From 84f942fc62c4a1557e0c3aea2b3c30343ed7384b Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sat, 19 May 2018 17:48:20 +0200 Subject: [PATCH] Only show missing features dialog once --- .../de/kuschku/quasseldroid/Quasseldroid.kt | 3 +- .../quasseldroid/ui/chat/ChatActivity.kt | 87 +++++++++++-------- .../accounts/setup/AccountSetupActivity.kt | 3 +- .../missingfeatures/MissingFeaturesDialog.kt | 20 +++-- .../persistence/AccountDatabase.kt | 13 ++- 5 files changed, 77 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt b/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt index a729a2fa8..183d0aa31 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt @@ -85,7 +85,8 @@ class Quasseldroid : DaggerApplication() { user = it.user, pass = it.pass, name = it.name, - lastUsed = 0 + lastUsed = 0, + acceptedMissingFeatures = false ) }.toTypedArray()) Thread(Runnable { diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt index 61887c115..dd2581c38 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt @@ -124,7 +124,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc private var chatlineFragment: ChatlineFragment? = null - private var isInitialConnect = true + private var connectedAccount = -1L override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) @@ -458,12 +458,12 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc .firstElement() .toLiveData() .observe(this, Observer { - if (isInitialConnect) { + if (connectedAccount != accountId) { if (resources.getBoolean(R.bool.buffer_drawer_exists) && viewModel.buffer.value == Int.MAX_VALUE) { drawerLayout.openDrawer(Gravity.START) } - isInitialConnect = false + connectedAccount = accountId viewModel.session.value?.orNull()?.let { if (it.identities.isEmpty()) { UserSetupActivity.launch(this) @@ -486,33 +486,46 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc ExtendedFeature.BacklogFilterType ) - it.features.core.enabledFeatures if (missingFeatures.isNotEmpty()) { - MissingFeaturesDialog.Builder(this) - .missingFeatures(missingFeatures.mapNotNull { feature -> - when (feature) { - ExtendedFeature.SynchronizedMarkerLine -> R.string.label_feature_synchronizedmarkerline - ExtendedFeature.SaslAuthentication -> R.string.label_feature_saslauthentication - ExtendedFeature.SaslExternal -> R.string.label_feature_saslexternal - ExtendedFeature.HideInactiveNetworks -> R.string.label_feature_hideinactivenetworks - ExtendedFeature.PasswordChange -> R.string.label_feature_passwordchange - ExtendedFeature.CapNegotiation -> R.string.label_feature_capnegotiation - ExtendedFeature.VerifyServerSSL -> R.string.label_feature_verifyserverssl - ExtendedFeature.CustomRateLimits -> R.string.label_feature_customratelimits - ExtendedFeature.AwayFormatTimestamp -> R.string.label_feature_awayformattimestamp - ExtendedFeature.BufferActivitySync -> R.string.label_feature_bufferactivitysync - ExtendedFeature.CoreSideHighlights -> R.string.label_feature_coresidehighlights - ExtendedFeature.SenderPrefixes -> R.string.label_feature_senderprefixes - ExtendedFeature.RemoteDisconnect -> R.string.label_feature_remotedisconnect - ExtendedFeature.RichMessages -> R.string.label_feature_richmessages - ExtendedFeature.BacklogFilterType -> R.string.label_feature_backlogfiltertype - else -> null - }?.let { - MissingFeature( - feature = feature, - description = it - ) + runInBackground { + val accounts = accountDatabase.accounts() + val account = accounts.findById(accountId) + if (account?.acceptedMissingFeatures == false) { + val dialog = MissingFeaturesDialog.Builder(this) + .missingFeatures(missingFeatures.mapNotNull { feature -> + when (feature) { + ExtendedFeature.SynchronizedMarkerLine -> R.string.label_feature_synchronizedmarkerline + ExtendedFeature.SaslAuthentication -> R.string.label_feature_saslauthentication + ExtendedFeature.SaslExternal -> R.string.label_feature_saslexternal + ExtendedFeature.HideInactiveNetworks -> R.string.label_feature_hideinactivenetworks + ExtendedFeature.PasswordChange -> R.string.label_feature_passwordchange + ExtendedFeature.CapNegotiation -> R.string.label_feature_capnegotiation + ExtendedFeature.VerifyServerSSL -> R.string.label_feature_verifyserverssl + ExtendedFeature.CustomRateLimits -> R.string.label_feature_customratelimits + ExtendedFeature.AwayFormatTimestamp -> R.string.label_feature_awayformattimestamp + ExtendedFeature.BufferActivitySync -> R.string.label_feature_bufferactivitysync + ExtendedFeature.CoreSideHighlights -> R.string.label_feature_coresidehighlights + ExtendedFeature.SenderPrefixes -> R.string.label_feature_senderprefixes + ExtendedFeature.RemoteDisconnect -> R.string.label_feature_remotedisconnect + ExtendedFeature.RichMessages -> R.string.label_feature_richmessages + ExtendedFeature.BacklogFilterType -> R.string.label_feature_backlogfiltertype + else -> null + }?.let { + MissingFeature( + feature = feature, + description = it + ) + } + }) + .positiveListener(MaterialDialog.SingleButtonCallback { _, _ -> + runInBackground { + accounts.save(account.copy(acceptedMissingFeatures = true)) + } + }) + runOnUiThread { + dialog.show() } - }) - .show() + } + } } } } @@ -606,18 +619,18 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc super.onSaveInstanceState(outState) outState?.putInt("OPEN_BUFFER", viewModel.buffer.value ?: -1) outState?.putInt("OPEN_BUFFERVIEWCONFIG", viewModel.bufferViewConfigId.value ?: -1) - outState?.putBoolean("HAS_BEEN_CONNECTED", isInitialConnect) + outState?.putLong("CONNECTED_ACCOUNT", connectedAccount) } override fun onSaveInstanceState(outState: Bundle?, outPersistentState: PersistableBundle?) { super.onSaveInstanceState(outState, outPersistentState) outState?.putInt("OPEN_BUFFER", viewModel.buffer.value ?: -1) outState?.putInt("OPEN_BUFFERVIEWCONFIG", viewModel.bufferViewConfigId.value ?: -1) - outState?.putBoolean("HAS_BEEN_CONNECTED", isInitialConnect) + outState?.putLong("CONNECTED_ACCOUNT", connectedAccount) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { outPersistentState?.putInt("OPEN_BUFFER", viewModel.buffer.value ?: -1) outPersistentState?.putInt("OPEN_BUFFERVIEWCONFIG", viewModel.bufferViewConfigId.value ?: -1) - outPersistentState?.putBoolean("HAS_BEEN_CONNECTED", isInitialConnect) + outPersistentState?.putLong("CONNECTED_ACCOUNT", connectedAccount) } } @@ -626,7 +639,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc viewModel.buffer.onNext(savedInstanceState?.getInt("OPEN_BUFFER", -1) ?: -1) viewModel.bufferViewConfigId.onNext(savedInstanceState?.getInt("OPEN_BUFFERVIEWCONFIG", -1) ?: -1) - isInitialConnect = savedInstanceState?.getBoolean("HAS_BEEN_CONNECTED", true) ?: true + connectedAccount = savedInstanceState?.getLong("CONNECTED_ACCOUNT", -1L) ?: -1L } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @@ -644,10 +657,10 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc savedInstanceState?.getInt("OPEN_BUFFERVIEWCONFIG", fallbackBufferViewConfigId) ?: fallbackBufferViewConfigId ) - val fallbackIsInitialConnect = persistentState?.getBoolean("HAS_BEEN_CONNECTED", true) ?: true - isInitialConnect = savedInstanceState?.getBoolean( - "HAS_BEEN_CONNECTED", fallbackIsInitialConnect - ) ?: fallbackIsInitialConnect + val fallbackConnectedAccount = persistentState?.getLong("CONNECTED_ACCOUNT", -1L) ?: -1L + connectedAccount = savedInstanceState?.getLong( + "CONNECTED_ACCOUNT", fallbackConnectedAccount + ) ?: fallbackConnectedAccount } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupActivity.kt index cce8865b3..25156ece6 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupActivity.kt @@ -43,7 +43,8 @@ class AccountSetupActivity : SetupActivity() { user = data.getString("user"), pass = data.getString("pass"), name = data.getString("name"), - lastUsed = Instant.now().epochSecond + lastUsed = Instant.now().epochSecond, + acceptedMissingFeatures = false ) handler.post { database.accounts().create(account) diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt b/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt index 174c445e0..58b3cf2df 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt @@ -45,6 +45,9 @@ class MissingFeaturesDialog : DialogFragment() { .customView(R.layout.dialog_missing_features, true) .title(R.string.label_missing_features) .positiveText(R.string.label_accept) + .also { dialog -> + builder?.positiveListener?.let(dialog::onPositive) + } .build() ButterKnife.bind(this, dialog.customView!!) list.layoutManager = LinearLayoutManager(list.context) @@ -57,7 +60,7 @@ class MissingFeaturesDialog : DialogFragment() { override fun onDismiss(dialog: DialogInterface?) { super.onDismiss(dialog) - builder?.dismissListener?.onDismiss(this) + builder?.dismissListener?.onDismiss(this.dialog) } fun show(context: FragmentActivity) = show(context.supportFragmentManager) @@ -73,15 +76,11 @@ class MissingFeaturesDialog : DialogFragment() { } } - @FunctionalInterface - interface OnDismissListener { - fun onDismiss(dialog: MissingFeaturesDialog) - } - class Builder(private val fragmentManager: FragmentManager) : Serializable { constructor(context: FragmentActivity) : this(context.supportFragmentManager) - var dismissListener: OnDismissListener? = null + var dismissListener: DialogInterface.OnDismissListener? = null + var positiveListener: MaterialDialog.SingleButtonCallback? = null var missingFeatures: List<MissingFeature>? = null fun missingFeatures(missingFeatures: List<MissingFeature>): Builder { @@ -89,11 +88,16 @@ class MissingFeaturesDialog : DialogFragment() { return this } - fun dismissListener(dismissListener: OnDismissListener): Builder { + fun dismissListener(dismissListener: DialogInterface.OnDismissListener): Builder { this.dismissListener = dismissListener return this } + fun positiveListener(positiveListener: MaterialDialog.SingleButtonCallback): Builder { + this.positiveListener = positiveListener + return this + } + fun build() = MissingFeaturesDialog().apply { arguments = Bundle().apply { putSerializable("builder", this@Builder) diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/AccountDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/AccountDatabase.kt index ae7e85f7c..9b9819bc3 100644 --- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/AccountDatabase.kt +++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/AccountDatabase.kt @@ -20,10 +20,12 @@ package de.kuschku.quasseldroid.persistence import android.arch.lifecycle.LiveData +import android.arch.persistence.db.SupportSQLiteDatabase import android.arch.persistence.room.* +import android.arch.persistence.room.migration.Migration import android.content.Context -@Database(entities = [(AccountDatabase.Account::class)], version = 1) +@Database(entities = [(AccountDatabase.Account::class)], version = 2) abstract class AccountDatabase : RoomDatabase() { abstract fun accounts(): AccountDao @@ -36,7 +38,8 @@ abstract class AccountDatabase : RoomDatabase() { var user: String, var pass: String, var name: String, - var lastUsed: Long + var lastUsed: Long, + var acceptedMissingFeatures: Boolean ) @Dao @@ -73,6 +76,12 @@ abstract class AccountDatabase : RoomDatabase() { database = Room.databaseBuilder( context.applicationContext, AccountDatabase::class.java, DATABASE_NAME + ).addMigrations( + object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE account ADD COLUMN acceptedMissingFeatures INTEGER NOT NULL DEFAULT 0;") + } + } ).allowMainThreadQueries().build() } } -- GitLab