From f5106e60504784cec9d41fe36eaab5cf669e5319 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 9 Nov 2021 11:20:03 +0100 Subject: [PATCH] check if pip mode is granted on device, otherwise hide button Signed-off-by: Marcel Hibbe --- .../talk/activities/CallActivity.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index a0a2ad124..791771caa 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -24,6 +24,7 @@ import android.Manifest; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.SuppressLint; +import android.app.AppOpsManager; import android.app.KeyguardManager; import android.app.PendingIntent; import android.app.PictureInPictureParams; @@ -310,7 +311,7 @@ public class CallActivity extends BaseActivity { setCallState(CallStatus.CONNECTING); } - if (deviceSupportsPipMode()) { + if (isGreaterEqualOreo() && isPipModePossible()) { mPictureInPictureParamsBuilder = new PictureInPictureParams.Builder(); } @@ -516,7 +517,7 @@ public class CallActivity extends BaseActivity { binding.callInfosLinearLayout.setVisibility(View.VISIBLE); binding.selfVideoViewWrapper.setVisibility(View.VISIBLE); - if (!deviceSupportsPipMode()) { + if (!isPipModePossible()) { binding.pictureInPictureButton.setVisibility(View.GONE); } @@ -2462,7 +2463,7 @@ public class CallActivity extends BaseActivity { void enterPipMode() { enableKeyguard(); - if (deviceSupportsPipMode()) { + if (isGreaterEqualOreo() && isPipModePossible()) { Rational pipRatio = new Rational(300, 500); mPictureInPictureParamsBuilder.setAspectRatio(pipRatio); enterPictureInPictureMode(mPictureInPictureParamsBuilder.build()); @@ -2471,9 +2472,21 @@ public class CallActivity extends BaseActivity { } } - private boolean deviceSupportsPipMode() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O - && getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); + private boolean isPipModePossible() { + if (isGreaterEqualOreo()) { + boolean deviceHasPipFeature = getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); + + AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); + boolean isPipFeatureGranted = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, + android.os.Process.myUid(), + "com.nextcloud.talk2") == AppOpsManager.MODE_ALLOWED; // TODO: no hardcoding (-> branding!) + return deviceHasPipFeature && isPipFeatureGranted; + } + return false; + } + + private boolean isGreaterEqualOreo(){ + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; } @RequiresApi(api = Build.VERSION_CODES.O) @@ -2517,7 +2530,7 @@ public class CallActivity extends BaseActivity { String title, int requestCode) { - if (deviceSupportsPipMode()) { + if (isGreaterEqualOreo() && isPipModePossible()) { final ArrayList actions = new ArrayList<>(); final Icon icon = Icon.createWithResource(this, iconId);