ui: sheets: Use BottomSheetDialogFragment directly

We don't need base class anymore. Also use view binding the recommended
way for fragments.

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-03-20 13:35:06 +05:30
parent 5cf7fa6b3c
commit 3a27fa719b
12 changed files with 175 additions and 302 deletions

View File

@@ -21,10 +21,8 @@
package com.aurora.store.view.ui.sheets package com.aurora.store.view.ui.sheets
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
@@ -37,16 +35,23 @@ import com.aurora.store.data.providers.BlacklistProvider
import com.aurora.store.databinding.SheetAppMenuBinding import com.aurora.store.databinding.SheetAppMenuBinding
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
import com.aurora.store.viewmodel.sheets.SheetsViewModel import com.aurora.store.viewmodel.sheets.SheetsViewModel
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
@AndroidEntryPoint @AndroidEntryPoint
class AppMenuSheet : BaseBottomSheet() { class AppMenuSheet : BottomSheetDialogFragment(R.layout.sheet_app_menu) {
private lateinit var B: SheetAppMenuBinding companion object {
const val TAG = "APP_MENU_SHEET"
}
private var _binding: SheetAppMenuBinding? = null
private val binding get() = _binding!!
private val viewModel: SheetsViewModel by viewModels() private val viewModel: SheetsViewModel by viewModels()
private val args: AppMenuSheetArgs by navArgs() private val args: AppMenuSheetArgs by navArgs()
private val exportMimeType = "application/zip" private val exportMimeType = "application/zip"
private val requestDocumentCreation = private val requestDocumentCreation =
@@ -59,22 +64,14 @@ class AppMenuSheet : BaseBottomSheet() {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater,
container: ViewGroup,
savedInstanceState: Bundle?
): View {
B = SheetAppMenuBinding.inflate(layoutInflater)
return B.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = SheetAppMenuBinding.bind(view)
val blacklistProvider = BlacklistProvider.with(requireContext()) val blacklistProvider = BlacklistProvider.with(requireContext())
val isBlacklisted: Boolean = blacklistProvider.isBlacklisted(args.app.packageName) val isBlacklisted: Boolean = blacklistProvider.isBlacklisted(args.app.packageName)
with(B.navigationView) { with(binding.navigationView) {
//Switch strings for Add/Remove Blacklist //Switch strings for Add/Remove Blacklist
val blackListMenu: MenuItem = menu.findItem(R.id.action_blacklist) val blackListMenu: MenuItem = menu.findItem(R.id.action_blacklist)
blackListMenu.setTitle( blackListMenu.setTitle(
@@ -125,7 +122,8 @@ class AppMenuSheet : BaseBottomSheet() {
} }
} }
companion object { override fun onDestroyView() {
const val TAG = "APP_MENU_SHEET" super.onDestroyView()
_binding = null
} }
} }

View File

@@ -20,47 +20,43 @@
package com.aurora.store.view.ui.sheets package com.aurora.store.view.ui.sheets
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.SheetAppPeekBinding import com.aurora.store.databinding.SheetAppPeekBinding
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class AppPeekDialogSheet : BaseBottomSheet() { class AppPeekDialogSheet : BottomSheetDialogFragment(R.layout.sheet_app_peek) {
lateinit var B: SheetAppPeekBinding private var _binding: SheetAppPeekBinding? = null
private val binding get() = _binding!!
private val args: AppPeekDialogSheetArgs by navArgs() private val args: AppPeekDialogSheetArgs by navArgs()
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater, super.onViewCreated(view, savedInstanceState)
container: ViewGroup, _binding = SheetAppPeekBinding.bind(view)
savedInstanceState: Bundle?
): View {
B = SheetAppPeekBinding.inflate(inflater, container, false)
return B.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) { binding.txtLine1.text = args.app.displayName
B.txtLine1.text = args.app.displayName binding.imgIcon.load(args.app.iconArtwork.url) {
B.imgIcon.load(args.app.iconArtwork.url) {
transformations(RoundedCornersTransformation(25F)) transformations(RoundedCornersTransformation(25F))
} }
B.txtLine2.text = args.app.developerName binding.txtLine2.text = args.app.developerName
B.txtLine3.text = String.format( binding.txtLine3.text = String.format(
requireContext().getString(R.string.app_list_rating), requireContext().getString(R.string.app_list_rating),
CommonUtil.addSiPrefix(args.app.size), CommonUtil.addSiPrefix(args.app.size),
args.app.labeledRating, args.app.labeledRating,
if (args.app.isFree) if (args.app.isFree) "Free" else "Paid"
"Free"
else
"Paid"
) )
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} }

View File

@@ -1,83 +0,0 @@
/*
* Aurora Store
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
*
* Aurora Store 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 2 of the License, or
* (at your option) any later version.
*
* Aurora Store 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 Aurora Store. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.aurora.store.view.ui.sheets
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.aurora.store.R
import com.aurora.store.databinding.SheetBaseBinding
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import java.lang.reflect.Modifier
abstract class BaseBottomSheet : BottomSheetDialogFragment() {
lateinit var VM: SheetBaseBinding
var gson: Gson = GsonBuilder()
.excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT)
.create()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val bottomSheetDialog = BottomSheetDialog(
requireContext(),
R.style.AppTheme_Dialog
)
VM = SheetBaseBinding.inflate(layoutInflater)
bottomSheetDialog.setContentView(VM.root)
val container = VM.container
val contentView = onCreateContentView(
LayoutInflater.from(requireContext()),
container,
savedInstanceState
)
if (contentView != null) {
onContentViewCreated(contentView, savedInstanceState)
container.addView(contentView)
}
bottomSheetDialog.setOnShowListener {
val bottomSheet =
bottomSheetDialog.findViewById<FrameLayout>(com.google.android.material.R.id.design_bottom_sheet)
if (bottomSheet != null)
BottomSheetBehavior.from(bottomSheet).state = BottomSheetBehavior.STATE_EXPANDED
}
return bottomSheetDialog
}
abstract fun onCreateContentView(
inflater: LayoutInflater,
container: ViewGroup,
savedInstanceState: Bundle?
): View?
abstract fun onContentViewCreated(view: View, savedInstanceState: Bundle?)
}

View File

@@ -22,59 +22,44 @@ package com.aurora.store.view.ui.sheets
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import coil.load import coil.load
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.SheetDeviceMiuiBinding import com.aurora.store.databinding.SheetDeviceMiuiBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class DeviceMiuiSheet : BaseBottomSheet() { class DeviceMiuiSheet : BottomSheetDialogFragment(R.layout.sheet_device_miui) {
private lateinit var B: SheetDeviceMiuiBinding private var _binding: SheetDeviceMiuiBinding? = null
private val binding get() = _binding!!
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater, super.onViewCreated(view, savedInstanceState)
container: ViewGroup, _binding = SheetDeviceMiuiBinding.bind(view)
savedInstanceState: Bundle?
): View {
B = SheetDeviceMiuiBinding.inflate(inflater, container, false)
inflateData() binding.imgIcon.load(R.drawable.ic_xiaomi_logo) {
attachAction()
return B.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
}
private fun inflateData() {
B.imgIcon.load(R.drawable.ic_xiaomi_logo) {
transformations(CircleCropTransformation()) transformations(CircleCropTransformation())
} }
}
private fun attachAction() { binding.btnPrimary.setOnClickListener {
B.btnPrimary.setOnClickListener { try {
openDeveloperSettings() startActivity(Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS))
} catch (e: Exception) {
toast(R.string.toast_developer_setting_failed)
}
} }
B.btnSecondary.setOnClickListener { binding.btnSecondary.setOnClickListener {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
} }
private fun openDeveloperSettings() { override fun onDestroyView() {
try { super.onDestroyView()
startActivity(Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)) _binding = null
} catch (e: Exception) {
toast(R.string.toast_developer_setting_failed)
}
} }
} }

View File

@@ -21,9 +21,7 @@ package com.aurora.store.view.ui.sheets
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.findViewTreeLifecycleOwner import androidx.lifecycle.findViewTreeLifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
@@ -34,13 +32,14 @@ import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.model.DownloadStatus
import com.aurora.store.databinding.SheetDownloadMenuBinding import com.aurora.store.databinding.SheetDownloadMenuBinding
import com.aurora.store.util.DownloadWorkerUtil import com.aurora.store.util.DownloadWorkerUtil
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
class DownloadMenuSheet : BaseBottomSheet() { class DownloadMenuSheet : BottomSheetDialogFragment(R.layout.sheet_download_menu) {
private val TAG = DownloadMenuSheet::class.java.simpleName private val TAG = DownloadMenuSheet::class.java.simpleName
@@ -56,17 +55,9 @@ class DownloadMenuSheet : BaseBottomSheet() {
@Inject @Inject
lateinit var appInstaller: AppInstaller lateinit var appInstaller: AppInstaller
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater,
container: ViewGroup,
savedInstanceState: Bundle?
): View {
_binding = SheetDownloadMenuBinding.inflate(layoutInflater)
return binding.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = SheetDownloadMenuBinding.bind(view)
with(binding.navigationView) { with(binding.navigationView) {
menu.findItem(R.id.action_cancel).isVisible = !args.download.isFinished menu.findItem(R.id.action_cancel).isVisible = !args.download.isFinished

View File

@@ -4,9 +4,7 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.extensions.isIgnoringBatteryOptimizations import com.aurora.extensions.isIgnoringBatteryOptimizations
@@ -17,8 +15,9 @@ import com.aurora.store.data.work.UpdateWorker
import com.aurora.store.databinding.SheetDozeWarningBinding import com.aurora.store.databinding.SheetDozeWarningBinding
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_AUTO import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_AUTO
import com.aurora.store.util.save import com.aurora.store.util.save
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
class DozeWarningSheet : BaseBottomSheet() { class DozeWarningSheet : BottomSheetDialogFragment(R.layout.sheet_doze_warning) {
private val args: DozeWarningSheetArgs by navArgs() private val args: DozeWarningSheetArgs by navArgs()
@@ -42,26 +41,23 @@ class DozeWarningSheet : BaseBottomSheet() {
private var _binding: SheetDozeWarningBinding? = null private var _binding: SheetDozeWarningBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater, super.onViewCreated(view, savedInstanceState)
container: ViewGroup, _binding = SheetDozeWarningBinding.bind(view)
savedInstanceState: Bundle?
): View {
_binding = SheetDozeWarningBinding.inflate(inflater, container, false)
return binding.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
binding.btnSecondary.setOnClickListener { dismissAllowingStateLoss() } binding.btnSecondary.setOnClickListener { dismissAllowingStateLoss() }
binding.btnPrimary.setOnClickListener { requestDozePermission() } binding.btnPrimary.setOnClickListener {
} if (isMAndAbove()) {
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
private fun requestDozePermission() { data = Uri.parse("package:${requireContext().packageName}")
if (isMAndAbove()) { }
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { startForDozeResult.launch(intent)
data = Uri.parse("package:${requireContext().packageName}")
} }
startForDozeResult.launch(intent)
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} }

View File

@@ -20,51 +20,51 @@
package com.aurora.store.view.ui.sheets package com.aurora.store.view.ui.sheets
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.Filter import com.aurora.store.data.Filter
import com.aurora.store.data.providers.FilterProvider import com.aurora.store.data.providers.FilterProvider
import com.aurora.store.databinding.SheetFilterBinding import com.aurora.store.databinding.SheetFilterBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class FilterSheet : BaseBottomSheet() { class FilterSheet : BottomSheetDialogFragment(R.layout.sheet_filter) {
private var _binding: SheetFilterBinding? = null
private val binding get() = _binding!!
private lateinit var B: SheetFilterBinding
private lateinit var filter: Filter private lateinit var filter: Filter
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater, super.onViewCreated(view, savedInstanceState)
container: ViewGroup, _binding = SheetFilterBinding.bind(view)
savedInstanceState: Bundle?
): View {
B = SheetFilterBinding.inflate(inflater, container, false)
filter = FilterProvider.with(requireContext()).getSavedFilter() filter = FilterProvider.with(requireContext()).getSavedFilter()
return B.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
attachSingleChips() attachSingleChips()
attachMultipleChips() attachMultipleChips()
attachActions() attachActions()
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun attachActions() { private fun attachActions() {
B.btnPositive.setOnClickListener { binding.btnPositive.setOnClickListener {
FilterProvider.with(requireContext()).saveFilter(filter) FilterProvider.with(requireContext()).saveFilter(filter)
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
B.btnNegative.setOnClickListener { binding.btnNegative.setOnClickListener {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
} }
private fun attachSingleChips() { private fun attachSingleChips() {
B.filterGfs.apply { binding.filterGfs.apply {
isChecked = filter.gsfDependentApps isChecked = filter.gsfDependentApps
setOnCheckedChangeListener { _, checked -> setOnCheckedChangeListener { _, checked ->
isChecked = checked isChecked = checked
@@ -72,7 +72,7 @@ class FilterSheet : BaseBottomSheet() {
} }
} }
B.filterPaid.apply { binding.filterPaid.apply {
isChecked = filter.paidApps isChecked = filter.paidApps
setOnCheckedChangeListener { _, checked -> setOnCheckedChangeListener { _, checked ->
isChecked = checked isChecked = checked
@@ -80,7 +80,7 @@ class FilterSheet : BaseBottomSheet() {
} }
} }
B.filterAds.apply { binding.filterAds.apply {
isChecked = filter.appsWithAds isChecked = filter.appsWithAds
setOnCheckedChangeListener { _, checked -> setOnCheckedChangeListener { _, checked ->
isChecked = checked isChecked = checked
@@ -101,11 +101,11 @@ class FilterSheet : BaseBottomSheet() {
chip.id = i chip.id = i
chip.text = downloadLabel chip.text = downloadLabel
chip.isChecked = filter.downloads == downloadValues[i].toInt() chip.isChecked = filter.downloads == downloadValues[i].toInt()
B.downloadChips.addView(chip) binding.downloadChips.addView(chip)
i++ i++
} }
B.downloadChips.setOnCheckedStateChangeListener { _, checkedIds -> binding.downloadChips.setOnCheckedStateChangeListener { _, checkedIds ->
filter.downloads = downloadValues[checkedIds[0]].toInt() filter.downloads = downloadValues[checkedIds[0]].toInt()
} }
@@ -115,11 +115,11 @@ class FilterSheet : BaseBottomSheet() {
chip.id = i chip.id = i
chip.text = ratingLabel chip.text = ratingLabel
chip.isChecked = filter.rating == ratingValues[i].toFloat() chip.isChecked = filter.rating == ratingValues[i].toFloat()
B.ratingChips.addView(chip) binding.ratingChips.addView(chip)
i++ i++
} }
B.ratingChips.setOnCheckedStateChangeListener { _, checkedIds -> binding.ratingChips.setOnCheckedStateChangeListener { _, checkedIds ->
filter.rating = ratingValues[checkedIds[0]].toFloat() filter.rating = ratingValues[checkedIds[0]].toFloat()
} }
} }

View File

@@ -20,9 +20,7 @@
package com.aurora.store.view.ui.sheets package com.aurora.store.view.ui.sheets
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import coil.load import coil.load
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
@@ -30,49 +28,41 @@ import com.aurora.extensions.copyToClipBoard
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.SheetInstallErrorBinding import com.aurora.store.databinding.SheetInstallErrorBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class InstallErrorDialogSheet : BaseBottomSheet() { class InstallErrorDialogSheet : BottomSheetDialogFragment(R.layout.sheet_install_error) {
private lateinit var B: SheetInstallErrorBinding private var _binding: SheetInstallErrorBinding? = null
private val binding get() = _binding!!
private val args: InstallErrorDialogSheetArgs by navArgs() private val args: InstallErrorDialogSheetArgs by navArgs()
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater, super.onViewCreated(view, savedInstanceState)
container: ViewGroup, _binding = SheetInstallErrorBinding.bind(view)
savedInstanceState: Bundle?
): View {
B = SheetInstallErrorBinding.inflate(inflater, container, false)
inflateData()
attachAction()
return B.root binding.imgIcon.load(args.app.iconArtwork.url) {
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
}
private fun inflateData() {
B.imgIcon.load(args.app.iconArtwork.url) {
transformations(CircleCropTransformation()) transformations(CircleCropTransformation())
} }
B.txtLine1.text = args.app.displayName binding.txtLine1.text = args.app.displayName
B.txtLine2.text = args.error binding.txtLine2.text = args.error
B.txtLine3.text = args.extra binding.txtLine3.text = args.extra
}
private fun attachAction() { binding.btnPrimary.setOnClickListener {
B.btnPrimary.setOnClickListener {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
B.btnSecondary.setOnClickListener { binding.btnSecondary.setOnClickListener {
requireContext().copyToClipBoard(args.extra) requireContext().copyToClipBoard(args.extra)
requireContext().toast(R.string.toast_clipboard_copied) requireContext().toast(R.string.toast_clipboard_copied)
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} }

View File

@@ -21,9 +21,7 @@ package com.aurora.store.view.ui.sheets
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
@@ -33,34 +31,43 @@ import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.SheetManualDownloadBinding import com.aurora.store.databinding.SheetManualDownloadBinding
import com.aurora.store.viewmodel.sheets.SheetsViewModel import com.aurora.store.viewmodel.sheets.SheetsViewModel
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
class ManualDownloadSheet : BaseBottomSheet() { class ManualDownloadSheet : BottomSheetDialogFragment(R.layout.sheet_manual_download) {
private lateinit var B: SheetManualDownloadBinding private var _binding: SheetManualDownloadBinding? = null
private val binding get() = _binding!!
private val viewModel: SheetsViewModel by viewModels() private val viewModel: SheetsViewModel by viewModels()
private val args: ManualDownloadSheetArgs by navArgs() private val args: ManualDownloadSheetArgs by navArgs()
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater,
container: ViewGroup,
savedInstanceState: Bundle?
): View {
B = SheetManualDownloadBinding.inflate(inflater)
return B.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = SheetManualDownloadBinding.bind(view)
isCancelable = false isCancelable = false
inflateData() inflateData()
attachActions() attachActions()
viewLifecycleOwner.lifecycleScope.launch {
viewModel.purchaseStatus.collectLatest {
if (it) {
toast(R.string.toast_manual_available)
dismissAllowingStateLoss()
} else {
toast(R.string.toast_manual_unavailable)
}
}
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
@@ -78,30 +85,30 @@ class ManualDownloadSheet : BaseBottomSheet() {
} }
private fun inflateData() { private fun inflateData() {
B.imgIcon.load(args.app.iconArtwork.url) { binding.imgIcon.load(args.app.iconArtwork.url) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F)) transformations(RoundedCornersTransformation(32F))
} }
B.txtLine1.text = args.app.displayName binding.txtLine1.text = args.app.displayName
B.txtLine2.text = args.app.packageName binding.txtLine2.text = args.app.packageName
B.txtLine3.text = ("${args.app.versionName} (${args.app.versionCode})") binding.txtLine3.text = ("${args.app.versionName} (${args.app.versionCode})")
B.versionCodeLayout.hint = "${args.app.versionCode}" binding.versionCodeLayout.hint = "${args.app.versionCode}"
B.versionCodeLayout.editText?.setText("${args.app.versionCode}") binding.versionCodeLayout.editText?.setText("${args.app.versionCode}")
} }
private fun attachActions() { private fun attachActions() {
B.btnPrimary.setOnClickListener { binding.btnPrimary.setOnClickListener {
val customVersionString = (B.versionCodeInp.text).toString() val customVersionString = (binding.versionCodeInp.text).toString()
if (customVersionString.isEmpty()) if (customVersionString.isEmpty())
B.versionCodeInp.error = "Enter version code" binding.versionCodeInp.error = "Enter version code"
else { else {
viewModel.purchase(requireContext(), args.app, customVersionString.toInt()) viewModel.purchase(requireContext(), args.app, customVersionString.toInt())
} }
} }
B.btnSecondary.setOnClickListener { binding.btnSecondary.setOnClickListener {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
} }

View File

@@ -24,19 +24,20 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.util.Log import android.util.Log
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import com.aurora.extensions.isQAndAbove import com.aurora.extensions.isQAndAbove
import com.aurora.store.R
import com.aurora.store.databinding.SheetNetworkBinding import com.aurora.store.databinding.SheetNetworkBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class NetworkDialogSheet : BaseBottomSheet() { class NetworkDialogSheet : BottomSheetDialogFragment(R.layout.sheet_network) {
private val TAG = NetworkDialogSheet::class.java.simpleName private val TAG = NetworkDialogSheet::class.java.simpleName
lateinit var B: SheetNetworkBinding private var _binding: SheetNetworkBinding? = null
private val binding get() = _binding!!
companion object { companion object {
@@ -50,17 +51,11 @@ class NetworkDialogSheet : BaseBottomSheet() {
} }
} }
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater, super.onViewCreated(view, savedInstanceState)
container: ViewGroup, _binding = SheetNetworkBinding.bind(view)
savedInstanceState: Bundle?
): View {
B = SheetNetworkBinding.inflate(inflater, container, false)
return B.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) { binding.btnAction.setOnClickListener {
B.btnAction.setOnClickListener {
if (isQAndAbove()) { if (isQAndAbove()) {
startActivity(Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)) startActivity(Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY))
} else { } else {
@@ -73,4 +68,9 @@ class NetworkDialogSheet : BaseBottomSheet() {
} }
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} }

View File

@@ -22,9 +22,7 @@ package com.aurora.store.view.ui.sheets
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.PermissionInfo import android.content.pm.PermissionInfo
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.extensions.hide import com.aurora.extensions.hide
@@ -33,32 +31,23 @@ import com.aurora.store.R
import com.aurora.store.data.model.PermissionGroupInfo import com.aurora.store.data.model.PermissionGroupInfo
import com.aurora.store.databinding.SheetPermissionsBinding import com.aurora.store.databinding.SheetPermissionsBinding
import com.aurora.store.view.custom.layouts.PermissionGroup import com.aurora.store.view.custom.layouts.PermissionGroup
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import java.util.* import java.util.*
@AndroidEntryPoint @AndroidEntryPoint
class PermissionBottomSheet : BaseBottomSheet() { class PermissionBottomSheet : BottomSheetDialogFragment(R.layout.sheet_permissions) {
private var _binding: SheetPermissionsBinding? = null
private val binding get() = _binding!!
private lateinit var B: SheetPermissionsBinding
private lateinit var packageManager: PackageManager private lateinit var packageManager: PackageManager
private val args: PermissionBottomSheetArgs by navArgs() private val args: PermissionBottomSheetArgs by navArgs()
override fun onCreateContentView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater,
container: ViewGroup,
savedInstanceState: Bundle?
): View {
B = SheetPermissionsBinding.inflate(inflater)
return B.root
}
override fun onContentViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
inflateData() _binding = SheetPermissionsBinding.bind(view)
}
private fun inflateData() {
packageManager = requireContext().packageManager packageManager = requireContext().packageManager
val permissionGroupWidgets: MutableMap<String, PermissionGroup?> = val permissionGroupWidgets: MutableMap<String, PermissionGroup?> =
@@ -84,17 +73,23 @@ class PermissionBottomSheet : BaseBottomSheet() {
permissionGroup?.addPermission(permissionInfo) permissionGroup?.addPermission(permissionInfo)
} }
B.permissionsContainer.removeAllViews() binding.permissionsContainer.removeAllViews()
val permissionGroupLabels: List<String> = ArrayList(permissionGroupWidgets.keys) val permissionGroupLabels: List<String> = ArrayList(permissionGroupWidgets.keys)
permissionGroupLabels.sortedBy { it }.forEach { permissionGroupLabels.sortedBy { it }.forEach {
B.permissionsContainer.addView(permissionGroupWidgets[it]) binding.permissionsContainer.addView(permissionGroupWidgets[it])
} }
if (permissionGroupLabels.isEmpty()) if (permissionGroupLabels.isEmpty()) {
B.permissionsNone.show() binding.permissionsNone.show()
else } else {
B.permissionsNone.hide() binding.permissionsNone.hide()
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
private fun getPermissionInfo(permissionName: String): PermissionInfo? { private fun getPermissionInfo(permissionName: String): PermissionInfo? {

View File

@@ -120,6 +120,4 @@
<style name="AppTheme.SwitchPreference" parent="@style/Preference.SwitchPreferenceCompat.Material"> <style name="AppTheme.SwitchPreference" parent="@style/Preference.SwitchPreferenceCompat.Material">
<item name="widgetLayout">@layout/preference_material_switch</item> <item name="widgetLayout">@layout/preference_material_switch</item>
</style> </style>
<style name="AppTheme.Dialog" parent="Theme.Material3.DayNight.BottomSheetDialog" />
</resources> </resources>