From 6cc278d667a8f040ea39036774f2f731277ab164 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Sat, 16 Sep 2017 22:36:21 +0800 Subject: [PATCH] improved theme improved filters --- build.gradle | 2 +- .../mariotaku/twidere/model/FiltersData.java | 8 ++- .../twidere/model/CursorReference.java | 12 +++- .../ktextension/SQLiteDatabaseExtensions.kt | 5 +- .../extension/ContentResolverExtensions.kt | 26 ++++--- ...dEditTextPreferenceDialogFragmentCompat.kt | 3 +- .../fragment/filter/AddEditItemFragment.kt | 71 +++++++++++++------ .../fragment/filter/BaseFiltersFragment.kt | 14 ++-- .../fragment/filter/FilteredUsersFragment.kt | 26 +++++++ .../twidere/task/UpdateAccountInfoTask.kt | 3 +- .../mariotaku/twidere/util/AccountMigrator.kt | 3 +- .../twidere/util/DataStoreFunctions.kt | 5 +- .../mariotaku/twidere/util/DataStoreUtils.kt | 13 ++-- .../twidere/util/UserColorNameManager.kt | 4 ++ .../util/database/ContentFiltersUtils.kt | 27 ++----- .../ContentNotificationManager.kt | 6 +- .../src/main/res/layout/activity_sign_in.xml | 4 +- .../res/layout/activity_user_selector.xml | 2 +- .../dialog_add_filters_subscription.xml | 4 +- .../res/layout/dialog_add_host_mapping.xml | 4 +- .../src/main/res/layout/dialog_api_editor.xml | 2 +- .../layout/dialog_auto_complete_textview.xml | 2 +- .../layout/dialog_compose_edit_alt_text.xml | 2 +- .../layout/dialog_edit_conversation_name.xml | 2 +- .../res/layout/dialog_edit_user_nickname.xml | 2 +- .../res/layout/dialog_filter_rule_editor.xml | 2 +- .../layout/dialog_login_verification_code.xml | 2 +- .../res/layout/dialog_password_sign_in.xml | 4 +- .../layout/dialog_status_quote_retweet.xml | 2 +- .../fragment_messages_conversation_new.xml | 2 +- .../res/layout/layout_extra_config_text.xml | 2 +- .../src/main/res/values/themes_base_dark.xml | 2 + .../src/main/res/values/themes_base_light.xml | 2 + 33 files changed, 167 insertions(+), 103 deletions(-) diff --git a/build.gradle b/build.gradle index 46b7100bf..6677b8953 100644 --- a/build.gradle +++ b/build.gradle @@ -68,7 +68,7 @@ subprojects { KPreferences : '0.9.7', Kovenant : '3.3.0', ParcelablePlease : '1.0.2', - Chameleon : '0.9.20', + Chameleon : '0.9.22', UniqR : '0.9.4', SQLiteQB : '0.9.15', Glide : '3.7.0', diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/FiltersData.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/FiltersData.java index 6b84a75c1..c9e594801 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/FiltersData.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/FiltersData.java @@ -115,6 +115,10 @@ public class FiltersData { @FilterScope int scope = 0; + public long getId() { + return _id; + } + public UserKey getUserKey() { return userKey; } @@ -149,6 +153,7 @@ public class FiltersData { @FilterScope public int getScope() { + if (scope == 0) return FilterScope.DEFAULT; return scope; } @@ -210,7 +215,7 @@ public class FiltersData { @CursorField(value = Filters.SCOPE, type = "INTEGER DEFAULT 0") @JsonField(name = "scope") @FilterScope - int scope = 0; + int scope = FilterScope.ALL; public long getId() { return _id; @@ -243,6 +248,7 @@ public class FiltersData { @FilterScope public int getScope() { + if (scope == 0) return FilterScope.DEFAULT; return scope; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/CursorReference.java b/twidere/src/main/java/org/mariotaku/twidere/model/CursorReference.java index 34ac168d3..bd061cae9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/CursorReference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/CursorReference.java @@ -21,29 +21,37 @@ package org.mariotaku.twidere.model; import android.database.Cursor; +import android.support.annotation.NonNull; import java.io.Closeable; import java.io.IOException; public class CursorReference implements Closeable { + @NonNull private final C cursor; - public CursorReference(C cursor) { + private CursorReference(@NonNull C cursor) { this.cursor = cursor; } + @NonNull public C get() { return cursor; } + @SuppressWarnings("unused") + @NonNull public C component1() { return get(); } @Override public void close() throws IOException { - if (cursor == null) return; cursor.close(); } + + public static CursorReference get(Cur cursor) { + return new CursorReference<>(cursor); + } } diff --git a/twidere/src/main/kotlin/org/mariotaku/ktextension/SQLiteDatabaseExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/ktextension/SQLiteDatabaseExtensions.kt index 2663239d6..f6368d7bc 100644 --- a/twidere/src/main/kotlin/org/mariotaku/ktextension/SQLiteDatabaseExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/ktextension/SQLiteDatabaseExtensions.kt @@ -19,10 +19,11 @@ package org.mariotaku.ktextension +import android.database.Cursor import android.database.sqlite.SQLiteDatabase import org.mariotaku.twidere.model.CursorReference fun SQLiteDatabase.queryReference(table: String, columns: Array? = null, selection: String? = null, selectionArgs: Array? = null, groupBy: String? = null, - having: String? = null, orderBy: String? = null) = - CursorReference(query(table, columns, selection, selectionArgs, groupBy, having, orderBy)) \ No newline at end of file + having: String? = null, orderBy: String? = null): CursorReference? = + CursorReference.get(query(table, columns, selection, selectionArgs, groupBy, having, orderBy)) \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/ContentResolverExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/ContentResolverExtensions.kt index 7e31636e7..e8ca5bc63 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/ContentResolverExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/ContentResolverExtensions.kt @@ -33,7 +33,7 @@ import org.mariotaku.twidere.util.content.ContentResolverUtils fun ContentResolver.query(uri: Uri, projection: Array? = null, selection: String? = null, selectionArgs: Array? = null, sortOrder: String? = null, - limit: String? = null): Cursor { + limit: String? = null): Cursor? { return if (limit != null) { query(uri.buildUpon().appendQueryParameter(QUERY_PARAM_LIMIT, limit.toString()).build(), projection, selection, selectionArgs, sortOrder) @@ -44,8 +44,8 @@ fun ContentResolver.query(uri: Uri, projection: Array? = null, fun ContentResolver.queryReference(uri: Uri, projection: Array? = null, selection: String? = null, selectionArgs: Array? = null, sortOrder: String? = null, - limit: String? = null): CursorReference { - return CursorReference(query(uri, projection, selection, selectionArgs, sortOrder, limit)) + limit: String? = null): CursorReference? { + return CursorReference.get(query(uri, projection, selection, selectionArgs, sortOrder, limit)) } @SuppressLint("Recycle") @@ -54,10 +54,16 @@ fun ContentResolver.rawQuery(sql: String, selectionArgs: Array?, notifyU return query(rawUri, null, null, selectionArgs, null) } +@SuppressLint("Recycle") +fun ContentResolver.rawQueryReference(sql: String, selectionArgs: Array?, notifyUri: Uri? = null): CursorReference? { + val rawUri = TwidereQueryBuilder.rawQuery(sql, notifyUri) + return queryReference(rawUri, null, null, selectionArgs, null) +} + fun ContentResolver.queryOne(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String? = null, cls: Class): T? { - return queryReference(uri, projection, selection, selectionArgs, sortOrder, "1").use { (cur) -> + return queryReference(uri, projection, selection, selectionArgs, sortOrder, "1")?.use { (cur) -> if (!cur.moveToFirst()) return@use null val indices = ObjectCursor.indicesFrom(cur, cls) return@use indices.newObject(cur) @@ -66,29 +72,29 @@ fun ContentResolver.queryOne(uri: Uri, projection: Array?, selection fun ContentResolver.queryAll(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String? = null, cls: Class): List { - return queryReference(uri, projection, selection, selectionArgs, sortOrder).use { (cur) -> + return queryReference(uri, projection, selection, selectionArgs, sortOrder)?.use { (cur) -> return@use cur.map(ObjectCursor.indicesFrom(cur, cls)) - } + } ?: emptyList() } fun ContentResolver.queryCount(uri: Uri, selection: String?, selectionArgs: Array?): Int { val projection = arrayOf(SQLFunctions.COUNT()) - return queryReference(uri, projection, selection, selectionArgs, null).use { (cur) -> + return queryReference(uri, projection, selection, selectionArgs, null)?.use { (cur) -> if (cur.moveToFirst()) { return@use cur.getInt(0) } return@use -1 - } + } ?: -1 } fun ContentResolver.queryLong(uri: Uri, field: String, selection: String?, selectionArgs: Array?, def: Long = -1): Long { val projection = arrayOf(field) - return queryReference(uri, projection, selection, selectionArgs, null, "1").use { (cur) -> + return queryReference(uri, projection, selection, selectionArgs, null, "1")?.use { (cur) -> if (cur.moveToFirst()) { return@use cur.getLong(0) } return@use def - } + } ?: def } fun ContentResolver.insert(uri: Uri, obj: T, cls: Class = obj.javaClass): Uri? { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ThemedEditTextPreferenceDialogFragmentCompat.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ThemedEditTextPreferenceDialogFragmentCompat.kt index 59313e8e0..a5c1f8a0a 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ThemedEditTextPreferenceDialogFragmentCompat.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ThemedEditTextPreferenceDialogFragmentCompat.kt @@ -36,9 +36,8 @@ class ThemedEditTextPreferenceDialogFragmentCompat : ThemedPreferenceDialogFragm override fun onCreateDialogView(context: Context): View { val view = super.onCreateDialogView(context) val theme = Chameleon.getOverrideTheme(context, context) - editText = view.findViewById(android.R.id.edit) + editText = view.findViewById(android.R.id.edit) val appearance = ChameleonTextView.Appearance.create(editText, context, null, theme) - appearance.backgroundTintColor = theme.colorAccent ChameleonTextView.Appearance.apply(editText, appearance) return view } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/AddEditItemFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/AddEditItemFragment.kt index 3251d0891..9b6f8ef5d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/AddEditItemFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/AddEditItemFragment.kt @@ -73,6 +73,9 @@ class AddEditItemFragment : BaseDialogFragment(), DialogInterface.OnClickListene else -> 0 } + private val canEditValue: Boolean + get() = contentUri != Filters.Users.CONTENT_URI + private var Dialog.value: String? get() = editText.string?.takeIf(String::isNotEmpty) set(value) { @@ -100,30 +103,12 @@ class AddEditItemFragment : BaseDialogFragment(), DialogInterface.OnClickListene dialog as AlertDialog when (which) { DialogInterface.BUTTON_POSITIVE -> { - val value = dialog.value ?: return val scope = dialog.scope ?: return - - val values = ContentValues { - this[Filters.VALUE] = value - this[Filters.SCOPE] = scope.value - } - val uri = contentUri - val id = rowId - val resolver = context.contentResolver - if (id >= 0) { - val valueWhere = Expression.equalsArgs(Filters.VALUE).sql - val valueWhereArgs = arrayOf(value) - val matchedId = resolver.queryLong(uri, Filters._ID, valueWhere, valueWhereArgs, - -1) - if (matchedId != -1L && matchedId != id) { - Toast.makeText(context, R.string.message_toast_duplicate_filter_rule, - Toast.LENGTH_SHORT).show() - } else { - val idWhere = Expression.equals(Filters._ID, id).sql - resolver.update(uri, values, idWhere, null) - } + if (!canEditValue) { + saveScopeOnly(scope) } else { - resolver.insert(uri, values) + val value = dialog.value ?: return + saveItem(value, scope) } } } @@ -154,6 +139,9 @@ class AddEditItemFragment : BaseDialogFragment(), DialogInterface.OnClickListene else -> null }) editText.threshold = 1 + val canEdit = canEditValue + editText.isEnabled = canEdit + editText.setTextIsSelectable(canEdit) advancedToggle.setOnClickListener { advancedExpanded = !advancedExpanded } @@ -231,6 +219,45 @@ class AddEditItemFragment : BaseDialogFragment(), DialogInterface.OnClickListene isChecked = scopes[scope] } + private fun saveScopeOnly(scopes: FilterScopes) { + val resolver = context.contentResolver + val contentUri = contentUri + val rowId = rowId + + if (rowId < 0) return + + val values = ContentValues { + this[Filters.SCOPE] = scopes.value + } + val idWhere = Expression.equals(Filters._ID, rowId).sql + resolver.update(contentUri, values, idWhere, null) + } + + private fun saveItem(value: String, scopes: FilterScopes) { + val resolver = context.contentResolver + val uri = contentUri + val rowId = rowId + val values = ContentValues { + this[Filters.VALUE] = value + this[Filters.SCOPE] = scopes.value + } + if (rowId >= 0) { + val valueWhere = Expression.equalsArgs(Filters.VALUE).sql + val valueWhereArgs = arrayOf(value) + val matchedId = resolver.queryLong(uri, Filters._ID, valueWhere, valueWhereArgs, + -1) + if (matchedId != -1L && matchedId != rowId) { + Toast.makeText(context, R.string.message_toast_duplicate_filter_rule, + Toast.LENGTH_SHORT).show() + } else { + val idWhere = Expression.equals(Filters._ID, rowId).sql + resolver.update(uri, values, idWhere, null) + } + } else { + resolver.insert(uri, values) + } + } + class FilterScopes(val masks: Int, value: Int = 0) : Parcelable { var value: Int = 0 diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/BaseFiltersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/BaseFiltersFragment.kt index 5647a5521..06715a8dd 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/BaseFiltersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/BaseFiltersFragment.kt @@ -83,11 +83,7 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment - if (!supportsEdit) return@setOnItemClickListener - val adapter = this.adapter as FilterListAdapter - val item = adapter.getFilterItem(pos) ?: return@setOnItemClickListener - if (item.source >= 0) return@setOnItemClickListener - addOrEditItem(item.id, item.value, item.scope) + onItemClick(pos) } listView.setMultiChoiceModeListener(this) loaderManager.initLoader(0, null, this) @@ -110,7 +106,6 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment= 0) return + addOrEditItem(item.id, item.value, item.scope) + } + protected open fun performDeletion() { val ids = listView.checkedItemIds val where = Expression.inArgs(Columns.Column(Filters._ID), ids.size) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/FilteredUsersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/FilteredUsersFragment.kt index f8615f43d..6220dd6ec 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/FilteredUsersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/filter/FilteredUsersFragment.kt @@ -22,6 +22,7 @@ import kotlinx.android.synthetic.main.fragment_content_listview.* import nl.komponents.kovenant.then import nl.komponents.kovenant.ui.alwaysUi import org.mariotaku.kpreferences.KPreferences +import org.mariotaku.kpreferences.get import org.mariotaku.ktextension.* import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.twidere.R @@ -140,6 +141,12 @@ class FilteredUsersFragment : BaseFiltersFragment() { return true } + override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { + super.onCreateActionMode(mode, menu) + mode.menuInflater.inflate(R.menu.action_multi_select_filtered_users, menu) + return true + } + override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { val result = super.onPrepareActionMode(mode, menu) val isFeaturesSupported = extraFeaturesService.isSupported() @@ -161,8 +168,18 @@ class FilteredUsersFragment : BaseFiltersFragment() { return FilterUsersListAdapter(context) } + override fun onItemClick(position: Int) { + val adapter = this.adapter as FilterUsersListAdapter + val item = adapter.getFilterItem(position) ?: return + if (item.source >= 0) return + addOrEditItem(item.id, userColorNameManager.getDisplayName(item, + preferences[nameFirstKey]), item.scope) + } + override fun addOrEditItem(id: Long, value: String?, scope: Int) { // No-op + if (id < 0) return + super.addOrEditItem(id, value, scope) } override fun performDeletion() { @@ -289,6 +306,15 @@ class FilteredUsersFragment : BaseFiltersFragment() { } return null } + + fun getFilterItem(position: Int): FiltersData.UserItem? { + val cursor = this.cursor ?: return null + val indices = this.indices ?: return null + if (cursor.moveToPosition(position)) { + return indices.newObject(cursor) + } + return null + } } } \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateAccountInfoTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateAccountInfoTask.kt index 14159cc86..ed8c7c993 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateAccountInfoTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateAccountInfoTask.kt @@ -60,8 +60,7 @@ class UpdateAccountInfoTask( private fun updateTabs(resolver: ContentResolver, accountKey: UserKey) { resolver.queryReference(Tabs.CONTENT_URI, Tabs.COLUMNS, null, null, - null).use { (tabsCursor) -> - if (tabsCursor == null) return + null)?.use { (tabsCursor) -> val indices = ObjectCursor.indicesFrom(tabsCursor, Tab::class.java) val creator = ObjectCursor.valuesCreatorFrom(Tab::class.java) tabsCursor.moveToFirst() diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt index e92f059a3..620b833c2 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt @@ -26,8 +26,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Accounts @Suppress("deprecation") fun migrateAccounts(am: AccountManager, db: SQLiteDatabase) { db.queryReference(Accounts.TABLE_NAME, Accounts.COLUMNS, null, null, - null, null, null).use { (cur) -> - if (cur == null) return + null, null, null)?.use { (cur) -> val indices = ObjectCursor.indicesFrom(cur, ParcelableCredentials::class.java) cur.moveToFirst() while (!cur.isAfterLast) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt index 729fcb3a5..084f1485d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt @@ -31,7 +31,7 @@ fun Context.deleteDrafts(draftIds: LongArray): Int { val where = Expression.inArgs(Drafts._ID, draftIds.size).sql val whereArgs = draftIds.mapToArray(Long::toString) - contentResolver.queryReference(Drafts.CONTENT_URI, Drafts.COLUMNS, where, whereArgs, null).use { (cursor) -> + contentResolver.queryReference(Drafts.CONTENT_URI, Drafts.COLUMNS, where, whereArgs, null)?.use { (cursor) -> val indices = ObjectCursor.indicesFrom(cursor, Draft::class.java) cursor.moveToFirst() while (!cursor.isAfterLast) { @@ -126,8 +126,7 @@ fun ContentResolver.updateItems(uri: Uri, columns: Array?, where: St whereArgs: Array?, cls: Class, action: (T) -> T) { val values = LongSparseArray() - queryReference(uri, columns, where, whereArgs, null).use { (c) -> - if (c == null) return + queryReference(uri, columns, where, whereArgs, null)?.use { (c) -> val ci = ObjectCursor.indicesFrom(c, cls) val vc = ObjectCursor.valuesCreatorFrom(cls) c.moveToFirst() diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreUtils.kt index 70ce50445..ec1c8a198 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreUtils.kt @@ -286,12 +286,12 @@ object DataStoreUtils { Expression.notEquals("${Filters.Users.SCOPE} & $scope", 0) ) return resolver.queryReference(Filters.Users.CONTENT_URI, projection, where.sql, - null, null).use { (cur) -> + null, null)?.use { (cur) -> return@use Array(cur.count) { i -> cur.moveToPosition(i) UserKey.valueOf(cur.getString(0)) } - } + } ?: emptyArray() } fun getFilteredKeywords(context: Context, @FilterScope scope: Int): Array { @@ -302,12 +302,12 @@ object DataStoreUtils { Expression.notEquals("${Filters.SCOPE} & $scope", 0) ) return resolver.queryReference(Filters.Keywords.CONTENT_URI, projection, where.sql, - null, null).use { (cur) -> + null, null)?.use { (cur) -> return@use Array(cur.count) { i -> cur.moveToPosition(i) cur.getString(0) } - } + } ?: emptyArray() } fun getAccountDisplayName(context: Context, accountKey: UserKey, nameFirst: Boolean): String? { @@ -418,8 +418,7 @@ object DataStoreUtils { val resolver = context.contentResolver if (followingOnly) { val projection = arrayOf(Activities.SOURCES) - return resolver.queryReference(uri, projection, selection.sql, selectionArgs, null).use { (cur) -> - if (cur == null) return@use 0 + return resolver.queryReference(uri, projection, selection.sql, selectionArgs, null)?.use { (cur) -> var total = 0 cur.moveToFirst() while (!cur.isAfterLast) { @@ -443,7 +442,7 @@ object DataStoreUtils { cur.moveToNext() } return@use total - } + } ?: 0 } return resolver.queryCount(uri, selection.sql, selectionArgs) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/UserColorNameManager.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/UserColorNameManager.kt index f2a70887d..6abf1168a 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/UserColorNameManager.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/UserColorNameManager.kt @@ -97,6 +97,10 @@ class UserColorNameManager(context: Context) { return getDisplayName(status.user_key, status.user_name, status.user_screen_name, nameFirst) } + fun getDisplayName(user: FiltersData.UserItem, nameFirst: Boolean): String { + return getDisplayName(user.userKey, user.name, user.screenName, nameFirst) + } + fun getDisplayName(userKey: UserKey, name: String, screenName: String, nameFirst: Boolean): String { return getDisplayName(userKey.toString(), name, screenName, nameFirst) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/database/ContentFiltersUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/database/ContentFiltersUtils.kt index 5567e1fd7..c1ef80294 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/database/ContentFiltersUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/database/ContentFiltersUtils.kt @@ -21,39 +21,24 @@ package org.mariotaku.twidere.util.database import android.content.ContentResolver import org.mariotaku.twidere.annotation.FilterScope -import org.mariotaku.twidere.extension.rawQuery +import org.mariotaku.twidere.extension.rawQueryReference import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.provider.TwidereDataStore.Filters.* -/** - * Created by mariotaku on 2017/2/16. - */ - object ContentFiltersUtils { fun isFiltered(cr: ContentResolver, status: ParcelableStatus, filterRts: Boolean, @FilterScope scope: Int, allowedKeywords: Array? = null): Boolean { - return isFiltered(cr, status.filter_users, status.filter_texts, + val query = isFilteredQuery(status.filter_users, status.filter_texts, status.filter_sources, status.filter_links, status.filter_names, status.filter_descriptions, filterRts, scope, allowedKeywords) + return cr.rawQueryReference(query.first, query.second)?.use { (cur) -> + cur.moveToFirst() && cur.getInt(0) != 0 + } ?: false } - fun isFiltered(cr: ContentResolver, users: Array?, texts: String?, sources: Array?, - links: Array?, names: Array?, descriptions: String?, filterRts: Boolean, - @FilterScope scope: Int, allowedKeywords: Array? = null): Boolean { - val query = isFilteredQuery(users, texts, sources, links, names, descriptions, true, - scope, allowedKeywords) - val cur = cr.rawQuery(query.first, query.second) ?: return false - @Suppress("ConvertTryFinallyToUseCall") - try { - return cur.moveToFirst() && cur.getInt(0) != 0 - } finally { - cur.close() - } - } - - fun isFilteredQuery(users: Array?, texts: String?, sources: Array?, + private fun isFilteredQuery(users: Array?, texts: String?, sources: Array?, links: Array?, names: Array?, descriptions: String?, filterRts: Boolean, @FilterScope scope: Int, allowedKeywords: Array? = null): Pair> { val selectionArgs = mutableListOf() diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/notification/ContentNotificationManager.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/notification/ContentNotificationManager.kt index 330cc1bcf..d236ee344 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/notification/ContentNotificationManager.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/notification/ContentNotificationManager.kt @@ -205,8 +205,8 @@ class ContentNotificationManager( val (remaining, consumed) = cr.queryReference(Activities.AboutMe.CONTENT_URI, Activities.COLUMNS, filteredSelection.sql, selectionArgs, - OrderBy(Activities.TIMESTAMP, false).sql).use { (cur) -> - if (cur == null || cur.isEmpty) return@use Pair(-1, -1) + OrderBy(Activities.TIMESTAMP, false).sql)?.use { (cur) -> + if (cur.isEmpty) return@use Pair(-1, -1) val ci = ObjectCursor.indicesFrom(cur, ParcelableActivity::class.java) var con = 0 val rem = cur.forEachRow(5) { c, _ -> @@ -248,7 +248,7 @@ class ContentNotificationManager( return@forEachRow true } return@use Pair(rem, con) - } + } ?: Pair(-1, -1) if (remaining < 0) return if (remaining > 0) { style.addLine(resources.getString(R.string.and_N_more, remaining)) diff --git a/twidere/src/main/res/layout/activity_sign_in.xml b/twidere/src/main/res/layout/activity_sign_in.xml index 27bded8c4..8a6131d48 100644 --- a/twidere/src/main/res/layout/activity_sign_in.xml +++ b/twidere/src/main/res/layout/activity_sign_in.xml @@ -46,7 +46,7 @@ android:inputType="textEmailAddress" android:maxLines="1" android:typeface="normal" - app:backgroundTint="?colorAccent"/> + app:backgroundTint="?colorControlStateful"/> + app:backgroundTint="?colorControlStateful"/> + app:backgroundTint="?colorControlStateful"/> + app:met_primaryColor="?colorControlStateful"/> + app:met_primaryColor="?colorControlStateful"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_add_host_mapping.xml b/twidere/src/main/res/layout/dialog_add_host_mapping.xml index c18376ad9..d90538fcc 100644 --- a/twidere/src/main/res/layout/dialog_add_host_mapping.xml +++ b/twidere/src/main/res/layout/dialog_add_host_mapping.xml @@ -39,7 +39,7 @@ android:hint="@string/host_mapping_host" android:inputType="text|textUri" android:maxLines="1" - app:backgroundTint="?colorAccent"/> + app:backgroundTint="?colorControlStateful"/> + app:backgroundTint="?colorControlStateful"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_api_editor.xml b/twidere/src/main/res/layout/dialog_api_editor.xml index 59b42d6c1..ca5c5b6d5 100644 --- a/twidere/src/main/res/layout/dialog_api_editor.xml +++ b/twidere/src/main/res/layout/dialog_api_editor.xml @@ -69,7 +69,7 @@ android:ems="10" android:inputType="textUri" android:maxLines="1" - app:backgroundTint="?colorAccent" + app:backgroundTint="?colorControlStateful" tools:text="https://api.twitter.com/"/> + app:backgroundTint="?colorControlStateful"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_compose_edit_alt_text.xml b/twidere/src/main/res/layout/dialog_compose_edit_alt_text.xml index 69b9a4a72..9bd60f8e5 100644 --- a/twidere/src/main/res/layout/dialog_compose_edit_alt_text.xml +++ b/twidere/src/main/res/layout/dialog_compose_edit_alt_text.xml @@ -12,6 +12,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" - app:backgroundTint="?colorAccent"/> + app:backgroundTint="?colorControlStateful"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_edit_conversation_name.xml b/twidere/src/main/res/layout/dialog_edit_conversation_name.xml index 4f6467b75..996b2e5eb 100644 --- a/twidere/src/main/res/layout/dialog_edit_conversation_name.xml +++ b/twidere/src/main/res/layout/dialog_edit_conversation_name.xml @@ -32,6 +32,6 @@ android:layout_height="wrap_content" android:hint="@string/hint_conversation_name" android:maxLines="1" - app:backgroundTint="?colorAccent"/> + app:backgroundTint="?colorControlStateful"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_edit_user_nickname.xml b/twidere/src/main/res/layout/dialog_edit_user_nickname.xml index 36a7a52d9..3319a4495 100644 --- a/twidere/src/main/res/layout/dialog_edit_user_nickname.xml +++ b/twidere/src/main/res/layout/dialog_edit_user_nickname.xml @@ -13,7 +13,7 @@ android:layout_height="wrap_content" android:inputType="text|textPersonName" android:maxLines="1" - app:backgroundTint="?colorAccent" + app:backgroundTint="?colorControlStateful" tools:text="Nickname"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_filter_rule_editor.xml b/twidere/src/main/res/layout/dialog_filter_rule_editor.xml index 05541dc3a..97b1ee02f 100644 --- a/twidere/src/main/res/layout/dialog_filter_rule_editor.xml +++ b/twidere/src/main/res/layout/dialog_filter_rule_editor.xml @@ -35,7 +35,7 @@ android:layout_height="wrap_content" android:completionThreshold="1" android:maxLines="1" - app:backgroundTint="?colorAccent"/> + app:backgroundTint="?colorControlStateful"/> + app:backgroundTint="?colorControlStateful"> diff --git a/twidere/src/main/res/layout/dialog_password_sign_in.xml b/twidere/src/main/res/layout/dialog_password_sign_in.xml index a6fa76ac9..994b657dd 100644 --- a/twidere/src/main/res/layout/dialog_password_sign_in.xml +++ b/twidere/src/main/res/layout/dialog_password_sign_in.xml @@ -15,7 +15,7 @@ android:inputType="textEmailAddress" android:maxLines="1" android:typeface="normal" - app:backgroundTint="?colorAccent"/> + app:backgroundTint="?colorControlStateful"/> + app:backgroundTint="?colorControlStateful"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_status_quote_retweet.xml b/twidere/src/main/res/layout/dialog_status_quote_retweet.xml index 1249243b5..bef4bf79e 100644 --- a/twidere/src/main/res/layout/dialog_status_quote_retweet.xml +++ b/twidere/src/main/res/layout/dialog_status_quote_retweet.xml @@ -54,7 +54,7 @@ android:hint="@string/comment_hint" android:inputType="textMultiLine|textLongMessage|textCapSentences" android:visibility="visible" - app:backgroundTint="?colorAccent"> + app:backgroundTint="?colorControlStateful"> diff --git a/twidere/src/main/res/layout/fragment_messages_conversation_new.xml b/twidere/src/main/res/layout/fragment_messages_conversation_new.xml index a5c5eb2b8..88d3ccdb1 100644 --- a/twidere/src/main/res/layout/fragment_messages_conversation_new.xml +++ b/twidere/src/main/res/layout/fragment_messages_conversation_new.xml @@ -33,7 +33,7 @@ android:layout_weight="0" android:hint="@string/hint_message_select_user" android:minLines="1" - app:backgroundTint="?colorAccent"/> + app:backgroundTint="?colorControlStateful"/> + app:backgroundTint="?colorControlStateful"/> \ No newline at end of file diff --git a/twidere/src/main/res/values/themes_base_dark.xml b/twidere/src/main/res/values/themes_base_dark.xml index ff024615e..6f0aad169 100644 --- a/twidere/src/main/res/values/themes_base_dark.xml +++ b/twidere/src/main/res/values/themes_base_dark.xml @@ -39,6 +39,7 @@ @color/background_color_action_bar_dark false + ?colorControlNormal @style/Theme.Twidere.Dark.ActionBar @style/PreferenceThemeOverlay.v14.Material @@ -70,6 +71,7 @@ @color/background_color_action_bar_dark false + ?colorControlNormal @null @style/PreferenceThemeOverlay.v14.Material diff --git a/twidere/src/main/res/values/themes_base_light.xml b/twidere/src/main/res/values/themes_base_light.xml index 802e512aa..b0caf937d 100644 --- a/twidere/src/main/res/values/themes_base_light.xml +++ b/twidere/src/main/res/values/themes_base_light.xml @@ -39,6 +39,7 @@ ?colorPrimary true + ?colorControlNormal @style/Theme.Twidere.Light.ActionBar @style/PreferenceThemeOverlay.v14.Material @@ -71,6 +72,7 @@ ?colorPrimary true + ?colorControlNormal @null @style/PreferenceThemeOverlay.v14.Material