ContactItem improvements (#1324)
* ContactRepository: try to deduplicate phoneNumbers in a smart way * AndroidManifest: use CALL_PHONE permission to allow for making phone calls * Implement CallOnTap with contact results - contact activities that require permissions we do not have are not listed - add CallOnTap setting for phone number results on search behind contacts settings * utilize PhoneNumberUtils * navroute settings/search/contacts * queryIntentActivities -> resolveActivity * localization * Code formatting * Wrap contact search settings in preference category --------- Co-authored-by: MM20 <15646950+MM2-0@users.noreply.github.com>
This commit is contained in:
@@ -818,4 +818,6 @@
|
||||
<item quantity="one">in einer Minute</item>
|
||||
<item quantity="other">in %1$d Minuten</item>
|
||||
</plurals>
|
||||
<string name="preference_contacts_call_on_tap">Zum Anruf Tippen</string>
|
||||
<string name="preference_contacts_call_on_tap_summary">Beim Tippen auf eine Telefonnummer diese direkt Anrufen</string>
|
||||
</resources>
|
||||
@@ -390,6 +390,8 @@
|
||||
<string name="missing_permission_music_widget">Notification access is required to control media playback</string>
|
||||
<!-- Missing contact permission in search settings screen -->
|
||||
<string name="missing_permission_contact_search_settings">Contact permission is required to search contacts</string>
|
||||
<!-- Missing call permission in contacts settings screen -->
|
||||
<string name="missing_permission_call_contacts_settings">Call permission is required to start calls</string>
|
||||
<!-- Missing calendar permission in search settings screen -->
|
||||
<string name="missing_permission_calendar_search_settings">Calendar permission is required to search calendar</string>
|
||||
<!-- Missing calendar permission in calendar widget settings screen -->
|
||||
@@ -668,6 +670,8 @@
|
||||
<string name="preference_category_accounts">Accounts</string>
|
||||
<string name="preference_weather_integration">Weather</string>
|
||||
<string name="preference_media_integration">Media control</string>
|
||||
<string name="preference_contacts_call_on_tap">Call on tap</string>
|
||||
<string name="preference_contacts_call_on_tap_summary">Directly start calls when tapping phone numbers</string>
|
||||
<!-- Used in an info banner if a specific feature requires a Nextcloud account -->
|
||||
<string name="no_account_nextcloud">You haven\'t connected a Nextcloud account yet</string>
|
||||
<!-- Used in an info banner if a specific feature requires an Owncloud account -->
|
||||
|
||||
@@ -15,3 +15,15 @@ fun <T> List<T>.randomElementOrNull(): T? {
|
||||
fun <T> List<T>?.ifNullOrEmpty(block: () -> List<T>): List<T> {
|
||||
return if (this.isNullOrEmpty()) block() else this
|
||||
}
|
||||
|
||||
fun <T> List<T>.distinctByEquality(equalityPredicate: (T, T) -> Boolean): List<T> {
|
||||
if (size < 2) return this
|
||||
|
||||
val ret = mutableListOf<T>()
|
||||
|
||||
for (item in this) {
|
||||
if (ret.none { equalityPredicate(it, item) }) ret.add(item)
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ enum class PermissionGroup {
|
||||
AppShortcuts,
|
||||
Accessibility,
|
||||
ManageProfiles,
|
||||
Call,
|
||||
}
|
||||
|
||||
internal class PermissionsManagerImpl(
|
||||
@@ -93,6 +94,9 @@ internal class PermissionsManagerImpl(
|
||||
private val manageProfilesPermissionState = MutableStateFlow(
|
||||
checkPermissionOnce(PermissionGroup.ManageProfiles)
|
||||
)
|
||||
private val callPermissionState = MutableStateFlow(
|
||||
checkPermissionOnce(PermissionGroup.Call)
|
||||
)
|
||||
|
||||
override fun requestPermission(context: AppCompatActivity, permissionGroup: PermissionGroup) {
|
||||
when (permissionGroup) {
|
||||
@@ -167,6 +171,14 @@ internal class PermissionsManagerImpl(
|
||||
CrashReporter.logException(e)
|
||||
}
|
||||
}
|
||||
|
||||
PermissionGroup.Call -> {
|
||||
ActivityCompat.requestPermissions(
|
||||
context,
|
||||
callPermissions,
|
||||
permissionGroup.ordinal
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +221,10 @@ internal class PermissionsManagerImpl(
|
||||
PermissionGroup.Accessibility -> {
|
||||
accessibilityPermissionState.value
|
||||
}
|
||||
|
||||
PermissionGroup.Call -> {
|
||||
callPermissions.all { context.checkPermission(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,6 +238,7 @@ internal class PermissionsManagerImpl(
|
||||
PermissionGroup.AppShortcuts -> appShortcutsPermissionState
|
||||
PermissionGroup.Accessibility -> accessibilityPermissionState
|
||||
PermissionGroup.ManageProfiles -> manageProfilesPermissionState
|
||||
PermissionGroup.Call -> callPermissionState
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,6 +258,7 @@ internal class PermissionsManagerImpl(
|
||||
PermissionGroup.AppShortcuts -> appShortcutsPermissionState.value = granted
|
||||
PermissionGroup.Accessibility -> accessibilityPermissionState.value = granted
|
||||
PermissionGroup.ManageProfiles -> manageProfilesPermissionState.value = granted
|
||||
PermissionGroup.Call -> callPermissionState.value = granted
|
||||
}
|
||||
}
|
||||
|
||||
@@ -269,5 +287,6 @@ internal class PermissionsManagerImpl(
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
private val callPermissions = arrayOf(Manifest.permission.CALL_PHONE)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ data class LauncherSettingsData internal constructor(
|
||||
val fileSearchProviders: Set<String> = setOf("local"),
|
||||
|
||||
val contactSearchEnabled: Boolean = true,
|
||||
val contactSearchCallOnTap: Boolean = false,
|
||||
|
||||
@Deprecated("Use calendarSearchProviders `local` instead")
|
||||
val calendarSearchEnabled: Boolean = true,
|
||||
|
||||
+7
@@ -12,4 +12,11 @@ class ContactSearchSettings internal constructor(private val dataStore: Launcher
|
||||
fun setEnabled(enabled: Boolean) {
|
||||
dataStore.update { it.copy(contactSearchEnabled = enabled) }
|
||||
}
|
||||
|
||||
val callOnTap: Flow<Boolean>
|
||||
get() = dataStore.data.map { it.contactSearchCallOnTap }.distinctUntilChanged()
|
||||
|
||||
fun setCallOnTap(callOnTap: Boolean) {
|
||||
dataStore.update { it.copy(contactSearchCallOnTap = callOnTap) }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user