diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddAlreadyAssignedAppsInfoDialog.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddAlreadyAssignedAppsInfoDialog.kt new file mode 100644 index 0000000..be5a1d7 --- /dev/null +++ b/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddAlreadyAssignedAppsInfoDialog.kt @@ -0,0 +1,37 @@ +/* + * TimeLimit Copyright 2019 Jonas Lochmann + * + * 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 version 3 of the License. + * + * 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 . + */ +package io.timelimit.android.ui.manage.category.apps.add + +import android.app.Dialog +import android.os.Bundle +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager +import io.timelimit.android.R +import io.timelimit.android.extensions.showSafe + +class AddAlreadyAssignedAppsInfoDialog: DialogFragment() { + companion object { + private const val DIALOG_TAG = "AddAlreadyAssignedAppsInfoDialog" + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(context!!, theme) + .setMessage(R.string.must_read_add_already_assigned_apps) + .setPositiveButton(R.string.generic_ok, null) + .create() + + fun show(fragmentManager: FragmentManager) = showSafe(fragmentManager, DIALOG_TAG) +} \ No newline at end of file diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddAppAdapter.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddAppAdapter.kt index a9d7759..263fdd4 100644 --- a/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddAppAdapter.kt +++ b/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddAppAdapter.kt @@ -20,7 +20,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import io.timelimit.android.data.model.App import io.timelimit.android.databinding.FragmentAddCategoryAppsItemBinding -import io.timelimit.android.extensions.toggle import io.timelimit.android.logic.DefaultAppLogic import kotlin.properties.Delegates @@ -28,17 +27,7 @@ class AddAppAdapter: RecyclerView.Adapter() { var data: List? by Delegates.observable(null as List?) { _, _, _ -> notifyDataSetChanged() } var listener: AddAppAdapterListener? = null var categoryTitleByPackageName: Map by Delegates.observable(emptyMap()) { _, _, _ -> notifyDataSetChanged() } - val selectedApps = mutableSetOf() - - private val itemHandlers = object: ItemHandlers { - override fun onAppClicked(app: App) { - selectedApps.toggle(app.packageName) - - notifyDataSetChanged() - } - - override fun onAppLongClicked(app: App) = listener?.onAppLongClicked(app) ?: false - } + var selectedApps: Set by Delegates.observable(emptySet()) { _, _, _ -> notifyDataSetChanged() } init { setHasStableIds(true) @@ -67,7 +56,7 @@ class AddAppAdapter: RecyclerView.Adapter() { LayoutInflater.from(parent.context), parent, false - ).apply { handlers = itemHandlers } + ) ) override fun onBindViewHolder(holder: ViewHolder, position: Int) { @@ -77,6 +66,7 @@ class AddAppAdapter: RecyclerView.Adapter() { binding.item = item binding.checked = selectedApps.contains(item.packageName) binding.currentCategoryTitle = categoryTitleByPackageName[item.packageName] + binding.handlers = listener binding.executePendingBindings() binding.icon.setImageDrawable( @@ -89,10 +79,7 @@ class AddAppAdapter: RecyclerView.Adapter() { class ViewHolder(val binding: FragmentAddCategoryAppsItemBinding): RecyclerView.ViewHolder(binding.root) -interface ItemHandlers: AddAppAdapterListener { - fun onAppClicked(app: App) -} - interface AddAppAdapterListener { + fun onAppClicked(app: App) fun onAppLongClicked(app: App): Boolean } \ No newline at end of file diff --git a/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddCategoryAppsFragment.kt b/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddCategoryAppsFragment.kt index 0b0ce6d..02c27e8 100644 --- a/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddCategoryAppsFragment.kt +++ b/app/src/main/java/io/timelimit/android/ui/manage/category/apps/add/AddCategoryAppsFragment.kt @@ -49,6 +49,7 @@ class AddCategoryAppsFragment : DialogFragment() { companion object { private const val DIALOG_TAG = "x" private const val STATUS_PACKAGE_NAMES = "d" + private const val STATUS_EDUCATED = "e" fun newInstance(params: ManageCategoryFragmentArgs) = AddCategoryAppsFragment().apply { arguments = params.toBundle() @@ -59,6 +60,7 @@ class AddCategoryAppsFragment : DialogFragment() { private val database: Database by lazy { DefaultAppLogic.with(context!!).database } private val auth: ActivityViewModel by lazy { getActivityViewModel(activity!!) } private val adapter = AddAppAdapter() + private var didEducateAboutAddingAssignedApps = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -70,9 +72,8 @@ class AddCategoryAppsFragment : DialogFragment() { }) if (savedInstanceState != null) { - adapter.selectedApps.addAll( - savedInstanceState.getStringArrayList(STATUS_PACKAGE_NAMES)!! - ) + adapter.selectedApps = savedInstanceState.getStringArrayList(STATUS_PACKAGE_NAMES)!!.toSet() + didEducateAboutAddingAssignedApps = savedInstanceState.getBoolean(STATUS_EDUCATED) } } @@ -80,6 +81,7 @@ class AddCategoryAppsFragment : DialogFragment() { super.onSaveInstanceState(outState) outState.putStringArrayList(STATUS_PACKAGE_NAMES, ArrayList(adapter.selectedApps)) + outState.putBoolean(STATUS_EDUCATED, didEducateAboutAddingAssignedApps) } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { @@ -194,14 +196,26 @@ class AddCategoryAppsFragment : DialogFragment() { } binding.selectAllButton.setOnClickListener { - adapter.selectedApps.addAll( - adapter.data?.map { it.packageName } ?: emptySet() - ) - - adapter.notifyDataSetChanged() + adapter.selectedApps = adapter.selectedApps + (adapter.data?.map { it.packageName }?.toSet() ?: emptySet()) } adapter.listener = object: AddAppAdapterListener { + override fun onAppClicked(app: App) { + if (adapter.selectedApps.contains(app.packageName)) { + adapter.selectedApps = adapter.selectedApps - setOf(app.packageName) + } else { + if (!didEducateAboutAddingAssignedApps) { + if (adapter.categoryTitleByPackageName[app.packageName] != null) { + didEducateAboutAddingAssignedApps = true + + AddAlreadyAssignedAppsInfoDialog().show(fragmentManager!!) + } + } + + adapter.selectedApps = adapter.selectedApps + setOf(app.packageName) + } + } + override fun onAppLongClicked(app: App): Boolean { return if (adapter.selectedApps.isEmpty()) { AddAppActivitiesDialogFragment.newInstance( diff --git a/app/src/main/res/layout/fragment_add_category_apps_item.xml b/app/src/main/res/layout/fragment_add_category_apps_item.xml index 3b8f498..1f33394 100644 --- a/app/src/main/res/layout/fragment_add_category_apps_item.xml +++ b/app/src/main/res/layout/fragment_add_category_apps_item.xml @@ -27,7 +27,7 @@ + type="io.timelimit.android.ui.manage.category.apps.add.AddAppAdapterListener" /> + + Apps mit Kategorie werden beim Hinzufügen aus der vorherigen Kategorie entfernt - für mehrere Kategorien gleichzeitig können Sie Ober- und Unter-Kategorien verwenden + \ No newline at end of file diff --git a/app/src/main/res/values/strings-must-read.xml b/app/src/main/res/values/strings-must-read.xml index 5247567..f90abfc 100644 --- a/app/src/main/res/values/strings-must-read.xml +++ b/app/src/main/res/values/strings-must-read.xml @@ -29,4 +29,8 @@ If there is one rule per day with 3 hours, then there is a limit of 3 hours per day. + + Apps with category are removed from the previous category when they are added to a new category - + use parent and child categories to \"add\" an App to multiple categories + \ No newline at end of file