Refactor permissions manager

This commit is contained in:
MM20
2022-01-03 21:41:44 +01:00
parent 5c0d142fd9
commit b5005ee4ea
15 changed files with 183 additions and 84 deletions
@@ -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