Refactor permissions manager
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
package de.mm20.launcher2.ui.component
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.rounded.Lock
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Composable
|
||||
fun MissingPermissionBanner(
|
||||
modifier: Modifier = Modifier,
|
||||
text: String,
|
||||
onClick: () -> Unit,
|
||||
secondaryAction: @Composable () -> Unit = {}
|
||||
) {
|
||||
Surface(
|
||||
modifier = modifier,
|
||||
color = MaterialTheme.colorScheme.primaryContainer,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Column {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Icon(
|
||||
modifier = Modifier.padding(16.dp),
|
||||
imageVector = Icons.Rounded.Lock,
|
||||
contentDescription = null
|
||||
)
|
||||
Text(
|
||||
text = text,
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(vertical = 16.dp)
|
||||
.padding(end = 16.dp),
|
||||
style = MaterialTheme.typography.bodyMedium
|
||||
)
|
||||
}
|
||||
Row(
|
||||
Modifier
|
||||
.align(Alignment.End)
|
||||
.padding(8.dp)
|
||||
) {
|
||||
secondaryAction()
|
||||
TextButton(
|
||||
modifier = Modifier.padding(start = 8.dp),
|
||||
onClick = onClick) {
|
||||
Text("Grant", style = MaterialTheme.typography.labelLarge)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,14 +213,6 @@ class LauncherActivity : AppCompatActivity() {
|
||||
ThemeHelper.applyTheme(theme)
|
||||
|
||||
if (LauncherPreferences.instance.firstRunVersion < 1) {
|
||||
ActivityCompat.requestPermissions(
|
||||
this, arrayOf(
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
Manifest.permission.ACCESS_FINE_LOCATION,
|
||||
Manifest.permission.ACCESS_COARSE_LOCATION
|
||||
), PermissionsManager.ALL
|
||||
)
|
||||
LauncherPreferences.instance.firstRunVersion = 1
|
||||
}
|
||||
|
||||
@@ -646,15 +638,6 @@ class LauncherActivity : AppCompatActivity() {
|
||||
) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||
search(binding.searchBar.getSearchQuery())
|
||||
when (requestCode) {
|
||||
PermissionsManager.LOCATION -> {
|
||||
ViewModelProvider(this).get(WeatherViewModel::class.java).requestUpdate(this)
|
||||
}
|
||||
PermissionsManager.ALL -> {
|
||||
ViewModelProvider(this).get(WeatherViewModel::class.java).requestUpdate(this)
|
||||
search(binding.searchBar.getSearchQuery())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
|
||||
@@ -9,6 +9,7 @@ import android.widget.FrameLayout
|
||||
import androidx.activity.viewModels
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.lifecycle.LiveData
|
||||
import de.mm20.launcher2.permissions.PermissionGroup
|
||||
import de.mm20.launcher2.permissions.PermissionsManager
|
||||
import de.mm20.launcher2.preferences.LauncherPreferences
|
||||
import de.mm20.launcher2.search.data.CalendarEvent
|
||||
@@ -16,8 +17,10 @@ import de.mm20.launcher2.search.data.MissingPermission
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.launcher.search.SearchViewModel
|
||||
import de.mm20.launcher2.ui.legacy.search.SearchListView
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.get
|
||||
|
||||
class CalendarView : FrameLayout {
|
||||
class CalendarView : FrameLayout, KoinComponent {
|
||||
|
||||
constructor(context: Context) : super(context)
|
||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||
@@ -30,6 +33,7 @@ class CalendarView : FrameLayout {
|
||||
private val calendarEvents: LiveData<List<CalendarEvent>?>
|
||||
|
||||
init {
|
||||
val permissionsManager: PermissionsManager = get()
|
||||
View.inflate(context, R.layout.view_search_category_list, this)
|
||||
layoutTransition = LayoutTransition()
|
||||
layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
|
||||
@@ -43,9 +47,8 @@ class CalendarView : FrameLayout {
|
||||
visibility = View.GONE
|
||||
return@observe
|
||||
}
|
||||
if (it.isEmpty() && LauncherPreferences.instance.searchCalendars && !PermissionsManager.checkPermission(
|
||||
context,
|
||||
PermissionsManager.CALENDAR
|
||||
if (it.isEmpty() && LauncherPreferences.instance.searchCalendars && !permissionsManager.checkPermission(
|
||||
PermissionGroup.Calendar
|
||||
)
|
||||
) {
|
||||
visibility = View.VISIBLE
|
||||
@@ -53,7 +56,7 @@ class CalendarView : FrameLayout {
|
||||
listOf(
|
||||
MissingPermission(
|
||||
context.getString(R.string.permission_calendar_search),
|
||||
PermissionsManager.CALENDAR
|
||||
PermissionGroup.Calendar
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.widget.SearchView
|
||||
import androidx.activity.viewModels
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.lifecycle.LiveData
|
||||
import de.mm20.launcher2.permissions.PermissionGroup
|
||||
import de.mm20.launcher2.permissions.PermissionsManager
|
||||
import de.mm20.launcher2.preferences.LauncherPreferences
|
||||
import de.mm20.launcher2.search.data.Contact
|
||||
@@ -17,8 +18,10 @@ import de.mm20.launcher2.search.data.MissingPermission
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.launcher.search.SearchViewModel
|
||||
import de.mm20.launcher2.ui.legacy.search.SearchListView
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.get
|
||||
|
||||
class ContactView : FrameLayout {
|
||||
class ContactView : FrameLayout, KoinComponent {
|
||||
private val contacts: LiveData<List<Contact>?>
|
||||
|
||||
constructor(context: Context) : super(context)
|
||||
@@ -30,6 +33,7 @@ class ContactView : FrameLayout {
|
||||
)
|
||||
|
||||
init {
|
||||
val permissionsManager: PermissionsManager = get()
|
||||
View.inflate(context, R.layout.view_search_category_list, this)
|
||||
layoutTransition = LayoutTransition()
|
||||
layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
|
||||
@@ -43,9 +47,8 @@ class ContactView : FrameLayout {
|
||||
visibility = View.GONE
|
||||
return@observe
|
||||
}
|
||||
if (it.isEmpty() && LauncherPreferences.instance.searchContacts && !PermissionsManager.checkPermission(
|
||||
context,
|
||||
PermissionsManager.CONTACTS
|
||||
if (it.isEmpty() && LauncherPreferences.instance.searchContacts && !permissionsManager.checkPermission(
|
||||
PermissionGroup.Contacts
|
||||
)
|
||||
) {
|
||||
visibility = View.VISIBLE
|
||||
@@ -53,7 +56,7 @@ class ContactView : FrameLayout {
|
||||
listOf(
|
||||
MissingPermission(
|
||||
context.getString(R.string.permission_contact_search),
|
||||
PermissionsManager.CONTACTS
|
||||
PermissionGroup.Contacts
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -9,14 +9,17 @@ import android.widget.FrameLayout
|
||||
import androidx.activity.viewModels
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.lifecycle.LiveData
|
||||
import de.mm20.launcher2.permissions.PermissionGroup
|
||||
import de.mm20.launcher2.permissions.PermissionsManager
|
||||
import de.mm20.launcher2.search.data.File
|
||||
import de.mm20.launcher2.search.data.MissingPermission
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.launcher.search.SearchViewModel
|
||||
import de.mm20.launcher2.ui.legacy.search.SearchListView
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.get
|
||||
|
||||
class FileView : FrameLayout {
|
||||
class FileView : FrameLayout, KoinComponent {
|
||||
private val files: LiveData<List<File>?>
|
||||
|
||||
constructor(context: Context) : super(context)
|
||||
@@ -28,6 +31,7 @@ class FileView : FrameLayout {
|
||||
)
|
||||
|
||||
init {
|
||||
val permissionsManager: PermissionsManager = get()
|
||||
View.inflate(context, R.layout.view_search_category_list, this)
|
||||
layoutTransition = LayoutTransition()
|
||||
layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
|
||||
@@ -41,9 +45,8 @@ class FileView : FrameLayout {
|
||||
visibility = View.GONE
|
||||
return@observe
|
||||
}
|
||||
if (it.isEmpty() && !PermissionsManager.checkPermission(
|
||||
context,
|
||||
PermissionsManager.EXTERNAL_STORAGE
|
||||
if (it.isEmpty() && !permissionsManager.checkPermission(
|
||||
PermissionGroup.ExternalStorage
|
||||
)
|
||||
) {
|
||||
visibility = View.VISIBLE
|
||||
@@ -51,7 +54,7 @@ class FileView : FrameLayout {
|
||||
listOf(
|
||||
MissingPermission(
|
||||
context.getString(R.string.permission_files_search),
|
||||
PermissionsManager.EXTERNAL_STORAGE
|
||||
PermissionGroup.ExternalStorage
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -2,6 +2,7 @@ package de.mm20.launcher2.ui.legacy.search
|
||||
|
||||
import android.app.Activity
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.transition.Scene
|
||||
import de.mm20.launcher2.permissions.PermissionsManager
|
||||
import de.mm20.launcher2.search.data.MissingPermission
|
||||
@@ -10,17 +11,20 @@ import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.legacy.searchable.SearchableView
|
||||
import de.mm20.launcher2.ui.legacy.view.InnerCardView
|
||||
import de.mm20.launcher2.ui.legacy.view.LauncherIconView
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.get
|
||||
|
||||
class PermissionListRepresentation : Representation {
|
||||
class PermissionListRepresentation : Representation, KoinComponent {
|
||||
override fun getScene(rootView: SearchableView, searchable: Searchable, previousRepresentation: Int?): Scene {
|
||||
val missingPermission = searchable as MissingPermission
|
||||
val context = rootView.context
|
||||
val scene = Scene.getSceneForLayout(rootView, R.layout.view_permission_list, rootView.context)
|
||||
scene.setEnterAction {
|
||||
val permissionsManager: PermissionsManager = get()
|
||||
rootView.findViewById<TextView>(R.id.permissionText).text = missingPermission.label
|
||||
rootView.findViewById<LauncherIconView>(R.id.permissionIcon).icon = missingPermission.getPlaceholderIcon(context)
|
||||
rootView.findViewById<InnerCardView>(R.id.card).setOnClickListener {
|
||||
PermissionsManager.requestPermission(context as Activity, missingPermission.permissionGroup)
|
||||
permissionsManager.requestPermission(context as AppCompatActivity, missingPermission.permissionGroup)
|
||||
}
|
||||
}
|
||||
return scene
|
||||
|
||||
Reference in New Issue
Block a user