From 353cfc1b083b581d10fd5a132bfb83e05e04f618 Mon Sep 17 00:00:00 2001 From: Fan Wu Date: Thu, 2 Jan 2025 11:18:59 +0800 Subject: [PATCH 1/5] Check the permission of the callingUid instead of the calling package Bug: 372671447 Test: atest Flag: EXEMPT bug fix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e719575e92c1e6bd0b9088663e6c909bccf2b007) Merged-In: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad Change-Id: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad --- .../settings/applications/AppInfoBase.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 3e91d2d792f..a5f1a1438a2 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -20,6 +20,7 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.Manifest; import android.app.Activity; +import android.app.ActivityManager; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; @@ -33,6 +34,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.usb.IUsbManager; import android.os.Bundle; import android.os.IBinder; +import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; @@ -171,20 +173,19 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment if (!(activity instanceof SettingsActivity)) { return false; } - final String callingPackageName = - ((SettingsActivity) activity).getInitialCallingPackage(); - - if (TextUtils.isEmpty(callingPackageName)) { - Log.w(TAG, "Not able to get calling package name for permission check"); + try { + int callerUid = ActivityManager.getService().getLaunchedFromUid( + activity.getActivityToken()); + if (ActivityManager.checkUidPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, + callerUid) != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "Uid " + callerUid + " does not have required permission " + + Manifest.permission.INTERACT_ACROSS_USERS_FULL); + return false; + } + return true; + } catch (RemoteException e) { return false; } - if (mPm.checkPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingPackageName) - != PackageManager.PERMISSION_GRANTED) { - Log.w(TAG, "Package " + callingPackageName + " does not have required permission " - + Manifest.permission.INTERACT_ACROSS_USERS_FULL); - return false; - } - return true; } protected void setIntentAndFinish(boolean appChanged) { From 87645011fc78104372d08b303b361b83e4ce1a70 Mon Sep 17 00:00:00 2001 From: Fan Wu Date: Thu, 2 Jan 2025 11:18:59 +0800 Subject: [PATCH 2/5] Check the permission of the callingUid instead of the calling package Bug: 372671447 Test: atest Flag: EXEMPT bug fix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e719575e92c1e6bd0b9088663e6c909bccf2b007) Merged-In: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad Change-Id: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad --- .../settings/applications/AppInfoBase.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 3e91d2d792f..a5f1a1438a2 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -20,6 +20,7 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.Manifest; import android.app.Activity; +import android.app.ActivityManager; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; @@ -33,6 +34,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.usb.IUsbManager; import android.os.Bundle; import android.os.IBinder; +import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; @@ -171,20 +173,19 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment if (!(activity instanceof SettingsActivity)) { return false; } - final String callingPackageName = - ((SettingsActivity) activity).getInitialCallingPackage(); - - if (TextUtils.isEmpty(callingPackageName)) { - Log.w(TAG, "Not able to get calling package name for permission check"); + try { + int callerUid = ActivityManager.getService().getLaunchedFromUid( + activity.getActivityToken()); + if (ActivityManager.checkUidPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, + callerUid) != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "Uid " + callerUid + " does not have required permission " + + Manifest.permission.INTERACT_ACROSS_USERS_FULL); + return false; + } + return true; + } catch (RemoteException e) { return false; } - if (mPm.checkPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingPackageName) - != PackageManager.PERMISSION_GRANTED) { - Log.w(TAG, "Package " + callingPackageName + " does not have required permission " - + Manifest.permission.INTERACT_ACROSS_USERS_FULL); - return false; - } - return true; } protected void setIntentAndFinish(boolean appChanged) { From 63656485eaeb51defab1b507f2351cba904c933e Mon Sep 17 00:00:00 2001 From: Fan Wu Date: Thu, 2 Jan 2025 11:18:59 +0800 Subject: [PATCH 3/5] Check the permission of the callingUid instead of the calling package Bug: 372671447 Test: atest Flag: EXEMPT bug fix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e719575e92c1e6bd0b9088663e6c909bccf2b007) Merged-In: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad Change-Id: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad --- .../settings/applications/AppInfoBase.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 10fce8ebac0..e8a67de5a52 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -20,6 +20,7 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.Manifest; import android.app.Activity; +import android.app.ActivityManager; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; @@ -34,6 +35,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.usb.IUsbManager; import android.os.Bundle; import android.os.IBinder; +import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; @@ -172,20 +174,19 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment if (!(activity instanceof SettingsActivity)) { return false; } - final String callingPackageName = - ((SettingsActivity) activity).getInitialCallingPackage(); - - if (TextUtils.isEmpty(callingPackageName)) { - Log.w(TAG, "Not able to get calling package name for permission check"); + try { + int callerUid = ActivityManager.getService().getLaunchedFromUid( + activity.getActivityToken()); + if (ActivityManager.checkUidPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, + callerUid) != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "Uid " + callerUid + " does not have required permission " + + Manifest.permission.INTERACT_ACROSS_USERS_FULL); + return false; + } + return true; + } catch (RemoteException e) { return false; } - if (mPm.checkPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingPackageName) - != PackageManager.PERMISSION_GRANTED) { - Log.w(TAG, "Package " + callingPackageName + " does not have required permission " - + Manifest.permission.INTERACT_ACROSS_USERS_FULL); - return false; - } - return true; } protected void setIntentAndFinish(boolean appChanged) { From 201d7ffac4355009a1330ccbf82cb25321b0c7b1 Mon Sep 17 00:00:00 2001 From: Fan Wu Date: Thu, 2 Jan 2025 11:18:59 +0800 Subject: [PATCH 4/5] Check the permission of the callingUid instead of the calling package Bug: 372671447 Test: atest Flag: EXEMPT bug fix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e719575e92c1e6bd0b9088663e6c909bccf2b007) Merged-In: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad Change-Id: Ib36c0a3ba482bcddd53c2c09409ea818e6f43cad --- .../settings/applications/AppInfoBase.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 10fce8ebac0..e8a67de5a52 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -20,6 +20,7 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.Manifest; import android.app.Activity; +import android.app.ActivityManager; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; @@ -34,6 +35,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.usb.IUsbManager; import android.os.Bundle; import android.os.IBinder; +import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; @@ -172,20 +174,19 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment if (!(activity instanceof SettingsActivity)) { return false; } - final String callingPackageName = - ((SettingsActivity) activity).getInitialCallingPackage(); - - if (TextUtils.isEmpty(callingPackageName)) { - Log.w(TAG, "Not able to get calling package name for permission check"); + try { + int callerUid = ActivityManager.getService().getLaunchedFromUid( + activity.getActivityToken()); + if (ActivityManager.checkUidPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, + callerUid) != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "Uid " + callerUid + " does not have required permission " + + Manifest.permission.INTERACT_ACROSS_USERS_FULL); + return false; + } + return true; + } catch (RemoteException e) { return false; } - if (mPm.checkPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingPackageName) - != PackageManager.PERMISSION_GRANTED) { - Log.w(TAG, "Package " + callingPackageName + " does not have required permission " - + Manifest.permission.INTERACT_ACROSS_USERS_FULL); - return false; - } - return true; } protected void setIntentAndFinish(boolean appChanged) { From a85577054bc958f880aadf5a6b716c88e873129c Mon Sep 17 00:00:00 2001 From: Pierre Barbier de Reuille Date: Fri, 31 Jan 2025 23:39:33 +0000 Subject: [PATCH 5/5] Desktop Experience needs the device to be eligible The Desktop Experience is only available (and therefore the freeform on secondary display disabled) if the device is eligible for Desktop Mode. Correcting the test to make it correct. Fix: 393547201 Test: atest DesktopModeSecondaryDisplayPreferenceControllerTest Flag: EXEMPT (bug fix) Change-Id: I36a031487d8a6f6d681a2cb46a1fa50e47d870cc --- ...deSecondaryDisplayPreferenceControllerTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/robotests/src/com/android/settings/development/DesktopModeSecondaryDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/DesktopModeSecondaryDisplayPreferenceControllerTest.java index c4e8f489ca5..dc6ac3fafba 100644 --- a/tests/robotests/src/com/android/settings/development/DesktopModeSecondaryDisplayPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/DesktopModeSecondaryDisplayPreferenceControllerTest.java @@ -26,10 +26,12 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.res.Resources; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; @@ -41,6 +43,7 @@ import androidx.fragment.app.FragmentTransaction; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; +import com.android.internal.R; import com.android.window.flags.Flags; import org.junit.Before; @@ -78,18 +81,22 @@ public class DesktopModeSecondaryDisplayPreferenceControllerTest { private FragmentTransaction mTransaction; private Context mContext; + private Resources mResources; private DesktopModeSecondaryDisplayPreferenceController mController; @Before - public void setup() { + public void setup() throws Exception { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = spy(RuntimeEnvironment.application); + mResources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mResources); doReturn(mTransaction).when(mFragmentManager).beginTransaction(); doReturn(mFragmentManager).when(mActivity).getSupportFragmentManager(); doReturn(mActivity).when(mFragment).getActivity(); mController = new DesktopModeSecondaryDisplayPreferenceController(mContext, mFragment); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); mController.displayPreference(mScreen); + when(mResources.getBoolean(R.bool.config_isDesktopModeSupported)).thenReturn(false); } @DisableFlags(Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION) @@ -101,6 +108,8 @@ public class DesktopModeSecondaryDisplayPreferenceControllerTest { @EnableFlags(Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION) @Test public void isAvailable_whenDesktopExperienceDevOptionIsEnabled_shouldBeFalse() { + when(mResources.getBoolean(R.bool.config_isDesktopModeSupported)).thenReturn(true); + assertThat(mController.isAvailable()).isFalse(); } @@ -174,4 +183,5 @@ public class DesktopModeSecondaryDisplayPreferenceControllerTest { assertThat(mode).isEqualTo(SETTING_VALUE_OFF); verify(mPreference).setEnabled(false); } + }