From 4e396e990d698ac5d6186acab24c42b813711821 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 8 Jun 2023 13:12:15 +0200 Subject: [PATCH] Added compat methods to check & request full screen intent permission + other required changes for Android 14 --- app/src/main/AndroidManifest.xml | 5 ++ .../main/dialer/fragments/DialerFragment.kt | 18 +++++++ .../compatibility/Api34Compatibility.kt | 48 +++++++++++++++++++ .../linphone/compatibility/Compatibility.kt | 15 ++++++ app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values/strings.xml | 3 ++ 6 files changed, 91 insertions(+) create mode 100644 app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0ec17de66..951efadc0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,6 +54,11 @@ + + + + () { // Don't check the following the previous permissions are being asked checkTelecomManagerPermissions() } + + // See https://developer.android.com/about/versions/14/behavior-changes-14#fgs-types + if (Version.sdkAboveOrEqual(Version.API34_ANDROID_14_UPSIDE_DOWN_CAKE)) { + val fullScreenIntentPermission = Compatibility.hasFullScreenIntentPermission( + requireContext() + ) + Log.i( + "[Dialer] Android 14 or above detected: full-screen intent permission is ${if (fullScreenIntentPermission) "granted" else "not granted"}" + ) + if (!fullScreenIntentPermission) { + (requireActivity() as MainActivity).showSnackBar( + R.string.android_14_full_screen_intent_permission_not_granted, + R.string.android_14_go_to_full_screen_intent_permission_setting + ) { + Compatibility.requestFullScreenIntentPermission(requireContext()) + } + } + } } @TargetApi(Version.API26_O_80) diff --git a/app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt new file mode 100644 index 000000000..b325806a5 --- /dev/null +++ b/app/src/main/java/org/linphone/compatibility/Api34Compatibility.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 this program. If not, see . + */ +package org.linphone.compatibility + +import android.annotation.TargetApi +import android.app.NotificationManager +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.provider.Settings +import androidx.core.content.ContextCompat + +@TargetApi(34) +class Api34Compatibility { + companion object { + fun hasFullScreenIntentPermission(context: Context): Boolean { + val notificationManager = context.getSystemService(NotificationManager::class.java) as NotificationManager + // See https://developer.android.com/reference/android/app/NotificationManager#canUseFullScreenIntent%28%29 + return notificationManager.canUseFullScreenIntent() + } + + fun requestFullScreenIntentPermission(context: Context) { + val intent = Intent() + // See https://developer.android.com/reference/android/provider/Settings#ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT + intent.action = Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT + intent.data = Uri.parse("package:${context.packageName}") + intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + ContextCompat.startActivity(context, intent, null) + } + } +} diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index e7d940694..cab4ff7cf 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -462,5 +462,20 @@ class Compatibility { Api28Compatibility.clearClipboard(clipboard) } } + + fun hasFullScreenIntentPermission(context: Context): Boolean { + if (Version.sdkAboveOrEqual(Version.API34_ANDROID_14_UPSIDE_DOWN_CAKE)) { + return Api34Compatibility.hasFullScreenIntentPermission(context) + } + return true + } + + fun requestFullScreenIntentPermission(context: Context): Boolean { + if (Version.sdkAboveOrEqual(Version.API34_ANDROID_14_UPSIDE_DOWN_CAKE)) { + Api34Compatibility.requestFullScreenIntentPermission(context) + return true + } + return false + } } } diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 44b1da943..5313d2021 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -788,4 +788,6 @@ La connexion a échouée car l\'authentification est manquante ou invalide pour le compte\n%s.\n\nVous pouvez fournir le mot de passe à nouveau ou vérifier la configuration de votre compte dans les paramètres. Confirmer Change la visibilité du selectionneur d\'emoji + Permission requise pour afficher les appels entrant non accordée + Afficher \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b8ecdf5d9..5958d297f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -777,6 +777,9 @@ Connection failed because authentication is missing or invalid for account \n%s.\n\nYou can provide password again, or check your account configuration in the settings. Confirm + Permission required to show incoming calls not granted yet + Show + Add a SIP address field Add a phone number field