1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-02 17:56:56 +01:00

fixed account activate state

cleaned up code
This commit is contained in:
Mariotaku Lee 2016-12-08 22:43:18 +08:00
parent ecdc9ab2c4
commit 963ff1c3ca
37 changed files with 314 additions and 397 deletions

View File

@ -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<br>

View File

@ -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

View File

@ -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<String> 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) {

View File

@ -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<UserKey, String> 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:

View File

@ -356,7 +356,7 @@ public class CompactHashSet<E> extends java.util.AbstractSet<E> {
offset = 2;
}
newObjects[index] = (E) o;
newObjects[index] = o;
}
objects = newObjects;

View File

@ -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)
}
}

View File

@ -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, Any>(updateUnreadCountTask)
mainTabs.setDisplayBadge(preferences.getBoolean(SharedPreferenceConstants.KEY_UNREAD_COUNT, true))
}
val tabs: List<SupportTabSpec>
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<out Account>?) {
activity.notifyAccountsChanged()
activity.updateUnreadCount()
}
}

View File

@ -81,7 +81,7 @@ class PlusServiceDashboardActivity : BaseActivity() {
override fun loadInBackground(): List<ResolveInfo> {
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)
}

View File

@ -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<Parcelable>()
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<ParcelableActivity>?
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()
}
}

View File

@ -51,7 +51,7 @@ abstract class AbsContentListRecyclerViewFragment<A : LoadMoreSupportAdapter<Rec
}
override fun scrollToPositionWithOffset(position: Int, offset: Int) {
layoutManager?.scrollToPositionWithOffset(0, 0)
layoutManager.scrollToPositionWithOffset(0, 0)
}
override fun onCreateLayoutManager(context: Context): LinearLayoutManager {
@ -60,13 +60,13 @@ abstract class AbsContentListRecyclerViewFragment<A : LoadMoreSupportAdapter<Rec
override val reachingEnd: Boolean
get() {
val lm = layoutManager ?: return false
val lm = layoutManager
return lm.findLastCompletelyVisibleItemPosition() >= lm.itemCount - 1
}
override val reachingStart: Boolean
get() {
val lm = layoutManager ?: return false
val lm = layoutManager
return lm.findFirstCompletelyVisibleItemPosition() <= 0
}

View File

@ -46,9 +46,10 @@ import org.mariotaku.twidere.view.iface.IExtendedView
abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<RecyclerView.ViewHolder>, 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<A : LoadMoreSupportAdapter<Recycle
val activity = activity
if (activity is IControlBarActivity) {
//TODO hide only if top > 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<A : LoadMoreSupportAdapter<Recycle
updateRefreshProgressOffset()
}
if (value == currentRefreshing) return
val layoutRefreshing = value && adapter?.loadMoreIndicatorPosition != ILoadMoreSupportAdapter.NONE
val layoutRefreshing = value && adapter.loadMoreIndicatorPosition != ILoadMoreSupportAdapter.NONE
swipeLayout.isRefreshing = layoutRefreshing
}
@ -207,7 +208,7 @@ abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<Recycle
}
protected open fun setupRecyclerView(context: Context, recyclerView: RecyclerView) {
itemDecoration = createItemDecoration(context, recyclerView, layoutManager!!)
itemDecoration = createItemDecoration(context, recyclerView, layoutManager)
if (itemDecoration != null) {
recyclerView.addItemDecoration(itemDecoration)
}
@ -248,7 +249,7 @@ abstract class AbsContentRecyclerViewFragment<A : LoadMoreSupportAdapter<Recycle
}
open fun setLoadMoreIndicatorPosition(@IndicatorPosition position: Long) {
adapter?.loadMoreIndicatorPosition = position
adapter.loadMoreIndicatorPosition = position
}
override fun triggerRefresh(): Boolean {

View File

@ -117,7 +117,7 @@ abstract class AbsStatusesFragment protected constructor() :
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())
}
}
@ -134,10 +134,10 @@ abstract class AbsStatusesFragment protected constructor() :
protected var adapterData: List<ParcelableStatus>?
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<List<ParcelableStatus>?>, data: List<ParcelableStatus>?) {
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()
}
}

