From 3536da6166e87409a61610799b65e5af0c8da115 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 4 Nov 2023 12:22:59 -0600 Subject: [PATCH] Move more stuff to ViewModel --- .../lagradost/cloudstream3/MainActivity.kt | 7 -- .../cloudstream3/ui/account/AccountHelper.kt | 75 +++-------- .../ui/account/AccountSelectActivity.kt | 117 +++++------------- .../AccountSelectLinearItemDecoration.kt | 6 +- .../ui/account/AccountViewModel.kt | 71 +++++++++-- .../cloudstream3/ui/home/HomeFragment.kt | 5 +- .../ui/home/HomeParentItemAdapterPreview.kt | 5 +- 7 files changed, 118 insertions(+), 168 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index eede0f8d..a41028bd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -92,8 +92,6 @@ import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStri import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.inAppAuths import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.WatchType -import com.lagradost.cloudstream3.ui.account.AccountHelper -import com.lagradost.cloudstream3.ui.account.AccountViewModel import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO import com.lagradost.cloudstream3.ui.home.HomeViewModel import com.lagradost.cloudstream3.ui.player.BasicLink @@ -1612,9 +1610,4 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { false } } - - fun showAccountSelectLinear(context: Context) { - val viewModel = ViewModelProvider(this)[AccountViewModel::class.java] - AccountHelper.showAccountSelectLinear(context, viewModel, this) - } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt index d41bac9b..e92cbc8d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt @@ -1,5 +1,6 @@ package com.lagradost.cloudstream3.ui.account +import android.app.Activity import android.content.Context import android.content.DialogInterface import android.content.Intent @@ -12,10 +13,11 @@ import androidx.appcompat.app.AlertDialog import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged -import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetDialog import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys +import com.lagradost.cloudstream3.MainActivity import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.AccountEditDialogBinding import com.lagradost.cloudstream3.databinding.AccountSelectLinearBinding @@ -26,7 +28,6 @@ import com.lagradost.cloudstream3.ui.result.setImage import com.lagradost.cloudstream3.ui.result.setLinearListLayout import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus import com.lagradost.cloudstream3.utils.DataStoreHelper -import com.lagradost.cloudstream3.utils.DataStoreHelper.getAccounts import com.lagradost.cloudstream3.utils.DataStoreHelper.getDefaultAccount import com.lagradost.cloudstream3.utils.DataStoreHelper.setAccount import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe @@ -277,85 +278,45 @@ object AccountHelper { }, 200) } - fun showAccountSelectLinear( - context: Context, - viewModel: AccountViewModel, - lifecycleOwner: LifecycleOwner - ) { - fun onAccountUpdated(account: DataStoreHelper.Account) { - val currentAccounts = DataStoreHelper.accounts.toMutableList() - - val overrideIndex = currentAccounts.indexOfFirst { it.keyIndex == account.keyIndex } - - if (overrideIndex != -1) { - currentAccounts[overrideIndex] = account - } else currentAccounts.add(account) - - val currentHomePage = DataStoreHelper.currentHomePage - setAccount(account, false) - DataStoreHelper.currentHomePage = currentHomePage - DataStoreHelper.accounts = currentAccounts.toTypedArray() - } + fun Activity?.showAccountSelectLinear() { + val activity = this as? MainActivity ?: return + val viewModel = ViewModelProvider(activity)[AccountViewModel::class.java] val binding: AccountSelectLinearBinding = AccountSelectLinearBinding.inflate( - LayoutInflater.from(context) + LayoutInflater.from(activity) ) - val builder = BottomSheetDialog(context) + val builder = BottomSheetDialog(activity) builder.setContentView(binding.root) builder.show() binding.manageAccountsButton.setOnClickListener { - val accountSelectIntent = Intent(context, AccountSelectActivity::class.java) + val accountSelectIntent = Intent(activity, AccountSelectActivity::class.java) accountSelectIntent.putExtra("isEditingFromMainActivity", true) - context.startActivity(accountSelectIntent) + activity.startActivity(accountSelectIntent) builder.dismissSafe() } val recyclerView: RecyclerView = binding.accountRecyclerView - val itemWidth = recyclerView.resources.getDimensionPixelSize( + val itemSize = recyclerView.resources.getDimensionPixelSize( R.dimen.account_select_linear_item_size ) - val itemHeight = recyclerView.resources.getDimensionPixelSize( - R.dimen.account_select_linear_item_size - ) - - recyclerView.addItemDecoration(AccountSelectLinearItemDecoration(itemWidth, itemHeight)) + recyclerView.addItemDecoration(AccountSelectLinearItemDecoration(itemSize)) recyclerView.setLinearListLayout(isHorizontal = true) - lifecycleOwner.observe(viewModel.accountsLiveData) { liveAccounts -> + activity.observe(viewModel.accounts) { liveAccounts -> recyclerView.adapter = AccountAdapter( liveAccounts, accountSelectCallback = { account -> - // Check if the selected account has a lock PIN set - if (account.lockPin != null) { - // Prompt for the lock pin - showPinInputDialog(context, account.lockPin, false) { pin -> - if (pin == null) return@showPinInputDialog - // Pin is correct, unlock the profile - setAccount(account, true) - builder.dismissSafe() - } - } else { - // No lock PIN set, directly set the account - setAccount(account, true) - builder.dismissSafe() - } + viewModel.handleAccountSelect(account, activity) + builder.dismissSafe() }, - accountCreateCallback = { - onAccountUpdated(it) - viewModel.updateAccounts(getAccounts(context)) - }, - accountEditCallback = { - onAccountUpdated(it) - viewModel.updateAccounts(getAccounts(context)) - }, - accountDeleteCallback = { - viewModel.updateAccounts(getAccounts(context)) - } + accountCreateCallback = { viewModel.handleAccountUpdate(it, activity) }, + accountEditCallback = { viewModel.handleAccountUpdate(it, activity) }, + accountDeleteCallback = { viewModel.handleAccountUpdate(activity) } ) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt index 46ff0fc5..c34c8563 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt @@ -1,8 +1,8 @@ package com.lagradost.cloudstream3.ui.account +import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle -import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -15,14 +15,15 @@ import com.lagradost.cloudstream3.databinding.ActivityAccountSelectBinding import com.lagradost.cloudstream3.mvvm.observe import com.lagradost.cloudstream3.ui.account.AccountAdapter.Companion.VIEW_TYPE_EDIT_ACCOUNT import com.lagradost.cloudstream3.ui.account.AccountAdapter.Companion.VIEW_TYPE_SELECT_ACCOUNT -import com.lagradost.cloudstream3.ui.account.AccountHelper.showPinInputDialog import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.DataStoreHelper.getAccounts +import com.lagradost.cloudstream3.utils.DataStoreHelper.setAccount import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute class AccountSelectActivity : AppCompatActivity() { + @SuppressLint("NotifyDataSetChanged") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -53,75 +54,58 @@ class AccountSelectActivity : AppCompatActivity() { val viewModel = ViewModelProvider(this)[AccountViewModel::class.java] - observe(viewModel.accountsLiveData) { liveAccounts -> + observe(viewModel.accounts) { liveAccounts -> val adapter = AccountAdapter( liveAccounts, // Handle the selected account - accountSelectCallback = { onAccountSelected(it) }, - accountCreateCallback = { - onAccountUpdated(it) - - viewModel.updateAccounts( - getAccounts(binding.root.context) - ) + accountSelectCallback = { + viewModel.handleAccountSelect(it,this@AccountSelectActivity) + navigateToMainActivity() }, + accountCreateCallback = { viewModel.handleAccountUpdate(it, this@AccountSelectActivity) }, accountEditCallback = { - onAccountUpdated(it) - - viewModel.updateAccounts( - getAccounts(binding.root.context) - ) + viewModel.handleAccountUpdate(it, this@AccountSelectActivity) // We came from MainActivity, return there // and switch to the edited account if (isEditingFromMainActivity) { - DataStoreHelper.setAccount( - it, - it.keyIndex != DataStoreHelper.selectedKeyIndex - ) + setAccount(it, it.keyIndex != DataStoreHelper.selectedKeyIndex) navigateToMainActivity() } }, - accountDeleteCallback = { - viewModel.updateAccounts( - getAccounts(binding.root.context) - ) - } + accountDeleteCallback = { viewModel.handleAccountUpdate(this@AccountSelectActivity) } ) recyclerView.adapter = adapter - var isEditing = false - - if (isEditingFromMainActivity) { - binding.editAccountButton.setImageResource(R.drawable.ic_baseline_close_24) - binding.title.setText(R.string.manage_accounts) - adapter.viewType = VIEW_TYPE_EDIT_ACCOUNT - isEditing = true - - adapter.notifyDataSetChanged() - } - - binding.editAccountButton.setOnClickListener { - isEditing = !isEditing + observe(viewModel.isEditing) { isEditing -> if (isEditing) { - (it as ImageView).setImageResource(R.drawable.ic_baseline_close_24) + binding.editAccountButton.setImageResource(R.drawable.ic_baseline_close_24) binding.title.setText(R.string.manage_accounts) adapter.viewType = VIEW_TYPE_EDIT_ACCOUNT } else { - // We came from MainActivity, return there - // and resume it's state - if (isEditingFromMainActivity) { - navigateToMainActivity() - } - - (it as ImageView).setImageResource(R.drawable.ic_baseline_edit_24) + binding.editAccountButton.setImageResource(R.drawable.ic_baseline_edit_24) binding.title.setText(R.string.select_an_account) adapter.viewType = VIEW_TYPE_SELECT_ACCOUNT } adapter.notifyDataSetChanged() } + + if (isEditingFromMainActivity) { + viewModel.setIsEditing(true) + } + + binding.editAccountButton.setOnClickListener { + // We came from MainActivity, return there + // and resume its state + if (isEditingFromMainActivity) { + navigateToMainActivity() + return@setOnClickListener + } + + viewModel.toggleIsEditing() + } } if (isTvSettings()) { @@ -133,49 +117,6 @@ class AccountSelectActivity : AppCompatActivity() { } } - private fun onAccountSelected(selectedAccount: DataStoreHelper.Account) { - if (selectedAccount.lockPin != null) { - // The selected account has a PIN set, prompt the user to enter the PIN - showPinInputDialog(this@AccountSelectActivity, selectedAccount.lockPin, false) { pin -> - if (pin == null) return@showPinInputDialog - // Pin is correct, proceed to main activity - setAccount(selectedAccount) - navigateToMainActivity() - } - } else { - // No PIN set for the selected account, proceed to main activity - setAccount(selectedAccount) - navigateToMainActivity() - } - } - - private fun onAccountUpdated(account: DataStoreHelper.Account) { - val currentAccounts = DataStoreHelper.accounts.toMutableList() - - val overrideIndex = currentAccounts.indexOfFirst { it.keyIndex == account.keyIndex } - if (overrideIndex != -1) { - currentAccounts[overrideIndex] = account - } else currentAccounts.add(account) - - val currentHomePage = DataStoreHelper.currentHomePage - setAccount(account) - - DataStoreHelper.accounts = currentAccounts.toTypedArray() - DataStoreHelper.currentHomePage = currentHomePage - } - - private fun setAccount(account: DataStoreHelper.Account) { - // Don't reload if it is the same account - if (DataStoreHelper.selectedKeyIndex == account.keyIndex) { - return - } - - DataStoreHelper.selectedKeyIndex = account.keyIndex - - MainActivity.bookmarksUpdatedEvent(true) - MainActivity.reloadHomeEvent(true) - } - private fun navigateToMainActivity() { val mainIntent = Intent(this, MainActivity::class.java) startActivity(mainIntent) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectLinearItemDecoration.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectLinearItemDecoration.kt index e0fd0e4d..eb907b34 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectLinearItemDecoration.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectLinearItemDecoration.kt @@ -4,11 +4,11 @@ import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView -class AccountSelectLinearItemDecoration(private val width: Int, private val height: Int) : RecyclerView.ItemDecoration() { +class AccountSelectLinearItemDecoration(private val size: Int) : RecyclerView.ItemDecoration() { override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { val layoutParams = view.layoutParams as RecyclerView.LayoutParams - layoutParams.width = width - layoutParams.height = height + layoutParams.width = size + layoutParams.height = size view.layoutParams = layoutParams } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountViewModel.kt index 2a8ee97d..a051e618 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountViewModel.kt @@ -1,21 +1,74 @@ package com.lagradost.cloudstream3.ui.account +import android.content.Context import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.lagradost.cloudstream3.ui.account.AccountHelper.showPinInputDialog import com.lagradost.cloudstream3.utils.DataStoreHelper +import com.lagradost.cloudstream3.utils.DataStoreHelper.getAccounts +import com.lagradost.cloudstream3.utils.DataStoreHelper.setAccount class AccountViewModel : ViewModel() { - private val _accountsLiveData = MutableLiveData>() - val accountsLiveData: LiveData> get() = _accountsLiveData + private val _accounts: MutableLiveData> = MutableLiveData(DataStoreHelper.accounts.toList()) + val accounts: LiveData> = _accounts - init { - // Default to using the getAccounts function to retrieve initial data - val initialAccounts = DataStoreHelper.accounts.toList() - _accountsLiveData.value = initialAccounts + private val _isEditing = MutableLiveData(false) + val isEditing: LiveData = _isEditing + + fun handleAccountUpdate(context: Context) { + _accounts.postValue(getAccounts(context)) } - fun updateAccounts(newAccounts: List) { - _accountsLiveData.value = newAccounts + fun setIsEditing(value: Boolean) { + _isEditing.postValue(value) } -} + + fun toggleIsEditing() { + _isEditing.postValue(!(_isEditing.value ?: false)) + } + + fun handleAccountUpdate( + account: DataStoreHelper.Account, + context: Context + ) { + val currentAccounts = getAccounts(context).toMutableList() + + val overrideIndex = currentAccounts.indexOfFirst { it.keyIndex == account.keyIndex } + + if (overrideIndex != -1) { + currentAccounts[overrideIndex] = account + } else currentAccounts.add(account) + + val currentHomePage = DataStoreHelper.currentHomePage + + setAccount(account, false) + + DataStoreHelper.currentHomePage = currentHomePage + DataStoreHelper.accounts = currentAccounts.toTypedArray() + + _accounts.postValue(getAccounts(context)) + } + + fun handleAccountSelect( + account: DataStoreHelper.Account, + context: Context + ) { + // Check if the selected account has a lock PIN set + if (account.lockPin != null) { + // The selected account has a PIN set, prompt the user to enter the PIN + showPinInputDialog( + context, + account.lockPin, + false + ) { pin -> + if (pin == null) return@showPinInputDialog + // Pin is correct, proceed to main activity + setAccount(account, true) + } + } else { + // No PIN set for the selected account, proceed to main activity + setAccount(account, true) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index f17cce8b..d54ea488 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -38,6 +38,7 @@ import com.lagradost.cloudstream3.mvvm.observe import com.lagradost.cloudstream3.mvvm.observeNullable import com.lagradost.cloudstream3.ui.APIRepository.Companion.noneApi import com.lagradost.cloudstream3.ui.APIRepository.Companion.randomApi +import com.lagradost.cloudstream3.ui.account.AccountHelper.showAccountSelectLinear import com.lagradost.cloudstream3.ui.result.txt import com.lagradost.cloudstream3.ui.search.* import com.lagradost.cloudstream3.ui.search.SearchHelper.handleSearchClickCallback @@ -495,8 +496,8 @@ class HomeFragment : Fragment() { //homeChangeApiLoading.setOnClickListener(apiChangeClickListener) homeApiFab.setOnClickListener(apiChangeClickListener) homeChangeApi.setOnClickListener(apiChangeClickListener) - homeSwitchAccount.setOnClickListener { v -> - (CommonActivity.activity as MainActivity).showAccountSelectLinear(v?.context ?: return@setOnClickListener) + homeSwitchAccount.setOnClickListener { + activity?.showAccountSelectLinear() } homeRandom.setOnClickListener { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt index 1caa9a47..dfe768d2 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt @@ -27,6 +27,7 @@ import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.debugException import com.lagradost.cloudstream3.mvvm.observe import com.lagradost.cloudstream3.ui.WatchType +import com.lagradost.cloudstream3.ui.account.AccountHelper.showAccountSelectLinear import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.selectHomepage import com.lagradost.cloudstream3.ui.result.FOCUS_SELF import com.lagradost.cloudstream3.ui.result.ResultViewModel2 @@ -477,8 +478,8 @@ class HomeParentItemAdapterPreview( } } - homeAccount?.setOnClickListener { v -> - (activity as MainActivity).showAccountSelectLinear(v?.context ?: return@setOnClickListener) + homeAccount?.setOnClickListener { + activity?.showAccountSelectLinear() } (binding as? FragmentHomeHeadTvBinding)?.apply {