diff --git a/app/src/main/java/io/timelimit/android/ui/manage/device/manage/ManageDeviceFragment.kt b/app/src/main/java/io/timelimit/android/ui/manage/device/manage/ManageDeviceFragment.kt index b99e61f..7759a1f 100644 --- a/app/src/main/java/io/timelimit/android/ui/manage/device/manage/ManageDeviceFragment.kt +++ b/app/src/main/java/io/timelimit/android/ui/manage/device/manage/ManageDeviceFragment.kt @@ -53,10 +53,6 @@ import io.timelimit.android.ui.main.AuthenticationFab import io.timelimit.android.ui.main.FragmentWithCustomTitle class ManageDeviceFragment : Fragment(), FragmentWithCustomTitle { - companion object { - private const val IS_EDITING_DEVICE_TITLE = "a" - } - private val activity: ActivityViewModelHolder by lazy { getActivity() as ActivityViewModelHolder } private val logic: AppLogic by lazy { DefaultAppLogic.with(context!!) } private val auth: ActivityViewModel by lazy { activity.getActivityViewModel() } @@ -65,22 +61,6 @@ class ManageDeviceFragment : Fragment(), FragmentWithCustomTitle { logic.database.device().getDeviceById(args.deviceId) } - private var isEditingDeviceTitle = MutableLiveData().apply { value = false } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - if (savedInstanceState != null) { - isEditingDeviceTitle.value = savedInstanceState.getBoolean(IS_EDITING_DEVICE_TITLE) - } - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - - outState.putBoolean(IS_EDITING_DEVICE_TITLE, isEditingDeviceTitle.value!!) - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val navigation = Navigation.findNavController(container!!) val binding = FragmentManageDeviceBinding.inflate(inflater, container, false) @@ -185,27 +165,9 @@ class ManageDeviceFragment : Fragment(), FragmentWithCustomTitle { } } - override fun startEditDeviceTitle() { + override fun editDeviceTitle() { if (auth.requestAuthenticationOrReturnTrue()) { - binding.newDeviceTitleText.setText(binding.deviceTitle) - isEditingDeviceTitle.value = true - } - } - - override fun doEditDeviceTitle() { - val newDeviceTitle = binding.newDeviceTitleText.text.toString() - - if (newDeviceTitle.isBlank()) { - Snackbar.make(binding.newDeviceTitleText, R.string.manage_device_rename_toast_empty, Snackbar.LENGTH_SHORT).show() - } else { - if (auth.tryDispatchParentAction( - UpdateDeviceNameAction( - deviceId = args.deviceId, - name = newDeviceTitle - ) - )) { - isEditingDeviceTitle.value = false - } + UpdateDeviceTitleDialogFragment.newInstance(args.deviceId).show(fragmentManager!!) } } @@ -284,8 +246,6 @@ class ManageDeviceFragment : Fragment(), FragmentWithCustomTitle { binding.isThisDevice = ownDeviceId == args.deviceId }) - isEditingDeviceTitle.observe(this, Observer { binding.isEditingDeviceTitle = it }) - ManageDeviceIntroduction.bind( view = binding.introduction, database = logic.database, @@ -323,7 +283,6 @@ interface ManageDeviceFragmentHandlers { fun openUsageStatsSettings() fun openNotificationAccessSettings() fun manageDeviceAdmin() - fun startEditDeviceTitle() - fun doEditDeviceTitle() + fun editDeviceTitle() fun showAuthenticationScreen() } diff --git a/app/src/main/java/io/timelimit/android/ui/manage/device/manage/UpdateDeviceTitleDialogFragment.kt b/app/src/main/java/io/timelimit/android/ui/manage/device/manage/UpdateDeviceTitleDialogFragment.kt new file mode 100644 index 0000000..18c71ba --- /dev/null +++ b/app/src/main/java/io/timelimit/android/ui/manage/device/manage/UpdateDeviceTitleDialogFragment.kt @@ -0,0 +1,105 @@ +/* + * Open 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.device.manage + +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import io.timelimit.android.R +import io.timelimit.android.coroutines.runAsync +import io.timelimit.android.data.model.Device +import io.timelimit.android.data.model.UserType +import io.timelimit.android.extensions.showSafe +import io.timelimit.android.livedata.waitForNullableValue +import io.timelimit.android.logic.DefaultAppLogic +import io.timelimit.android.sync.actions.UpdateDeviceNameAction +import io.timelimit.android.ui.main.ActivityViewModel +import io.timelimit.android.ui.main.ActivityViewModelHolder +import io.timelimit.android.ui.util.EditTextBottomSheetDialog + +class UpdateDeviceTitleDialogFragment: EditTextBottomSheetDialog() { + companion object { + private const val TAG = "UpdateDeviceTitleDialogFragment" + private const val EXTRA_DEVICE_ID = "deviceId" + + fun newInstance(deviceId: String) = UpdateDeviceTitleDialogFragment().apply { + arguments = Bundle().apply { + putString(EXTRA_DEVICE_ID, deviceId) + } + } + } + + val deviceId: String by lazy { arguments!!.getString(EXTRA_DEVICE_ID) } + val auth: ActivityViewModel by lazy { + (activity as ActivityViewModelHolder).getActivityViewModel() + } + val deviceEntry: LiveData by lazy { + DefaultAppLogic.with(context!!).database.device().getDeviceById(deviceId) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + auth.authenticatedUser.observe(this, Observer { + if (it?.second?.type != UserType.Parent) { + dismissAllowingStateLoss() + } + }) + + deviceEntry.observe(this, Observer { + if (it == null) { + dismissAllowingStateLoss() + } + }) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + if (savedInstanceState == null) { + runAsync { + deviceEntry.waitForNullableValue()?.let { deviceEntry -> + binding.editText.setText(deviceEntry.name) + didInitField() + } + } + } + + binding.title = getString(R.string.manage_device_rename) + } + + override fun go() { + val newDeviceTitle = binding.editText.text.toString() + + if (newDeviceTitle.isBlank()) { + Toast.makeText(context!!, R.string.manage_device_rename_toast_empty, Toast.LENGTH_SHORT).show() + } else { + if (auth.tryDispatchParentAction( + UpdateDeviceNameAction( + deviceId = deviceId, + name = newDeviceTitle + ) + )) { + dismiss() + } + } + } + + fun show(fragmentManager: FragmentManager) = showSafe(fragmentManager, TAG) +} diff --git a/app/src/main/java/io/timelimit/android/ui/util/EditTextBottomSheetDialog.kt b/app/src/main/java/io/timelimit/android/ui/util/EditTextBottomSheetDialog.kt index 5201fd5..6fe0635 100644 --- a/app/src/main/java/io/timelimit/android/ui/util/EditTextBottomSheetDialog.kt +++ b/app/src/main/java/io/timelimit/android/ui/util/EditTextBottomSheetDialog.kt @@ -41,6 +41,12 @@ abstract class EditTextBottomSheetDialog: DialogFragment() { } } + fun didInitField() { + binding.editText.setSelection(binding.editText.text.length) + binding.editText.requestFocus() + inputMethodManager.showSoftInput(binding.editText, 0) + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { binding = EditTextBottomSheetDialogBinding.inflate(inflater, container, false) diff --git a/app/src/main/res/layout/fragment_manage_device.xml b/app/src/main/res/layout/fragment_manage_device.xml index 87eceec..bd21bde 100644 --- a/app/src/main/res/layout/fragment_manage_device.xml +++ b/app/src/main/res/layout/fragment_manage_device.xml @@ -55,10 +55,6 @@ name="handlers" type="io.timelimit.android.ui.manage.device.manage.ManageDeviceFragmentHandlers" /> - - @@ -99,9 +95,7 @@ android:layout_height="wrap_content"> - - -