View File

@ -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<Account
val menuInflater = SupportMenuInflater(context)
menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, accountDashboardMenu.menu)
accountDashboardMenu.setOnMenuItemClickListener(OnMenuItemClickListener { item ->
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<Account
return@OnMenuItemClickListener true
}
}
return@OnMenuItemClickListener false
}
val accounts = accountActionProvider!!.accounts
val account = accounts[item.order]
val values = ContentValues()
val newActivated = !account.activated
accountActionProvider!!.setAccountActivated(account.key, newActivated)
values.put(Accounts.IS_ACTIVATED, newActivated)
val where = Expression.equalsArgs(Accounts.ACCOUNT_KEY).sql
val whereArgs = arrayOf(account.key.toString())
mResolver!!.update(Accounts.CONTENT_URI, values, where, whereArgs)
true
return@OnMenuItemClickListener false
})
profileContainer.setOnClickListener(this)
@ -722,6 +722,7 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks<Account
class AccountsInfoLoader(context: Context) : AsyncTaskLoader<AccountsInfo>(context) {
private var contentObserver: ContentObserver? = null
private var accountListener: OnAccountsUpdateListener? = null
private var firstLoad: Boolean
@ -746,10 +747,13 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks<Account
// Stop monitoring for changes.
if (contentObserver != null) {
val cr = context.contentResolver
cr.unregisterContentObserver(contentObserver)
context.contentResolver.unregisterContentObserver(contentObserver)
contentObserver = null
}
if (accountListener != null) {
AccountManager.get(context).removeOnAccountsUpdatedListener(accountListener)
accountListener = null
}
}
/**
@ -768,9 +772,13 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks<Account
onContentChanged()
}
}
val cr = context.contentResolver
cr.registerContentObserver(Accounts.CONTENT_URI, true, contentObserver)
cr.registerContentObserver(Drafts.CONTENT_URI, true, contentObserver)
context.contentResolver.registerContentObserver(Drafts.CONTENT_URI, true, contentObserver)
}
if (accountListener == null) {
accountListener = OnAccountsUpdateListener { accounts ->
onContentChanged()
}
AccountManager.get(context).addOnAccountsUpdatedListener(accountListener, null, false)
}
if (takeContentChanged() || firstLoad) {

View File

@ -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<List<AccountDetails>>,
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<List<AccountDetails>> {
return AccountDetailsLoader(context)
}
@ -144,27 +147,17 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb
}
override fun onLoadFinished(loader: Loader<List<AccountDetails>>, data: List<AccountDetails>) {
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)

View File

@ -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<UserKey>
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<ParcelableActivity>?): Boolean {
return data?.size != 0
}
override fun onLoaderReset(loader: Loader<List<ParcelableActivity>>) {
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

View File

@ -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<List<ParcelableStatus>?> {
override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean): Loader<List<ParcelableStatus>?> {
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<UserKey>
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<ParcelableStatus>?): Boolean {
return data?.size != 0
}
@ -167,7 +165,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() {
}
override fun onLoaderReset(loader: Loader<List<ParcelableStatus>?>) {
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

View File

@ -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<MessageEntriesAdapter>(), LoaderCallbacks<Cursor>, 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<MessageEntries
if (activity == null) return
val isEmpty = cursor != null && cursor.count == 0
mFirstVisibleItem = -1
val adapter = adapter
adapter!!.setCursor(cursor)
adapter.setCursor(cursor)
adapter.loadMoreIndicatorPosition = ILoadMoreSupportAdapter.NONE
adapter.loadMoreSupportedPosition = if (hasMoreData(cursor)) ILoadMoreSupportAdapter.END else ILoadMoreSupportAdapter.NONE
val accountIds = accountKeys
@ -155,8 +155,7 @@ class DirectMessagesFragment : AbsContentListRecyclerViewFragment<MessageEntries
}
override fun onLoaderReset(loader: Loader<Cursor>) {
val adapter = adapter
adapter!!.setCursor(null)
adapter.setCursor(null)
}
override fun onEntryClick(position: Int, entry: DirectMessageEntry) {
@ -219,8 +218,7 @@ class DirectMessagesFragment : AbsContentListRecyclerViewFragment<MessageEntries
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(activity is LinkHandlerActivity)
val adapter = adapter!!
mNavigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager!!, adapter, this)
mNavigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter, this)
adapter.listener = this
@ -230,15 +228,17 @@ class DirectMessagesFragment : AbsContentListRecyclerViewFragment<MessageEntries
override fun onStart() {
super.onStart()
contentResolver.registerContentObserver(Accounts.CONTENT_URI, true, reloadContentObserver)
accountListener = OnAccountsUpdateListener { accounts ->
}
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<MessageEntries
init {
this.readPositions = Collections.synchronizedSet(HashSet(readPositions))
adapter = fragment.adapter!!
adapter = fragment.adapter
}
override fun doInBackground(vararg params: Any): Any? {

View File

@ -34,7 +34,7 @@ class GroupMembersFragment : CursorSupportUsersListFragment() {
val groupId = args.getString(EXTRA_GROUP_ID)
val groupName = args.getString(EXTRA_GROUP_NAME)
val loader = GroupMembersLoader(context, accountId, groupId,
groupName, adapter!!.getData(), fromUser)
groupName, adapter.getData(), fromUser)
loader.cursor = nextCursor
loader.page = nextPage
return loader

View File

@ -38,7 +38,7 @@ class IncomingFriendshipsFragment : CursorSupportUsersListFragment(), IUsersAdap
public override fun onCreateUsersLoader(context: Context, args: Bundle,
fromUser: Boolean): CursorSupportUsersLoader {
val accountKey = args.getParcelable<UserKey>(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)
}

View File

@ -60,7 +60,7 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAdapter
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)
}
@ -99,11 +99,11 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAdapter
}
override fun onLoadFinished(loader: Loader<List<*>?>, data: List<*>?) {
adapter!!.setData(data)
adapter.setData(data)
}
override fun onLoaderReset(loader: Loader<List<*>?>) {
adapter!!.setData(null)
adapter.setData(null)
}
override var refreshing: Boolean
@ -117,7 +117,7 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAdapter
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo?
val position = contextMenuInfo!!.position
val adapter = adapter
when (adapter!!.getItemViewType(position)) {
when (adapter.getItemViewType(position)) {
VariousItemsAdapter.VIEW_TYPE_STATUS -> {
val dummyAdapter = adapter.dummyAdapter
val status = dummyAdapter.getStatus(contextMenuInfo.position) ?: return
@ -133,7 +133,7 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAdapter
val contextMenuInfo = item!!.menuInfo as ExtendedRecyclerView.ContextMenuInfo
val position = contextMenuInfo.position
val adapter = adapter
when (adapter!!.getItemViewType(position)) {
when (adapter.getItemViewType(position)) {
VariousItemsAdapter.VIEW_TYPE_STATUS -> {
val dummyAdapter = adapter.dummyAdapter
val status = dummyAdapter.getStatus(position) ?: return false

View File

@ -32,7 +32,7 @@ class MutesUsersListFragment : CursorSupportUsersListFragment() {
args: Bundle,
fromUser: Boolean): CursorSupportUsersLoader {
val accountKey = args.getParcelable<UserKey>(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

View File

@ -77,7 +77,7 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment<Par
override fun onLoadFinished(loader: Loader<List<ParcelableGroup>?>, data: List<ParcelableGroup>?) {
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<Par
}
val data: List<ParcelableGroup>?
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<Par
super.onActivityCreated(savedInstanceState)
val adapter = adapter
val layoutManager = layoutManager
adapter!!.groupAdapterListener = this
adapter.groupAdapterListener = this
mNavigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager!!, adapter,
mNavigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter,
this)
val loaderArgs = Bundle(arguments)
loaderArgs.putBoolean(EXTRA_FROM_USER, true)
@ -147,7 +147,7 @@ abstract class ParcelableGroupsFragment : AbsContentListRecyclerViewFragment<Par
}
override fun onGroupClick(holder: GroupViewHolder, position: Int) {
IntentUtils.openGroupDetails(context, adapter!!.getGroup(position)!!)
IntentUtils.openGroupDetails(context, adapter.getGroup(position)!!)
}
override fun onGroupLongClick(holder: GroupViewHolder, position: Int): Boolean {

View File

@ -129,7 +129,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() {
refreshing = false
setLoadMoreIndicatorPosition(ILoadMoreSupportAdapter.NONE)
val adapter = adapter
if (adapter!!.itemCount > 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

View File

@ -79,7 +79,7 @@ abstract class ParcelableUserListsFragment : AbsContentListRecyclerViewFragment<
override fun onLoadFinished(loader: Loader<List<ParcelableUserList>>, data: List<ParcelableUserList>) {
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<ParcelableUserList>?
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)
}

View File

@ -63,10 +63,10 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val adapter = adapter!!
val adapter = adapter
adapter.userClickListener = this
navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager!!, adapter,
navigationHelper = RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter,
this)
val loaderArgs = Bundle(arguments)
loaderArgs.putBoolean(IntentConstants.EXTRA_FROM_USER, true)
@ -99,7 +99,7 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
}
override fun onLoadFinished(loader: Loader<List<ParcelableUser>?>, data: List<ParcelableUser>?) {
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<Parc
}
override fun onUserClick(holder: UserViewHolder, position: Int) {
val user = adapter?.getUser(position) ?: return
val user = adapter.getUser(position) ?: return
IntentUtils.openUserProfile(activity, user, null,
preferences.getBoolean(SharedPreferenceConstants.KEY_NEW_DOCUMENT_API), userReferral)
}
override fun onFollowClicked(holder: UserViewHolder, position: Int) {
val user = adapter?.getUser(position) ?: return
val user = adapter.getUser(position) ?: return
if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return
if (user.is_following) {
DestroyFriendshipDialogFragment.show(fragmentManager, user)
@ -158,13 +158,13 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
}
override fun onUnblockClicked(holder: UserViewHolder, position: Int) {
val user = adapter?.getUser(position) ?: return
val user = adapter.getUser(position) ?: return
if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return
twitterWrapper.destroyBlockAsync(user.account_key, user.key)
}
override fun onUnmuteClicked(holder: UserViewHolder, position: Int) {
val user = adapter?.getUser(position) ?: return
val user = adapter.getUser(position) ?: return
if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return
twitterWrapper.destroyMuteAsync(user.account_key, user.key)
}
@ -183,7 +183,7 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
override fun createItemDecoration(context: Context, recyclerView: RecyclerView,
layoutManager: LinearLayoutManager): RecyclerView.ItemDecoration? {
val adapter = adapter ?: return null
val adapter = adapter
val itemDecoration = DividerItemDecoration(context,
(recyclerView.layoutManager as LinearLayoutManager).orientation)
val res = context.resources
@ -208,7 +208,7 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
}
private fun findPosition(accountKey: UserKey, userKey: UserKey): Int {
return adapter?.findPosition(accountKey, userKey) ?: RecyclerView.NO_POSITION
return adapter.findPosition(accountKey, userKey)
}
protected open fun shouldRemoveUser(position: Int, event: FriendshipTaskEvent): Boolean {
@ -227,7 +227,7 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
@Subscribe
fun onFriendshipTaskEvent(event: FriendshipTaskEvent) {
val adapter = adapter ?: return
val adapter = adapter
val position = findPosition(event.accountKey, event.userKey)
val data = adapter.getData() ?: return
if (position < 0 || position >= data.size) return

View File

@ -45,7 +45,7 @@ class SearchUsersFragment : ParcelableUsersFragment() {
val accountKey = args.getParcelable<UserKey>(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<List<ParcelableUser>?>, data: List<ParcelableUser>?) {

View File

@ -33,7 +33,7 @@ class StatusFavoritersListFragment : CursorSupportUsersListFragment() {
val accountKey = args.getParcelable<UserKey>(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

View File

@ -35,7 +35,7 @@ class StatusRetweetersListFragment : CursorSupportUsersListFragment() {
val accountKey = args.getParcelable<UserKey>(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

View File

@ -33,7 +33,7 @@ class UserBlocksListFragment : CursorSupportUsersListFragment() {
args: Bundle,
fromUser: Boolean): CursorSupportUsersLoader {
val accountKey = args.getParcelable<UserKey>(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

View File

@ -36,7 +36,7 @@ class UserFollowersFragment : CursorSupportUsersListFragment() {
val userKey = args.getParcelable<UserKey>(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

View File

@ -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()));

View File

@ -35,7 +35,7 @@ class UserFriendsFragment : CursorSupportUsersListFragment() {
val userKey = args.getParcelable<UserKey>(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

View File

@ -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)
}

View File

@ -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

View File

@ -32,7 +32,7 @@ import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder
class UserMediaTimelineFragment : AbsContentRecyclerViewFragment<StaggeredGridParcelableStatusesAdapter, StaggeredGridLayoutManager>(), LoaderCallbacks<List<ParcelableStatus>>, 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<StaggeredGridPa
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val adapter = adapter
adapter!!.statusClickListener = this
adapter.statusClickListener = this
val loaderArgs = Bundle(arguments)
loaderArgs.putBoolean(EXTRA_FROM_USER, true)
loaderManager.initLoader(0, loaderArgs, this)
@ -95,12 +95,12 @@ class UserMediaTimelineFragment : AbsContentRecyclerViewFragment<StaggeredGridPa
val fromUser = args.getBoolean(EXTRA_FROM_USER)
val loadingMore = args.getBoolean(EXTRA_LOADING_MORE, false)
return MediaTimelineLoader(context, accountKey, userKey, screenName, sinceId, maxId,
adapter!!.getData(), null, tabPosition, fromUser, loadingMore)
adapter.getData(), null, tabPosition, fromUser, loadingMore)
}
override fun onLoadFinished(loader: Loader<List<ParcelableStatus>>, data: List<ParcelableStatus>?) {
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<StaggeredGridPa
}
override fun onLoaderReset(loader: Loader<List<ParcelableStatus>>) {
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<StaggeredGridPa
if (position and ILoadMoreSupportAdapter.START != 0L) return
super.onLoadMoreContents(position)
if (position == 0L) return
val adapter = adapter ?: return
val adapter = adapter
val maxId = adapter.getStatusId(adapter.statusCount - 1)
getStatuses(maxId, null)
}
@ -149,7 +149,7 @@ class UserMediaTimelineFragment : AbsContentRecyclerViewFragment<StaggeredGridPa
}
override fun onStatusClick(holder: IStatusViewHolder, position: Int) {
IntentUtils.openStatus(context, adapter!!.getStatus(position)!!, null)
IntentUtils.openStatus(context, adapter.getStatus(position)!!, null)
}
override fun onStatusLongClick(holder: IStatusViewHolder, position: Int): Boolean {

View File

@ -92,14 +92,14 @@ class UserTimelineFragment : ParcelableStatusesFragment() {
val screenName = args.getString(EXTRA_SCREEN_NAME)
val tabPosition = args.getInt(EXTRA_TAB_POSITION, -1)
val loadingMore = args.getBoolean(EXTRA_LOADING_MORE, false)
val pinnedIds = if (adapter!!.hasPinnedStatuses) null else pinnedStatusIds
val pinnedIds = if (adapter.hasPinnedStatuses) null else pinnedStatusIds
return UserTimelineLoader(context, accountKey, userKey, screenName, sinceId, maxId, data,
savedStatusesFileArgs, tabPosition, fromUser, loadingMore, pinnedIds)
}
override fun onStatusesLoaded(loader: Loader<List<ParcelableStatus>?>, data: List<ParcelableStatus>?) {
val timelineLoader = loader as UserTimelineLoader
val adapter = adapter!!
val adapter = adapter
if (!adapter.hasPinnedStatuses) {
adapter.pinnedStatuses = timelineLoader.pinnedStatuses
}

View File

@ -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<UserKey, UserStreamCallback>()
private var mResolver: ContentResolver? = null
private val callbacks = SimpleArrayMap<UserKey, UserStreamCallback>()
private var mNotificationManager: NotificationManager? = null
private var notificationManager: NotificationManager? = null
private var mAccountKeys: Array<UserKey>? = null
private var accountKeys: Array<UserKey>? = 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)
}
}