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"
|
|
|
|
}
|
|
|
|
}
|