diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java index 24ecdbc43..251bc45bb 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java @@ -71,8 +71,6 @@ public interface TwidereDataStore { interface Accounts extends BaseColumns, AccountSupportColumns { String TABLE_NAME = "accounts"; - String CONTENT_PATH = TABLE_NAME; - Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); /** * Login name of the account
diff --git a/twidere/src/androidTest/java/org/mariotaku/twidere/util/StatusShortenerInterfaceTest.kt b/twidere/src/androidTest/java/org/mariotaku/twidere/util/StatusShortenerInterfaceTest.kt index eb52fb12c..83d20935c 100644 --- a/twidere/src/androidTest/java/org/mariotaku/twidere/util/StatusShortenerInterfaceTest.kt +++ b/twidere/src/androidTest/java/org/mariotaku/twidere/util/StatusShortenerInterfaceTest.kt @@ -24,7 +24,7 @@ class StatusShortenerInterfaceTest { @Test @FlakyTest fun testConnection() { - val context = InstrumentationRegistry.getTargetContext(); + val context = InstrumentationRegistry.getTargetContext() val application = context.applicationContext as Application val preferences = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) val shortenerComponent = preferences.getString(TwidereConstants.KEY_STATUS_SHORTENER, null) ?: return diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java index 6b67f926e..abe92e5cd 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java @@ -98,7 +98,6 @@ import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.message.UnreadCountUpdatedEvent; import org.mariotaku.twidere.model.util.ParcelableActivityUtils; import org.mariotaku.twidere.provider.TwidereDataStore.AccountSupportColumns; -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.provider.TwidereDataStore.Activities; import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags; import org.mariotaku.twidere.provider.TwidereDataStore.CachedImages; @@ -131,8 +130,6 @@ import org.mariotaku.twidere.util.ReadStateManager; import org.mariotaku.twidere.util.SQLiteDatabaseWrapper; import org.mariotaku.twidere.util.SQLiteDatabaseWrapper.LazyLoadCallback; import org.mariotaku.twidere.util.SharedPreferencesWrapper; -import org.mariotaku.twidere.util.TwidereArrayUtils; -import org.mariotaku.twidere.util.TwidereListUtils; import org.mariotaku.twidere.util.TwidereQueryBuilder.CachedUsersQueryBuilder; import org.mariotaku.twidere.util.TwidereQueryBuilder.ConversationQueryBuilder; import org.mariotaku.twidere.util.UriExtraUtils; @@ -149,8 +146,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.InetAddress; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -991,29 +986,6 @@ public final class TwidereDataProvider extends ContentProvider implements Consta throw new SecurityException("Access preferences requires level PERMISSION_LEVEL_PREFERENCES"); break; } - case TABLE_ID_ACCOUNTS: { - // Reading some information like user_id, screen_name etc is - // okay, but reading columns like password requires higher - // permission level. - if (checkPermission(PERMISSION_ACCOUNTS)) { - break; - } - // Only querying basic information - if (TwidereArrayUtils.contains(Accounts.COLUMNS_NO_CREDENTIALS, projection) && !checkPermission(PERMISSION_READ)) { - final String pkgName = mPermissionsManager.getPackageNameByUid(Binder.getCallingUid()); - throw new SecurityException("Access database " + table + " requires level PERMISSION_LEVEL_READ, package: " + pkgName); - } - final String pkgName = mPermissionsManager.getPackageNameByUid(Binder.getCallingUid()); - final List callingSensitiveCols = new ArrayList<>(); - if (projection != null) { - Collections.addAll(callingSensitiveCols, projection); - callingSensitiveCols.removeAll(Arrays.asList(Accounts.COLUMNS_NO_CREDENTIALS)); - } else { - callingSensitiveCols.add("*"); - } - throw new SecurityException("Access column " + TwidereListUtils.toString(callingSensitiveCols, ',', true) - + " in database accounts requires level PERMISSION_LEVEL_ACCOUNTS, package: " + pkgName); - } case TABLE_ID_DIRECT_MESSAGES: case TABLE_ID_DIRECT_MESSAGES_INBOX: case TABLE_ID_DIRECT_MESSAGES_OUTBOX: @@ -1052,14 +1024,6 @@ public final class TwidereDataProvider extends ContentProvider implements Consta private void checkWritePermission(final int id, final String table) { if (Binder.getCallingPid() == Process.myPid()) return; switch (id) { - case TABLE_ID_ACCOUNTS: { - // Writing to accounts database is not allowed for third-party - // applications. - if (!mPermissionsManager.checkSignature(Binder.getCallingUid())) - throw new SecurityException( - "Writing to accounts database is not allowed for third-party applications"); - break; - } case TABLE_ID_DIRECT_MESSAGES: case TABLE_ID_DIRECT_MESSAGES_INBOX: case TABLE_ID_DIRECT_MESSAGES_OUTBOX: @@ -1223,14 +1187,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta private void onDatabaseUpdated(final int tableId, final Uri uri) { if (uri == null) return; - switch (tableId) { - case TABLE_ID_ACCOUNTS: { - DataStoreUtils.clearAccountName(); - break; - } - } notifyContentObserver(Utils.getNotificationUri(tableId, uri)); - } private void onNewItemsInserted(final Uri uri, final int tableId, final ContentValues values) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java index fb720a067..e7808333e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java @@ -68,7 +68,6 @@ import org.mariotaku.twidere.model.tab.extra.TabExtras; import org.mariotaku.twidere.model.util.AccountUtils; import org.mariotaku.twidere.provider.TwidereDataStore; import org.mariotaku.twidere.provider.TwidereDataStore.AccountSupportColumns; -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.provider.TwidereDataStore.Activities; import org.mariotaku.twidere.provider.TwidereDataStore.CacheFiles; import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags; @@ -114,8 +113,6 @@ public class DataStoreUtils implements Constants { private static Map sAccountNames = new HashMap<>(); static { - CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Accounts.CONTENT_PATH, - TABLE_ID_ACCOUNTS); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Statuses.CONTENT_PATH, TABLE_ID_STATUSES); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Activities.AboutMe.CONTENT_PATH, @@ -549,8 +546,6 @@ public class DataStoreUtils implements Constants { public static String getTableNameById(final int id) { switch (id) { - case TwidereConstants.TABLE_ID_ACCOUNTS: - return Accounts.TABLE_NAME; case TwidereConstants.TABLE_ID_STATUSES: return Statuses.TABLE_NAME; case TwidereConstants.TABLE_ID_ACTIVITIES_ABOUT_ME: diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/collection/CompactHashSet.java b/twidere/src/main/java/org/mariotaku/twidere/util/collection/CompactHashSet.java index 76eb0919b..3d16e6b82 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/collection/CompactHashSet.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/collection/CompactHashSet.java @@ -356,7 +356,7 @@ public class CompactHashSet extends java.util.AbstractSet { offset = 2; } - newObjects[index] = (E) o; + newObjects[index] = o; } objects = newObjects; diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt index 036402bfc..99128e688 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt @@ -1864,7 +1864,7 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener private class PreviewGridOnStartDragListener(private val activity: ComposeActivity) : SimpleItemTouchHelperCallback.OnStartDragListener { override fun onStartDrag(viewHolder: ViewHolder) { - val helper = activity.itemTouchHelper ?: return + val helper = activity.itemTouchHelper helper.startDrag(viewHolder) } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt index b21219620..72d4816e4 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt @@ -19,19 +19,19 @@ package org.mariotaku.twidere.activity +import android.accounts.Account +import android.accounts.AccountManager +import android.accounts.OnAccountsUpdateListener import android.app.PendingIntent import android.app.SearchManager import android.content.Context import android.content.Intent import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.content.res.Configuration -import android.database.ContentObserver import android.graphics.Rect import android.graphics.drawable.Drawable -import android.net.Uri import android.os.AsyncTask import android.os.Bundle -import android.os.Handler import android.preference.PreferenceActivity import android.support.annotation.StringRes import android.support.v4.app.Fragment @@ -76,7 +76,8 @@ import org.mariotaku.twidere.model.Tab import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.message.TaskStateChangedEvent import org.mariotaku.twidere.model.message.UnreadCountUpdatedEvent -import org.mariotaku.twidere.provider.TwidereDataStore.* +import org.mariotaku.twidere.provider.TwidereDataStore.Activities +import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.service.StreamingService import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback @@ -85,9 +86,7 @@ import org.mariotaku.twidere.view.TabPagerIndicator class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, SupportFragmentCallback, OnLongClickListener, DrawerLayout.DrawerListener { - private val handler = Handler() - - private val accountChangeObserver = AccountChangeObserver(this, handler) + private val accountChangeObserver = AccountChangeObserver(this) private var selectedAccountToSearch: AccountDetails? = null private var tabColumns: Int = 0 @@ -95,12 +94,14 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp private lateinit var multiSelectHandler: MultiSelectEventHandler - private var pagerAdapter: SupportTabsAdapter? = null + private lateinit var pagerAdapter: SupportTabsAdapter + + private lateinit var drawerToggle: ActionBarDrawerToggle private var updateUnreadCountTask: UpdateUnreadCountTask? = null private val readStateChangeListener = OnSharedPreferenceChangeListener { sharedPreferences, key -> updateUnreadCount() } private val controlBarShowHideHelper = IControlBarActivity.ControlBarShowHideHelper(this) - private lateinit var drawerToggle: ActionBarDrawerToggle + private val homeDrawerToggleDelegate = object : ActionBarDrawerToggle.Delegate { override fun setActionBarUpIndicator(upDrawable: Drawable, @StringRes contentDescRes: Int) { drawerToggleButton.setImageDrawable(upDrawable) @@ -120,7 +121,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp } override fun getActionBarThemedContext(): Context { - return toolbar!!.context + return toolbar.context } override fun isNavigationVisible(): Boolean { @@ -138,13 +139,13 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp override val currentVisibleFragment: Fragment? get() { - val currentItem = mainPager!!.currentItem - if (currentItem < 0 || currentItem >= pagerAdapter!!.count) return null - return pagerAdapter!!.instantiateItem(mainPager, currentItem) as Fragment + val currentItem = mainPager.currentItem + if (currentItem < 0 || currentItem >= pagerAdapter.count) return null + return pagerAdapter.instantiateItem(mainPager, currentItem) as Fragment } override fun triggerRefresh(position: Int): Boolean { - val f = pagerAdapter!!.instantiateItem(mainPager, position) as Fragment + val f = pagerAdapter.instantiateItem(mainPager, position) as Fragment if (f.activity == null || f.isDetached) return false if (f !is RefreshScrollTopInterface) return false return f.triggerRefresh() @@ -221,29 +222,29 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp if (action != null) { when (action) { KeyboardShortcutConstants.ACTION_NAVIGATION_PREVIOUS_TAB -> { - val previous = mainPager!!.currentItem - 1 + val previous = mainPager.currentItem - 1 if (previous < 0 && DrawerLayoutAccessor.findDrawerWithGravity(homeMenu, Gravity.START) != null) { homeMenu.openDrawer(GravityCompat.START) setControlBarVisibleAnimate(true) - } else if (previous < pagerAdapter!!.count) { + } else if (previous < pagerAdapter.count) { if (homeMenu.isDrawerOpen(GravityCompat.END)) { homeMenu.closeDrawers() } else { - mainPager!!.setCurrentItem(previous, true) + mainPager.setCurrentItem(previous, true) } } return true } KeyboardShortcutConstants.ACTION_NAVIGATION_NEXT_TAB -> { - val next = mainPager!!.currentItem + 1 - if (next >= pagerAdapter!!.count && DrawerLayoutAccessor.findDrawerWithGravity(homeMenu, Gravity.END) != null) { + val next = mainPager.currentItem + 1 + if (next >= pagerAdapter.count && DrawerLayoutAccessor.findDrawerWithGravity(homeMenu, Gravity.END) != null) { homeMenu.openDrawer(GravityCompat.END) setControlBarVisibleAnimate(true) } else if (next >= 0) { if (homeMenu.isDrawerOpen(GravityCompat.START)) { homeMenu.closeDrawers() } else { - mainPager!!.setCurrentItem(next, true) + mainPager.setCurrentItem(next, true) } } return true @@ -267,18 +268,16 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { when (keyCode) { KeyEvent.KEYCODE_MENU -> { - val drawer = homeMenu if (isDrawerOpen) { - drawer!!.closeDrawers() + homeMenu.closeDrawers() } else { - drawer!!.openDrawer(GravityCompat.START) + homeMenu.openDrawer(GravityCompat.START) } return true } KeyEvent.KEYCODE_BACK -> { - val drawer = homeMenu if (isDrawerOpen) { - drawer!!.closeDrawers() + homeMenu.closeDrawers() return true } } @@ -328,9 +327,9 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp drawerToggle = ActionBarDrawerToggle(this, homeMenu, R.string.open_accounts_dashboard, R.string.close_accounts_dashboard) - homeContent!!.setOnFitSystemWindowsListener(this) + homeContent.setOnFitSystemWindowsListener(this) pagerAdapter = SupportTabsAdapter(this, supportFragmentManager, mainTabs, tabColumns) - mainPager!!.adapter = pagerAdapter + mainPager.adapter = pagerAdapter mainTabs.setViewPager(mainPager) mainTabs.setOnPageChangeListener(this) mainTabs.setColumns(tabColumns) @@ -390,8 +389,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp override fun onStart() { super.onStart() multiSelectHandler.dispatchOnStart() - val resolver = contentResolver - resolver.registerContentObserver(Accounts.CONTENT_URI, true, accountChangeObserver) + AccountManager.get(this).addOnAccountsUpdatedListener(accountChangeObserver, null, false) bus.register(this) readStateManager.registerOnSharedPreferenceChangeListener(readStateChangeListener) @@ -404,17 +402,12 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp updateActionsButton() } - override fun onPause() { - super.onPause() - } - override fun onStop() { multiSelectHandler.dispatchOnStop() readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener) bus.unregister(this) - val resolver = contentResolver - resolver.unregisterContentObserver(accountChangeObserver) - preferences.edit().putInt(SharedPreferenceConstants.KEY_SAVED_TAB_POSITION, mainPager!!.currentItem).apply() + AccountManager.get(this).removeOnAccountsUpdatedListener(accountChangeObserver) + preferences.edit().putInt(SharedPreferenceConstants.KEY_SAVED_TAB_POSITION, mainPager.currentItem).apply() super.onStop() } @@ -504,18 +497,18 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp if (mainTabs == null || updateUnreadCountTask != null && updateUnreadCountTask!!.status == AsyncTask.Status.RUNNING) return updateUnreadCountTask = UpdateUnreadCountTask(this, readStateManager, mainTabs, - pagerAdapter!!.tabs.toTypedArray()) + pagerAdapter.tabs.toTypedArray()) AsyncTaskUtils.executeTask(updateUnreadCountTask) mainTabs.setDisplayBadge(preferences.getBoolean(SharedPreferenceConstants.KEY_UNREAD_COUNT, true)) } val tabs: List - get() = pagerAdapter!!.tabs + get() = pagerAdapter.tabs override fun onNewIntent(intent: Intent) { val tabPosition = handleIntent(intent, false, false) if (tabPosition >= 0) { - mainPager!!.currentItem = TwidereMathUtils.clamp(tabPosition, pagerAdapter!!.count, 0) + mainPager.currentItem = TwidereMathUtils.clamp(tabPosition, pagerAdapter.count, 0) } } @@ -559,7 +552,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp return 1 - actionsButton.translationY / total } val totalHeight = controlBarHeight.toFloat() - return 1 + toolbar!!.translationY / totalHeight + return 1 + toolbar.translationY / totalHeight } override fun setControlBarOffset(offset: Float) { @@ -676,7 +669,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp var initialTab = -1 if (tabType != null) { val accountKey = uri?.getQueryParameter(QUERY_PARAM_ACCOUNT_KEY)?.convert(UserKey::valueOf) - val adapter = pagerAdapter!! + val adapter = pagerAdapter for (i in 0 until adapter.count) { val tab = adapter.getTab(i) if (tabType == Tab.getTypeAlias(tab.type)) { @@ -730,10 +723,10 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp private fun setTabPosition(initialTab: Int) { val rememberPosition = preferences.getBoolean(SharedPreferenceConstants.KEY_REMEMBER_POSITION, true) if (initialTab >= 0) { - mainPager!!.currentItem = TwidereMathUtils.clamp(initialTab, pagerAdapter!!.count, 0) + mainPager.currentItem = TwidereMathUtils.clamp(initialTab, pagerAdapter.count, 0) } else if (rememberPosition) { val position = preferences.getInt(SharedPreferenceConstants.KEY_SAVED_TAB_POSITION, 0) - mainPager!!.currentItem = TwidereMathUtils.clamp(position, pagerAdapter!!.count, 0) + mainPager.currentItem = TwidereMathUtils.clamp(position, pagerAdapter.count, 0) } } @@ -745,11 +738,11 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp } private fun setupHomeTabs() { - pagerAdapter!!.clear() - pagerAdapter!!.addTabs(CustomTabUtils.getHomeTabs(this)) - val hasNoTab = pagerAdapter!!.count == 0 + pagerAdapter.clear() + pagerAdapter.addTabs(CustomTabUtils.getHomeTabs(this)) + val hasNoTab = pagerAdapter.count == 0 emptyTabHint.visibility = if (hasNoTab) View.VISIBLE else View.GONE - mainPager!!.visibility = if (hasNoTab) View.GONE else View.VISIBLE + mainPager.visibility = if (hasNoTab) View.GONE else View.VISIBLE // mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount() / 2); } @@ -784,10 +777,9 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp } private fun triggerActionsClick() { - if (mainPager == null || pagerAdapter == null) return - val position = mainPager!!.currentItem - if (pagerAdapter!!.count == 0) return - val tab = pagerAdapter!!.getTab(position) + val position = mainPager.currentItem + if (pagerAdapter.count == 0) return + val tab = pagerAdapter.getTab(position) if (DirectMessagesFragment::class.java == tab.cls) { IntentUtils.openMessageConversation(this, null, null) } else if (MessagesEntriesFragment::class.java == tab.cls) { @@ -800,12 +792,11 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp } private fun updateActionsButton() { - if (mainPager == null || pagerAdapter == null) return val icon: Int val title: Int - val position = mainPager!!.currentItem - if (pagerAdapter!!.count == 0) return - val tab = pagerAdapter!!.getTab(position) + val position = mainPager.currentItem + if (pagerAdapter.count == 0) return + val tab = pagerAdapter.getTab(position) if (DirectMessagesFragment::class.java == tab.cls) { icon = R.drawable.ic_action_add title = R.string.new_direct_message @@ -823,15 +814,11 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp actionsButton.contentDescription = getString(title) } - private class AccountChangeObserver(private val mActivity: HomeActivity, handler: Handler) : ContentObserver(handler) { + private class AccountChangeObserver(private val activity: HomeActivity) : OnAccountsUpdateListener { - override fun onChange(selfChange: Boolean) { - onChange(selfChange, null) - } - - override fun onChange(selfChange: Boolean, uri: Uri?) { - mActivity.notifyAccountsChanged() - mActivity.updateUnreadCount() + override fun onAccountsUpdated(accounts: Array?) { + activity.notifyAccountsChanged() + activity.updateUnreadCount() } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/PlusServiceDashboardActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/PlusServiceDashboardActivity.kt index fa22da244..16d419160 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/PlusServiceDashboardActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/PlusServiceDashboardActivity.kt @@ -81,7 +81,7 @@ class PlusServiceDashboardActivity : BaseActivity() { override fun loadInBackground(): List { val context = context val intent = Intent(INTENT_ACTION_PLUS_SERVICE_SIGN_IN) - intent.setPackage(context.packageName) + intent.`package` = context.packageName val pm = context.packageManager return pm.queryIntentActivities(intent, PackageManager.GET_META_DATA) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt index 8849ed8a5..112710ead 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt @@ -116,7 +116,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec private val onScrollListener = object : OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { - val layoutManager = layoutManager ?: return + val layoutManager = layoutManager saveReadPosition(layoutManager.findFirstVisibleItemPosition()) } } @@ -147,7 +147,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec position = recyclerView!!.getChildLayoutPosition(focusedChild) } if (position != RecyclerView.NO_POSITION) { - val activity = adapter!!.getActivity(position) ?: return false + val activity = adapter.getActivity(position) ?: return false if (keyCode == KeyEvent.KEYCODE_ENTER) { openActivity(activity) return true @@ -233,11 +233,11 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec val tag = currentReadPositionTag val layoutManager = layoutManager if (readFromBottom) { - lastVisiblePos = layoutManager!!.findLastVisibleItemPosition() + lastVisiblePos = layoutManager.findLastVisibleItemPosition() } else { - lastVisiblePos = layoutManager!!.findFirstVisibleItemPosition() + lastVisiblePos = layoutManager.findFirstVisibleItemPosition() } - if (lastVisiblePos != RecyclerView.NO_POSITION && lastVisiblePos < adapter!!.itemCount) { + if (lastVisiblePos != RecyclerView.NO_POSITION && lastVisiblePos < adapter.itemCount) { val activityStartIndex = adapter.activityStartIndex val activityEndIndex = activityStartIndex + adapter.activityCount val lastItemIndex = Math.min(activityEndIndex, lastVisiblePos) @@ -251,7 +251,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec lastReadId = -1 lastVisibleTop = 0 } - adapter!!.setData(data) + adapter.setData(data) val activityStartIndex = adapter.activityStartIndex // The last activity is activityEndExclusiveIndex - 1 val activityEndExclusiveIndex = activityStartIndex + adapter.activityCount @@ -304,7 +304,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec } override fun onGapClick(holder: GapViewHolder, position: Int) { - val activity = adapter?.getActivity(position) ?: return + val activity = adapter.getActivity(position) ?: return if (BuildConfig.DEBUG) { Log.v(TwidereConstants.LOGTAG, "Load activity gap $activity") } @@ -315,7 +315,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec } override fun onMediaClick(holder: IStatusViewHolder, view: View, media: ParcelableMedia, position: Int) { - val adapter = adapter ?: return + val adapter = adapter val status = adapter.getActivity(position)?.getActivityStatus() ?: return IntentUtils.openMedia(activity, status, media, null, preferences.getBoolean(KEY_NEW_DOCUMENT_API)) // BEGIN HotMobi @@ -350,7 +350,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec } override fun onActivityClick(holder: ActivityTitleSummaryViewHolder, position: Int) { - val activity = adapter!!.getActivity(position) ?: return + val activity = adapter.getActivity(position) ?: return val list = ArrayList() if (activity.target_object_statuses?.isNotEmpty() ?: false) { list.addAll(activity.target_object_statuses) @@ -363,7 +363,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec override fun onStatusMenuClick(holder: IStatusViewHolder, menuView: View, position: Int) { if (activity == null) return - val lm = layoutManager ?: return + val lm = layoutManager val view = lm.findViewByPosition(position) ?: return if (lm.getItemViewType(view) != ITEM_VIEW_TYPE_STATUS) { return @@ -377,7 +377,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec } private fun getActivityStatus(position: Int): ParcelableStatus? { - return adapter?.getActivity(position)?.getActivityStatus() + return adapter.getActivity(position)?.getActivityStatus() } override fun onStart() { @@ -437,9 +437,9 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec scrollListener!!.reversed = preferences.getBoolean(KEY_READ_FROM_BOTTOM) val adapter = adapter val layoutManager = layoutManager - adapter!!.setListener(this) + adapter.setListener(this) registerForContextMenu(recyclerView) - navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager!!, adapter, + navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter, this) pauseOnScrollListener = PauseRecyclerViewOnScrollListener(adapter.mediaLoader.imageLoader, false, true) @@ -453,8 +453,8 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec get() { val lm = layoutManager val adapter = adapter - val lastPosition = lm!!.findLastCompletelyVisibleItemPosition() - val itemCount = adapter!!.itemCount + val lastPosition = lm.findLastCompletelyVisibleItemPosition() + val itemCount = adapter.itemCount var finalPos = itemCount - 1 for (i in lastPosition + 1..itemCount - 1) { if (adapter.getItemViewType(i) != ParcelableActivitiesAdapter.ITEM_VIEW_TYPE_EMPTY) { @@ -476,7 +476,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec protected val adapterData: List? get() { - return adapter?.getData() + return adapter.getData() } protected open val readPositionTag: String? @@ -493,7 +493,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec protected fun saveReadPosition(position: Int) { if (host == null) return if (position == RecyclerView.NO_POSITION) return - val item = adapter!!.getActivity(position) ?: return + val item = adapter.getActivity(position) ?: return var positionUpdated = false readPositionTag?.let { for (accountKey in accountKeys) { @@ -524,7 +524,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec val inflater = MenuInflater(context) val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo? val position = contextMenuInfo!!.position - when (adapter!!.getItemViewType(position)) { + when (adapter.getItemViewType(position)) { ITEM_VIEW_TYPE_STATUS -> { val status = getActivityStatus(position) ?: return inflater.inflate(R.menu.action_status, menu) @@ -540,7 +540,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec val contextMenuInfo = item!!.menuInfo as ExtendedRecyclerView.ContextMenuInfo val position = contextMenuInfo.position - when (adapter!!.getItemViewType(position)) { + when (adapter.getItemViewType(position)) { ITEM_VIEW_TYPE_STATUS -> { val status = getActivityStatus(position) ?: return false if (item.itemId == R.id.share) { @@ -559,7 +559,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec override fun createItemDecoration(context: Context, recyclerView: RecyclerView, layoutManager: LinearLayoutManager): RecyclerView.ItemDecoration? { - val adapter = adapter!! + val adapter = adapter val itemDecoration = object : DividerItemDecoration(context, (recyclerView.layoutManager as LinearLayoutManager).orientation) { override fun isDividerEnabled(childPos: Int): Boolean { @@ -602,7 +602,7 @@ abstract class AbsActivitiesFragment protected constructor() : AbsContentListRec @Subscribe fun notifyStatusListChanged(event: StatusListChangedEvent) { - adapter!!.notifyDataSetChanged() + adapter.notifyDataSetChanged() } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentListRecyclerViewFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentListRecyclerViewFragment.kt index 7ceaa5b54..41be66f75 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentListRecyclerViewFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentListRecyclerViewFragment.kt @@ -51,7 +51,7 @@ abstract class AbsContentListRecyclerViewFragment= lm.itemCount - 1 } override val reachingStart: Boolean get() { - val lm = layoutManager ?: return false + val lm = layoutManager return lm.findFirstCompletelyVisibleItemPosition() <= 0 } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentRecyclerViewFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentRecyclerViewFragment.kt index 1e7a11c66..914555af1 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentRecyclerViewFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsContentRecyclerViewFragment.kt @@ -46,9 +46,10 @@ import org.mariotaku.twidere.view.iface.IExtendedView abstract class AbsContentRecyclerViewFragment, L : RecyclerView.LayoutManager> : BaseSupportFragment(), SwipeRefreshLayout.OnRefreshListener, HeaderDrawerLayout.DrawerCallback, RefreshScrollTopInterface, IControlBarActivity.ControlBarOffsetListener, ContentScrollHandler.ContentListSupport, ControlBarShowHideHelper.ControlBarAnimationListener { - var layoutManager: L? = null - private set - override var adapter: A? = null + lateinit var layoutManager: L + protected set + override lateinit var adapter: A + protected set var itemDecoration: ItemDecoration? = null private set @@ -110,7 +111,7 @@ abstract class AbsContentRecyclerViewFragment actionBar.height - val manager = layoutManager!! + val manager = layoutManager if (manager.childCount == 0) return val firstView = manager.getChildAt(0) if (manager.getPosition(firstView) != 0) { @@ -138,7 +139,7 @@ abstract class AbsContentRecyclerViewFragment? get() { - return adapter?.getData() + return adapter.getData() } set(data) { - adapter?.setData(data) + adapter.setData(data) } protected open val readPositionTag: String? @@ -170,10 +170,10 @@ abstract class AbsStatusesFragment protected constructor() : override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) scrollListener?.reversed = preferences.getBoolean(SharedPreferenceConstants.KEY_READ_FROM_BOTTOM) - val adapter = adapter!! + val adapter = adapter adapter.statusClickListener = this registerForContextMenu(recyclerView) - navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager!!, adapter, this) + navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter, this) pauseOnScrollListener = PauseRecyclerViewOnScrollListener(adapter.mediaLoader.imageLoader, false, true) if (shouldInitLoader) { @@ -224,7 +224,7 @@ abstract class AbsStatusesFragment protected constructor() : override fun onDestroy() { val adapter = adapter - adapter!!.statusClickListener = null + adapter.statusClickListener = null super.onDestroy() } @@ -245,7 +245,7 @@ abstract class AbsStatusesFragment protected constructor() : position = recyclerView.getChildLayoutPosition(focusedChild) } if (position != -1) { - val status = adapter!!.getStatus(position) ?: return false + val status = adapter.getStatus(position) ?: return false if (keyCode == KeyEvent.KEYCODE_ENTER) { IntentUtils.openStatus(activity, status, null) return true @@ -316,7 +316,7 @@ abstract class AbsStatusesFragment protected constructor() : } override fun onLoadFinished(loader: Loader?>, data: List?) { - val adapter = adapter ?: return + val adapter = adapter val rememberPosition = preferences.getBoolean(SharedPreferenceConstants.KEY_REMEMBER_POSITION, false) val readFromBottom = preferences.getBoolean(SharedPreferenceConstants.KEY_READ_FROM_BOTTOM, false) var lastReadPositionKey: Long @@ -325,9 +325,9 @@ abstract class AbsStatusesFragment protected constructor() : val tag = currentReadPositionTag val layoutManager = layoutManager if (readFromBottom) { - lastVisiblePos = layoutManager!!.findLastVisibleItemPosition() + lastVisiblePos = layoutManager.findLastVisibleItemPosition() } else { - lastVisiblePos = layoutManager!!.findFirstVisibleItemPosition() + lastVisiblePos = layoutManager.findFirstVisibleItemPosition() } if (lastVisiblePos != RecyclerView.NO_POSITION && lastVisiblePos < adapter.itemCount) { val statusStartIndex = adapter.statusStartIndex @@ -397,7 +397,7 @@ abstract class AbsStatusesFragment protected constructor() : override fun onGapClick(holder: GapViewHolder, position: Int) { - val adapter = this.adapter ?: return + val adapter = this.adapter val status = adapter.getStatus(position) ?: return if (BuildConfig.DEBUG) { Log.v(TwidereConstants.LOGTAG, "Load activity gap " + status) @@ -410,7 +410,7 @@ abstract class AbsStatusesFragment protected constructor() : } override fun onMediaClick(holder: IStatusViewHolder, view: View, media: ParcelableMedia, statusPosition: Int) { - val adapter = adapter ?: return + val adapter = adapter val status = adapter.getStatus(statusPosition) ?: return IntentUtils.openMedia(activity, status, media, null, preferences.getBoolean(SharedPreferenceConstants.KEY_NEW_DOCUMENT_API)) @@ -424,7 +424,7 @@ abstract class AbsStatusesFragment protected constructor() : override fun onItemActionClick(holder: RecyclerView.ViewHolder, id: Int, position: Int) { val context = context ?: return val adapter = adapter - val status = adapter!!.getStatus(position) ?: return + val status = adapter.getStatus(position) ?: return handleStatusActionClick(context, fragmentManager, twitterWrapper, holder as StatusViewHolder, status, id) } @@ -433,7 +433,7 @@ abstract class AbsStatusesFragment protected constructor() : val itemDecoration = DividerItemDecoration(context, (recyclerView.layoutManager as LinearLayoutManager).orientation) val res = context.resources - if (adapter!!.profileImageEnabled) { + if (adapter.profileImageEnabled) { val decorPaddingLeft = res.getDimensionPixelSize(R.dimen.element_spacing_normal) * 2 + res.getDimensionPixelSize(R.dimen.icon_size_status_profile_image) itemDecoration.setPadding { position, rect -> val itemViewType = adapter.getItemViewType(position) @@ -464,7 +464,7 @@ abstract class AbsStatusesFragment protected constructor() : } override fun onStatusClick(holder: IStatusViewHolder, position: Int) { - IntentUtils.openStatus(activity, adapter!!.getStatus(position)!!, null) + IntentUtils.openStatus(activity, adapter.getStatus(position)!!, null) } override fun onStatusLongClick(holder: IStatusViewHolder, position: Int): Boolean { @@ -474,12 +474,12 @@ abstract class AbsStatusesFragment protected constructor() : override fun onItemMenuClick(holder: RecyclerView.ViewHolder, menuView: View, position: Int) { if (activity == null) return - val view = layoutManager?.findViewByPosition(position) ?: return + val view = layoutManager.findViewByPosition(position) ?: return recyclerView.showContextMenuForChild(view) } override fun onUserProfileClick(holder: IStatusViewHolder, position: Int) { - val status = adapter!!.getStatus(position) + val status = adapter.getStatus(position) val intent = IntentUtils.userProfile(status!!.account_key, status.user_key, status.user_screen_name, Referral.TIMELINE_STATUS, status.extras.user_statusnet_profile_url) @@ -511,7 +511,7 @@ abstract class AbsStatusesFragment protected constructor() : protected fun saveReadPosition(position: Int) { if (host == null) return if (position == RecyclerView.NO_POSITION) return - val adapter = adapter ?: return + val adapter = adapter val status = adapter.getStatus(position) ?: return val positionKey = if (status.position_key > 0) status.position_key else status.timestamp readPositionTagWithArguments?.let { @@ -537,7 +537,7 @@ abstract class AbsStatusesFragment protected constructor() : val adapter = adapter val inflater = MenuInflater(context) val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo? - val status = adapter!!.getStatus(contextMenuInfo!!.position) + val status = adapter.getStatus(contextMenuInfo!!.position) inflater.inflate(R.menu.action_status, menu) MenuUtils.setupForStatus(context, preferences, menu, status!!, twitterWrapper) } @@ -545,7 +545,7 @@ abstract class AbsStatusesFragment protected constructor() : override fun onContextItemSelected(item: MenuItem?): Boolean { if (!userVisibleHint) return false val contextMenuInfo = item!!.menuInfo as ExtendedRecyclerView.ContextMenuInfo - val status = adapter!!.getStatus(contextMenuInfo.position) ?: return false + val status = adapter.getStatus(contextMenuInfo.position) ?: return false if (item.itemId == R.id.share) { val shareIntent = Utils.createStatusShareIntent(activity, status) val chooser = Intent.createChooser(shareIntent, getString(R.string.share_status)) @@ -572,7 +572,7 @@ abstract class AbsStatusesFragment protected constructor() : @Subscribe fun notifyStatusListChanged(event: StatusListChangedEvent) { - adapter?.notifyDataSetChanged() + adapter.notifyDataSetChanged() } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt index 2f519273e..9016048ae 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt @@ -20,11 +20,15 @@ package org.mariotaku.twidere.fragment import android.accounts.AccountManager +import android.accounts.OnAccountsUpdateListener import android.animation.Animator import android.animation.Animator.AnimatorListener import android.animation.AnimatorSet import android.animation.ObjectAnimator -import android.content.* +import android.content.ContentResolver +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.database.ContentObserver import android.graphics.Matrix @@ -58,7 +62,6 @@ import org.mariotaku.ktextension.convert import org.mariotaku.ktextension.setItemAvailability import org.mariotaku.ktextension.setMenuItemIcon import org.mariotaku.ktextension.setMenuItemTitle -import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.twidere.R import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.activity.* @@ -66,13 +69,13 @@ import org.mariotaku.twidere.annotation.AccountType import org.mariotaku.twidere.annotation.CustomTabType import org.mariotaku.twidere.annotation.Referral import org.mariotaku.twidere.constant.KeyboardShortcutConstants.* +import org.mariotaku.twidere.extension.setActivated import org.mariotaku.twidere.fragment.AccountsDashboardFragment.AccountsInfo import org.mariotaku.twidere.menu.AccountToggleProvider import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.SupportTabSpec import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.util.AccountUtils -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts import org.mariotaku.twidere.provider.TwidereDataStore.Drafts import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback @@ -139,7 +142,14 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks - if (item.groupId != AccountToggleProvider.MENU_GROUP) { + if (item.groupId == AccountToggleProvider.MENU_GROUP) { + val accounts = accountActionProvider!!.accounts + val account = accounts[item.order] + val newActivated = !account.activated + accountActionProvider!!.setAccountActivated(account.key, newActivated) + account.account.setActivated(AccountManager.get(context), newActivated) + return@OnMenuItemClickListener true + } else { when (item.itemId) { R.id.compose -> { val account = accountsAdapter!!.selectedAccount ?: return@OnMenuItemClickListener true @@ -150,18 +160,8 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks(context) { private var contentObserver: ContentObserver? = null + private var accountListener: OnAccountsUpdateListener? = null private var firstLoad: Boolean @@ -746,10 +747,13 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks + onContentChanged() + } + AccountManager.get(context).addOnAccountsUpdatedListener(accountListener, null, false) } if (takeContentChanged() || firstLoad) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsManagerFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsManagerFragment.kt index 81d5e5325..2b4735ffe 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsManagerFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsManagerFragment.kt @@ -1,5 +1,6 @@ package org.mariotaku.twidere.fragment +import android.accounts.Account import android.accounts.AccountManager import android.app.Activity import android.app.AlertDialog @@ -22,7 +23,9 @@ import org.mariotaku.twidere.activity.ColorPickerDialogActivity import org.mariotaku.twidere.activity.SignInActivity import org.mariotaku.twidere.adapter.AccountDetailsAdapter import org.mariotaku.twidere.annotation.Referral -import org.mariotaku.twidere.constant.SharedPreferenceConstants +import org.mariotaku.twidere.constant.IntentConstants +import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NEW_DOCUMENT_API +import org.mariotaku.twidere.extension.getAccountKey import org.mariotaku.twidere.extension.setActivated import org.mariotaku.twidere.extension.setColor import org.mariotaku.twidere.extension.setPosition @@ -33,6 +36,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.Inbox import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.Outbox import org.mariotaku.twidere.util.IntentUtils import org.mariotaku.twidere.util.Utils +import org.mariotaku.twidere.util.support.AccountManagerSupport /** * Sort and toggle account availability @@ -41,26 +45,33 @@ import org.mariotaku.twidere.util.Utils class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallbacks>, AdapterView.OnItemClickListener { - private var adapter: AccountDetailsAdapter? = null + private lateinit var adapter: AccountDetailsAdapter private var selectedAccount: AccountDetails? = null override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) setHasOptionsMenu(true) - val activity = activity - adapter = AccountDetailsAdapter(activity).apply { - Utils.configBaseAdapter(activity, this) + val am = AccountManager.get(context) + adapter = AccountDetailsAdapter(context).apply { + Utils.configBaseAdapter(context, this) setSortEnabled(true) setSwitchEnabled(true) accountToggleListener = { pos, checked -> - getItem(pos).activated = checked + val item = getItem(pos) + item.activated = checked + item.account.setActivated(am, checked) } } listView.adapter = adapter listView.isDragEnabled = true listView.onItemClickListener = this listView.setDropListener { from, to -> - adapter?.drop(from, to) + adapter.drop(from, to) + for (i in 0 until adapter.count) { + val item = adapter.getItem(i) + item.account.setActivated(am, item.activated) + item.account.setPosition(am, i) + } } listView.setOnCreateContextMenuListener(this) listView.emptyView = emptyView @@ -101,9 +112,8 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb override fun onContextItemSelected(item: MenuItem?): Boolean { val menuInfo = item!!.menuInfo as? AdapterContextMenuInfo ?: return false - val details = adapter!!.getItem(menuInfo.position) + val details = adapter.getItem(menuInfo.position) ?: return false selectedAccount = details - if (details == null) return false when (item.itemId) { R.id.set_color -> { val intent = Intent(activity, ColorPickerDialogActivity::class.java) @@ -123,18 +133,11 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb } override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) { - val account = adapter!!.getItem(position) - IntentUtils.openUserProfile(context, account.user, null, - preferences.getBoolean(SharedPreferenceConstants.KEY_NEW_DOCUMENT_API), + val account = adapter.getItem(position) + IntentUtils.openUserProfile(context, account.user, null, preferences.getBoolean(KEY_NEW_DOCUMENT_API), Referral.SELF_PROFILE) } - override fun onStop() { - super.onStop() - saveActivatedState() - saveAccountPositions() - } - override fun onCreateLoader(id: Int, args: Bundle?): Loader> { return AccountDetailsLoader(context) } @@ -144,27 +147,17 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb } override fun onLoadFinished(loader: Loader>, data: List) { - adapter?.apply { + adapter.apply { clear() addAll(data) } setListShown(true) } - private fun saveActivatedState() { - val am = AccountManager.get(context) - adapter?.let { adapter -> - for (i in 0 until adapter.count) { - val item = adapter.getItem(i) - item.account.setActivated(am, item.activated) - } - } - } - override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenuInfo) { if (menuInfo !is AdapterContextMenuInfo) return - val account = adapter!!.getItem(menuInfo.position) - menu.setHeaderTitle(account!!.user.name) + val account = adapter.getItem(menuInfo.position)!! + menu.setHeaderTitle(account.user.name) val inflater = MenuInflater(v.context) inflater.inflate(R.menu.action_manager_account, menu) } @@ -178,25 +171,18 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb progressContainer.visibility = if (shown) View.GONE else View.VISIBLE } - private fun saveAccountPositions() { - val am = AccountManager.get(context) - adapter?.let { adapter -> - for (i in 0 until adapter.count) { - adapter.getItem(i).account.setPosition(am, i) - } - } - } - class AccountDeletionDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener { override fun onClick(dialog: DialogInterface, which: Int) { - val id = arguments.getLong(EXTRA_ID) + val account: Account = arguments.getParcelable(IntentConstants.EXTRA_ACCOUNT) val resolver = context.contentResolver + val am = AccountManager.get(context) when (which) { DialogInterface.BUTTON_POSITIVE -> { - val where = Expression.equalsArgs(Accounts._ID).sql - val whereArgs = arrayOf(id.toString()) - resolver.delete(Accounts.CONTENT_URI, where, whereArgs) + val accountKey = account.getAccountKey(am) + AccountManagerSupport.removeAccount(am, account, activity, null, null) + val where = Expression.equalsArgs(AccountSupportColumns.ACCOUNT_KEY).sql + val whereArgs = arrayOf(accountKey.toString()) // Also delete tweets related to the account we previously // deleted. resolver.delete(Statuses.CONTENT_URI, where, whereArgs) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt index 5033c882b..e87a50930 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt @@ -19,6 +19,8 @@ package org.mariotaku.twidere.fragment +import android.accounts.AccountManager +import android.accounts.OnAccountsUpdateListener import android.content.Context import android.database.ContentObserver import android.database.Cursor @@ -38,7 +40,8 @@ import org.mariotaku.twidere.constant.IntentConstants.EXTRA_FROM_USER import org.mariotaku.twidere.loader.ExtendedObjectCursorLoader import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.message.* -import org.mariotaku.twidere.provider.TwidereDataStore.* +import org.mariotaku.twidere.provider.TwidereDataStore.Activities +import org.mariotaku.twidere.provider.TwidereDataStore.Filters import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.DataStoreUtils.getTableNameByUri import org.mariotaku.twidere.util.ErrorInfoStore @@ -53,7 +56,7 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { override fun onLoadingFinished() { val accountKeys = accountKeys val adapter = adapter - if (adapter!!.itemCount > 0) { + if (adapter.itemCount > 0) { showContent() } else if (accountKeys.isNotEmpty()) { val errorInfo = ErrorInfoStore.getErrorInfo(context, @@ -71,6 +74,7 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { protected abstract val errorInfoKey: String private var contentObserver: ContentObserver? = null + private var accountListener: OnAccountsUpdateListener? = null abstract val contentUri: Uri @@ -96,7 +100,7 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { } val expression = processWhere(where, accountSelectionArgs) val selection = expression.sql - val adapter = adapter!! + val adapter = adapter adapter.showAccountsColor = accountKeys.size > 1 val projection = Activities.COLUMNS return CursorActivitiesLoader(context, uri, projection, selection, expression.parameters, @@ -108,28 +112,30 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { } override val accountKeys: Array - get() { - val accountKeys = Utils.getAccountKeys(context, arguments) - if (accountKeys != null) { - return accountKeys - } - return DataStoreUtils.getActivatedAccountKeys(context) - } + get() = Utils.getAccountKeys(context, arguments) ?: DataStoreUtils.getActivatedAccountKeys(context) override fun onStart() { super.onStart() - val cr = contentResolver contentObserver = object : ContentObserver(Handler()) { override fun onChange(selfChange: Boolean) { reloadActivities() } } - cr.registerContentObserver(Accounts.CONTENT_URI, true, contentObserver!!) - cr.registerContentObserver(Filters.CONTENT_URI, true, contentObserver!!) + accountListener = OnAccountsUpdateListener { accounts -> + reloadActivities() + } + context.contentResolver.registerContentObserver(Filters.CONTENT_URI, true, contentObserver) + AccountManager.get(context).addOnAccountsUpdatedListener(accountListener, null, false) updateRefreshState() reloadActivities() } + override fun onStop() { + context.contentResolver.unregisterContentObserver(contentObserver) + AccountManager.get(context).removeOnAccountsUpdatedListener(accountListener) + super.onStop() + } + protected fun reloadActivities() { if (activity == null || isDetached) return val args = Bundle() @@ -141,18 +147,12 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { loaderManager.restartLoader(0, args, this) } - override fun onStop() { - val cr = contentResolver - cr.unregisterContentObserver(contentObserver!!) - super.onStop() - } - override fun hasMoreData(data: List?): Boolean { return data?.size != 0 } override fun onLoaderReset(loader: Loader>) { - adapter!!.setData(null) + adapter.setData(null) } override fun onLoadMoreContents(@IndicatorPosition position: Long) { @@ -259,7 +259,7 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { if (result == null) return val lm = layoutManager val adapter = adapter - val rangeStart = Math.max(adapter!!.activityStartIndex, lm!!.findFirstVisibleItemPosition()) + val rangeStart = Math.max(adapter.activityStartIndex, lm.findFirstVisibleItemPosition()) val rangeEnd = Math.min(lm.findLastVisibleItemPosition(), adapter.activityStartIndex + adapter.activityCount - 1) loop@ for (i in rangeStart..rangeEnd) { val activity = adapter.getActivity(i) @@ -310,7 +310,7 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { @Subscribe fun notifyStatusListChanged(event: StatusListChangedEvent) { - adapter!!.notifyDataSetChanged() + adapter.notifyDataSetChanged() } @Subscribe diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt index 1f02eaa2a..eeea4ccdb 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt @@ -19,27 +19,31 @@ package org.mariotaku.twidere.fragment +import android.accounts.AccountManager +import android.accounts.OnAccountsUpdateListener import android.content.Context import android.database.ContentObserver import android.net.Uri import android.os.Bundle import android.os.Handler import android.support.v4.content.Loader +import android.util.Log import com.squareup.otto.Subscribe import kotlinx.android.synthetic.main.fragment_content_recyclerview.* import org.mariotaku.sqliteqb.library.ArgsArray import org.mariotaku.sqliteqb.library.Columns.Column import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.twidere.R +import org.mariotaku.twidere.TwidereConstants.LOGTAG import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter -import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition import org.mariotaku.twidere.constant.IntentConstants.EXTRA_FROM_USER import org.mariotaku.twidere.loader.ExtendedObjectCursorLoader import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.message.* -import org.mariotaku.twidere.provider.TwidereDataStore.* +import org.mariotaku.twidere.provider.TwidereDataStore.Filters +import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.DataStoreUtils.buildStatusFilterWhereClause import org.mariotaku.twidere.util.DataStoreUtils.getTableNameByUri @@ -52,6 +56,7 @@ import org.mariotaku.twidere.util.Utils abstract class CursorStatusesFragment : AbsStatusesFragment() { private var contentObserver: ContentObserver? = null + private var accountListener: OnAccountsUpdateListener? = null abstract val errorInfoKey: String abstract val isFilterEnabled: Boolean @@ -67,13 +72,11 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { showContentOrError() } - override fun onCreateStatusesLoader(context: Context, - args: Bundle, - fromUser: Boolean): Loader?> { + override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean): Loader?> { val uri = contentUri val table = getTableNameByUri(uri) val sortOrder = Statuses.DEFAULT_SORT_ORDER - val accountKeys = accountKeys + val accountKeys = this.accountKeys val accountWhere = Expression.`in`(Column(Statuses.ACCOUNT_KEY), ArgsArray(accountKeys.size)) val filterWhere = getFiltersWhere(table) @@ -84,15 +87,14 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { where = accountWhere } val adapter = adapter - adapter!!.showAccountsColor = accountKeys.size > 1 + adapter.showAccountsColor = accountKeys.size > 1 val projection = Statuses.COLUMNS val selectionArgs = Array(accountKeys.size) { accountKeys[it].toString() } val expression = processWhere(where, selectionArgs) return ExtendedObjectCursorLoader(context, ParcelableStatusCursorIndices::class.java, uri, - projection, expression.sql, expression.parameters, - sortOrder, fromUser) + projection, expression.sql, expression.parameters, sortOrder, fromUser) } override fun createMessageBusCallback(): Any { @@ -102,7 +104,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { private fun showContentOrError() { val accountKeys = accountKeys - val adapter = adapter!! + val adapter = adapter if (adapter.itemCount > 0) { showContent() } else if (accountKeys.isNotEmpty()) { @@ -119,29 +121,30 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { } override val accountKeys: Array - get() { - val args = arguments - val accountKeys = Utils.getAccountKeys(context, args) - if (accountKeys != null) { - return accountKeys - } - return DataStoreUtils.getActivatedAccountKeys(context) - } + get() = Utils.getAccountKeys(context, arguments) ?: DataStoreUtils.getActivatedAccountKeys(context) override fun onStart() { super.onStart() - val cr = contentResolver contentObserver = object : ContentObserver(Handler()) { override fun onChange(selfChange: Boolean) { reloadStatuses() } } - cr.registerContentObserver(Accounts.CONTENT_URI, true, contentObserver!!) - cr.registerContentObserver(Filters.CONTENT_URI, true, contentObserver!!) + accountListener = OnAccountsUpdateListener { accounts -> + reloadStatuses() + } + context.contentResolver.registerContentObserver(Filters.CONTENT_URI, true, contentObserver) + AccountManager.get(context).addOnAccountsUpdatedListener(accountListener, null, false) updateRefreshState() reloadStatuses() } + override fun onStop() { + context.contentResolver.unregisterContentObserver(contentObserver) + AccountManager.get(context).removeOnAccountsUpdatedListener(accountListener) + super.onStop() + } + protected fun reloadStatuses() { if (context == null || isDetached) return val args = Bundle() @@ -153,11 +156,6 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { loaderManager.restartLoader(0, args, this) } - override fun onStop() { - contentResolver.unregisterContentObserver(contentObserver!!) - super.onStop() - } - override fun hasMoreData(data: List?): Boolean { return data?.size != 0 } @@ -167,7 +165,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { } override fun onLoaderReset(loader: Loader?>) { - adapter!!.setData(null) + adapter.setData(null) } override fun onLoadMoreContents(@IndicatorPosition position: Long) { @@ -272,9 +270,9 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { val status = event.status val data = adapterData if (status == null || data == null || data.isEmpty()) return - val adapter = adapter as ParcelableStatusesAdapter - val firstVisiblePosition = layoutManager!!.findFirstVisibleItemPosition() - val lastVisiblePosition = layoutManager!!.findLastVisibleItemPosition() + val adapter = adapter + val firstVisiblePosition = layoutManager.findFirstVisibleItemPosition() + val lastVisiblePosition = layoutManager.findLastVisibleItemPosition() val startIndex = adapter.statusStartIndex for (i in firstVisiblePosition..lastVisiblePosition) { if (status.account_key == adapter.getAccountKey(i) && status.id == adapter.getStatusId(i)) { @@ -294,7 +292,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { @Subscribe fun notifyStatusListChanged(event: StatusListChangedEvent) { - adapter!!.notifyDataSetChanged() + adapter.notifyDataSetChanged() } @Subscribe diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DirectMessagesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DirectMessagesFragment.kt index 67fb9910d..2fb6f1112 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DirectMessagesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/DirectMessagesFragment.kt @@ -19,6 +19,8 @@ package org.mariotaku.twidere.fragment +import android.accounts.AccountManager +import android.accounts.OnAccountsUpdateListener import android.content.Context import android.database.Cursor import android.os.AsyncTask @@ -55,18 +57,17 @@ import org.mariotaku.twidere.model.BaseRefreshTaskParam import org.mariotaku.twidere.model.RefreshTaskParam import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.message.GetMessagesTaskEvent -import org.mariotaku.twidere.provider.TwidereDataStore.* +import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.Inbox +import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback -import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver import java.util.* class DirectMessagesFragment : AbsContentListRecyclerViewFragment(), LoaderCallbacks, MessageEntriesAdapterListener, KeyboardShortcutCallback { // Listeners - private val reloadContentObserver = SupportFragmentReloadCursorObserver( - this, 0, this) + private var accountListener: OnAccountsUpdateListener? = null private var mRemoveUnreadCountsTask: RemoveUnreadCountsTask? = null private var mNavigationHelper: RecyclerViewNavigationHelper? = null @@ -129,8 +130,7 @@ class DirectMessagesFragment : AbsContentListRecyclerViewFragment) { - val adapter = adapter - adapter!!.setCursor(null) + adapter.setCursor(null) } override fun onEntryClick(position: Int, entry: DirectMessageEntry) { @@ -219,8 +218,7 @@ class DirectMessagesFragment : AbsContentListRecyclerViewFragment + + } + AccountManager.get(context).addOnAccountsUpdatedListener(accountListener, null, false) bus.register(this) - val adapter = adapter - adapter!!.updateReadState() + adapter.updateReadState() } override fun onStop() { bus.unregister(this) - contentResolver.unregisterContentObserver(reloadContentObserver) + AccountManager.get(context).removeOnAccountsUpdatedListener(accountListener) super.onStop() } @@ -350,7 +350,7 @@ class DirectMessagesFragment : AbsContentListRecyclerViewFragment(EXTRA_ACCOUNT_KEY) - val loader = IncomingFriendshipsLoader(context, accountKey, adapter!!.getData(), fromUser) + val loader = IncomingFriendshipsLoader(context, accountKey, adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader @@ -60,13 +60,13 @@ class IncomingFriendshipsFragment : CursorSupportUsersListFragment(), IUsersAdap override fun onAcceptClicked(holder: UserViewHolder, position: Int) { val adapter = adapter - val user = adapter!!.getUser(position) ?: return + val user = adapter.getUser(position) ?: return twitterWrapper.acceptFriendshipAsync(user.account_key, user.key) } override fun onDenyClicked(holder: UserViewHolder, position: Int) { val adapter = adapter - val user = adapter!!.getUser(position) ?: return + val user = adapter.getUser(position) ?: return twitterWrapper.denyFriendshipAsync(user.account_key, user.key) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt index 6a23efc2a..468ec7f0f 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt @@ -60,7 +60,7 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment?>, data: List<*>?) { - adapter!!.setData(data) + adapter.setData(data) } override fun onLoaderReset(loader: Loader?>) { - adapter!!.setData(null) + adapter.setData(null) } override var refreshing: Boolean @@ -117,7 +117,7 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment { val dummyAdapter = adapter.dummyAdapter val status = dummyAdapter.getStatus(contextMenuInfo.position) ?: return @@ -133,7 +133,7 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment { val dummyAdapter = adapter.dummyAdapter val status = dummyAdapter.getStatus(position) ?: return false diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/MutesUsersListFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/MutesUsersListFragment.kt index 633c70b11..e59a957c3 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/MutesUsersListFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/MutesUsersListFragment.kt @@ -32,7 +32,7 @@ class MutesUsersListFragment : CursorSupportUsersListFragment() { args: Bundle, fromUser: Boolean): CursorSupportUsersLoader { val accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY) - val loader = MutesUsersLoader(context, accountKey, adapter!!.getData(), fromUser) + val loader = MutesUsersLoader(context, accountKey, adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableGroupsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableGroupsFragment.kt index 3ebbbe27b..2d46a60ca 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableGroupsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableGroupsFragment.kt @@ -77,7 +77,7 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment?>, data: List?) { val adapter = adapter - adapter!!.setData(data) + adapter.setData(data) if (loader !is IExtendedLoader || loader.fromUser) { adapter.loadMoreSupportedPosition = if (hasMoreData(data)) ILoadMoreSupportAdapter.END else ILoadMoreSupportAdapter.NONE refreshEnabled = true @@ -107,7 +107,7 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment? - get() = adapter!!.getData() + get() = adapter.getData() override fun handleKeyboardShortcutSingle(handler: KeyboardShortcutsHandler, keyCode: Int, event: KeyEvent, metaState: Int): Boolean { return mNavigationHelper!!.handleKeyboardShortcutSingle(handler, keyCode, event, metaState) @@ -125,9 +125,9 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment 0) { + if (adapter.itemCount > 0) { showContent() } else if (loader is MicroBlogAPIStatusesLoader) { val e = loader.exception @@ -151,7 +151,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { if (position == 0L) return val adapter = adapter // Load the last item - val idx = adapter!!.statusStartIndex + adapter.rawStatusCount - 1 + val idx = adapter.statusStartIndex + adapter.rawStatusCount - 1 if (idx < 0) return val status = adapter.getStatus(idx) ?: return val accountKeys = arrayOf(status.account_key) @@ -166,7 +166,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { if (status == null) return val lm = layoutManager val adapter = adapter - val rangeStart = Math.max(adapter!!.statusStartIndex, lm!!.findFirstVisibleItemPosition()) + val rangeStart = Math.max(adapter.statusStartIndex, lm.findFirstVisibleItemPosition()) val rangeEnd = Math.min(lm.findLastVisibleItemPosition(), adapter.statusStartIndex + adapter.statusCount - 1) for (i in rangeStart..rangeEnd) { val item = adapter.getStatus(i) @@ -183,7 +183,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { override fun triggerRefresh(): Boolean { super.triggerRefresh() - val adapter = adapter ?: return false + val adapter = adapter val accountKeys = accountKeys if (adapter.statusCount > 0) { val firstStatus = adapter.getStatus(0)!! @@ -251,7 +251,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { @Subscribe fun notifyStatusListChanged(event: StatusListChangedEvent) { - adapter!!.notifyDataSetChanged() + adapter.notifyDataSetChanged() } @Subscribe diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUserListsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUserListsFragment.kt index 6b823fd4a..d162d00f2 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUserListsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUserListsFragment.kt @@ -79,7 +79,7 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment< override fun onLoadFinished(loader: Loader>, data: List) { val adapter = adapter - adapter!!.setData(data) + adapter.setData(data) if (loader !is IExtendedLoader || loader.fromUser) { adapter.loadMoreSupportedPosition = if (hasMoreData(data)) ILoadMoreSupportAdapter.END else ILoadMoreSupportAdapter.NONE refreshEnabled = true @@ -113,7 +113,7 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment< } val data: List? - get() = adapter!!.getData() + get() = adapter.getData() override fun handleKeyboardShortcutSingle(handler: KeyboardShortcutsHandler, keyCode: Int, event: KeyEvent, metaState: Int): Boolean { return navigationHelper!!.handleKeyboardShortcutSingle(handler, keyCode, event, metaState) @@ -131,9 +131,9 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment< super.onActivityCreated(savedInstanceState) val adapter = adapter val layoutManager = layoutManager - adapter!!.userListClickListener = this + adapter.userListClickListener = this - navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager!!, adapter, + navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter, this) val loaderArgs = Bundle(arguments) loaderArgs.putBoolean(EXTRA_FROM_USER, true) @@ -153,7 +153,7 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment< } override fun onUserListClick(holder: UserListViewHolder, position: Int) { - val userList = adapter!!.getUserList(position) ?: return + val userList = adapter.getUserList(position) ?: return IntentUtils.openUserListDetails(activity, userList) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt index 7828e29bf..00a72df89 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt @@ -63,10 +63,10 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment?>, data: List?) { - val adapter = adapter ?: return + val adapter = adapter adapter.setData(data) if (loader !is IExtendedLoader || loader.fromUser) { adapter.loadMoreSupportedPosition = if (hasMoreData(data)) ILoadMoreSupportAdapter.END else ILoadMoreSupportAdapter.NONE @@ -142,13 +142,13 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment= data.size) return diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SearchUsersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SearchUsersFragment.kt index 550260baa..a3502de83 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SearchUsersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/SearchUsersFragment.kt @@ -45,7 +45,7 @@ class SearchUsersFragment : ParcelableUsersFragment() { val accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY) val query = args.getString(EXTRA_QUERY) val page = args.getInt(EXTRA_PAGE, 1) - return UserSearchLoader(context, accountKey, query, page, adapter!!.getData(), fromUser) + return UserSearchLoader(context, accountKey, query, page, adapter.getData(), fromUser) } override fun onLoadFinished(loader: Loader?>, data: List?) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFavoritersListFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFavoritersListFragment.kt index 8f083e71b..fbfe5d90e 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFavoritersListFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFavoritersListFragment.kt @@ -33,7 +33,7 @@ class StatusFavoritersListFragment : CursorSupportUsersListFragment() { val accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY) val statusId = args.getString(EXTRA_STATUS_ID) val loader = StatusFavoritersLoader(context, accountKey, - statusId, adapter!!.getData(), false) + statusId, adapter.getData(), false) loader.cursor = nextCursor loader.page = nextPage return loader diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusRetweetersListFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusRetweetersListFragment.kt index ee5b762e0..7a0d0fc32 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusRetweetersListFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusRetweetersListFragment.kt @@ -35,7 +35,7 @@ class StatusRetweetersListFragment : CursorSupportUsersListFragment() { val accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY) val statusId = args.getString(EXTRA_STATUS_ID) val loader = StatusRetweetersLoader(context, accountKey, statusId, - adapter!!.getData(), fromUser) + adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserBlocksListFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserBlocksListFragment.kt index c5a8a5423..0b6ec188e 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserBlocksListFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserBlocksListFragment.kt @@ -33,7 +33,7 @@ class UserBlocksListFragment : CursorSupportUsersListFragment() { args: Bundle, fromUser: Boolean): CursorSupportUsersLoader { val accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY) - val loader = UserBlocksLoader(context, accountKey, adapter!!.getData(), fromUser) + val loader = UserBlocksLoader(context, accountKey, adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFollowersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFollowersFragment.kt index 04e8e83fc..4a6bc59a5 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFollowersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFollowersFragment.kt @@ -36,7 +36,7 @@ class UserFollowersFragment : CursorSupportUsersListFragment() { val userKey = args.getParcelable(EXTRA_USER_KEY) val screenName = args.getString(EXTRA_SCREEN_NAME) val loader = UserFollowersLoader(context, accountKey, userKey, screenName, - adapter!!.getData(), fromUser) + adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt index bc5289df4..51731afa0 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt @@ -1322,7 +1322,7 @@ class UserFragment : BaseSupportFragment(), OnClickListener, OnLinkClickListener private fun setupBaseActionBar() { val activity = activity as? LinkHandlerActivity ?: return val actionBar = activity.supportActionBar ?: return - val shadow = ResourcesCompat.getDrawable(activity.getResources(), R.drawable.shadow_user_banner_action_bar, null) + val shadow = ResourcesCompat.getDrawable(activity.resources, R.drawable.shadow_user_banner_action_bar, null) mActionBarBackground = ActionBarDrawable(shadow!!) if (!ThemeUtils.isWindowFloating(activity) && ThemeUtils.isTransparentBackground(activity.currentThemeBackgroundOption)) { // mActionBarBackground.setAlpha(ThemeUtils.getActionBarAlpha(linkHandler.getCurrentThemeBackgroundAlpha())); diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFriendsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFriendsFragment.kt index be5495ccc..c783440a0 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFriendsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFriendsFragment.kt @@ -35,7 +35,7 @@ class UserFriendsFragment : CursorSupportUsersListFragment() { val userKey = args.getParcelable(EXTRA_USER_KEY) val screenName = args.getString(EXTRA_SCREEN_NAME) val loader = UserFriendsLoader(context, accountKey, userKey, - screenName, adapter!!.getData(), fromUser) + screenName, adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListMembersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListMembersFragment.kt index ae58c96dd..363aa1ded 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListMembersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListMembersFragment.kt @@ -50,7 +50,7 @@ class UserListMembersFragment : CursorSupportUsersListFragment() { val screenName = args.getString(EXTRA_SCREEN_NAME) val listName = args.getString(EXTRA_LIST_NAME) val loader = UserListMembersLoader(context, accountId, listId, - userKey, screenName, listName, adapter!!.getData(), fromUser) + userKey, screenName, listName, adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader @@ -91,7 +91,7 @@ class UserListMembersFragment : CursorSupportUsersListFragment() { val inflater = MenuInflater(context) val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo? inflater.inflate(R.menu.action_user_list_member, menu) - val user = adapter!!.getUser(contextMenuInfo!!.position) + val user = adapter.getUser(contextMenuInfo!!.position) menu.setHeaderTitle(userColorNameManager.getDisplayName(user, preferences.getBoolean(KEY_NAME_FIRST))) } @@ -99,7 +99,7 @@ class UserListMembersFragment : CursorSupportUsersListFragment() { if (!userVisibleHint) return false val userList = userList ?: return false val contextMenuInfo = item!!.menuInfo as ExtendedRecyclerView.ContextMenuInfo - val user = adapter!!.getUser(contextMenuInfo.position) ?: return false + val user = adapter.getUser(contextMenuInfo.position) ?: return false when (item.itemId) { R.id.delete_from_list -> { DeleteUserListMembersDialogFragment.show(fragmentManager, userList, user) @@ -134,7 +134,7 @@ class UserListMembersFragment : CursorSupportUsersListFragment() { UserListMembersChangedEvent.Action.ADDED -> { val adapter = adapter val newUsers = Arrays.asList(*event.users) - val users = adapter!!.getData() ?: return + val users = adapter.getData() ?: return if (users is MutableList) { users.removeAll(newUsers) users.addAll(0, newUsers) @@ -145,7 +145,7 @@ class UserListMembersFragment : CursorSupportUsersListFragment() { UserListMembersChangedEvent.Action.REMOVED -> { val adapter = adapter val removedUsers = Arrays.asList(*event.users) - val users = adapter!!.getData() ?: return + val users = adapter.getData() ?: return if (users is MutableList) { users.removeAll(removedUsers) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListSubscribersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListSubscribersFragment.kt index 888aacf45..3d1842521 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListSubscribersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserListSubscribersFragment.kt @@ -35,7 +35,7 @@ class UserListSubscribersFragment : CursorSupportUsersListFragment() { val screenName = args.getString(EXTRA_SCREEN_NAME) val listName = args.getString(EXTRA_LIST_NAME) val loader = UserListSubscribersLoader(context, accountKey, - listId, userKey, screenName, listName, adapter!!.getData(), fromUser) + listId, userKey, screenName, listName, adapter.getData(), fromUser) loader.cursor = nextCursor loader.page = nextPage return loader diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserMediaTimelineFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserMediaTimelineFragment.kt index c4190440d..0e4dd5328 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserMediaTimelineFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserMediaTimelineFragment.kt @@ -32,7 +32,7 @@ import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder class UserMediaTimelineFragment : AbsContentRecyclerViewFragment(), LoaderCallbacks>, DrawerCallback, IStatusViewHolder.StatusClickListener { override fun scrollToPositionWithOffset(position: Int, offset: Int) { - layoutManager!!.scrollToPositionWithOffset(position, offset) + layoutManager.scrollToPositionWithOffset(position, offset) } override var refreshing: Boolean @@ -48,7 +48,7 @@ class UserMediaTimelineFragment : AbsContentRecyclerViewFragment>, data: List?) { val adapter = adapter - val changed = adapter!!.setData(data) + val changed = adapter.setData(data) if ((loader as IExtendedLoader).fromUser && loader is MediaTimelineLoader) { val maxId = loader.maxId val sinceId = loader.sinceId @@ -118,19 +118,19 @@ class UserMediaTimelineFragment : AbsContentRecyclerViewFragment>) { - adapter!!.setData(null) + adapter.setData(null) } override val reachingEnd: Boolean get() { val lm = layoutManager - return ArrayUtils.contains(lm!!.findLastCompletelyVisibleItemPositions(null), lm.itemCount - 1) + return ArrayUtils.contains(lm.findLastCompletelyVisibleItemPositions(null), lm.itemCount - 1) } override val reachingStart: Boolean get() { val lm = layoutManager - return ArrayUtils.contains(lm!!.findFirstCompletelyVisibleItemPositions(null), 0) + return ArrayUtils.contains(lm.findFirstCompletelyVisibleItemPositions(null), 0) } override fun onLoadMoreContents(position: Long) { @@ -138,7 +138,7 @@ class UserMediaTimelineFragment : AbsContentRecyclerViewFragment?>, data: List?) { val timelineLoader = loader as UserTimelineLoader - val adapter = adapter!! + val adapter = adapter if (!adapter.hasPinnedStatuses) { adapter.pinnedStatuses = timelineLoader.pinnedStatuses } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt index e9b635920..fade2ca03 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/service/StreamingService.kt @@ -1,16 +1,13 @@ package org.mariotaku.twidere.service import android.accounts.AccountManager +import android.accounts.OnAccountsUpdateListener import android.app.NotificationManager import android.app.PendingIntent import android.app.Service -import android.content.ContentResolver import android.content.ContentValues import android.content.Context import android.content.Intent -import android.database.ContentObserver -import android.net.Uri -import android.os.Handler import android.os.IBinder import android.support.v4.app.NotificationCompat import android.support.v4.util.SimpleArrayMap @@ -42,60 +39,50 @@ import java.nio.charset.Charset class StreamingService : Service() { - private val mCallbacks = SimpleArrayMap() - private var mResolver: ContentResolver? = null + private val callbacks = SimpleArrayMap() - private var mNotificationManager: NotificationManager? = null + private var notificationManager: NotificationManager? = null - private var mAccountKeys: Array? = null + private var accountKeys: Array? = null - private val mAccountChangeObserver = object : ContentObserver(Handler()) { - - override fun onChange(selfChange: Boolean) { - onChange(selfChange, null) + private val accountChangeObserver = OnAccountsUpdateListener { + if (!TwidereArrayUtils.contentMatch(accountKeys, DataStoreUtils.getActivatedAccountKeys(this@StreamingService))) { + initStreaming() } - - override fun onChange(selfChange: Boolean, uri: Uri?) { - if (!TwidereArrayUtils.contentMatch(mAccountKeys, DataStoreUtils.getActivatedAccountKeys(this@StreamingService))) { - initStreaming() - } - } - - } - - override fun onBind(intent: Intent): IBinder? { - return null } override fun onCreate() { super.onCreate() - mResolver = contentResolver - mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if (BuildConfig.DEBUG) { Log.d(LOGTAG, "Stream service started.") } initStreaming() - mResolver!!.registerContentObserver(Accounts.CONTENT_URI, true, mAccountChangeObserver) + AccountManager.get(this).addOnAccountsUpdatedListener(accountChangeObserver, null, false) } override fun onDestroy() { clearTwitterInstances() - mResolver!!.unregisterContentObserver(mAccountChangeObserver) + AccountManager.get(this).removeOnAccountsUpdatedListener(accountChangeObserver) if (BuildConfig.DEBUG) { Log.d(LOGTAG, "Stream service stopped.") } super.onDestroy() } + override fun onBind(intent: Intent): IBinder? { + return null + } + private fun clearTwitterInstances() { var i = 0 - val j = mCallbacks.size() + val j = callbacks.size() while (i < j) { - Thread(ShutdownStreamTwitterRunnable(mCallbacks.valueAt(i))).start() + Thread(ShutdownStreamTwitterRunnable(callbacks.valueAt(i))).start() i++ } - mCallbacks.clear() - mNotificationManager!!.cancel(NOTIFICATION_SERVICE_STARTED) + callbacks.clear() + notificationManager!!.cancel(NOTIFICATION_SERVICE_STARTED) } private fun initStreaming() { @@ -111,7 +98,7 @@ class StreamingService : Service() { if (BuildConfig.DEBUG) { Log.d(LOGTAG, "Setting up twitter stream instances") } - mAccountKeys = accountKeys + this.accountKeys = accountKeys clearTwitterInstances() var result = false accountsList.forEachIndexed { i, account -> @@ -121,12 +108,12 @@ class StreamingService : Service() { } val twitter = account.credentials.newMicroBlogInstance(context = this, cls = TwitterUserStream::class.java) val callback = TwidereUserStreamCallback(this, account) - mCallbacks.put(account.key, callback) + callbacks.put(account.key, callback) object : Thread() { override fun run() { twitter.getUserStream(callback) Log.d(LOGTAG, String.format("Stream %s disconnected", account.key)) - mCallbacks.remove(account.key) + callbacks.remove(account.key) updateStreamState() } }.start() @@ -136,7 +123,7 @@ class StreamingService : Service() { } private fun updateStreamState() { - if (mCallbacks.size() > 0) { + if (callbacks.size() > 0) { val intent = Intent(this, SettingsActivity::class.java) val contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) @@ -148,9 +135,9 @@ class StreamingService : Service() { builder.setContentTitle(contentTitle) builder.setContentText(contentText) builder.setContentIntent(contentIntent) - mNotificationManager!!.notify(NOTIFICATION_SERVICE_STARTED, builder.build()) + notificationManager!!.notify(NOTIFICATION_SERVICE_STARTED, builder.build()) } else { - mNotificationManager!!.cancel(NOTIFICATION_SERVICE_STARTED) + notificationManager!!.cancel(NOTIFICATION_SERVICE_STARTED) } }