2016-07-08 09:52:32 +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.fragment
|
|
|
|
|
2016-12-04 04:58:03 +01:00
|
|
|
import android.accounts.AccountManager
|
2016-11-30 08:18:43 +01:00
|
|
|
import android.app.Dialog
|
2016-07-08 09:52:32 +02:00
|
|
|
import android.content.ContentValues
|
|
|
|
import android.content.Context
|
2016-11-30 08:18:43 +01:00
|
|
|
import android.content.DialogInterface
|
2016-07-08 09:52:32 +02:00
|
|
|
import android.content.Intent
|
|
|
|
import android.database.Cursor
|
|
|
|
import android.graphics.Paint
|
|
|
|
import android.graphics.PorterDuff.Mode
|
|
|
|
import android.os.Bundle
|
|
|
|
import android.support.v4.app.LoaderManager.LoaderCallbacks
|
|
|
|
import android.support.v4.content.CursorLoader
|
|
|
|
import android.support.v4.content.Loader
|
2016-11-30 08:18:43 +01:00
|
|
|
import android.support.v7.app.AlertDialog
|
2016-07-08 09:52:32 +02:00
|
|
|
import android.text.TextUtils
|
2016-12-01 03:16:55 +01:00
|
|
|
import android.util.SparseArray
|
2016-07-08 09:52:32 +02:00
|
|
|
import android.view.*
|
2016-11-30 08:18:43 +01:00
|
|
|
import android.widget.*
|
2016-07-08 09:52:32 +02:00
|
|
|
import android.widget.AbsListView.MultiChoiceModeListener
|
|
|
|
import android.widget.AdapterView.OnItemClickListener
|
|
|
|
import com.afollestad.appthemeengine.ATEActivity
|
|
|
|
import com.afollestad.appthemeengine.Config
|
|
|
|
import com.mobeta.android.dslv.SimpleDragSortCursorAdapter
|
|
|
|
import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.*
|
2016-11-30 08:18:43 +01:00
|
|
|
import kotlinx.android.synthetic.main.list_item_section_header.view.*
|
|
|
|
import org.mariotaku.ktextension.Bundle
|
|
|
|
import org.mariotaku.ktextension.set
|
2016-07-08 09:52:32 +02:00
|
|
|
import org.mariotaku.sqliteqb.library.Columns.Column
|
|
|
|
import org.mariotaku.sqliteqb.library.Expression
|
|
|
|
import org.mariotaku.sqliteqb.library.RawItemArray
|
|
|
|
import org.mariotaku.twidere.R
|
|
|
|
import org.mariotaku.twidere.TwidereConstants.*
|
|
|
|
import org.mariotaku.twidere.activity.SettingsActivity
|
2016-11-30 08:18:43 +01:00
|
|
|
import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter
|
|
|
|
import org.mariotaku.twidere.adapter.ArrayAdapter
|
|
|
|
import org.mariotaku.twidere.annotation.CustomTabType
|
2016-12-04 04:58:03 +01:00
|
|
|
import org.mariotaku.twidere.extension.model.isOfficial
|
2016-12-04 06:45:57 +01:00
|
|
|
import org.mariotaku.twidere.model.AccountDetails
|
|
|
|
import org.mariotaku.twidere.model.Tab
|
|
|
|
import org.mariotaku.twidere.model.TabCursorIndices
|
|
|
|
import org.mariotaku.twidere.model.TabValuesCreator
|
2016-11-30 08:18:43 +01:00
|
|
|
import org.mariotaku.twidere.model.tab.DrawableHolder
|
|
|
|
import org.mariotaku.twidere.model.tab.TabConfiguration
|
2016-12-01 03:16:55 +01:00
|
|
|
import org.mariotaku.twidere.model.tab.iface.AccountCallback
|
2016-12-04 04:58:03 +01:00
|
|
|
import org.mariotaku.twidere.model.util.AccountUtils
|
2016-07-08 09:52:32 +02:00
|
|
|
import org.mariotaku.twidere.provider.TwidereDataStore.Tabs
|
|
|
|
import org.mariotaku.twidere.util.CustomTabUtils
|
|
|
|
import org.mariotaku.twidere.util.DataStoreUtils
|
|
|
|
import org.mariotaku.twidere.util.ThemeUtils
|
|
|
|
import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder
|
|
|
|
|
2016-11-30 08:18:43 +01:00
|
|
|
class CustomTabsFragment : BaseSupportFragment(), LoaderCallbacks<Cursor?>, MultiChoiceModeListener {
|
2016-07-08 09:52:32 +02:00
|
|
|
|
2016-12-08 15:56:21 +01:00
|
|
|
private lateinit var adapter: CustomTabsAdapter
|
2016-07-08 09:52:32 +02:00
|
|
|
|
|
|
|
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
|
|
|
when (item.itemId) {
|
|
|
|
R.id.delete -> {
|
|
|
|
val itemIds = listView.checkedItemIds
|
|
|
|
val where = Expression.`in`(Column(Tabs._ID), RawItemArray(itemIds))
|
2016-12-13 01:23:41 +01:00
|
|
|
context.contentResolver.delete(Tabs.CONTENT_URI, where.sql, null)
|
2016-07-26 09:12:25 +02:00
|
|
|
SettingsActivity.setShouldRestart(activity)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
mode.finish()
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
|
|
|
super.onActivityCreated(savedInstanceState)
|
|
|
|
setHasOptionsMenu(true)
|
|
|
|
adapter = CustomTabsAdapter(context)
|
|
|
|
listView.choiceMode = ListView.CHOICE_MODE_MULTIPLE_MODAL
|
|
|
|
listView.setMultiChoiceModeListener(this)
|
2016-11-30 08:18:43 +01:00
|
|
|
listView.onItemClickListener = OnItemClickListener { parent, view, position, id ->
|
2016-12-08 15:56:21 +01:00
|
|
|
val tab = adapter.getTab(position)
|
2016-11-30 08:18:43 +01:00
|
|
|
val df = TabEditorDialogFragment()
|
|
|
|
df.arguments = Bundle {
|
|
|
|
this[EXTRA_OBJECT] = tab
|
|
|
|
}
|
|
|
|
df.show(fragmentManager, TabEditorDialogFragment.TAG_EDIT_TAB)
|
|
|
|
}
|
2016-07-08 09:52:32 +02:00
|
|
|
listView.adapter = adapter
|
|
|
|
listView.emptyView = emptyView
|
|
|
|
listView.setDropListener { from, to ->
|
2016-12-08 15:56:21 +01:00
|
|
|
adapter.drop(from, to)
|
2016-07-08 09:52:32 +02:00
|
|
|
if (listView.choiceMode != AbsListView.CHOICE_MODE_NONE) {
|
|
|
|
listView.moveCheckState(from, to)
|
|
|
|
}
|
|
|
|
saveTabPositions()
|
|
|
|
}
|
|
|
|
emptyText.setText(R.string.no_tab)
|
|
|
|
emptyIcon.setImageResource(R.drawable.ic_info_tab)
|
|
|
|
loaderManager.initLoader(0, null, this)
|
|
|
|
setListShown(false)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setListShown(shown: Boolean) {
|
|
|
|
listContainer.visibility = if (shown) View.VISIBLE else View.GONE
|
|
|
|
progressContainer.visibility = if (shown) View.GONE else View.VISIBLE
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
|
|
|
mode.menuInflater.inflate(R.menu.action_multi_select_items, menu)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor?> {
|
|
|
|
return CursorLoader(activity, Tabs.CONTENT_URI, Tabs.COLUMNS, null, null, Tabs.DEFAULT_SORT_ORDER)
|
|
|
|
}
|
|
|
|
|
2016-11-30 08:18:43 +01:00
|
|
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
|
|
|
inflater.inflate(R.menu.menu_custom_tabs, menu)
|
|
|
|
val context = this.context
|
|
|
|
val accountIds = DataStoreUtils.getAccountKeys(context)
|
|
|
|
val itemAdd = menu.findItem(R.id.add_submenu)
|
2016-07-08 09:52:32 +02:00
|
|
|
if (itemAdd != null && itemAdd.hasSubMenu()) {
|
|
|
|
val subMenu = itemAdd.subMenu
|
|
|
|
subMenu.clear()
|
2016-11-30 08:18:43 +01:00
|
|
|
for ((type, conf) in TabConfiguration.all()) {
|
2016-12-01 03:16:55 +01:00
|
|
|
val accountIdRequired = (conf.accountFlags and TabConfiguration.FLAG_ACCOUNT_REQUIRED) != 0
|
2016-11-30 08:18:43 +01:00
|
|
|
val subItem = subMenu.add(0, 0, conf.sortPosition, conf.name.createString(context))
|
|
|
|
val disabledByNoAccount = accountIdRequired && accountIds.isEmpty()
|
|
|
|
val disabledByDuplicateTab = conf.isSingleTab && CustomTabUtils.isTabAdded(context, type)
|
2016-07-08 09:52:32 +02:00
|
|
|
val shouldDisable = disabledByDuplicateTab || disabledByNoAccount
|
|
|
|
subItem.isVisible = !shouldDisable
|
|
|
|
subItem.isEnabled = !shouldDisable
|
2016-11-30 08:18:43 +01:00
|
|
|
val icon = conf.icon.createDrawable(context)
|
|
|
|
if (context is ATEActivity) {
|
|
|
|
icon.mutate().setColorFilter(Config.textColorPrimary(context, context.ateKey),
|
|
|
|
Mode.SRC_ATOP)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
subItem.icon = icon
|
2016-11-30 08:18:43 +01:00
|
|
|
subItem.setOnMenuItemClickListener { item ->
|
|
|
|
val df = TabEditorDialogFragment()
|
|
|
|
df.arguments = Bundle {
|
|
|
|
this[EXTRA_TAB_TYPE] = type
|
|
|
|
if (!adapter.isEmpty) {
|
|
|
|
this[EXTRA_TAB_POSITION] = adapter.getTab(adapter.count - 1).position + 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
df.show(fragmentManager, TabEditorDialogFragment.TAG_ADD_TAB)
|
|
|
|
return@setOnMenuItemClickListener true
|
|
|
|
}
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
|
|
|
return inflater.inflate(R.layout.layout_draggable_list_with_empty_view, container, false)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDestroyActionMode(mode: ActionMode) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onItemCheckedStateChanged(mode: ActionMode, position: Int, id: Long,
|
|
|
|
checked: Boolean) {
|
|
|
|
updateTitle(mode)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onLoaderReset(loader: Loader<Cursor?>) {
|
2016-12-08 15:56:21 +01:00
|
|
|
adapter.changeCursor(null)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onLoadFinished(loader: Loader<Cursor?>, cursor: Cursor?) {
|
2016-12-08 15:56:21 +01:00
|
|
|
adapter.changeCursor(cursor)
|
2016-07-08 09:52:32 +02:00
|
|
|
setListShown(true)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
|
|
|
|
updateTitle(mode)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onStop() {
|
|
|
|
super.onStop()
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun saveTabPositions() {
|
2016-12-08 15:56:21 +01:00
|
|
|
val positions = adapter.cursorPositions
|
|
|
|
val c = adapter.cursor
|
2016-07-08 09:52:32 +02:00
|
|
|
if (positions != null && c != null && !c.isClosed) {
|
|
|
|
val idIdx = c.getColumnIndex(Tabs._ID)
|
2016-08-21 15:30:07 +02:00
|
|
|
for (i in 0 until positions.size) {
|
2016-07-08 09:52:32 +02:00
|
|
|
c.moveToPosition(positions[i])
|
|
|
|
val id = c.getLong(idIdx)
|
|
|
|
val values = ContentValues()
|
|
|
|
values.put(Tabs.POSITION, i)
|
|
|
|
val where = Expression.equals(Tabs._ID, id).sql
|
2016-12-13 01:23:41 +01:00
|
|
|
context.contentResolver.update(Tabs.CONTENT_URI, values, where, null)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
}
|
2016-07-26 09:12:25 +02:00
|
|
|
SettingsActivity.setShouldRestart(activity)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun updateTitle(mode: ActionMode?) {
|
|
|
|
if (listView == null || mode == null || activity == null) return
|
|
|
|
val count = listView.checkedItemCount
|
|
|
|
mode.title = resources.getQuantityString(R.plurals.Nitems_selected, count, count)
|
|
|
|
}
|
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
class TabEditorDialogFragment : BaseDialogFragment(), DialogInterface.OnShowListener, AccountCallback {
|
2016-11-30 08:18:43 +01:00
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
private val activityResultMap: SparseArray<TabConfiguration.ExtraConfiguration> = SparseArray()
|
|
|
|
|
|
|
|
override fun onShow(dialog: DialogInterface) {
|
|
|
|
dialog as AlertDialog
|
2016-11-30 08:18:43 +01:00
|
|
|
@CustomTabType
|
|
|
|
val tabType: String
|
|
|
|
val tab: Tab
|
|
|
|
val conf: TabConfiguration
|
|
|
|
when (tag) {
|
|
|
|
TAG_ADD_TAB -> {
|
|
|
|
tabType = arguments.getString(EXTRA_TAB_TYPE)
|
|
|
|
tab = Tab()
|
|
|
|
conf = TabConfiguration.ofType(tabType)!!
|
|
|
|
tab.type = tabType
|
|
|
|
tab.icon = conf.icon.persistentKey
|
|
|
|
tab.position = arguments.getInt(EXTRA_TAB_POSITION)
|
|
|
|
}
|
|
|
|
TAG_EDIT_TAB -> {
|
|
|
|
tab = arguments.getParcelable(EXTRA_OBJECT)
|
|
|
|
tabType = tab.type
|
2016-12-02 01:25:23 +01:00
|
|
|
conf = TabConfiguration.ofType(tabType) ?: run {
|
|
|
|
dismiss()
|
|
|
|
return
|
|
|
|
}
|
2016-11-30 08:18:43 +01:00
|
|
|
}
|
|
|
|
else -> {
|
|
|
|
throw AssertionError()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
val tabName = dialog.findViewById(R.id.tabName) as EditText
|
|
|
|
val iconSpinner = dialog.findViewById(R.id.tab_icon_spinner) as Spinner
|
|
|
|
val accountSpinner = dialog.findViewById(R.id.account_spinner) as Spinner
|
|
|
|
val accountContainer = dialog.findViewById(R.id.account_container)!!
|
|
|
|
val accountSectionHeader = accountContainer.sectionHeader
|
|
|
|
val extraConfigContainer = dialog.findViewById(R.id.extra_config_container) as LinearLayout
|
|
|
|
|
|
|
|
val positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE)
|
|
|
|
|
|
|
|
val iconsAdapter = TabIconsAdapter(context)
|
|
|
|
val accountsAdapter = AccountsSpinnerAdapter(context)
|
|
|
|
iconSpinner.adapter = iconsAdapter
|
|
|
|
accountSpinner.adapter = accountsAdapter
|
|
|
|
|
|
|
|
iconsAdapter.setData(DrawableHolder.builtins())
|
|
|
|
|
|
|
|
tabName.hint = conf.name.createString(context)
|
|
|
|
tabName.setText(tab.name)
|
|
|
|
iconSpinner.setSelection(iconsAdapter.findPositionByKey(tab.icon))
|
|
|
|
accountSectionHeader.setText(R.string.account)
|
|
|
|
|
|
|
|
val editMode = tag == TAG_EDIT_TAB
|
|
|
|
|
|
|
|
val hasAccount = conf.accountFlags and TabConfiguration.FLAG_HAS_ACCOUNT != 0
|
|
|
|
val accountMutable = conf.accountFlags and TabConfiguration.FLAG_ACCOUNT_MUTABLE != 0
|
|
|
|
if (hasAccount && (accountMutable || !editMode)) {
|
|
|
|
accountContainer.visibility = View.VISIBLE
|
|
|
|
val accountIdRequired = conf.accountFlags and TabConfiguration.FLAG_ACCOUNT_REQUIRED != 0
|
|
|
|
accountsAdapter.clear()
|
|
|
|
if (!accountIdRequired) {
|
2016-12-04 04:58:03 +01:00
|
|
|
accountsAdapter.add(AccountDetails.dummy())
|
2016-12-01 03:16:55 +01:00
|
|
|
}
|
|
|
|
val officialKeyOnly = arguments.getBoolean(EXTRA_OFFICIAL_KEY_ONLY, false)
|
2016-12-04 04:58:03 +01:00
|
|
|
accountsAdapter.addAll(AccountUtils.getAllAccountDetails(AccountManager.get(context)).filter {
|
|
|
|
if (officialKeyOnly && !it.isOfficial(context)) {
|
|
|
|
return@filter false
|
|
|
|
}
|
|
|
|
return@filter true
|
|
|
|
})
|
2016-12-01 03:16:55 +01:00
|
|
|
accountsAdapter.setDummyItemText(R.string.activated_accounts)
|
2016-11-30 08:18:43 +01:00
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
tab.arguments?.accountKeys?.firstOrNull()?.let { key ->
|
|
|
|
accountSpinner.setSelection(accountsAdapter.findPositionByKey(key))
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
accountContainer.visibility = View.GONE
|
|
|
|
}
|
2016-11-30 08:18:43 +01:00
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
val extraConfigurations = conf.getExtraConfigurations(context).orEmpty()
|
2016-11-30 08:18:43 +01:00
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
fun inflateHeader(title: String): View {
|
|
|
|
val headerView = LayoutInflater.from(context).inflate(R.layout.list_item_section_header,
|
|
|
|
extraConfigContainer, false)
|
|
|
|
headerView.sectionHeader.text = title
|
|
|
|
return headerView
|
|
|
|
}
|
2016-11-30 08:18:43 +01:00
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
extraConfigurations.forEachIndexed { idx, extraConf ->
|
|
|
|
extraConf.onCreate(context)
|
|
|
|
extraConf.position = idx + 1
|
|
|
|
// Hide immutable settings in edit mode
|
|
|
|
if (editMode && !extraConf.isMutable) return@forEachIndexed
|
|
|
|
extraConf.headerTitle?.let {
|
|
|
|
// Inflate header with headerTitle
|
|
|
|
extraConfigContainer.addView(inflateHeader(it.createString(context)))
|
|
|
|
}
|
|
|
|
val view = extraConf.onCreateView(context, extraConfigContainer)
|
|
|
|
extraConf.onViewCreated(context, view, this)
|
|
|
|
conf.readExtraConfigurationFrom(tab, extraConf)
|
|
|
|
extraConfigContainer.addView(view)
|
|
|
|
}
|
2016-11-30 08:18:43 +01:00
|
|
|
|
2016-12-08 15:56:21 +01:00
|
|
|
accountSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
2016-12-05 13:57:32 +01:00
|
|
|
|
|
|
|
private fun updateExtraTabs(account: AccountDetails?) {
|
|
|
|
extraConfigurations.forEach {
|
|
|
|
it.onAccountSelectionChanged(account)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {
|
|
|
|
val account = parent.selectedItem as? AccountDetails
|
|
|
|
updateExtraTabs(account)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onNothingSelected(view: AdapterView<*>) {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
positiveButton.setOnClickListener {
|
|
|
|
tab.name = tabName.text.toString()
|
|
|
|
tab.icon = (iconSpinner.selectedItem as DrawableHolder).persistentKey
|
|
|
|
tab.arguments = CustomTabUtils.newTabArguments(tabType)
|
2016-11-30 08:18:43 +01:00
|
|
|
if (hasAccount) {
|
2016-12-05 12:28:17 +01:00
|
|
|
val account = accountSpinner.selectedItem as? AccountDetails ?: return@setOnClickListener
|
2016-12-04 06:45:57 +01:00
|
|
|
if (!account.dummy) {
|
|
|
|
tab.arguments?.accountKeys = arrayOf(account.key)
|
2016-12-01 03:16:55 +01:00
|
|
|
} else {
|
|
|
|
tab.arguments?.accountKeys = null
|
2016-11-30 08:18:43 +01:00
|
|
|
}
|
|
|
|
}
|
2016-12-01 03:16:55 +01:00
|
|
|
tab.extras = CustomTabUtils.newTabExtras(tabType)
|
|
|
|
extraConfigurations.forEach {
|
|
|
|
// Make sure immutable configuration skipped in edit mode
|
|
|
|
if (editMode && !it.isMutable) return@forEach
|
|
|
|
if (!conf.applyExtraConfigurationTo(tab, it)) {
|
|
|
|
return@setOnClickListener
|
2016-11-30 08:18:43 +01:00
|
|
|
}
|
|
|
|
}
|
2016-12-01 03:16:55 +01:00
|
|
|
when (tag) {
|
|
|
|
TAG_EDIT_TAB -> {
|
|
|
|
val where = Expression.equalsArgs(Tabs._ID).sql
|
|
|
|
val whereArgs = arrayOf(tab.id.toString())
|
|
|
|
context.contentResolver.update(Tabs.CONTENT_URI, TabValuesCreator.create(tab), where, whereArgs)
|
2016-11-30 08:18:43 +01:00
|
|
|
}
|
2016-12-01 03:16:55 +01:00
|
|
|
TAG_ADD_TAB -> {
|
|
|
|
context.contentResolver.insert(Tabs.CONTENT_URI, TabValuesCreator.create(tab))
|
2016-11-30 08:18:43 +01:00
|
|
|
}
|
|
|
|
}
|
2016-12-10 03:03:20 +01:00
|
|
|
SettingsActivity.setShouldRestart(activity)
|
2016-12-01 03:16:55 +01:00
|
|
|
dismiss()
|
2016-11-30 08:18:43 +01:00
|
|
|
}
|
2016-12-01 03:16:55 +01:00
|
|
|
}
|
|
|
|
|
2016-12-05 12:28:17 +01:00
|
|
|
override fun getAccount(): AccountDetails? {
|
|
|
|
return (dialog.findViewById(R.id.account_spinner) as Spinner).selectedItem as? AccountDetails
|
2016-12-01 03:16:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
|
|
|
val builder = AlertDialog.Builder(context)
|
|
|
|
builder.setView(R.layout.dialog_custom_tab_editor)
|
|
|
|
builder.setPositiveButton(R.string.save, null)
|
|
|
|
builder.setNegativeButton(android.R.string.cancel, null)
|
|
|
|
val dialog = builder.create()
|
|
|
|
dialog.setOnShowListener(this)
|
2016-11-30 08:18:43 +01:00
|
|
|
return dialog
|
|
|
|
}
|
|
|
|
|
2016-12-01 03:16:55 +01:00
|
|
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
|
|
val extraConf = activityResultMap.get(requestCode)
|
|
|
|
activityResultMap.remove(requestCode)
|
|
|
|
extraConf?.onActivityResult(requestCode and 0xFF, resultCode, data)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun startExtraConfigurationActivityForResult(extraConf: TabConfiguration.ExtraConfiguration, intent: Intent, requestCode: Int) {
|
|
|
|
val requestCodeInternal = extraConf.position shl 8 and 0xFF00 or (requestCode and 0xFF)
|
|
|
|
activityResultMap.put(requestCodeInternal, extraConf)
|
|
|
|
startActivityForResult(intent, requestCodeInternal)
|
|
|
|
}
|
|
|
|
|
2016-11-30 08:18:43 +01:00
|
|
|
companion object {
|
|
|
|
|
|
|
|
const val TAG_EDIT_TAB = "edit_tab"
|
|
|
|
const val TAG_ADD_TAB = "add_tab"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
internal class TabIconsAdapter(context: Context) : ArrayAdapter<DrawableHolder>(context, R.layout.spinner_item_custom_tab_icon) {
|
|
|
|
|
|
|
|
private val iconColor: Int
|
|
|
|
|
|
|
|
init {
|
|
|
|
setDropDownViewResource(R.layout.list_item_two_line_small)
|
|
|
|
iconColor = ThemeUtils.getThemeForegroundColor(context)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
|
|
|
|
val view = super.getDropDownView(position, convertView, parent)
|
|
|
|
view.findViewById(android.R.id.text2).visibility = View.GONE
|
|
|
|
val text1 = view.findViewById(android.R.id.text1) as TextView
|
|
|
|
val item = getItem(position)
|
|
|
|
text1.text = item.name
|
|
|
|
bindIconView(item, view)
|
|
|
|
return view
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
|
|
|
|
val view = super.getView(position, convertView, parent)
|
|
|
|
bindIconView(getItem(position), view)
|
|
|
|
return view
|
|
|
|
}
|
|
|
|
|
|
|
|
fun setData(list: List<DrawableHolder>?) {
|
|
|
|
clear()
|
|
|
|
if (list == null) return
|
|
|
|
addAll(list)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun bindIconView(item: DrawableHolder, view: View) {
|
|
|
|
val icon = view.findViewById(android.R.id.icon) as ImageView
|
|
|
|
icon.setColorFilter(iconColor, Mode.SRC_ATOP)
|
|
|
|
icon.setImageDrawable(item.createDrawable(icon.context))
|
|
|
|
}
|
|
|
|
|
|
|
|
fun findPositionByKey(key: String): Int {
|
|
|
|
return (0 until count).indexOfFirst { getItem(it).persistentKey == key }
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
class CustomTabsAdapter(context: Context) : SimpleDragSortCursorAdapter(context,
|
|
|
|
R.layout.list_item_custom_tab, null, emptyArray(), intArrayOf(), 0) {
|
2016-07-08 09:52:32 +02:00
|
|
|
|
2016-11-30 08:18:43 +01:00
|
|
|
private val iconColor: Int
|
|
|
|
private var indices: TabCursorIndices? = null
|
2016-07-08 09:52:32 +02:00
|
|
|
|
|
|
|
init {
|
2016-11-30 08:18:43 +01:00
|
|
|
iconColor = ThemeUtils.getThemeForegroundColor(context)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun bindView(view: View, context: Context?, cursor: Cursor) {
|
|
|
|
super.bindView(view, context, cursor)
|
|
|
|
val holder = view.tag as TwoLineWithIconViewHolder
|
|
|
|
val indices = indices!!
|
|
|
|
val type = cursor.getString(indices.type)
|
|
|
|
val name = cursor.getString(indices.name)
|
|
|
|
val iconKey = cursor.getString(indices.icon)
|
|
|
|
if (CustomTabUtils.isTabTypeValid(type)) {
|
|
|
|
val typeName = CustomTabUtils.getTabTypeName(context, type)
|
|
|
|
holder.text1.text = if (TextUtils.isEmpty(name)) typeName else name
|
|
|
|
holder.text1.paintFlags = holder.text1.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
|
|
|
|
holder.text2.visibility = View.VISIBLE
|
|
|
|
holder.text2.text = typeName
|
|
|
|
} else {
|
|
|
|
holder.text1.text = name
|
|
|
|
holder.text1.paintFlags = holder.text1.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
|
|
|
|
holder.text2.setText(R.string.invalid_tab)
|
|
|
|
}
|
2016-11-30 08:18:43 +01:00
|
|
|
val icon = CustomTabUtils.getTabIconDrawable(context, DrawableHolder.parse(iconKey))
|
2016-07-08 09:52:32 +02:00
|
|
|
holder.icon.visibility = View.VISIBLE
|
|
|
|
if (icon != null) {
|
|
|
|
holder.icon.setImageDrawable(icon)
|
|
|
|
} else {
|
|
|
|
holder.icon.setImageResource(R.drawable.ic_action_list)
|
|
|
|
}
|
2016-11-30 08:18:43 +01:00
|
|
|
holder.icon.setColorFilter(iconColor, Mode.SRC_ATOP)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun changeCursor(cursor: Cursor?) {
|
|
|
|
if (cursor != null) {
|
2016-11-30 08:18:43 +01:00
|
|
|
indices = TabCursorIndices(cursor)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
super.changeCursor(cursor)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun newView(context: Context?, cursor: Cursor?, parent: ViewGroup): View {
|
|
|
|
val view = super.newView(context, cursor, parent)
|
|
|
|
val tag = view.tag
|
|
|
|
if (tag !is TwoLineWithIconViewHolder) {
|
|
|
|
val holder = TwoLineWithIconViewHolder(view)
|
|
|
|
view.tag = holder
|
|
|
|
}
|
|
|
|
return view
|
|
|
|
}
|
|
|
|
|
2016-11-30 08:18:43 +01:00
|
|
|
|
|
|
|
fun getTab(position: Int): Tab {
|
|
|
|
cursor.moveToPosition(position)
|
|
|
|
return indices!!.newObject(cursor)
|
2016-07-08 09:52:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|