2016-07-02 05:54:53 +02:00
|
|
|
/*
|
|
|
|
* Twidere - Twitter client for Android
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package org.mariotaku.twidere.activity
|
|
|
|
|
2016-12-08 15:43:18 +01:00
|
|
|
import android.accounts.Account
|
|
|
|
import android.accounts.AccountManager
|
|
|
|
import android.accounts.OnAccountsUpdateListener
|
2016-12-17 05:10:24 +01:00
|
|
|
import android.app.Dialog
|
2016-07-02 05:54:53 +02:00
|
|
|
import android.app.PendingIntent
|
|
|
|
import android.app.SearchManager
|
|
|
|
import android.content.Context
|
2016-12-17 05:59:07 +01:00
|
|
|
import android.content.DialogInterface
|
2016-07-02 05:54:53 +02:00
|
|
|
import android.content.Intent
|
2016-12-24 15:05:15 +01:00
|
|
|
import android.content.SharedPreferences
|
2016-07-02 05:54:53 +02:00
|
|
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
|
|
|
import android.content.res.Configuration
|
|
|
|
import android.graphics.Rect
|
|
|
|
import android.graphics.drawable.Drawable
|
|
|
|
import android.os.AsyncTask
|
|
|
|
import android.os.Bundle
|
|
|
|
import android.preference.PreferenceActivity
|
|
|
|
import android.support.annotation.StringRes
|
|
|
|
import android.support.v4.app.Fragment
|
|
|
|
import android.support.v4.app.NotificationCompat
|
|
|
|
import android.support.v4.view.GravityCompat
|
|
|
|
import android.support.v4.view.ViewPager.OnPageChangeListener
|
|
|
|
import android.support.v4.widget.DrawerLayout
|
|
|
|
import android.support.v4.widget.DrawerLayoutAccessor
|
|
|
|
import android.support.v7.app.ActionBarDrawerToggle
|
2016-12-17 05:10:24 +01:00
|
|
|
import android.support.v7.app.AlertDialog
|
2016-07-02 05:54:53 +02:00
|
|
|
import android.support.v7.app.AppCompatDelegate
|
|
|
|
import android.support.v7.widget.TintTypedArray
|
|
|
|
import android.util.SparseIntArray
|
|
|
|
import android.view.Gravity
|
|
|
|
import android.view.KeyEvent
|
|
|
|
import android.view.MenuItem
|
|
|
|
import android.view.View
|
|
|
|
import android.view.View.OnClickListener
|
|
|
|
import android.view.View.OnLongClickListener
|
|
|
|
import android.view.ViewGroup.MarginLayoutParams
|
2016-12-13 12:35:25 +01:00
|
|
|
import com.getkeepsafe.taptargetview.TapTarget
|
|
|
|
import com.getkeepsafe.taptargetview.TapTargetView
|
2016-07-02 05:54:53 +02:00
|
|
|
import com.squareup.otto.Subscribe
|
|
|
|
import kotlinx.android.synthetic.main.activity_home.*
|
|
|
|
import kotlinx.android.synthetic.main.activity_home_content.*
|
|
|
|
import kotlinx.android.synthetic.main.layout_empty_tab_hint.*
|
|
|
|
import org.mariotaku.abstask.library.AbstractTask
|
|
|
|
import org.mariotaku.abstask.library.TaskStarter
|
2016-12-22 11:21:17 +01:00
|
|
|
import org.mariotaku.chameleon.ChameleonUtils
|
2016-12-13 12:35:25 +01:00
|
|
|
import org.mariotaku.kpreferences.get
|
|
|
|
import org.mariotaku.kpreferences.set
|
2016-12-13 02:12:55 +01:00
|
|
|
import org.mariotaku.ktextension.addOnAccountsUpdatedListenerSafe
|
2016-12-05 14:18:20 +01:00
|
|
|
import org.mariotaku.ktextension.convert
|
2016-12-13 02:12:55 +01:00
|
|
|
import org.mariotaku.ktextension.removeOnAccountsUpdatedListenerSafe
|
2016-07-02 05:54:53 +02:00
|
|
|
import org.mariotaku.twidere.Constants.*
|
|
|
|
import org.mariotaku.twidere.R
|
|
|
|
import org.mariotaku.twidere.activity.iface.IControlBarActivity
|
|
|
|
import org.mariotaku.twidere.adapter.SupportTabsAdapter
|
|
|
|
import org.mariotaku.twidere.annotation.CustomTabType
|
|
|
|
import org.mariotaku.twidere.annotation.ReadPositionTag
|
2016-12-17 05:59:07 +01:00
|
|
|
import org.mariotaku.twidere.constant.*
|
2016-07-02 05:54:53 +02:00
|
|
|
import org.mariotaku.twidere.fragment.*
|
|
|
|
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface
|
|
|
|
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback
|
|
|
|
import org.mariotaku.twidere.graphic.EmptyDrawable
|
2016-12-04 06:45:57 +01:00
|
|
|
import org.mariotaku.twidere.model.AccountDetails
|
2016-07-02 05:54:53 +02:00
|
|
|
import org.mariotaku.twidere.model.SupportTabSpec
|
2016-12-01 08:55:38 +01:00
|
|
|
import org.mariotaku.twidere.model.Tab
|
2016-07-02 05:54:53 +02:00
|
|
|
import org.mariotaku.twidere.model.UserKey
|
|
|
|
import org.mariotaku.twidere.model.message.TaskStateChangedEvent
|
|
|
|
import org.mariotaku.twidere.model.message.UnreadCountUpdatedEvent
|
2016-12-08 15:43:18 +01:00
|
|
|
import org.mariotaku.twidere.provider.TwidereDataStore.Activities
|
|
|
|
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
|
2016-07-02 05:54:53 +02:00
|
|
|
import org.mariotaku.twidere.service.StreamingService
|
|
|
|
import org.mariotaku.twidere.util.*
|
|
|
|
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
|
|
|
|
import org.mariotaku.twidere.view.HomeDrawerLayout
|
|
|
|
import org.mariotaku.twidere.view.TabPagerIndicator
|
|
|
|
|
|
|
|
class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, SupportFragmentCallback, OnLongClickListener, DrawerLayout.DrawerListener {
|
|
|
|
|
2016-12-12 14:19:02 +01:00
|
|
|
private val accountUpdatedListener = AccountUpdatedListener(this)
|
2016-07-02 05:54:53 +02:00
|
|
|
|
2016-12-04 06:45:57 +01:00
|
|
|
private var selectedAccountToSearch: AccountDetails? = null
|
2016-07-02 05:54:53 +02:00
|
|
|
private var tabColumns: Int = 0
|
|
|
|
|
|
|
|
|
2016-12-06 02:26:53 +01:00
|
|
|
private lateinit var multiSelectHandler: MultiSelectEventHandler
|
2016-07-02 05:54:53 +02:00
|
|
|
|
2016-12-08 15:43:18 +01:00
|
|
|
private lateinit var pagerAdapter: SupportTabsAdapter
|
|
|
|
|
|
|
|
private lateinit var drawerToggle: ActionBarDrawerToggle
|
2016-07-02 05:54:53 +02:00
|
|
|
|
|
|
|
private var updateUnreadCountTask: UpdateUnreadCountTask? = null
|
|
|
|
private val readStateChangeListener = OnSharedPreferenceChangeListener { sharedPreferences, key -> updateUnreadCount() }
|
|
|
|
private val controlBarShowHideHelper = IControlBarActivity.ControlBarShowHideHelper(this)
|
2016-12-08 15:43:18 +01:00
|
|
|
|
2016-07-02 05:54:53 +02:00
|
|
|
private val homeDrawerToggleDelegate = object : ActionBarDrawerToggle.Delegate {
|
|
|
|
override fun setActionBarUpIndicator(upDrawable: Drawable, @StringRes contentDescRes: Int) {
|
|
|
|
drawerToggleButton.setImageDrawable(upDrawable)
|
2016-12-22 11:21:17 +01:00
|
|
|
drawerToggleButton.setColorFilter(ChameleonUtils.getColorDependent(overrideTheme.colorToolbar))
|
2016-07-02 05:54:53 +02:00
|
|
|
drawerToggleButton.contentDescription = getString(contentDescRes)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun setActionBarDescription(@StringRes contentDescRes: Int) {
|
|
|
|
drawerToggleButton.contentDescription = getString(contentDescRes)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getThemeUpIndicator(): Drawable {
|
2016-12-22 11:21:17 +01:00
|
|
|
val a = TintTypedArray.obtainStyledAttributes(actionBarThemedContext, null,
|
|
|
|
HOME_AS_UP_ATTRS)
|
2016-07-02 05:54:53 +02:00
|
|
|
val result = a.getDrawable(0)
|
|
|
|
a.recycle()
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getActionBarThemedContext(): Context {
|
2016-12-08 15:43:18 +01:00
|
|
|
return toolbar.context
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun isNavigationVisible(): Boolean {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun closeAccountsDrawer() {
|
|
|
|
if (homeMenu == null) return
|
|
|
|
homeMenu.closeDrawers()
|
|
|
|
}
|
|
|
|
|
2016-12-03 16:45:13 +01:00
|
|
|
private val activatedAccountKeys: Array<UserKey>
|
|
|
|
get() = DataStoreUtils.getActivatedAccountKeys(this)
|
2016-07-02 05:54:53 +02:00
|
|
|
|
2016-07-06 15:21:34 +02:00
|
|
|
override val currentVisibleFragment: Fragment?
|
|
|
|
get() {
|
2016-12-08 15:43:18 +01:00
|
|
|
val currentItem = mainPager.currentItem
|
|
|
|
if (currentItem < 0 || currentItem >= pagerAdapter.count) return null
|
|
|
|
return pagerAdapter.instantiateItem(mainPager, currentItem) as Fragment
|
2016-07-06 15:21:34 +02:00
|
|
|
}
|
2016-07-02 05:54:53 +02:00
|
|
|
|
|
|
|
override fun triggerRefresh(position: Int): Boolean {
|
2016-12-08 15:43:18 +01:00
|
|
|
val f = pagerAdapter.instantiateItem(mainPager, position) as Fragment
|
2016-07-02 05:54:53 +02:00
|
|
|
if (f.activity == null || f.isDetached) return false
|
2016-12-06 02:26:53 +01:00
|
|
|
if (f !is RefreshScrollTopInterface) return false
|
2016-07-02 05:54:53 +02:00
|
|
|
return f.triggerRefresh()
|
|
|
|
}
|
|
|
|
|
2016-08-31 05:24:31 +02:00
|
|
|
val leftDrawerFragment: Fragment?
|
2016-07-02 05:54:53 +02:00
|
|
|
get() = supportFragmentManager.findFragmentById(R.id.leftDrawer)
|
|
|
|
|
|
|
|
override fun getSystemWindowsInsets(insets: Rect): Boolean {
|
|
|
|
if (mainTabs == null || homeContent == null) return false
|
|
|
|
val height = mainTabs.height
|
|
|
|
if (height != 0) {
|
|
|
|
insets.top = height
|
|
|
|
} else {
|
|
|
|
insets.top = ThemeUtils.getActionBarHeight(this)
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun setControlBarVisibleAnimate(visible: Boolean) {
|
|
|
|
controlBarShowHideHelper.setControlBarVisibleAnimate(visible)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun setControlBarVisibleAnimate(visible: Boolean, listener: IControlBarActivity.ControlBarShowHideHelper.ControlBarAnimationListener) {
|
|
|
|
controlBarShowHideHelper.setControlBarVisibleAnimate(visible, listener)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
|
|
if (drawerToggle.onOptionsItemSelected(item)) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
when (item.itemId) {
|
|
|
|
android.R.id.home -> {
|
|
|
|
val fm = supportFragmentManager
|
|
|
|
val count = fm.backStackEntryCount
|
|
|
|
if (homeMenu.isDrawerOpen(GravityCompat.START) || homeMenu.isDrawerOpen(GravityCompat.END)) {
|
|
|
|
homeMenu.closeDrawers()
|
|
|
|
return true
|
|
|
|
} else if (count == 0) {
|
|
|
|
homeMenu.openDrawer(GravityCompat.START)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
R.id.search -> {
|
|
|
|
openSearchView(selectedAccountToSearch)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
R.id.actions -> {
|
|
|
|
triggerActionsClick()
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return super.onOptionsItemSelected(item)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun handleKeyboardShortcutSingle(handler: KeyboardShortcutsHandler, keyCode: Int, event: KeyEvent, metaState: Int): Boolean {
|
|
|
|
if (handleFragmentKeyboardShortcutSingle(handler, keyCode, event, metaState)) return true
|
|
|
|
var action = handler.getKeyAction(KeyboardShortcutConstants.CONTEXT_TAG_HOME, keyCode, event, metaState)
|
|
|
|
if (action != null) {
|
|
|
|
when (action) {
|
|
|
|
KeyboardShortcutConstants.ACTION_HOME_ACCOUNTS_DASHBOARD -> {
|
|
|
|
if (homeMenu.isDrawerOpen(GravityCompat.START)) {
|
|
|
|
homeMenu.closeDrawers()
|
|
|
|
} else {
|
|
|
|
homeMenu.openDrawer(GravityCompat.START)
|
|
|
|
setControlBarVisibleAnimate(true)
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
action = handler.getKeyAction(KeyboardShortcutConstants.CONTEXT_TAG_NAVIGATION, keyCode, event, metaState)
|
|
|
|
if (action != null) {
|
|
|
|
when (action) {
|
|
|
|
KeyboardShortcutConstants.ACTION_NAVIGATION_PREVIOUS_TAB -> {
|
2016-12-08 15:43:18 +01:00
|
|
|
val previous = mainPager.currentItem - 1
|
2016-07-02 05:54:53 +02:00
|
|
|
if (previous < 0 && DrawerLayoutAccessor.findDrawerWithGravity(homeMenu, Gravity.START) != null) {
|
|
|
|
homeMenu.openDrawer(GravityCompat.START)
|
|
|
|
setControlBarVisibleAnimate(true)
|
2016-12-08 15:43:18 +01:00
|
|
|
} else if (previous < pagerAdapter.count) {
|
2016-07-02 05:54:53 +02:00
|
|
|
if (homeMenu.isDrawerOpen(GravityCompat.END)) {
|
|
|
|
homeMenu.closeDrawers()
|
|
|
|
} else {
|
2016-12-08 15:43:18 +01:00
|
|
|
mainPager.setCurrentItem(previous, true)
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
KeyboardShortcutConstants.ACTION_NAVIGATION_NEXT_TAB -> {
|
2016-12-08 15:43:18 +01:00
|
|
|
val next = mainPager.currentItem + 1
|
|
|
|
if (next >= pagerAdapter.count && DrawerLayoutAccessor.findDrawerWithGravity(homeMenu, Gravity.END) != null) {
|
2016-07-02 05:54:53 +02:00
|
|
|
homeMenu.openDrawer(GravityCompat.END)
|
|
|
|
setControlBarVisibleAnimate(true)
|
|
|
|
} else if (next >= 0) {
|
|
|
|
if (homeMenu.isDrawerOpen(GravityCompat.START)) {
|
|
|
|
homeMenu.closeDrawers()
|
|
|
|
} else {
|
2016-12-08 15:43:18 +01:00
|
|
|
mainPager.setCurrentItem(next, true)
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return handler.handleKey(this, null, keyCode, event, metaState)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun isKeyboardShortcutHandled(handler: KeyboardShortcutsHandler, keyCode: Int, event: KeyEvent, metaState: Int): Boolean {
|
|
|
|
if (isFragmentKeyboardShortcutHandled(handler, keyCode, event, metaState)) return true
|
|
|
|
return super.isKeyboardShortcutHandled(handler, keyCode, event, metaState)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun handleKeyboardShortcutRepeat(handler: KeyboardShortcutsHandler, keyCode: Int, repeatCount: Int, event: KeyEvent, metaState: Int): Boolean {
|
|
|
|
if (handleFragmentKeyboardShortcutRepeat(handler, keyCode, repeatCount, event, metaState))
|
|
|
|
return true
|
|
|
|
return super.handleKeyboardShortcutRepeat(handler, keyCode, repeatCount, event, metaState)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
|
|
|
|
when (keyCode) {
|
|
|
|
KeyEvent.KEYCODE_MENU -> {
|
|
|
|
if (isDrawerOpen) {
|
2016-12-08 15:43:18 +01:00
|
|
|
homeMenu.closeDrawers()
|
2016-07-02 05:54:53 +02:00
|
|
|
} else {
|
2016-12-08 15:43:18 +01:00
|
|
|
homeMenu.openDrawer(GravityCompat.START)
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
KeyEvent.KEYCODE_BACK -> {
|
|
|
|
if (isDrawerOpen) {
|
2016-12-08 15:43:18 +01:00
|
|
|
homeMenu.closeDrawers()
|
2016-07-02 05:54:53 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return super.onKeyUp(keyCode, event)
|
|
|
|
}
|
|
|
|
|
|
|
|
private val isDrawerOpen: Boolean
|
|
|
|
get() {
|
|
|
|
val drawer = homeMenu ?: return false
|
|
|
|
return drawer.isDrawerOpen(GravityCompat.START) || drawer.isDrawerOpen(GravityCompat.END)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when the context is first created.
|
|
|
|
*/
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
multiSelectHandler = MultiSelectEventHandler(this)
|
2016-12-06 02:26:53 +01:00
|
|
|
multiSelectHandler.dispatchOnCreate()
|
|
|
|
DataStoreUtils.prepareDatabase(this)
|
2016-07-02 05:54:53 +02:00
|
|
|
if (!DataStoreUtils.hasAccount(this)) {
|
|
|
|
val signInIntent = Intent(INTENT_ACTION_TWITTER_LOGIN)
|
|
|
|
signInIntent.setClass(this, SignInActivity::class.java)
|
|
|
|
startActivity(signInIntent)
|
|
|
|
finish()
|
2016-12-23 02:26:52 +01:00
|
|
|
if (defaultAutoRefreshAskedKey !in kPreferences) {
|
2016-12-17 05:10:24 +01:00
|
|
|
// Assume first install
|
2016-12-23 02:26:52 +01:00
|
|
|
kPreferences[defaultAutoRefreshAskedKey] = false
|
2016-12-17 05:10:24 +01:00
|
|
|
}
|
2016-07-02 05:54:53 +02:00
|
|
|
return
|
|
|
|
} else {
|
|
|
|
notifyAccountsChanged()
|
|
|
|
}
|
|
|
|
supportRequestWindowFeature(AppCompatDelegate.FEATURE_ACTION_MODE_OVERLAY)
|
|
|
|
setContentView(R.layout.activity_home)
|
|
|
|
|
|
|
|
setSupportActionBar(toolbar)
|
|
|
|
|
|
|
|
ThemeUtils.setCompatContentViewOverlay(window, EmptyDrawable())
|
|
|
|
|
|
|
|
val refreshOnStart = preferences.getBoolean(SharedPreferenceConstants.KEY_REFRESH_ON_START, false)
|
|
|
|
var tabDisplayOptionInt = Utils.getTabDisplayOptionInt(this)
|
|
|
|
|
|
|
|
tabColumns = resources.getInteger(R.integer.default_tab_columns)
|
|
|
|
|
|
|
|
drawerToggle = ActionBarDrawerToggle(this, homeMenu, R.string.open_accounts_dashboard,
|
|
|
|
R.string.close_accounts_dashboard)
|
2016-12-08 15:43:18 +01:00
|
|
|
homeContent.setOnFitSystemWindowsListener(this)
|
2016-07-02 05:54:53 +02:00
|
|
|
pagerAdapter = SupportTabsAdapter(this, supportFragmentManager, mainTabs, tabColumns)
|
2016-12-08 15:43:18 +01:00
|
|
|
mainPager.adapter = pagerAdapter
|
2016-07-02 05:54:53 +02:00
|
|
|
mainTabs.setViewPager(mainPager)
|
|
|
|
mainTabs.setOnPageChangeListener(this)
|
|
|
|
mainTabs.setColumns(tabColumns)
|
|
|
|
if (tabDisplayOptionInt == 0) {
|
2016-12-18 16:16:03 +01:00
|
|
|
tabDisplayOptionInt = TabPagerIndicator.DisplayOption.ICON
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
mainTabs.setTabDisplayOption(tabDisplayOptionInt)
|
2016-12-18 16:16:03 +01:00
|
|
|
mainTabs.setTabExpandEnabled(tabDisplayOptionInt and TabPagerIndicator.DisplayOption.LABEL == 0)
|
2016-12-23 02:26:52 +01:00
|
|
|
mainTabs.setDisplayBadge(preferences[unreadCountKey])
|
2016-07-02 05:54:53 +02:00
|
|
|
mainTabs.updateAppearance()
|
|
|
|
|
2016-12-23 02:26:52 +01:00
|
|
|
if (preferences[drawerToggleKey]) {
|
2016-07-02 05:54:53 +02:00
|
|
|
drawerToggleButton.visibility = View.VISIBLE
|
|
|
|
} else {
|
|
|
|
drawerToggleButton.visibility = View.GONE
|
|
|
|
}
|
|
|
|
|
2016-12-23 02:26:52 +01:00
|
|
|
if (preferences[fabVisibleKey]) {
|
2016-12-21 22:15:58 +01:00
|
|
|
actionsButton.visibility = View.VISIBLE
|
|
|
|
} else {
|
|
|
|
actionsButton.visibility = View.GONE
|
|
|
|
}
|
|
|
|
|
2016-12-06 02:26:53 +01:00
|
|
|
homeContent.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
|
2016-07-02 05:54:53 +02:00
|
|
|
if (top != oldTop) {
|
|
|
|
val fragment = leftDrawerFragment
|
|
|
|
if (fragment is AccountsDashboardFragment) {
|
|
|
|
fragment.setStatusBarHeight(top)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
actionsButton.setOnClickListener(this)
|
|
|
|
actionsButton.setOnLongClickListener(this)
|
|
|
|
drawerToggleButton.setOnClickListener(this)
|
|
|
|
emptyTabHint.setOnClickListener(this)
|
|
|
|
|
|
|
|
setupSlidingMenu()
|
|
|
|
setupBars()
|
|
|
|
showDataProfilingRequest()
|
|
|
|
initUnreadCount()
|
|
|
|
setupHomeTabs()
|
|
|
|
updateActionsButton()
|
|
|
|
|
|
|
|
if (savedInstanceState == null) {
|
|
|
|
if (refreshOnStart) {
|
|
|
|
twitterWrapper.refreshAll(activatedAccountKeys)
|
|
|
|
}
|
|
|
|
if (intent.getBooleanExtra(EXTRA_OPEN_ACCOUNTS_DRAWER, false)) {
|
|
|
|
openAccountsDrawer()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
val initialTabPosition = handleIntent(intent, savedInstanceState == null,
|
|
|
|
savedInstanceState != null)
|
|
|
|
setTabPosition(initialTabPosition)
|
|
|
|
|
|
|
|
if (Utils.isStreamingEnabled()) {
|
|
|
|
startService(Intent(this, StreamingService::class.java))
|
|
|
|
}
|
2016-12-13 12:35:25 +01:00
|
|
|
|
2016-12-23 02:26:52 +01:00
|
|
|
if (!showDrawerTutorial() && !kPreferences[defaultAutoRefreshAskedKey]) {
|
2016-12-17 05:10:24 +01:00
|
|
|
showAutoRefreshConfirm()
|
|
|
|
}
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onStart() {
|
|
|
|
super.onStart()
|
2016-12-06 02:26:53 +01:00
|
|
|
multiSelectHandler.dispatchOnStart()
|
2016-12-13 02:12:55 +01:00
|
|
|
AccountManager.get(this).addOnAccountsUpdatedListenerSafe(accountUpdatedListener, updateImmediately = false)
|
2016-07-02 05:54:53 +02:00
|
|
|
bus.register(this)
|
|
|
|
|
|
|
|
readStateManager.registerOnSharedPreferenceChangeListener(readStateChangeListener)
|
|
|
|
updateUnreadCount()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onResume() {
|
|
|
|
super.onResume()
|
|
|
|
invalidateOptionsMenu()
|
|
|
|
updateActionsButton()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onStop() {
|
2016-12-06 02:26:53 +01:00
|
|
|
multiSelectHandler.dispatchOnStop()
|
2016-07-02 05:54:53 +02:00
|
|
|
readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener)
|
|
|
|
bus.unregister(this)
|
2016-12-13 02:12:55 +01:00
|
|
|
AccountManager.get(this).removeOnAccountsUpdatedListenerSafe(accountUpdatedListener)
|
2016-12-08 15:43:18 +01:00
|
|
|
preferences.edit().putInt(SharedPreferenceConstants.KEY_SAVED_TAB_POSITION, mainPager.currentItem).apply()
|
2016-07-02 05:54:53 +02:00
|
|
|
|
|
|
|
super.onStop()
|
|
|
|
}
|
|
|
|
|
|
|
|
fun notifyAccountsChanged() {
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onSaveInstanceState(outState: Bundle) {
|
|
|
|
super.onSaveInstanceState(outState)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Subscribe
|
|
|
|
fun notifyTaskStateChanged(event: TaskStateChangedEvent) {
|
|
|
|
updateActionsButton()
|
|
|
|
}
|
|
|
|
|
|
|
|
@Subscribe
|
|
|
|
fun notifyUnreadCountUpdated(event: UnreadCountUpdatedEvent) {
|
|
|
|
updateUnreadCount()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onClick(v: View) {
|
|
|
|
when (v) {
|
|
|
|
actionsButton -> {
|
|
|
|
triggerActionsClick()
|
|
|
|
}
|
|
|
|
emptyTabHint -> {
|
|
|
|
val intent = Intent(this, SettingsActivity::class.java)
|
|
|
|
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, CustomTabsFragment::class.java.name)
|
|
|
|
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE, R.string.tabs)
|
|
|
|
startActivityForResult(intent, REQUEST_SETTINGS)
|
|
|
|
}
|
|
|
|
drawerToggleButton -> {
|
|
|
|
if (homeMenu.isDrawerOpen(GravityCompat.START) || homeMenu.isDrawerOpen(GravityCompat.END)) {
|
|
|
|
homeMenu.closeDrawers()
|
|
|
|
} else {
|
|
|
|
homeMenu.openDrawer(GravityCompat.START)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onLongClick(v: View): Boolean {
|
|
|
|
when (v) {
|
|
|
|
actionsButton -> {
|
|
|
|
Utils.showMenuItemToast(v, v.contentDescription, true)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPageSelected(position: Int) {
|
|
|
|
//TODO handle secondary drawer
|
|
|
|
if (homeMenu.isDrawerOpen(GravityCompat.START)) {
|
|
|
|
homeMenu.closeDrawers()
|
|
|
|
}
|
|
|
|
updateActionsButton()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPageScrollStateChanged(state: Int) {
|
|
|
|
setControlBarVisibleAnimate(true)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onSearchRequested(): Boolean {
|
|
|
|
startActivity(Intent(this, QuickSearchBarActivity::class.java))
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2016-12-04 06:45:57 +01:00
|
|
|
fun openSearchView(account: AccountDetails?) {
|
2016-07-02 05:54:53 +02:00
|
|
|
selectedAccountToSearch = account
|
|
|
|
onSearchRequested()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onFitSystemWindows(insets: Rect) {
|
|
|
|
super.onFitSystemWindows(insets)
|
|
|
|
val fragment = leftDrawerFragment
|
|
|
|
if (fragment is AccountsDashboardFragment) {
|
|
|
|
fragment.requestFitSystemWindows()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun updateUnreadCount() {
|
|
|
|
if (mainTabs == null || updateUnreadCountTask != null && updateUnreadCountTask!!.status == AsyncTask.Status.RUNNING)
|
|
|
|
return
|
2016-12-24 15:05:15 +01:00
|
|
|
updateUnreadCountTask = UpdateUnreadCountTask(this, preferences, readStateManager, mainTabs,
|
2016-12-08 15:43:18 +01:00
|
|
|
pagerAdapter.tabs.toTypedArray())
|
2016-07-02 05:54:53 +02:00
|
|
|
AsyncTaskUtils.executeTask<UpdateUnreadCountTask, Any>(updateUnreadCountTask)
|
|
|
|
mainTabs.setDisplayBadge(preferences.getBoolean(SharedPreferenceConstants.KEY_UNREAD_COUNT, true))
|
|
|
|
}
|
|
|
|
|
|
|
|
val tabs: List<SupportTabSpec>
|
2016-12-08 15:43:18 +01:00
|
|
|
get() = pagerAdapter.tabs
|
2016-07-02 05:54:53 +02:00
|
|
|
|
|
|
|
override fun onNewIntent(intent: Intent) {
|
|
|
|
val tabPosition = handleIntent(intent, false, false)
|
|
|
|
if (tabPosition >= 0) {
|
2016-12-08 15:43:18 +01:00
|
|
|
mainPager.currentItem = TwidereMathUtils.clamp(tabPosition, pagerAdapter.count, 0)
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDestroy() {
|
|
|
|
|
|
|
|
stopService(Intent(this, StreamingService::class.java))
|
|
|
|
|
|
|
|
// Delete unused items in databases.
|
|
|
|
|
|
|
|
val context = applicationContext
|
|
|
|
TaskStarter.execute(object : AbstractTask<Any?, Any?, Any?>() {
|
|
|
|
override fun doLongOperation(o: Any?): Any? {
|
|
|
|
DataStoreUtils.cleanDatabasesByItemLimit(context)
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
})
|
|
|
|
super.onDestroy()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPostCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onPostCreate(savedInstanceState)
|
|
|
|
// Sync the toggle state after onRestoreInstanceState has occurred.
|
|
|
|
drawerToggle.syncState()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onConfigurationChanged(newConfig: Configuration) {
|
|
|
|
super.onConfigurationChanged(newConfig)
|
|
|
|
// Pass any configuration change to the drawer toggle
|
|
|
|
drawerToggle.onConfigurationChanged(newConfig)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getControlBarOffset(): Float {
|
|
|
|
if (tabColumns > 1) {
|
|
|
|
val lp = actionsButton.layoutParams
|
|
|
|
val total: Float
|
|
|
|
if (lp is MarginLayoutParams) {
|
|
|
|
total = (lp.bottomMargin + actionsButton.height).toFloat()
|
|
|
|
} else {
|
|
|
|
total = actionsButton.height.toFloat()
|
|
|
|
}
|
|
|
|
return 1 - actionsButton.translationY / total
|
|
|
|
}
|
|
|
|
val totalHeight = controlBarHeight.toFloat()
|
2016-12-08 15:43:18 +01:00
|
|
|
return 1 + toolbar.translationY / totalHeight
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun setControlBarOffset(offset: Float) {
|
|
|
|
val translationY = if (tabColumns > 1) 0 else (controlBarHeight * (offset - 1)).toInt()
|
|
|
|
toolbar.translationY = translationY.toFloat()
|
|
|
|
windowOverlay.translationY = translationY.toFloat()
|
|
|
|
val lp = actionsButton.layoutParams
|
|
|
|
if (lp is MarginLayoutParams) {
|
|
|
|
actionsButton.translationY = (lp.bottomMargin + actionsButton.height) * (1 - offset)
|
|
|
|
} else {
|
|
|
|
actionsButton.translationY = actionsButton.height * (1 - offset)
|
|
|
|
}
|
|
|
|
notifyControlBarOffsetChanged()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDrawerOpened(drawerView: View) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDrawerClosed(drawerView: View) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDrawerStateChanged(newState: Int) {
|
|
|
|
val fragment = leftDrawerFragment
|
|
|
|
if (fragment is AccountsDashboardFragment) {
|
|
|
|
fragment.loadAccounts()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getDrawerToggleDelegate(): ActionBarDrawerToggle.Delegate? {
|
|
|
|
return homeDrawerToggleDelegate
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getControlBarHeight(): Int {
|
|
|
|
return mainTabs.height - mainTabs.stripHeight
|
|
|
|
}
|
|
|
|
|
|
|
|
private val keyboardShortcutRecipient: Fragment?
|
|
|
|
get() {
|
|
|
|
if (homeMenu.isDrawerOpen(GravityCompat.START)) {
|
|
|
|
return leftDrawerFragment
|
|
|
|
} else if (homeMenu.isDrawerOpen(GravityCompat.END)) {
|
|
|
|
return null
|
|
|
|
} else {
|
|
|
|
return currentVisibleFragment
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun handleFragmentKeyboardShortcutRepeat(handler: KeyboardShortcutsHandler,
|
|
|
|
keyCode: Int, repeatCount: Int,
|
|
|
|
event: KeyEvent, metaState: Int): Boolean {
|
|
|
|
val fragment = keyboardShortcutRecipient
|
|
|
|
if (fragment is KeyboardShortcutCallback) {
|
|
|
|
return fragment.handleKeyboardShortcutRepeat(handler, keyCode,
|
|
|
|
repeatCount, event, metaState)
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun handleFragmentKeyboardShortcutSingle(handler: KeyboardShortcutsHandler,
|
|
|
|
keyCode: Int, event: KeyEvent,
|
|
|
|
metaState: Int): Boolean {
|
|
|
|
val fragment = keyboardShortcutRecipient
|
|
|
|
if (fragment is KeyboardShortcutCallback) {
|
|
|
|
return fragment.handleKeyboardShortcutSingle(handler, keyCode,
|
|
|
|
event, metaState)
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun isFragmentKeyboardShortcutHandled(handler: KeyboardShortcutsHandler,
|
|
|
|
keyCode: Int, event: KeyEvent, metaState: Int): Boolean {
|
|
|
|
val fragment = keyboardShortcutRecipient
|
|
|
|
if (fragment is KeyboardShortcutCallback) {
|
|
|
|
return fragment.isKeyboardShortcutHandled(handler, keyCode,
|
|
|
|
event, metaState)
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun handleIntent(intent: Intent, handleExtraIntent: Boolean,
|
|
|
|
restoreInstanceState: Boolean): Int {
|
|
|
|
// use package's class loader to prevent BadParcelException
|
|
|
|
intent.setExtrasClassLoader(classLoader)
|
|
|
|
// reset intent
|
|
|
|
setIntent(Intent(this, HomeActivity::class.java))
|
|
|
|
val action = intent.action
|
|
|
|
if (Intent.ACTION_SEARCH == action) {
|
|
|
|
val query = intent.getStringExtra(SearchManager.QUERY)
|
|
|
|
val appSearchData = intent.getBundleExtra(SearchManager.APP_DATA)
|
|
|
|
val accountKey: UserKey?
|
|
|
|
if (appSearchData != null && appSearchData.containsKey(EXTRA_ACCOUNT_KEY)) {
|
|
|
|
accountKey = appSearchData.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
|
|
|
|
} else {
|
|
|
|
accountKey = Utils.getDefaultAccountKey(this)
|
|
|
|
}
|
|
|
|
IntentUtils.openSearch(this, accountKey, query)
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
val refreshOnStart = preferences.getBoolean(SharedPreferenceConstants.KEY_REFRESH_ON_START, false)
|
|
|
|
if (handleExtraIntent && refreshOnStart) {
|
|
|
|
twitterWrapper.refreshAll()
|
|
|
|
}
|
|
|
|
val extraIntent = intent.getParcelableExtra<Intent>(EXTRA_EXTRA_INTENT)
|
|
|
|
|
|
|
|
val uri = intent.data
|
|
|
|
@CustomTabType
|
|
|
|
val tabType = if (uri != null) Utils.matchTabType(uri) else null
|
|
|
|
var initialTab = -1
|
|
|
|
if (tabType != null) {
|
2016-12-05 14:18:20 +01:00
|
|
|
val accountKey = uri?.getQueryParameter(QUERY_PARAM_ACCOUNT_KEY)?.convert(UserKey::valueOf)
|
2016-12-08 15:43:18 +01:00
|
|
|
val adapter = pagerAdapter
|
2016-12-05 14:18:20 +01:00
|
|
|
for (i in 0 until adapter.count) {
|
|
|
|
val tab = adapter.getTab(i)
|
2016-12-01 08:55:38 +01:00
|
|
|
if (tabType == Tab.getTypeAlias(tab.type)) {
|
2016-07-07 05:42:08 +02:00
|
|
|
val args = tab.args
|
|
|
|
if (args != null && CustomTabUtils.hasAccountId(this, args,
|
2016-07-02 05:54:53 +02:00
|
|
|
activatedAccountKeys, accountKey)) {
|
|
|
|
initialTab = i
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (initialTab == -1 && (extraIntent == null || !handleExtraIntent)) {
|
|
|
|
// Tab not found, open account specific page
|
|
|
|
when (tabType) {
|
|
|
|
CustomTabType.NOTIFICATIONS_TIMELINE -> {
|
|
|
|
IntentUtils.openInteractions(this, accountKey)
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
CustomTabType.DIRECT_MESSAGES -> {
|
|
|
|
IntentUtils.openDirectMessages(this, accountKey)
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (extraIntent != null && handleExtraIntent) {
|
|
|
|
extraIntent.setExtrasClassLoader(classLoader)
|
|
|
|
startActivity(extraIntent)
|
|
|
|
}
|
|
|
|
return initialTab
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun initUnreadCount() {
|
2016-08-21 15:30:07 +02:00
|
|
|
for (i in 0 until mainTabs.count) {
|
2016-07-02 05:54:53 +02:00
|
|
|
mainTabs.setBadge(i, 0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun openAccountsDrawer() {
|
|
|
|
if (homeMenu == null) return
|
|
|
|
homeMenu.openDrawer(GravityCompat.START)
|
|
|
|
}
|
|
|
|
|
2016-12-17 05:10:24 +01:00
|
|
|
private fun showDrawerTutorial(): Boolean {
|
2016-12-13 12:35:25 +01:00
|
|
|
if (preferences[drawerTutorialCompleted]) return false
|
|
|
|
val targetSize = resources.getDimensionPixelSize(R.dimen.element_size_mlarge)
|
|
|
|
val height = resources.displayMetrics.heightPixels
|
|
|
|
val listener: TapTargetView.Listener = object : TapTargetView.Listener() {
|
|
|
|
override fun onTargetClick(view: TapTargetView?) {
|
|
|
|
if (!homeMenu.isDrawerOpen(GravityCompat.START)) {
|
|
|
|
homeMenu.openDrawer(GravityCompat.START)
|
|
|
|
}
|
|
|
|
super.onTargetClick(view)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onTargetDismissed(view: TapTargetView?, userInitiated: Boolean) {
|
|
|
|
preferences[drawerTutorialCompleted] = true
|
2016-12-17 05:10:24 +01:00
|
|
|
showAutoRefreshConfirm()
|
|
|
|
|
2016-12-13 12:35:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
val target = Rect(0, 0, targetSize, targetSize)
|
|
|
|
target.offsetTo(0, height / 2 - targetSize / 2)
|
|
|
|
TapTargetView.showFor(this, TapTarget.forBounds(target,
|
|
|
|
getString(R.string.hint_accounts_dashboard_title),
|
|
|
|
getString(R.string.hint_accounts_dashboard_message))
|
|
|
|
.apply {
|
|
|
|
outerCircleColor(R.color.branding_color)
|
|
|
|
dimColor(android.R.color.black)
|
|
|
|
}, listener)
|
|
|
|
|
2016-07-02 05:54:53 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2016-12-17 05:10:24 +01:00
|
|
|
private fun showAutoRefreshConfirm() {
|
2017-01-07 12:34:42 +01:00
|
|
|
if (isFinishing) return
|
|
|
|
executeAfterFragmentResumed { activity ->
|
|
|
|
val df = AutoRefreshConfirmDialogFragment()
|
|
|
|
df.show(activity.supportFragmentManager, "auto_refresh_confirm")
|
|
|
|
}
|
2016-12-17 05:10:24 +01:00
|
|
|
}
|
|
|
|
|
2016-07-02 05:54:53 +02:00
|
|
|
private fun setTabPosition(initialTab: Int) {
|
|
|
|
val rememberPosition = preferences.getBoolean(SharedPreferenceConstants.KEY_REMEMBER_POSITION, true)
|
|
|
|
if (initialTab >= 0) {
|
2016-12-08 15:43:18 +01:00
|
|
|
mainPager.currentItem = TwidereMathUtils.clamp(initialTab, pagerAdapter.count, 0)
|
2016-07-02 05:54:53 +02:00
|
|
|
} else if (rememberPosition) {
|
|
|
|
val position = preferences.getInt(SharedPreferenceConstants.KEY_SAVED_TAB_POSITION, 0)
|
2016-12-08 15:43:18 +01:00
|
|
|
mainPager.currentItem = TwidereMathUtils.clamp(position, pagerAdapter.count, 0)
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setupBars() {
|
|
|
|
val backgroundOption = currentThemeBackgroundOption
|
|
|
|
val isTransparent = ThemeUtils.isTransparentBackground(backgroundOption)
|
|
|
|
val actionBarAlpha = if (isTransparent) ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) else 0xFF
|
|
|
|
actionsButton.alpha = actionBarAlpha / 255f
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setupHomeTabs() {
|
2016-12-08 15:43:18 +01:00
|
|
|
pagerAdapter.clear()
|
|
|
|
pagerAdapter.addTabs(CustomTabUtils.getHomeTabs(this))
|
|
|
|
val hasNoTab = pagerAdapter.count == 0
|
2016-07-02 05:54:53 +02:00
|
|
|
emptyTabHint.visibility = if (hasNoTab) View.VISIBLE else View.GONE
|
2016-12-08 15:43:18 +01:00
|
|
|
mainPager.visibility = if (hasNoTab) View.GONE else View.VISIBLE
|
2017-01-16 18:16:58 +01:00
|
|
|
if (pagerAdapter.getPageWidth(0) < 1) {
|
|
|
|
mainPager.pageMargin = resources.getDimensionPixelOffset(R.dimen.home_page_margin)
|
|
|
|
mainPager.setPageMarginDrawable(R.color.home_page_margin_color)
|
|
|
|
} else {
|
|
|
|
mainPager.pageMargin = 0
|
|
|
|
mainPager.setPageMarginDrawable(null)
|
|
|
|
}
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun setupSlidingMenu() {
|
|
|
|
homeMenu.setDrawerShadow(R.drawable.drawer_shadow_start, GravityCompat.START)
|
|
|
|
homeMenu.addDrawerListener(drawerToggle)
|
|
|
|
homeMenu.addDrawerListener(this)
|
|
|
|
homeMenu.setShouldDisableDecider(HomeDrawerLayout.ShouldDisableDecider { e ->
|
|
|
|
val fragment = leftDrawerFragment
|
|
|
|
if (fragment is AccountsDashboardFragment) {
|
2016-12-05 04:39:22 +01:00
|
|
|
return@ShouldDisableDecider fragment.shouldDisableDrawerSlide(e)
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
false
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun showDataProfilingRequest() {
|
|
|
|
//spice
|
|
|
|
if (preferences.contains(KEY_USAGE_STATISTICS)) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
val intent = Intent(this, UsageStatisticsActivity::class.java)
|
|
|
|
val contentIntent = PendingIntent.getActivity(this, 0, intent, 0)
|
|
|
|
val builder = NotificationCompat.Builder(this)
|
|
|
|
builder.setAutoCancel(true)
|
|
|
|
builder.setSmallIcon(R.drawable.ic_stat_info)
|
|
|
|
builder.setTicker(getString(R.string.usage_statistics))
|
|
|
|
builder.setContentTitle(getString(R.string.usage_statistics))
|
|
|
|
builder.setContentText(getString(R.string.usage_statistics_notification_summary))
|
|
|
|
builder.setContentIntent(contentIntent)
|
|
|
|
notificationManager.notify(NOTIFICATION_ID_DATA_PROFILING, builder.build())
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun triggerActionsClick() {
|
2016-12-08 15:43:18 +01:00
|
|
|
val position = mainPager.currentItem
|
|
|
|
if (pagerAdapter.count == 0) return
|
|
|
|
val tab = pagerAdapter.getTab(position)
|
2016-07-02 05:54:53 +02:00
|
|
|
if (DirectMessagesFragment::class.java == tab.cls) {
|
|
|
|
IntentUtils.openMessageConversation(this, null, null)
|
|
|
|
} else if (MessagesEntriesFragment::class.java == tab.cls) {
|
|
|
|
IntentUtils.openMessageConversation(this, null, null)
|
|
|
|
} else if (TrendsSuggestionsFragment::class.java == tab.cls) {
|
|
|
|
openSearchView(null)
|
|
|
|
} else {
|
|
|
|
startActivity(Intent(INTENT_ACTION_COMPOSE))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun updateActionsButton() {
|
|
|
|
val icon: Int
|
|
|
|
val title: Int
|
2016-12-08 15:43:18 +01:00
|
|
|
val position = mainPager.currentItem
|
|
|
|
if (pagerAdapter.count == 0) return
|
|
|
|
val tab = pagerAdapter.getTab(position)
|
2016-07-02 05:54:53 +02:00
|
|
|
if (DirectMessagesFragment::class.java == tab.cls) {
|
|
|
|
icon = R.drawable.ic_action_add
|
|
|
|
title = R.string.new_direct_message
|
|
|
|
} else if (MessagesEntriesFragment::class.java == tab.cls) {
|
|
|
|
icon = R.drawable.ic_action_add
|
|
|
|
title = R.string.new_direct_message
|
|
|
|
} else if (TrendsSuggestionsFragment::class.java == tab.cls) {
|
|
|
|
icon = R.drawable.ic_action_search
|
|
|
|
title = android.R.string.search_go
|
|
|
|
} else {
|
|
|
|
icon = R.drawable.ic_action_status_compose
|
2016-12-26 17:46:37 +01:00
|
|
|
title = R.string.action_compose
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
actionsButton.setImageResource(icon)
|
|
|
|
actionsButton.contentDescription = getString(title)
|
|
|
|
}
|
|
|
|
|
2016-12-12 14:19:02 +01:00
|
|
|
private class AccountUpdatedListener(private val activity: HomeActivity) : OnAccountsUpdateListener {
|
2016-07-02 05:54:53 +02:00
|
|
|
|
2016-12-08 15:43:18 +01:00
|
|
|
override fun onAccountsUpdated(accounts: Array<out Account>?) {
|
|
|
|
activity.notifyAccountsChanged()
|
|
|
|
activity.updateUnreadCount()
|
2016-07-02 05:54:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private class UpdateUnreadCountTask internal constructor(
|
|
|
|
private val context: Context,
|
2016-12-24 15:05:15 +01:00
|
|
|
private val preferences: SharedPreferences,
|
2016-07-02 05:54:53 +02:00
|
|
|
private val readStateManager: ReadStateManager,
|
|
|
|
private val indicator: TabPagerIndicator,
|
|
|
|
private val tabs: Array<SupportTabSpec>) : AsyncTask<Any, UpdateUnreadCountTask.TabBadge, SparseIntArray>() {
|
|
|
|
|
|
|
|
override fun doInBackground(vararg params: Any): SparseIntArray {
|
|
|
|
val result = SparseIntArray()
|
|
|
|
tabs.forEachIndexed { i, spec ->
|
|
|
|
if (spec.type == null) {
|
|
|
|
publishProgress(TabBadge(i, -1))
|
|
|
|
return@forEachIndexed
|
|
|
|
}
|
|
|
|
when (spec.type) {
|
|
|
|
CustomTabType.HOME_TIMELINE -> {
|
2016-07-08 03:44:43 +02:00
|
|
|
val accountKeys = Utils.getAccountKeys(context, spec.args) ?:
|
|
|
|
DataStoreUtils.getActivatedAccountKeys(context)
|
|
|
|
val position = accountKeys.map {
|
|
|
|
val tag = Utils.getReadPositionTagWithAccount(ReadPositionTag.HOME_TIMELINE, it)
|
|
|
|
readStateManager.getPosition(tag)
|
|
|
|
}.fold(0L, Math::max)
|
2016-12-24 15:05:15 +01:00
|
|
|
val count = DataStoreUtils.getStatusesCount(context, preferences,
|
|
|
|
Statuses.CONTENT_URI, spec.args, position, Statuses.STATUS_TIMESTAMP,
|
|
|
|
true, accountKeys)
|
2016-07-02 05:54:53 +02:00
|
|
|
result.put(i, count)
|
|
|
|
publishProgress(TabBadge(i, count))
|
|
|
|
}
|
|
|
|
CustomTabType.NOTIFICATIONS_TIMELINE -> {
|
2016-07-08 03:44:43 +02:00
|
|
|
val accountKeys = Utils.getAccountKeys(context, spec.args) ?:
|
|
|
|
DataStoreUtils.getActivatedAccountKeys(context)
|
|
|
|
val position = accountKeys.map {
|
|
|
|
val tag = Utils.getReadPositionTagWithAccount(ReadPositionTag.ACTIVITIES_ABOUT_ME, it)
|
|
|
|
readStateManager.getPosition(tag)
|
|
|
|
}.fold(0L, Math::max)
|
2016-07-02 05:54:53 +02:00
|
|
|
val count = DataStoreUtils.getInteractionsCount(context, spec.args,
|
2016-07-08 03:44:43 +02:00
|
|
|
accountKeys, position, Activities.TIMESTAMP)
|
2016-07-02 05:54:53 +02:00
|
|
|
publishProgress(TabBadge(i, count))
|
|
|
|
result.put(i, count)
|
|
|
|
}
|
|
|
|
else -> {
|
|
|
|
publishProgress(TabBadge(i, -1))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPostExecute(result: SparseIntArray) {
|
|
|
|
indicator.clearBadge()
|
2016-08-21 15:30:07 +02:00
|
|
|
for (i in 0 until result.size()) {
|
2016-07-02 05:54:53 +02:00
|
|
|
indicator.setBadge(result.keyAt(i), result.valueAt(i))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onProgressUpdate(vararg values: TabBadge) {
|
|
|
|
for (value in values) {
|
|
|
|
indicator.setBadge(value.index, value.count)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
internal class TabBadge(var index: Int, var count: Int)
|
|
|
|
}
|
|
|
|
|
2016-12-17 05:10:24 +01:00
|
|
|
class AutoRefreshConfirmDialogFragment : BaseDialogFragment() {
|
|
|
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
|
|
|
val builder = AlertDialog.Builder(context)
|
|
|
|
builder.setTitle(R.string.auto_refresh)
|
|
|
|
builder.setMessage(R.string.message_auto_refresh_confirm)
|
|
|
|
builder.setPositiveButton(android.R.string.ok) { dialog, which ->
|
2016-12-17 05:59:07 +01:00
|
|
|
kPreferences[defaultAutoRefreshKey] = true
|
2016-12-17 05:10:24 +01:00
|
|
|
}
|
2016-12-17 05:59:07 +01:00
|
|
|
builder.setNegativeButton(R.string.no_thanks) { dialog, which ->
|
|
|
|
kPreferences[defaultAutoRefreshKey] = false
|
2016-12-17 05:10:24 +01:00
|
|
|
}
|
|
|
|
return builder.create()
|
|
|
|
}
|
2016-12-17 05:59:07 +01:00
|
|
|
|
|
|
|
override fun onDismiss(dialog: DialogInterface?) {
|
2016-12-23 02:26:52 +01:00
|
|
|
kPreferences[defaultAutoRefreshAskedKey] = true
|
2016-12-17 05:59:07 +01:00
|
|
|
super.onDismiss(dialog)
|
|
|
|
}
|
2016-12-17 05:10:24 +01:00
|
|
|
}
|
|
|
|
|
2016-07-02 05:54:53 +02:00
|
|
|
companion object {
|
|
|
|
private val HOME_AS_UP_ATTRS = intArrayOf(android.support.v7.appcompat.R.attr.homeAsUpIndicator)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|