diff --git a/app/src/main/java/com/vanced/manager/core/ext/FragmentExt.kt b/app/src/main/java/com/vanced/manager/core/ext/FragmentExt.kt new file mode 100644 index 00000000..d10352ca --- /dev/null +++ b/app/src/main/java/com/vanced/manager/core/ext/FragmentExt.kt @@ -0,0 +1,15 @@ +package com.vanced.manager.core.ext + +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import kotlin.reflect.full.createInstance + +fun Fragment.requireSupportFM() = requireActivity().supportFragmentManager + +inline fun Fragment.showDialogRefl() { + D::class.createInstance().show(requireSupportFM(), D::class.simpleName) +} + +fun Fragment.showDialog(dialog: D) { + dialog.show(requireSupportFM(), dialog::class.simpleName) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/GrantRootFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/GrantRootFragment.kt index 08591fc2..388121bc 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/GrantRootFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/GrantRootFragment.kt @@ -3,52 +3,47 @@ package com.vanced.manager.ui.fragments import android.content.Intent import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.content.edit -import androidx.databinding.DataBindingUtil -import androidx.fragment.app.Fragment -import androidx.preference.PreferenceManager.getDefaultSharedPreferences +import androidx.preference.PreferenceManager.* import com.topjohnwu.superuser.Shell import com.vanced.manager.R import com.vanced.manager.databinding.FragmentGrantRootBinding import com.vanced.manager.ui.MainActivity +import com.vanced.manager.ui.core.BindingFragment -class GrantRootFragment : Fragment(), View.OnClickListener { +class GrantRootFragment : BindingFragment() { - private lateinit var binding: FragmentGrantRootBinding - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + override fun binding( + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_grant_root, container, false) - return binding.root + ) = FragmentGrantRootBinding.inflate(inflater, container, false) + + override fun otherSetups() { + bindData() } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.grantRootFinishFab.setOnClickListener(this) - binding.grantRootFab.setOnClickListener(this) - } - - override fun onClick(v: View?) { - when (v?.id) { - R.id.grant_root_fab -> { - if (Shell.rootAccess()) { - getDefaultSharedPreferences(requireActivity()).edit { putString("vanced_variant", "root") } - } else { - Toast.makeText(requireActivity(), R.string.root_not_granted, Toast.LENGTH_SHORT).show() - } - } - R.id.grant_root_finish_fab -> { - val intent = Intent(requireActivity(), MainActivity::class.java) - intent.putExtra("firstLaunch", true) - startActivity(intent) - requireActivity().finish() - } + private fun bindData() { + with(binding) { + grantRootFinishFab.setOnClickListener { navigateToFirstLaunch() } + grantRootFab.setOnClickListener { grantRoot() } } } + private fun navigateToFirstLaunch() { + val intent = Intent(requireActivity(), MainActivity::class.java) + intent.putExtra("firstLaunch", true) + startActivity(intent) + requireActivity().finish() + } + + private fun grantRoot() { + if (Shell.rootAccess()) { + getDefaultSharedPreferences(requireActivity()).edit { putString("vanced_variant", "root") } + } else { + Toast.makeText(requireActivity(), R.string.root_not_granted, Toast.LENGTH_SHORT).show() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt index 3e7ae946..5e011f10 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt @@ -22,37 +22,43 @@ import com.vanced.manager.R import com.vanced.manager.adapter.AppListAdapter import com.vanced.manager.adapter.LinkAdapter import com.vanced.manager.adapter.SponsorAdapter +import com.vanced.manager.databinding.FragmentGrantRootBinding import com.vanced.manager.databinding.FragmentHomeBinding +import com.vanced.manager.ui.core.BindingFragment import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder import com.vanced.manager.ui.viewmodels.HomeViewModel import com.vanced.manager.ui.viewmodels.HomeViewModelFactory -open class HomeFragment : Fragment() { +open class HomeFragment : BindingFragment() { + + companion object { + const val INSTALL_FAILED = "install_failed" + const val REFRESH_HOME = "refresh_home" + } - private lateinit var binding: FragmentHomeBinding private val viewModel: HomeViewModel by viewModels { HomeViewModelFactory(requireActivity()) } + private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) } private val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(requireActivity()) } private lateinit var tooltip: ViewTooltip - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + override fun binding( + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - requireActivity().title = getString(R.string.title_home) - setHasOptionsMenu(true) - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) - return binding.root + ) = FragmentHomeBinding.inflate(inflater, container, false) + + override fun otherSetups() { + bindData() } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - + private fun bindData() { + requireActivity().title = getString(R.string.title_home) + setHasOptionsMenu(true) with(binding) { - viewModel = this@HomeFragment.viewModel - + homeRefresh.setOnRefreshListener { viewModel.fetchData() } tooltip = ViewTooltip .on(recyclerAppList) .position(ViewTooltip.Position.TOP) @@ -91,9 +97,13 @@ open class HomeFragment : Fragment() { adapter = LinkAdapter(requireActivity(), this@HomeFragment.viewModel) } } - } - + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflateWithCrowdin(R.menu.toolbar_menu, menu, resources) + super.onCreateOptionsMenu(menu, inflater) + } + override fun onPause() { super.onPause() localBroadcastManager.unregisterReceiver(broadcastReceiver) @@ -122,15 +132,5 @@ open class HomeFragment : Fragment() { intentFilter.addAction(REFRESH_HOME) localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter) } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflateWithCrowdin(R.menu.toolbar_menu, menu, resources) - super.onCreateOptionsMenu(menu, inflater) - } - - companion object { - const val INSTALL_FAILED = "install_failed" - const val REFRESH_HOME = "refresh_home" - } } diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/SelectAppsFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/SelectAppsFragment.kt index 40f74739..41c397d8 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SelectAppsFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/SelectAppsFragment.kt @@ -2,53 +2,56 @@ package com.vanced.manager.ui.fragments import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.content.edit -import androidx.databinding.DataBindingUtil -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import androidx.preference.PreferenceManager.getDefaultSharedPreferences +import androidx.preference.PreferenceManager.* import androidx.recyclerview.widget.LinearLayoutManager import com.vanced.manager.R import com.vanced.manager.adapter.SelectAppsAdapter import com.vanced.manager.databinding.FragmentSelectAppsBinding +import com.vanced.manager.ui.core.BindingFragment -class SelectAppsFragment : Fragment() { +class SelectAppsFragment : BindingFragment() { - private lateinit var binding: FragmentSelectAppsBinding + private lateinit var selectAdapter: SelectAppsAdapter - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + override fun binding( + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_select_apps, container, false) - return binding.root + ) = FragmentSelectAppsBinding.inflate(inflater, container, false) + + override fun otherSetups() { + bindData() } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - val selectAdapter = SelectAppsAdapter(requireActivity()) - val prefs = getDefaultSharedPreferences(requireActivity()) - binding.selectAppsRecycler.apply { + private fun bindData() { + with(binding) { + initRecycler() + selectAppsFab.setOnClickListener { actionOnClickAppsFab() } + } + } + + private fun FragmentSelectAppsBinding.initRecycler() { + selectAdapter = SelectAppsAdapter(requireActivity()) + selectAppsRecycler.apply { layoutManager = LinearLayoutManager(requireActivity()) setHasFixedSize(true) adapter = selectAdapter } - - binding.selectAppsFab.setOnClickListener { - if (selectAdapter.apps.all { app -> !app.isChecked }) { - Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT).show() - return@setOnClickListener - } - - selectAdapter.apps.forEach { app -> - prefs.edit { putBoolean("enable_${app.tag}", app.isChecked) } - } - - findNavController().navigate(SelectAppsFragmentDirections.selectAppsToGrantRoot()) - } } + private fun actionOnClickAppsFab() { + if (selectAdapter.apps.all { app -> !app.isChecked }) { + Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT).show() + return + } + val prefs = getDefaultSharedPreferences(requireActivity()) + selectAdapter.apps.forEach { app -> + prefs.edit { putBoolean("enable_${app.tag}", app.isChecked) } + } + findNavController().navigate(SelectAppsFragmentDirections.selectAppsToGrantRoot()) + } } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt index 10ae8897..cf25667c 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt @@ -1,59 +1,86 @@ package com.vanced.manager.ui.fragments import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.ViewGroup import android.widget.Toast -import androidx.databinding.DataBindingUtil -import androidx.fragment.app.Fragment -import androidx.preference.PreferenceManager.getDefaultSharedPreferences +import androidx.preference.PreferenceManager.* import androidx.recyclerview.widget.LinearLayoutManager import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.perf.FirebasePerformance import com.vanced.manager.R import com.vanced.manager.adapter.GetNotifAdapter +import com.vanced.manager.core.ext.showDialogRefl import com.vanced.manager.databinding.FragmentSettingsBinding +import com.vanced.manager.ui.core.BindingFragment import com.vanced.manager.ui.dialogs.* import com.vanced.manager.utils.LanguageHelper.getLanguageFormat import java.io.File -class SettingsFragment : Fragment() { +class SettingsFragment : BindingFragment() { + + private companion object { + + const val LIGHT = "Light" + const val DARK = "Dark" + const val BLUE = "Blue" + const val RED = "Red" + const val GREEN = "Green" + const val YELLOW = "Yellow" + } - private lateinit var binding: FragmentSettingsBinding private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - override fun onCreateView( + override fun binding( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ) = FragmentSettingsBinding.inflate(inflater, container, false) + + override fun otherSetups() { setHasOptionsMenu(true) - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_settings, container, false) - return binding.root + bindData() } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + private fun bindData() { + with(binding) { + bindRecycler() + bindFirebase() + bindManagerVariant() + bindClearFiles() + bindManagerTheme() + bindManagerAccentColor() + bindManagerLanguage() + selectApps.setOnClickListener { showDialogRefl() } + } + } - binding.notificationsRecycler.apply { + private fun FragmentSettingsBinding.bindRecycler() { + notificationsRecycler.apply { layoutManager = LinearLayoutManager(requireActivity()) adapter = GetNotifAdapter(requireActivity()) } + } - binding.firebase.setOnCheckedListener { _, isChecked -> + private fun FragmentSettingsBinding.bindFirebase() { + firebase.setOnCheckedListener { _, isChecked -> FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked) FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked FirebaseAnalytics.getInstance(requireActivity()).setAnalyticsCollectionEnabled(isChecked) } + } - binding.managerVariant.apply { + private fun FragmentSettingsBinding.bindManagerVariant() { + managerVariant.apply { prefs.getString("vanced_variant", "nonroot")?.let { setSummary(it) } - setOnClickListener { - ManagerVariantDialog().show(requireActivity().supportFragmentManager, "") - } + setOnClickListener { showDialogRefl() } } - - binding.clearFiles.setOnClickListener { + } + private fun FragmentSettingsBinding.bindClearFiles() { + clearFiles.setOnClickListener { with(requireActivity()) { listOf("vanced/nonroot", "vanced/root", "music/nonroot", "music/root", "microg").forEach { dir -> File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively() @@ -61,47 +88,43 @@ class SettingsFragment : Fragment() { Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show() } } + } + private fun FragmentSettingsBinding.bindManagerTheme() { val themePref = prefs.getString("manager_theme", "System Default") - binding.managerTheme.apply { + managerTheme.apply { setSummary( - when (themePref) { - "Light" -> getString(R.string.theme_light) - "Dark" -> getString(R.string.theme_dark) - else -> getString(R.string.system_default) - } + when (themePref) { + LIGHT -> getString(R.string.theme_light) + DARK -> getString(R.string.theme_dark) + else -> getString(R.string.system_default) + } ) - setOnClickListener { - ManagerThemeDialog().show(requireActivity().supportFragmentManager, "") - } + setOnClickListener { showDialogRefl() } } + } + private fun FragmentSettingsBinding.bindManagerAccentColor() { val accentPref = prefs.getString("manager_accent", "Blue") - binding.managerAccentColor.apply { + managerAccentColor.apply { setSummary( - when (accentPref) { - "Blue" -> getString(R.string.accent_blue) - "Red" -> getString(R.string.accent_red) - "Green" -> getString(R.string.accent_green) - "Yellow" -> getString(R.string.accent_yellow) - else -> getString(R.string.accent_purple) - } + when (accentPref) { + BLUE -> getString(R.string.accent_blue) + RED -> getString(R.string.accent_red) + GREEN -> getString(R.string.accent_green) + YELLOW -> getString(R.string.accent_yellow) + else -> getString(R.string.accent_purple) + } ) - setOnClickListener { - ManagerAccentColorDialog().show(requireActivity().supportFragmentManager, "") - } + setOnClickListener { showDialogRefl() } } + } + private fun FragmentSettingsBinding.bindManagerLanguage() { val langPref = prefs.getString("manager_lang", "System Default") - binding.managerLanguage.apply { - setSummary(getLanguageFormat(requireActivity(), langPref!!)) - setOnClickListener { - ManagerLanguageDialog().show(requireActivity().supportFragmentManager, "") - } - } - - binding.selectApps.setOnClickListener { - SelectAppsDialog().show(requireActivity().supportFragmentManager, "") + managerLanguage.apply { + setSummary(getLanguageFormat(requireActivity(), requireNotNull(langPref))) + setOnClickListener { showDialogRefl() } } } @@ -113,5 +136,4 @@ class SettingsFragment : Fragment() { } super.onCreateOptionsMenu(menu, inflater) } - } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/WelcomeFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/WelcomeFragment.kt index 9dfed653..1c7a53c1 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/WelcomeFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/WelcomeFragment.kt @@ -2,31 +2,28 @@ package com.vanced.manager.ui.fragments import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.databinding.DataBindingUtil -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import com.vanced.manager.R import com.vanced.manager.databinding.FragmentWelcomeBinding +import com.vanced.manager.ui.core.BindingFragment -class WelcomeFragment : Fragment() { +class WelcomeFragment : BindingFragment() { - private lateinit var binding: FragmentWelcomeBinding - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + override fun binding( + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_welcome, container, false) - return binding.root + ) = FragmentWelcomeBinding.inflate(inflater, container, false) + + override fun otherSetups() { + bindData() } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.welcomeGetStarted.setOnClickListener { - findNavController().navigate(WelcomeFragmentDirections.welcomeToSelectApps()) - } + private fun bindData() { + binding.welcomeGetStarted.setOnClickListener { navigateToWelcome() } } + private fun navigateToWelcome() { + findNavController().navigate(WelcomeFragmentDirections.welcomeToSelectApps()) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_grant_root.xml b/app/src/main/res/layout/fragment_grant_root.xml index c7abb3f8..fdcc58bc 100644 --- a/app/src/main/res/layout/fragment_grant_root.xml +++ b/app/src/main/res/layout/fragment_grant_root.xml @@ -1,62 +1,58 @@ - + - + - + - + - + - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 98df331e..91844333 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,75 +1,57 @@ - + - - - - - - - - - + android:fillViewport="true" + android:scrollbars="none"> - + android:orientation="vertical"> - + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:layout_marginStart="8dp" + android:nestedScrollingEnabled="false" + tools:itemCount="3" + tools:listitem="@layout/view_app"/> - + - + - - - - - - - - - - - + + + + diff --git a/app/src/main/res/layout/fragment_select_apps.xml b/app/src/main/res/layout/fragment_select_apps.xml index 9ccb9473..863b38fa 100644 --- a/app/src/main/res/layout/fragment_select_apps.xml +++ b/app/src/main/res/layout/fragment_select_apps.xml @@ -1,43 +1,41 @@ - + - + + + android:layout_height="wrap_content" + android:layout_marginHorizontal="24dp" + android:nestedScrollingEnabled="false" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:itemCount="2" + tools:listitem="@layout/view_app_checkbox"/> - + - - - - - - - + diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index c7712e1b..61dbd66e 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -1,64 +1,63 @@ - + - + android:layout_height="match_parent" + android:orientation="vertical" + android:paddingHorizontal="8dp" + android:paddingTop="16dp"> - + android:layout_height="wrap_content" + android:background="@drawable/category_background" + app:category_title="@string/category_behaviour"> - + app:switch_def_value="true" + app:switch_key="@{@string/use_custom_tabs}" + app:switch_summary="@string/link_custom_tabs" + app:switch_title="@string/link_title"/> - + - + - + - + - - - + + app:preference_title="@string/language_title"/> - + app:preference_title="@string/select_apps"/> - - - - - - - + + diff --git a/app/src/main/res/layout/fragment_welcome.xml b/app/src/main/res/layout/fragment_welcome.xml index 8331a70e..8d5c0437 100644 --- a/app/src/main/res/layout/fragment_welcome.xml +++ b/app/src/main/res/layout/fragment_welcome.xml @@ -1,37 +1,32 @@ - + - + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_marginTop="@dimen/top_header_margin" + android:src="@drawable/ic_launch_text" + android:textAlignment="center" + app:layout_constraintTop_toTopOf="parent"/> - - - - - - - + +