Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsManagerFragment.kt

245 lines
9.3 KiB
Kotlin
Raw Normal View History

2016-07-08 09:52:32 +02:00
package org.mariotaku.twidere.fragment
2016-12-03 16:45:13 +01:00
import android.accounts.AccountManager
2016-07-08 09:52:32 +02:00
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.DialogInterface
import android.content.Intent
import android.content.SharedPreferences
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.graphics.Color
import android.os.Bundle
2016-12-05 01:52:02 +01:00
import android.support.v4.app.LoaderManager
import android.support.v4.content.Loader
2016-07-08 09:52:32 +02:00
import android.view.*
import android.view.ContextMenu.ContextMenuInfo
import android.widget.AdapterView
import android.widget.AdapterView.AdapterContextMenuInfo
import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.*
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R
import org.mariotaku.twidere.activity.ColorPickerDialogActivity
import org.mariotaku.twidere.activity.SignInActivity
2016-12-03 16:45:13 +01:00
import org.mariotaku.twidere.adapter.AccountDetailsAdapter
2016-07-08 09:52:32 +02:00
import org.mariotaku.twidere.annotation.Referral
import org.mariotaku.twidere.constant.SharedPreferenceConstants
2016-12-05 01:52:02 +01:00
import org.mariotaku.twidere.extension.setActivated
2016-12-03 16:45:13 +01:00
import org.mariotaku.twidere.extension.setColor
2016-12-05 01:52:02 +01:00
import org.mariotaku.twidere.extension.setPosition
import org.mariotaku.twidere.loader.AccountDetailsLoader
2016-12-03 16:45:13 +01:00
import org.mariotaku.twidere.model.AccountDetails
2016-07-08 09:52:32 +02:00
import org.mariotaku.twidere.provider.TwidereDataStore.*
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
/**
* Created by mariotaku on 14/10/26.
*/
2016-12-05 01:52:02 +01:00
class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallbacks<List<AccountDetails>>,
OnSharedPreferenceChangeListener, AdapterView.OnItemClickListener {
2016-07-08 09:52:32 +02:00
2016-12-03 16:45:13 +01:00
private var adapter: AccountDetailsAdapter? = null
private var selectedAccount: AccountDetails? = null
2016-07-08 09:52:32 +02:00
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
val activity = activity
preferences.registerOnSharedPreferenceChangeListener(this)
2016-12-05 01:52:02 +01:00
adapter = AccountDetailsAdapter(activity).apply {
Utils.configBaseAdapter(activity, this)
setSortEnabled(true)
setSwitchEnabled(true)
accountToggleListener = { pos, checked ->
getItem(pos).activated = checked
}
}
2016-07-08 09:52:32 +02:00
listView.adapter = adapter
listView.isDragEnabled = true
listView.onItemClickListener = this
2016-12-05 01:52:02 +01:00
listView.setDropListener { from, to ->
adapter?.drop(from, to)
// TODO sort list
}
2016-07-08 09:52:32 +02:00
listView.setOnCreateContextMenuListener(this)
listView.emptyView = emptyView
emptyText.setText(R.string.no_account)
emptyIcon.setImageResource(R.drawable.ic_info_error_generic)
setListShown(false)
2016-12-05 01:52:02 +01:00
loaderManager.initLoader(0, null, this)
2016-07-08 09:52:32 +02:00
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
REQUEST_SET_COLOR -> {
if (resultCode != Activity.RESULT_OK || data == null || selectedAccount == null)
return
2016-12-03 16:45:13 +01:00
val am = AccountManager.get(context)
selectedAccount?.account?.setColor(am, data.getIntExtra(EXTRA_COLOR, Color.WHITE))
2016-07-08 09:52:32 +02:00
return
}
}
super.onActivityResult(requestCode, resultCode, data)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.add_account -> {
val intent = Intent(INTENT_ACTION_TWITTER_LOGIN)
intent.setClass(activity, SignInActivity::class.java)
startActivity(intent)
}
}
return super.onOptionsItemSelected(item)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_accounts_manager, menu)
}
override fun onContextItemSelected(item: MenuItem?): Boolean {
2016-12-03 16:45:13 +01:00
val menuInfo = item!!.menuInfo as? AdapterContextMenuInfo ?: return false
val details = adapter!!.getItem(menuInfo.position)
selectedAccount = details
if (details == null) return false
2016-07-08 09:52:32 +02:00
when (item.itemId) {
R.id.set_color -> {
val intent = Intent(activity, ColorPickerDialogActivity::class.java)
2016-12-03 16:45:13 +01:00
intent.putExtra(EXTRA_COLOR, details.color)
2016-07-08 09:52:32 +02:00
intent.putExtra(EXTRA_ALPHA_SLIDER, false)
startActivityForResult(intent, REQUEST_SET_COLOR)
}
R.id.delete -> {
val f = AccountDeletionDialogFragment()
val args = Bundle()
2016-12-03 16:45:13 +01:00
args.putParcelable(EXTRA_ACCOUNT, details.account)
2016-07-08 09:52:32 +02:00
f.arguments = args
f.show(childFragmentManager, FRAGMENT_TAG_ACCOUNT_DELETION)
}
}
return false
}
override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {
2016-12-03 16:45:13 +01:00
val account = adapter!!.getItem(position)
IntentUtils.openUserProfile(context, account.user, null,
preferences.getBoolean(SharedPreferenceConstants.KEY_NEW_DOCUMENT_API),
Referral.SELF_PROFILE)
2016-07-08 09:52:32 +02:00
}
override fun onStop() {
super.onStop()
saveActivatedState()
2016-12-05 01:52:02 +01:00
saveAccountPositions()
2016-07-08 09:52:32 +02:00
}
2016-12-05 01:52:02 +01:00
override fun onDestroyView() {
preferences.unregisterOnSharedPreferenceChangeListener(this)
super.onDestroyView()
}
override fun onCreateLoader(id: Int, args: Bundle?): Loader<List<AccountDetails>> {
return AccountDetailsLoader(context)
}
override fun onLoaderReset(loader: Loader<List<AccountDetails>>) {
}
override fun onLoadFinished(loader: Loader<List<AccountDetails>>, data: List<AccountDetails>) {
adapter?.apply {
clear()
addAll(data)
2016-07-08 09:52:32 +02:00
}
2016-12-05 01:52:02 +01:00
setListShown(true)
2016-07-08 09:52:32 +02:00
}
2016-12-05 01:52:02 +01:00
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)
}
}
2016-07-08 09:52:32 +02:00
}
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenuInfo) {
if (menuInfo !is AdapterContextMenuInfo) return
2016-12-03 16:45:13 +01:00
val account = adapter!!.getItem(menuInfo.position)
menu.setHeaderTitle(account!!.user.name)
2016-07-08 09:52:32 +02:00
val inflater = MenuInflater(v.context)
inflater.inflate(R.menu.action_manager_account, menu)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.layout_draggable_list_with_empty_view, container, false)
}
private fun setListShown(shown: Boolean) {
listContainer.visibility = if (shown) View.VISIBLE else View.GONE
progressContainer.visibility = if (shown) View.GONE else View.VISIBLE
}
private fun saveAccountPositions() {
2016-12-05 01:52:02 +01:00
val am = AccountManager.get(context)
adapter?.let { adapter ->
for (i in 0 until adapter.count) {
adapter.getItem(i).account.setPosition(am, i)
}
}
2016-07-08 09:52:32 +02:00
}
override fun onSharedPreferenceChanged(preferences: SharedPreferences, key: String) {
if (SharedPreferenceConstants.KEY_DEFAULT_ACCOUNT_KEY == key) {
updateDefaultAccount()
}
}
private fun updateDefaultAccount() {
adapter!!.notifyDataSetChanged()
}
class AccountDeletionDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface, which: Int) {
val id = arguments.getLong(EXTRA_ID)
2016-11-30 08:18:43 +01:00
val resolver = context.contentResolver
2016-07-08 09:52:32 +02:00
when (which) {
DialogInterface.BUTTON_POSITIVE -> {
val where = Expression.equalsArgs(Accounts._ID).sql
val whereArgs = arrayOf(id.toString())
resolver.delete(Accounts.CONTENT_URI, where, whereArgs)
// Also delete tweets related to the account we previously
// deleted.
resolver.delete(Statuses.CONTENT_URI, where, whereArgs)
resolver.delete(Mentions.CONTENT_URI, where, whereArgs)
resolver.delete(Inbox.CONTENT_URI, where, whereArgs)
resolver.delete(Outbox.CONTENT_URI, where, whereArgs)
}
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val context = context
val builder = AlertDialog.Builder(context)
builder.setNegativeButton(android.R.string.cancel, null)
builder.setPositiveButton(android.R.string.ok, this)
builder.setTitle(R.string.account_delete_confirm_title)
builder.setMessage(R.string.account_delete_confirm_message)
return builder.create()
}
}
companion object {
private val FRAGMENT_TAG_ACCOUNT_DELETION = "account_deletion"
}
}