Merge pull request #251 from HaliksaR/improvements/viewbinding

Migrage All Fragments to view binding
This commit is contained in:
Tornike Khintibidze 2020-11-15 13:21:10 +04:00 committed by GitHub
commit 354a78a28f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 399 additions and 403 deletions

View File

@ -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 <reified D : DialogFragment> Fragment.showDialogRefl() {
D::class.createInstance().show(requireSupportFM(), D::class.simpleName)
}
fun <D : DialogFragment> Fragment.showDialog(dialog: D) {
dialog.show(requireSupportFM(), dialog::class.simpleName)
}

View File

@ -3,52 +3,47 @@ package com.vanced.manager.ui.fragments
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.core.content.edit import androidx.core.content.edit
import androidx.databinding.DataBindingUtil import androidx.preference.PreferenceManager.*
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.databinding.FragmentGrantRootBinding import com.vanced.manager.databinding.FragmentGrantRootBinding
import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.MainActivity
import com.vanced.manager.ui.core.BindingFragment
class GrantRootFragment : Fragment(), View.OnClickListener { class GrantRootFragment : BindingFragment<FragmentGrantRootBinding>() {
private lateinit var binding: FragmentGrantRootBinding override fun binding(
inflater: LayoutInflater,
override fun onCreateView( container: ViewGroup?,
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ) = FragmentGrantRootBinding.inflate(inflater, container, false)
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_grant_root, container, false)
return binding.root override fun otherSetups() {
bindData()
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { private fun bindData() {
super.onViewCreated(view, savedInstanceState) with(binding) {
binding.grantRootFinishFab.setOnClickListener(this) grantRootFinishFab.setOnClickListener { navigateToFirstLaunch() }
binding.grantRootFab.setOnClickListener(this) grantRootFab.setOnClickListener { grantRoot() }
}
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 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()
}
}
} }

View File

@ -22,37 +22,43 @@ import com.vanced.manager.R
import com.vanced.manager.adapter.AppListAdapter import com.vanced.manager.adapter.AppListAdapter
import com.vanced.manager.adapter.LinkAdapter import com.vanced.manager.adapter.LinkAdapter
import com.vanced.manager.adapter.SponsorAdapter import com.vanced.manager.adapter.SponsorAdapter
import com.vanced.manager.databinding.FragmentGrantRootBinding
import com.vanced.manager.databinding.FragmentHomeBinding 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.dialogs.DialogContainer.installAlertBuilder
import com.vanced.manager.ui.viewmodels.HomeViewModel import com.vanced.manager.ui.viewmodels.HomeViewModel
import com.vanced.manager.ui.viewmodels.HomeViewModelFactory import com.vanced.manager.ui.viewmodels.HomeViewModelFactory
open class HomeFragment : Fragment() { open class HomeFragment : BindingFragment<FragmentHomeBinding>() {
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 { private val viewModel: HomeViewModel by viewModels {
HomeViewModelFactory(requireActivity()) HomeViewModelFactory(requireActivity())
} }
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) } private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) }
private val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(requireActivity()) } private val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(requireActivity()) }
private lateinit var tooltip: ViewTooltip private lateinit var tooltip: ViewTooltip
override fun onCreateView( override fun binding(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ) = FragmentHomeBinding.inflate(inflater, container, false)
requireActivity().title = getString(R.string.title_home)
setHasOptionsMenu(true) override fun otherSetups() {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) bindData()
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { private fun bindData() {
super.onViewCreated(view, savedInstanceState) requireActivity().title = getString(R.string.title_home)
setHasOptionsMenu(true)
with(binding) { with(binding) {
viewModel = this@HomeFragment.viewModel homeRefresh.setOnRefreshListener { viewModel.fetchData() }
tooltip = ViewTooltip tooltip = ViewTooltip
.on(recyclerAppList) .on(recyclerAppList)
.position(ViewTooltip.Position.TOP) .position(ViewTooltip.Position.TOP)
@ -91,7 +97,11 @@ open class HomeFragment : Fragment() {
adapter = LinkAdapter(requireActivity(), this@HomeFragment.viewModel) 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() { override fun onPause() {
@ -122,15 +132,5 @@ open class HomeFragment : Fragment() {
intentFilter.addAction(REFRESH_HOME) intentFilter.addAction(REFRESH_HOME)
localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter) 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"
}
} }

View File

@ -2,53 +2,56 @@ package com.vanced.manager.ui.fragments
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.core.content.edit import androidx.core.content.edit
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.preference.PreferenceManager.*
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.adapter.SelectAppsAdapter import com.vanced.manager.adapter.SelectAppsAdapter
import com.vanced.manager.databinding.FragmentSelectAppsBinding import com.vanced.manager.databinding.FragmentSelectAppsBinding
import com.vanced.manager.ui.core.BindingFragment
class SelectAppsFragment : Fragment() { class SelectAppsFragment : BindingFragment<FragmentSelectAppsBinding>() {
private lateinit var binding: FragmentSelectAppsBinding private lateinit var selectAdapter: SelectAppsAdapter
override fun onCreateView( override fun binding(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ) = FragmentSelectAppsBinding.inflate(inflater, container, false)
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_select_apps, container, false)
return binding.root override fun otherSetups() {
bindData()
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { private fun bindData() {
super.onViewCreated(view, savedInstanceState) with(binding) {
val selectAdapter = SelectAppsAdapter(requireActivity()) initRecycler()
val prefs = getDefaultSharedPreferences(requireActivity()) selectAppsFab.setOnClickListener { actionOnClickAppsFab() }
binding.selectAppsRecycler.apply { }
}
private fun FragmentSelectAppsBinding.initRecycler() {
selectAdapter = SelectAppsAdapter(requireActivity())
selectAppsRecycler.apply {
layoutManager = LinearLayoutManager(requireActivity()) layoutManager = LinearLayoutManager(requireActivity())
setHasFixedSize(true) setHasFixedSize(true)
adapter = selectAdapter 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())
}
} }

View File

@ -1,59 +1,86 @@
package com.vanced.manager.ui.fragments package com.vanced.manager.ui.fragments
import android.os.Bundle 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 android.widget.Toast
import androidx.databinding.DataBindingUtil import androidx.preference.PreferenceManager.*
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.google.firebase.perf.FirebasePerformance import com.google.firebase.perf.FirebasePerformance
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.adapter.GetNotifAdapter import com.vanced.manager.adapter.GetNotifAdapter
import com.vanced.manager.core.ext.showDialogRefl
import com.vanced.manager.databinding.FragmentSettingsBinding import com.vanced.manager.databinding.FragmentSettingsBinding
import com.vanced.manager.ui.core.BindingFragment
import com.vanced.manager.ui.dialogs.* import com.vanced.manager.ui.dialogs.*
import com.vanced.manager.utils.LanguageHelper.getLanguageFormat import com.vanced.manager.utils.LanguageHelper.getLanguageFormat
import java.io.File import java.io.File
class SettingsFragment : Fragment() { class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
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()) } private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) }
override fun onCreateView( override fun binding(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ) = FragmentSettingsBinding.inflate(inflater, container, false)
override fun otherSetups() {
setHasOptionsMenu(true) setHasOptionsMenu(true)
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_settings, container, false) bindData()
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { private fun bindData() {
super.onViewCreated(view, savedInstanceState) with(binding) {
bindRecycler()
bindFirebase()
bindManagerVariant()
bindClearFiles()
bindManagerTheme()
bindManagerAccentColor()
bindManagerLanguage()
selectApps.setOnClickListener { showDialogRefl<SelectAppsDialog>() }
}
}
binding.notificationsRecycler.apply { private fun FragmentSettingsBinding.bindRecycler() {
notificationsRecycler.apply {
layoutManager = LinearLayoutManager(requireActivity()) layoutManager = LinearLayoutManager(requireActivity())
adapter = GetNotifAdapter(requireActivity()) adapter = GetNotifAdapter(requireActivity())
} }
}
binding.firebase.setOnCheckedListener { _, isChecked -> private fun FragmentSettingsBinding.bindFirebase() {
firebase.setOnCheckedListener { _, isChecked ->
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked) FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked)
FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked
FirebaseAnalytics.getInstance(requireActivity()).setAnalyticsCollectionEnabled(isChecked) FirebaseAnalytics.getInstance(requireActivity()).setAnalyticsCollectionEnabled(isChecked)
} }
}
binding.managerVariant.apply { private fun FragmentSettingsBinding.bindManagerVariant() {
managerVariant.apply {
prefs.getString("vanced_variant", "nonroot")?.let { setSummary(it) } prefs.getString("vanced_variant", "nonroot")?.let { setSummary(it) }
setOnClickListener { setOnClickListener { showDialogRefl<ManagerVariantDialog>() }
ManagerVariantDialog().show(requireActivity().supportFragmentManager, "")
}
} }
}
binding.clearFiles.setOnClickListener { private fun FragmentSettingsBinding.bindClearFiles() {
clearFiles.setOnClickListener {
with(requireActivity()) { with(requireActivity()) {
listOf("vanced/nonroot", "vanced/root", "music/nonroot", "music/root", "microg").forEach { dir -> listOf("vanced/nonroot", "vanced/root", "music/nonroot", "music/root", "microg").forEach { dir ->
File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively() 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() Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show()
} }
} }
}
private fun FragmentSettingsBinding.bindManagerTheme() {
val themePref = prefs.getString("manager_theme", "System Default") val themePref = prefs.getString("manager_theme", "System Default")
binding.managerTheme.apply { managerTheme.apply {
setSummary( setSummary(
when (themePref) { when (themePref) {
"Light" -> getString(R.string.theme_light) LIGHT -> getString(R.string.theme_light)
"Dark" -> getString(R.string.theme_dark) DARK -> getString(R.string.theme_dark)
else -> getString(R.string.system_default) else -> getString(R.string.system_default)
} }
) )
setOnClickListener { setOnClickListener { showDialogRefl<ManagerThemeDialog>() }
ManagerThemeDialog().show(requireActivity().supportFragmentManager, "")
}
} }
}
private fun FragmentSettingsBinding.bindManagerAccentColor() {
val accentPref = prefs.getString("manager_accent", "Blue") val accentPref = prefs.getString("manager_accent", "Blue")
binding.managerAccentColor.apply { managerAccentColor.apply {
setSummary( setSummary(
when (accentPref) { when (accentPref) {
"Blue" -> getString(R.string.accent_blue) BLUE -> getString(R.string.accent_blue)
"Red" -> getString(R.string.accent_red) RED -> getString(R.string.accent_red)
"Green" -> getString(R.string.accent_green) GREEN -> getString(R.string.accent_green)
"Yellow" -> getString(R.string.accent_yellow) YELLOW -> getString(R.string.accent_yellow)
else -> getString(R.string.accent_purple) else -> getString(R.string.accent_purple)
} }
) )
setOnClickListener { setOnClickListener { showDialogRefl<ManagerAccentColorDialog>() }
ManagerAccentColorDialog().show(requireActivity().supportFragmentManager, "")
}
} }
}
private fun FragmentSettingsBinding.bindManagerLanguage() {
val langPref = prefs.getString("manager_lang", "System Default") val langPref = prefs.getString("manager_lang", "System Default")
binding.managerLanguage.apply { managerLanguage.apply {
setSummary(getLanguageFormat(requireActivity(), langPref!!)) setSummary(getLanguageFormat(requireActivity(), requireNotNull(langPref)))
setOnClickListener { setOnClickListener { showDialogRefl<ManagerLanguageDialog>() }
ManagerLanguageDialog().show(requireActivity().supportFragmentManager, "")
}
}
binding.selectApps.setOnClickListener {
SelectAppsDialog().show(requireActivity().supportFragmentManager, "")
} }
} }
@ -113,5 +136,4 @@ class SettingsFragment : Fragment() {
} }
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
} }
} }

View File

@ -2,31 +2,28 @@ package com.vanced.manager.ui.fragments
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.vanced.manager.R
import com.vanced.manager.databinding.FragmentWelcomeBinding import com.vanced.manager.databinding.FragmentWelcomeBinding
import com.vanced.manager.ui.core.BindingFragment
class WelcomeFragment : Fragment() { class WelcomeFragment : BindingFragment<FragmentWelcomeBinding>() {
private lateinit var binding: FragmentWelcomeBinding override fun binding(
inflater: LayoutInflater,
override fun onCreateView( container: ViewGroup?,
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ) = FragmentWelcomeBinding.inflate(inflater, container, false)
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_welcome, container, false)
return binding.root override fun otherSetups() {
bindData()
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { private fun bindData() {
super.onViewCreated(view, savedInstanceState) binding.welcomeGetStarted.setOnClickListener { navigateToWelcome() }
binding.welcomeGetStarted.setOnClickListener {
findNavController().navigate(WelcomeFragmentDirections.welcomeToSelectApps())
}
} }
private fun navigateToWelcome() {
findNavController().navigate(WelcomeFragmentDirections.welcomeToSelectApps())
}
} }

View File

@ -1,62 +1,58 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout> <com.vanced.manager.ui.core.SlidingConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?colorSurface">
<com.vanced.manager.ui.core.SlidingConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <TextView
xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/grant_root_header"
android:layout_width="match_parent" android:text="@string/are_you_rooted"
android:layout_height="match_parent" app:layout_constraintTop_toTopOf="parent"
android:background="?colorSurface"> style="@style/WelcomeHeaderTitle"/>
<TextView <TextView
android:id="@+id/grant_root_header" android:id="@+id/grant_root_description"
style="@style/WelcomeHeaderTitle" android:text="@string/willing_to_use_root"
android:text="@string/are_you_rooted" android:textSize="13sp"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toBottomOf="@id/grant_root_header"
style="@style/WelcomeHeaderSubtitle"/>
<TextView <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/grant_root_description" android:id="@+id/grant_root_fab"
style="@style/WelcomeHeaderSubtitle" android:layout_width="wrap_content"
android:text="@string/willing_to_use_root" android:layout_height="wrap_content"
android:textSize="13sp" android:backgroundTint="#1F1F1F"
app:layout_constraintTop_toBottomOf="@id/grant_root_header" /> android:padding="16dp"
android:src="@drawable/ic_magisk"
app:borderWidth="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/grant_root_header"
app:maxImageSize="44dp"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton <TextView
android:id="@+id/grant_root_fab" android:layout_width="wrap_content"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_marginTop="8dp"
android:backgroundTint="#1F1F1F" android:text="@string/grant_root"
android:padding="16dp" android:textColor="#ffffff"
android:src="@drawable/ic_magisk" android:textSize="13sp"
app:borderWidth="0dp" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/grant_root_fab"/>
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/grant_root_header"
app:maxImageSize="44dp" />
<TextView <com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="wrap_content" android:id="@+id/grant_root_finish_fab"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_marginTop="8dp" android:layout_height="wrap_content"
android:text="@string/grant_root" android:layout_marginBottom="45dp"
android:textColor="#ffffff" android:layout_marginEnd="45dp"
android:textSize="13sp" android:backgroundTint="?colorPrimary"
app:layout_constraintEnd_toEndOf="parent" android:src="@drawable/ic_baseline_navigate_next_48"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/grant_root_fab" /> app:layout_constraintEnd_toEndOf="parent"
app:maxImageSize="48dp"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton </com.vanced.manager.ui.core.SlidingConstraintLayout>
android:id="@+id/grant_root_finish_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="45dp"
android:layout_marginBottom="45dp"
android:backgroundTint="?colorPrimary"
android:src="@drawable/ic_baseline_navigate_next_48"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:maxImageSize="48dp" />
</com.vanced.manager.ui.core.SlidingConstraintLayout>
</layout>

View File

@ -1,75 +1,57 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:bind="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<data> <androidx.core.widget.NestedScrollView
<import type="android.view.View" />
<variable
name="viewModel"
type="com.vanced.manager.ui.viewmodels.HomeViewModel" />
</data>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/home_refresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
bind:onRefreshListener="@{()-> viewModel.fetchData()}"> android:fillViewport="true"
android:scrollbars="none">
<androidx.core.widget.NestedScrollView <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fillViewport="true" android:orientation="vertical">
android:scrollbars="none">
<LinearLayout <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_app_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:orientation="vertical"> android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:nestedScrollingEnabled="false"
tools:itemCount="3"
tools:listitem="@layout/view_app"/>
<androidx.recyclerview.widget.RecyclerView <TextView
android:id="@+id/recycler_app_list" android:layout_marginHorizontal="24dp"
android:layout_width="match_parent" android:layout_marginTop="12dp"
android:layout_height="wrap_content" android:text="@string/useful_links"
android:layout_marginStart="8dp" style="@style/CardTextHeader"/>
android:layout_marginEnd="8dp"
android:nestedScrollingEnabled="false"
tools:itemCount="3"
tools:listitem="@layout/view_app" />
<TextView <androidx.recyclerview.widget.RecyclerView
style="@style/CardTextHeader" android:id="@+id/recycler_sponsors"
android:layout_marginHorizontal="24dp" android:layout_width="match_parent"
android:layout_marginTop="12dp" android:layout_height="wrap_content"
android:text="@string/useful_links" /> android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:nestedScrollingEnabled="false"
tools:itemCount="2"
tools:listitem="@layout/view_sponsor"/>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_sponsors" android:id="@+id/recycler_links"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginTop="4dp"
android:layout_marginEnd="8dp" android:nestedScrollingEnabled="false"
android:nestedScrollingEnabled="false" android:paddingBottom="8dp"
tools:itemCount="2" tools:itemCount="6"
tools:listitem="@layout/view_sponsor" /> tools:listitem="@layout/view_social_link"/>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView </androidx.core.widget.NestedScrollView>
android:id="@+id/recycler_links" </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:nestedScrollingEnabled="false"
android:paddingBottom="8dp"
tools:itemCount="6"
tools:listitem="@layout/view_social_link" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</layout>

View File

@ -1,43 +1,41 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto" <com.vanced.manager.ui.core.SlidingConstraintLayout
xmlns:tools="http://schemas.android.com/tools"> xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?colorSurface">
<com.vanced.manager.ui.core.SlidingConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <TextView
android:id="@+id/select_apps_header"
android:text="@string/select_apps"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
style="@style/WelcomeHeaderTitle"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/select_apps_recycler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:background="?colorSurface"> 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"/>
<TextView <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/select_apps_header" android:id="@+id/select_apps_fab"
style="@style/WelcomeHeaderTitle" android:layout_width="wrap_content"
android:text="@string/select_apps" android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent" android:layout_marginBottom="45dp"
app:layout_constraintStart_toStartOf="parent" android:layout_marginEnd="45dp"
app:layout_constraintTop_toTopOf="parent" /> android:backgroundTint="?colorPrimary"
android:src="@drawable/ic_baseline_navigate_next_48"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:maxImageSize="48dp"/>
<androidx.recyclerview.widget.RecyclerView </com.vanced.manager.ui.core.SlidingConstraintLayout>
android:id="@+id/select_apps_recycler"
android:layout_width="match_parent"
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" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/select_apps_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="45dp"
android:layout_marginBottom="45dp"
android:backgroundTint="?colorPrimary"
android:src="@drawable/ic_baseline_navigate_next_48"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:maxImageSize="48dp" />
</com.vanced.manager.ui.core.SlidingConstraintLayout>
</layout>

View File

@ -1,64 +1,63 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout> <androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:orientation="vertical"
android:paddingHorizontal="8dp"
android:paddingTop="16dp">
<LinearLayout <com.vanced.manager.ui.core.PreferenceCategory
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:background="@drawable/category_background"
android:paddingHorizontal="8dp" app:category_title="@string/category_behaviour">
android:paddingTop="16dp">
<com.vanced.manager.ui.core.PreferenceCategory <com.vanced.manager.ui.core.PreferenceSwitch
android:id="@+id/use_custom_tabs"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/category_background" app:switch_def_value="true"
app:category_title="@string/category_behaviour"> app:switch_key="@{@string/use_custom_tabs}"
app:switch_summary="@string/link_custom_tabs"
app:switch_title="@string/link_title"/>
<com.vanced.manager.ui.core.PreferenceSwitch <androidx.recyclerview.widget.RecyclerView
android:id="@+id/use_custom_tabs" android:id="@+id/notifications_recycler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:switch_def_value="true" android:nestedScrollingEnabled="false"
app:switch_key="@{@string/use_custom_tabs}" tools:itemCount="3"
app:switch_summary="@string/link_custom_tabs" tools:listitem="@layout/view_preference_switch"/>
app:switch_title="@string/link_title" />
<androidx.recyclerview.widget.RecyclerView <com.vanced.manager.ui.core.PreferenceSwitch
android:id="@+id/notifications_recycler" android:id="@+id/firebase"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" app:switch_def_value="true"
tools:itemCount="3" app:switch_key="@{@string/firebase}"
tools:listitem="@layout/view_preference_switch" /> app:switch_summary="@string/firebase_summary"
app:switch_title="@string/firebase_title"/>
<com.vanced.manager.ui.core.PreferenceSwitch <com.vanced.manager.ui.core.EmptyPreference
android:id="@+id/firebase" android:id="@+id/manager_variant"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:switch_def_value="true" app:preference_title="@string/variant"/>
app:switch_key="@{@string/firebase}"
app:switch_summary="@string/firebase_summary"
app:switch_title="@string/firebase_title" />
<com.vanced.manager.ui.core.EmptyPreference <com.vanced.manager.ui.core.EmptyPreference
android:id="@+id/manager_variant" android:id="@+id/clearFiles"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:preference_title="@string/variant" /> app:preference_title="@string/clear_files"/>
<com.vanced.manager.ui.core.EmptyPreference </com.vanced.manager.ui.core.PreferenceCategory>
android:id="@+id/clearFiles"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:preference_title="@string/clear_files" />
</com.vanced.manager.ui.core.PreferenceCategory>
<com.vanced.manager.ui.core.PreferenceCategory <com.vanced.manager.ui.core.PreferenceCategory
android:layout_width="match_parent" android:layout_width="match_parent"
@ -83,19 +82,13 @@
android:id="@+id/manager_language" android:id="@+id/manager_language"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:preference_title="@string/language_title" /> app:preference_title="@string/language_title"/>
<com.vanced.manager.ui.core.EmptyPreference <com.vanced.manager.ui.core.EmptyPreference
android:id="@+id/select_apps" android:id="@+id/select_apps"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:preference_title="@string/select_apps" /> app:preference_title="@string/select_apps"/>
</com.vanced.manager.ui.core.PreferenceCategory> </com.vanced.manager.ui.core.PreferenceCategory>
</LinearLayout>
</LinearLayout> </androidx.core.widget.NestedScrollView>
</androidx.core.widget.NestedScrollView>
</layout>

View File

@ -1,37 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout> <com.vanced.manager.ui.core.SlidingConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?colorSurface">
<com.vanced.manager.ui.core.SlidingConstraintLayout <ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:background="?colorSurface"> 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"/>
<ImageView <com.google.android.material.button.MaterialButton
android:layout_width="match_parent" android:id="@+id/welcome_get_started"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_alignParentTop="true" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/top_header_margin" android:layout_marginBottom="32dp"
android:src="@drawable/ic_launch_text" android:letterSpacing="0.15"
android:textAlignment="center" android:padding="22dp"
app:layout_constraintTop_toTopOf="parent" /> android:text="@string/lets_get_started"
android:textAllCaps="false"
<com.google.android.material.button.MaterialButton android:textSize="13sp"
android:id="@+id/welcome_get_started" app:cornerRadius="50dp"
android:layout_width="wrap_content" app:layout_constraintBottom_toBottomOf="parent"
android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginBottom="32dp" app:layout_constraintStart_toStartOf="parent"/>
android:letterSpacing="0.15" </com.vanced.manager.ui.core.SlidingConstraintLayout>
android:padding="22dp"
android:text="@string/lets_get_started"
android:textAllCaps="false"
android:textSize="13sp"
app:cornerRadius="50dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</com.vanced.manager.ui.core.SlidingConstraintLayout>
</layout>