From cf435fdb7230253bc0d55b9d557f50b5a56ff08a Mon Sep 17 00:00:00 2001 From: Jannik Date: Sat, 2 Apr 2022 18:54:17 +0200 Subject: [PATCH] replace LoginDialog with material-components based LoginModalBottomSheet --- app/build.gradle | 2 - .../teapod/ui/activity/main/MainActivity.kt | 25 ++--- .../activity/main/fragments/AboutFragment.kt | 2 - .../main/fragments/AccountFragment.kt | 64 ++++--------- .../mosad/teapod/ui/components/LoginDialog.kt | 94 ------------------- .../ui/components/LoginModalBottomSheet.kt | 54 +++++++++++ app/src/main/res/layout/dialog_login.xml | 30 ------ app/src/main/res/layout/item_episode.xml | 2 +- .../main/res/layout/item_episode_player.xml | 2 +- .../res/layout/modal_bottom_sheet_login.xml | 77 +++++++++++++++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/styles.xml | 10 -- 12 files changed, 163 insertions(+), 200 deletions(-) delete mode 100644 app/src/main/java/org/mosad/teapod/ui/components/LoginDialog.kt create mode 100644 app/src/main/java/org/mosad/teapod/ui/components/LoginModalBottomSheet.kt delete mode 100644 app/src/main/res/layout/dialog_login.xml create mode 100644 app/src/main/res/layout/modal_bottom_sheet_login.xml diff --git a/app/build.gradle b/app/build.gradle index 10d7409..8c9d571 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,8 +68,6 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.12.0' implementation 'jp.wasabeef:glide-transformations:4.3.0' - implementation 'com.afollestad.material-dialogs:core:3.3.0' // TODO remove once unused - implementation 'com.afollestad.material-dialogs:bottomsheets:3.3.0' // TODO remove once unused implementation "io.ktor:ktor-client-core:$ktor_version" implementation "io.ktor:ktor-client-android:$ktor_version" diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt index 9c4e09c..1aa168f 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/MainActivity.kt @@ -43,7 +43,7 @@ import org.mosad.teapod.ui.activity.main.fragments.LibraryFragment import org.mosad.teapod.ui.activity.main.fragments.SearchFragment import org.mosad.teapod.ui.activity.onboarding.OnboardingActivity import org.mosad.teapod.ui.activity.player.PlayerActivity -import org.mosad.teapod.ui.components.LoginDialog +import org.mosad.teapod.ui.components.LoginModalBottomSheet import org.mosad.teapod.util.DataTypes import org.mosad.teapod.util.metadb.MetaDBController import java.util.* @@ -185,18 +185,19 @@ class MainActivity : AppCompatActivity(), NavigationBarView.OnItemSelectedListen } private fun showLoginDialog() { - LoginDialog(this, false).positiveButton { - EncryptedPreferences.saveCredentials(login, password, context) + val loginModal = LoginModalBottomSheet().apply { + positiveAction = { + EncryptedPreferences.saveCredentials(login, password, requireContext()) - // TODO -// if (!AoDParser.login()) { -// showLoginDialog() -// Log.w(javaClass.name, "Login failed, please try again.") -// } - }.negativeButton { - Log.i(classTag, "Login canceled, exiting.") - finish() - }.show() + // TODO only dismiss if login was successful + this.dismiss() + } + negativeAction = { + Log.i(classTag, "Login canceled, exiting.") + finish() + } + } + loginModal.show(this.supportFragmentManager, LoginModalBottomSheet.TAG) } /** diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AboutFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AboutFragment.kt index 6cd1fa9..7791d3d 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AboutFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AboutFragment.kt @@ -109,8 +109,6 @@ class AboutFragment : Fragment() { "https://github.com/google/ExoPlayer", License.APACHE2), ThirdPartyComponent("Material design icons", "2020", "Google Inc.", "https://github.com/google/material-design-icons", License.APACHE2), - ThirdPartyComponent("Material Dialogs", "", "Aidan Follestad", - "https://github.com/afollestad/material-dialogs", License.APACHE2), ThirdPartyComponent("Ktor", "2014-2021", "JetBrains s.r.o and contributors", "https://ktor.io/", License.APACHE2), ThirdPartyComponent("kotlinx.coroutines", "2016-2021", "JetBrains s.r.o", diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt index ca0ca11..dd8dc8e 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/AccountFragment.kt @@ -1,12 +1,9 @@ package org.mosad.teapod.ui.activity.main.fragments -import android.app.Activity -import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope @@ -24,7 +21,7 @@ import org.mosad.teapod.parser.crunchyroll.supportedLocals import org.mosad.teapod.preferences.EncryptedPreferences import org.mosad.teapod.preferences.Preferences import org.mosad.teapod.ui.activity.main.MainActivity -import org.mosad.teapod.ui.components.LoginDialog +import org.mosad.teapod.ui.components.LoginModalBottomSheet import org.mosad.teapod.util.DataTypes.Theme import org.mosad.teapod.util.showFragment import org.mosad.teapod.util.toDisplayString @@ -37,28 +34,6 @@ class AccountFragment : Fragment() { Crunchyroll.profile() } - private val getUriExport = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - result.data?.data?.also { uri -> - //StorageController.exportMyList(requireContext(), uri) - } - } - } - - private val getUriImport = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - result.data?.data?.also { uri -> -// val success = StorageController.importMyList(requireContext(), uri) -// if (success == 0) { -// Toast.makeText( -// context, getString(R.string.import_data_success), -// Toast.LENGTH_SHORT -// ).show() -// } - } - } - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { binding = FragmentAccountBinding.inflate(inflater, container, false) return binding.root @@ -102,7 +77,7 @@ class AccountFragment : Fragment() { private fun initActions() { binding.linearAccountLogin.setOnClickListener { - showLoginDialog(true) + showLoginDialog() } binding.linearAccountSubscription.setOnClickListener { @@ -136,36 +111,29 @@ class AccountFragment : Fragment() { } binding.linearExportData.setOnClickListener { - val i = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "text/json" - putExtra(Intent.EXTRA_TITLE, "my-list.json") - } - getUriExport.launch(i) + // unused } binding.linearImportData.setOnClickListener { - val i = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "*/*" - } - getUriImport.launch(i) + // unused } } - private fun showLoginDialog(firstTry: Boolean) { - LoginDialog(requireContext(), firstTry).positiveButton { - EncryptedPreferences.saveCredentials(login, password, context) - - // TODO -// if (!AoDParser.login()) { -// showLoginDialog(false) -// Log.w(javaClass.name, "Login failed, please try again.") -// } - }.show { + private fun showLoginDialog() { + val loginModal = LoginModalBottomSheet().apply { login = EncryptedPreferences.login password = "" + positiveAction = { + EncryptedPreferences.saveCredentials(login, password, requireContext()) + + // TODO only dismiss if login was successful + this.dismiss() + } + negativeAction = { + this.dismiss() + } } + activity?.let { loginModal.show(it.supportFragmentManager, LoginModalBottomSheet.TAG) } } private fun showContentLanguageSelection() { diff --git a/app/src/main/java/org/mosad/teapod/ui/components/LoginDialog.kt b/app/src/main/java/org/mosad/teapod/ui/components/LoginDialog.kt deleted file mode 100644 index a09d8f3..0000000 --- a/app/src/main/java/org/mosad/teapod/ui/components/LoginDialog.kt +++ /dev/null @@ -1,94 +0,0 @@ -/** - * ProjectLaogai - * - * Copyright 2019-2020 - * - * 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - * - */ - -package org.mosad.teapod.ui.components - -import android.content.Context -import android.widget.EditText -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.bottomsheets.setPeekHeight -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.customview.getCustomView -import org.mosad.teapod.R - -// TODO rework and port away from MaterialDialog -class LoginDialog(val context: Context, firstTry: Boolean) { - - private val dialog = MaterialDialog(context, BottomSheet()) - - private val editTextLogin: EditText - private val editTextPassword: EditText - - var login = "" - var password = "" - - init { - dialog.title(R.string.login) - .message(if (firstTry) R.string.login_desc else R.string.login_failed_desc) - .customView(R.layout.dialog_login) - .positiveButton(R.string.save) - .negativeButton(R.string.cancel) - .setPeekHeight(900) - - editTextLogin = dialog.getCustomView().findViewById(R.id.edit_text_login) - editTextPassword = dialog.getCustomView().findViewById(R.id.edit_text_password) - - // fix not working accent color - //dialog.getActionButton(WhichButton.POSITIVE).updateTextColor(Preferences.colorAccent) - //dialog.getActionButton(WhichButton.NEGATIVE).updateTextColor(Preferences.colorAccent) - } - - fun positiveButton(func: LoginDialog.() -> Unit): LoginDialog = apply { - dialog.positiveButton { - login = editTextLogin.text.toString() - password = editTextPassword.text.toString() - - func() - } - } - - fun negativeButton(func: LoginDialog.() -> Unit): LoginDialog = apply { - dialog.negativeButton { - func() - } - } - - fun show() { - dialog.show() - } - - fun show(func: LoginDialog.() -> Unit): LoginDialog = apply { - func() - - editTextLogin.setText(login) - editTextPassword.setText(password) - - show() - } - - @Suppress("unused") - fun dismiss() { - dialog.dismiss() - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/ui/components/LoginModalBottomSheet.kt b/app/src/main/java/org/mosad/teapod/ui/components/LoginModalBottomSheet.kt new file mode 100644 index 0000000..7de4571 --- /dev/null +++ b/app/src/main/java/org/mosad/teapod/ui/components/LoginModalBottomSheet.kt @@ -0,0 +1,54 @@ +package org.mosad.teapod.ui.components + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import org.mosad.teapod.databinding.ModalBottomSheetLoginBinding + +/** + * A bottom sheet with login credential input fields. + * + * To initialize login or password values, use apply. + */ +class LoginModalBottomSheet : BottomSheetDialogFragment() { + + private lateinit var binding: ModalBottomSheetLoginBinding + + var login = "" + var password = "" + + lateinit var positiveAction: LoginModalBottomSheet.() -> Unit + lateinit var negativeAction: LoginModalBottomSheet.() -> Unit + + companion object { + const val TAG = "LoginModalBottomSheet" + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = ModalBottomSheetLoginBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.editTextLogin.setText(login) + binding.editTextPassword.setText(password) + + binding.positiveButton.setOnClickListener { + login = binding.editTextLogin.text.toString() + password = binding.editTextPassword.text.toString() + + positiveAction.invoke(this) + } + binding.negativeButton.setOnClickListener { + negativeAction.invoke(this) + } + } +} diff --git a/app/src/main/res/layout/dialog_login.xml b/app/src/main/res/layout/dialog_login.xml deleted file mode 100644 index 17468d7..0000000 --- a/app/src/main/res/layout/dialog_login.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_episode.xml b/app/src/main/res/layout/item_episode.xml index 0a767fb..77e1e06 100644 --- a/app/src/main/res/layout/item_episode.xml +++ b/app/src/main/res/layout/item_episode.xml @@ -24,7 +24,7 @@ android:layout_height="72dp" android:contentDescription="@string/component_poster_desc" app:shapeAppearance="@style/ShapeAppearance.Teapod.RoundedPoster" - app:srcCompat="@color/md_disabled_text_dark_theme" /> + app:srcCompat="@color/imagePlacholder" /> + app:srcCompat="@color/imagePlacholder" /> + + + + + + + + + + + + +