mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Remove BaseSelectionMenu
This commit is contained in:
@@ -44,7 +44,6 @@ import java.io.*
|
|||||||
open class BaseScreen(@JvmField protected var activity: BaseActivity) {
|
open class BaseScreen(@JvmField protected var activity: BaseActivity) {
|
||||||
|
|
||||||
private var rootView: BaseRootView? = null
|
private var rootView: BaseRootView? = null
|
||||||
private var selectionMenu: BaseSelectionMenu? = null
|
|
||||||
private var snackbar: Snackbar? = null
|
private var snackbar: Snackbar? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -100,15 +99,6 @@ open class BaseScreen(@JvmField protected var activity: BaseActivity) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the menu to be shown when a selection is active on the screen.
|
|
||||||
*
|
|
||||||
* @param menu the menu to be shown during a selection
|
|
||||||
*/
|
|
||||||
fun setSelectionMenu(menu: BaseSelectionMenu?) {
|
|
||||||
selectionMenu = menu
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows a message on the screen.
|
* Shows a message on the screen.
|
||||||
*
|
*
|
||||||
@@ -155,15 +145,6 @@ open class BaseScreen(@JvmField protected var activity: BaseActivity) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Instructs the screen to start a selection.
|
|
||||||
*
|
|
||||||
* If a selection menu was provided, this menu will be shown instead of the regular one.
|
|
||||||
*/
|
|
||||||
fun startSelection() {
|
|
||||||
activity.startSupportActionMode(ActionModeWrapper())
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setActionBarColor(actionBar: ActionBar, color: Int) {
|
private fun setActionBarColor(actionBar: ActionBar, color: Int) {
|
||||||
val drawable = ColorDrawable(color)
|
val drawable = ColorDrawable(color)
|
||||||
actionBar.setBackgroundDrawable(drawable)
|
actionBar.setBackgroundDrawable(drawable)
|
||||||
@@ -174,31 +155,6 @@ open class BaseScreen(@JvmField protected var activity: BaseActivity) {
|
|||||||
activity.window.statusBarColor = darkerColor
|
activity.window.statusBarColor = darkerColor
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class ActionModeWrapper : ActionMode.Callback {
|
|
||||||
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
|
|
||||||
val selectionMenu = selectionMenu
|
|
||||||
if (item == null || selectionMenu == null) return false
|
|
||||||
return selectionMenu.onItemClicked(item)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
|
|
||||||
if (mode == null || menu == null) return false
|
|
||||||
val selectionMenu = selectionMenu ?: return false
|
|
||||||
selectionMenu.onCreate(activity.menuInflater, mode, menu)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroyActionMode(mode: ActionMode?) {
|
|
||||||
selectionMenu?.onFinish()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
|
|
||||||
val selectionMenu = selectionMenu
|
|
||||||
if (selectionMenu == null || menu == null) return false
|
|
||||||
return selectionMenu.onPrepare(menu)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Deprecated("")
|
@Deprecated("")
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of Loop Habit Tracker.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker 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.
|
|
||||||
*
|
|
||||||
* Loop Habit Tracker 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.isoron.androidbase.activities
|
|
||||||
|
|
||||||
import android.view.*
|
|
||||||
import androidx.appcompat.view.ActionMode
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for all the selection menus in the application.
|
|
||||||
*
|
|
||||||
* A selection menu is a menu that appears when the screen starts a selection
|
|
||||||
* operation. It contains actions that modify the selected items, such as delete
|
|
||||||
* or archive. Since it replaces the toolbar, it also has a title.
|
|
||||||
*
|
|
||||||
* This class hides many implementation details of creating such menus in
|
|
||||||
* Android. The interface is supposed to look very similar to [BaseMenu],
|
|
||||||
* with a few additional methods, such as finishing the selection operation.
|
|
||||||
* Internally, it uses an [ActionMode].
|
|
||||||
*/
|
|
||||||
abstract class BaseSelectionMenu {
|
|
||||||
private var actionMode: ActionMode? = null
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finishes the selection operation.
|
|
||||||
*/
|
|
||||||
fun finish() {
|
|
||||||
actionMode?.finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Declare that the menu has changed, and should be recreated.
|
|
||||||
*/
|
|
||||||
fun invalidate() {
|
|
||||||
actionMode?.invalidate()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the menu is first displayed.
|
|
||||||
*
|
|
||||||
* This method should not be overridden. The application should override
|
|
||||||
* the methods onCreate(Menu) and getMenuResourceId instead.
|
|
||||||
*
|
|
||||||
* @param inflater a menu inflater, for creating the menu
|
|
||||||
* @param mode the action mode associated with this menu.
|
|
||||||
* @param menu the menu that is being created.
|
|
||||||
*/
|
|
||||||
fun onCreate(inflater: MenuInflater, mode: ActionMode, menu: Menu) {
|
|
||||||
actionMode = mode
|
|
||||||
inflater.inflate(getResourceId(), menu)
|
|
||||||
onCreate(menu)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the selection operation is about to finish.
|
|
||||||
*/
|
|
||||||
open fun onFinish() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called whenever an item on the menu is selected.
|
|
||||||
*
|
|
||||||
* @param item the item that was selected.
|
|
||||||
* @return true if the event was consumed, or false otherwise
|
|
||||||
*/
|
|
||||||
open fun onItemClicked(item: MenuItem): Boolean = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called whenever the menu is invalidated.
|
|
||||||
*
|
|
||||||
* @param menu the menu to be refreshed
|
|
||||||
* @return true if the menu has changes, false otherwise
|
|
||||||
*/
|
|
||||||
open fun onPrepare(menu: Menu): Boolean = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the title of the selection menu.
|
|
||||||
*
|
|
||||||
* @param title the new title.
|
|
||||||
*/
|
|
||||||
fun setTitle(title: String?) {
|
|
||||||
actionMode?.title = title
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract fun getResourceId(): Int
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the menu is first created.
|
|
||||||
*
|
|
||||||
* @param menu the menu being created
|
|
||||||
*/
|
|
||||||
protected fun onCreate(menu: Menu) {}
|
|
||||||
}
|
|
||||||
@@ -66,8 +66,7 @@ class ListHabitsScreen
|
|||||||
private val confirmSyncKeyDialogFactory: ConfirmSyncKeyDialogFactory,
|
private val confirmSyncKeyDialogFactory: ConfirmSyncKeyDialogFactory,
|
||||||
private val colorPickerFactory: ColorPickerDialogFactory,
|
private val colorPickerFactory: ColorPickerDialogFactory,
|
||||||
private val numberPickerFactory: NumberPickerFactory,
|
private val numberPickerFactory: NumberPickerFactory,
|
||||||
private val behavior: Lazy<ListHabitsBehavior>,
|
private val behavior: Lazy<ListHabitsBehavior>
|
||||||
private val selectionMenu: Lazy<ListHabitsSelectionMenu>
|
|
||||||
) : BaseScreen(activity),
|
) : BaseScreen(activity),
|
||||||
CommandRunner.Listener,
|
CommandRunner.Listener,
|
||||||
ListHabitsBehavior.Screen,
|
ListHabitsBehavior.Screen,
|
||||||
@@ -79,7 +78,6 @@ class ListHabitsScreen
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onAttached() {
|
fun onAttached() {
|
||||||
setSelectionMenu(selectionMenu.get())
|
|
||||||
commandRunner.addListener(this)
|
commandRunner.addListener(this)
|
||||||
if(activity.intent.action == "android.intent.action.VIEW") {
|
if(activity.intent.action == "android.intent.action.VIEW") {
|
||||||
val uri = activity.intent.data!!.toString()
|
val uri = activity.intent.data!!.toString()
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
package org.isoron.uhabits.activities.habits.list
|
package org.isoron.uhabits.activities.habits.list
|
||||||
|
|
||||||
import android.view.*
|
import android.view.*
|
||||||
|
import androidx.appcompat.view.ActionMode
|
||||||
import dagger.*
|
import dagger.*
|
||||||
import org.isoron.androidbase.activities.*
|
import org.isoron.androidbase.activities.*
|
||||||
import org.isoron.uhabits.*
|
import org.isoron.uhabits.*
|
||||||
@@ -33,21 +34,55 @@ import javax.inject.*
|
|||||||
|
|
||||||
@ActivityScope
|
@ActivityScope
|
||||||
class ListHabitsSelectionMenu @Inject constructor(
|
class ListHabitsSelectionMenu @Inject constructor(
|
||||||
private val screen: ListHabitsScreen,
|
private val activity: BaseActivity,
|
||||||
private val listAdapter: HabitCardListAdapter,
|
private val listAdapter: HabitCardListAdapter,
|
||||||
var commandRunner: CommandRunner,
|
var commandRunner: CommandRunner,
|
||||||
private val prefs: Preferences,
|
private val prefs: Preferences,
|
||||||
private val behavior: ListHabitsSelectionMenuBehavior,
|
private val behavior: ListHabitsSelectionMenuBehavior,
|
||||||
private val listController: Lazy<HabitCardListController>,
|
private val listController: Lazy<HabitCardListController>,
|
||||||
private val notificationTray: NotificationTray
|
private val notificationTray: NotificationTray
|
||||||
) : BaseSelectionMenu() {
|
) : ActionMode.Callback {
|
||||||
|
|
||||||
override fun onFinish() {
|
var activeActionMode: ActionMode? = null
|
||||||
listController.get().onSelectionFinished()
|
|
||||||
super.onFinish()
|
fun onSelectionStart() {
|
||||||
|
activity.startSupportActionMode(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onItemClicked(item: MenuItem): Boolean {
|
fun onSelectionChange() {
|
||||||
|
activeActionMode?.invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onSelectionFinish() {
|
||||||
|
activeActionMode?.finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
||||||
|
activeActionMode = mode
|
||||||
|
activity.menuInflater.inflate(R.menu.list_habits_selection, menu)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
|
||||||
|
val itemEdit = menu.findItem(R.id.action_edit_habit)
|
||||||
|
val itemColor = menu.findItem(R.id.action_color)
|
||||||
|
val itemArchive = menu.findItem(R.id.action_archive_habit)
|
||||||
|
val itemUnarchive = menu.findItem(R.id.action_unarchive_habit)
|
||||||
|
val itemNotify = menu.findItem(R.id.action_notify)
|
||||||
|
|
||||||
|
itemColor.isVisible = true
|
||||||
|
itemEdit.isVisible = behavior.canEdit()
|
||||||
|
itemArchive.isVisible = behavior.canArchive()
|
||||||
|
itemUnarchive.isVisible = behavior.canUnarchive()
|
||||||
|
itemNotify.isVisible = prefs.isDeveloper
|
||||||
|
activeActionMode?.title = listAdapter.selected.size.toString()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
override fun onDestroyActionMode(mode: ActionMode?) {
|
||||||
|
listController.get().onSelectionFinished()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.action_edit_habit -> {
|
R.id.action_edit_habit -> {
|
||||||
behavior.onEditHabits()
|
behavior.onEditHabits()
|
||||||
@@ -75,7 +110,7 @@ class ListHabitsSelectionMenu @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_notify -> {
|
R.id.action_notify -> {
|
||||||
for(h in listAdapter.selected)
|
for (h in listAdapter.selected)
|
||||||
notificationTray.show(h, DateUtils.getToday(), 0)
|
notificationTray.show(h, DateUtils.getToday(), 0)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -83,26 +118,4 @@ class ListHabitsSelectionMenu @Inject constructor(
|
|||||||
else -> return false
|
else -> return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPrepare(menu: Menu): Boolean {
|
|
||||||
val itemEdit = menu.findItem(R.id.action_edit_habit)
|
|
||||||
val itemColor = menu.findItem(R.id.action_color)
|
|
||||||
val itemArchive = menu.findItem(R.id.action_archive_habit)
|
|
||||||
val itemUnarchive = menu.findItem(R.id.action_unarchive_habit)
|
|
||||||
val itemNotify = menu.findItem(R.id.action_notify)
|
|
||||||
|
|
||||||
itemColor.isVisible = true
|
|
||||||
itemEdit.isVisible = behavior.canEdit()
|
|
||||||
itemArchive.isVisible = behavior.canArchive()
|
|
||||||
itemUnarchive.isVisible = behavior.canUnarchive()
|
|
||||||
setTitle(Integer.toString(listAdapter.selected.size))
|
|
||||||
itemNotify.isVisible = prefs.isDeveloper
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onSelectionStart() = screen.startSelection()
|
|
||||||
fun onSelectionChange() = invalidate()
|
|
||||||
fun onSelectionFinish() = finish()
|
|
||||||
override fun getResourceId() = R.menu.list_habits_selection
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,9 @@
|
|||||||
<item name="android:navigationBarColor">?attr/colorPrimary</item>
|
<item name="android:navigationBarColor">?attr/colorPrimary</item>
|
||||||
<item name="android:itemBackground">?attr/highContrastReverseTextColor</item>
|
<item name="android:itemBackground">?attr/highContrastReverseTextColor</item>
|
||||||
|
|
||||||
|
|
||||||
<item name="windowActionModeOverlay">true</item>
|
<item name="windowActionModeOverlay">true</item>
|
||||||
<item name="actionModeBackground">@color/blue_grey_700</item>
|
<item name="actionModeBackground">@color/grey_700</item>
|
||||||
<item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
<item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
|
|
||||||
<item name="selectedBackground">@drawable/selected_box_light</item>
|
<item name="selectedBackground">@drawable/selected_box_light</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user