Add isCommunalMode() to CommunalManager SystemApi.
Design: go/communal-manager-api.
Test: atest CtsAppTestCases:CommunalManagerTest
Test: atest FrameworksMockingServicesTests:CommunalManagerServiceTest
Bug: 206054365
Change-Id: Ib1b964b17a7742b4e337862efa2b4e0562322fd0
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index dd951b4..d8cb961 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -1309,6 +1309,14 @@
}
+package android.app.communal {
+
+ public final class CommunalManager {
+ method @RequiresPermission("android.permission.READ_COMMUNAL_STATE") public boolean isCommunalMode();
+ }
+
+}
+
package android.app.compat {
public final class CompatChanges {
diff --git a/core/java/android/app/communal/CommunalManager.java b/core/java/android/app/communal/CommunalManager.java
index 60730ad..c2d2f27 100644
--- a/core/java/android/app/communal/CommunalManager.java
+++ b/core/java/android/app/communal/CommunalManager.java
@@ -19,6 +19,7 @@
import android.Manifest;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.compat.annotation.ChangeId;
import android.compat.annotation.Disabled;
@@ -33,6 +34,7 @@
*
* @hide
*/
+@SystemApi(client = SystemApi.Client.PRIVILEGED_APPS)
@SystemService(Context.COMMUNAL_MANAGER_SERVICE)
@RequiresFeature(PackageManager.FEATURE_COMMUNAL_MODE)
public final class CommunalManager {
@@ -59,6 +61,7 @@
@Disabled
public static final long ALLOW_COMMUNAL_MODE_WITH_USER_CONSENT = 200324021L;
+ /** @hide */
public CommunalManager(ICommunalManager service) {
mService = service;
}
@@ -67,6 +70,8 @@
* Updates whether or not the communal view is currently showing over the lockscreen.
*
* @param isShowing Whether communal view is showing.
+ *
+ * @hide
*/
@RequiresPermission(Manifest.permission.WRITE_COMMUNAL_STATE)
public void setCommunalViewShowing(boolean isShowing) {
@@ -76,4 +81,16 @@
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Check whether or not the communal view is currently showing over the lockscreen.
+ */
+ @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
+ public boolean isCommunalMode() {
+ try {
+ return mService.isCommunalMode();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/app/communal/ICommunalManager.aidl b/core/java/android/app/communal/ICommunalManager.aidl
index 02e8a65..123b23c 100644
--- a/core/java/android/app/communal/ICommunalManager.aidl
+++ b/core/java/android/app/communal/ICommunalManager.aidl
@@ -22,6 +22,7 @@
*
* @hide
*/
-oneway interface ICommunalManager {
- void setCommunalViewShowing(boolean isShowing);
+interface ICommunalManager {
+ oneway void setCommunalViewShowing(boolean isShowing);
+ boolean isCommunalMode();
}
\ No newline at end of file
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6e2c807..07cff73 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -5535,6 +5535,12 @@
<permission android:name="android.permission.WRITE_COMMUNAL_STATE"
android:protectionLevel="signature" />
+ <!-- Allows an application to view information from the currently active
+ {@link com.android.server.communal.CommunalManagerService}.
+ @hide -->
+ <permission android:name="android.permission.READ_COMMUNAL_STATE"
+ android:protectionLevel="signature|privileged"/>
+
<!-- Allows the holder to manage whether the system can bind to services
provided by instant apps. This permission is intended to protect
test/development fucntionality and should be used only in such cases.
diff --git a/services/core/java/com/android/server/communal/CommunalManagerService.java b/services/core/java/com/android/server/communal/CommunalManagerService.java
index 8d9b13e..01c0ac0 100644
--- a/services/core/java/com/android/server/communal/CommunalManagerService.java
+++ b/services/core/java/com/android/server/communal/CommunalManagerService.java
@@ -254,6 +254,18 @@
+ "permission required to modify communal state.");
mCommunalViewIsShowing.set(isShowing);
}
+
+ /**
+ * Checks whether or not we are in communal mode.
+ */
+ @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
+ @Override
+ public boolean isCommunalMode() {
+ mContext.enforceCallingPermission(Manifest.permission.READ_COMMUNAL_STATE,
+ Manifest.permission.READ_COMMUNAL_STATE
+ + "permission required to read communal state.");
+ return mCommunalViewIsShowing.get();
+ }
}
/**
diff --git a/services/tests/mockingservicestests/src/com/android/server/communal/CommunalManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/communal/CommunalManagerServiceTest.java
index 17d7c51..d6db1b2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/communal/CommunalManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/communal/CommunalManagerServiceTest.java
@@ -123,6 +123,8 @@
doNothing().when(mContextSpy).enforceCallingPermission(
eq(Manifest.permission.WRITE_COMMUNAL_STATE), anyString());
+ doNothing().when(mContextSpy).enforceCallingPermission(
+ eq(Manifest.permission.READ_COMMUNAL_STATE), anyString());
mService = new CommunalManagerService(mContextSpy);
mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
@@ -203,6 +205,18 @@
}
@Test
+ public void testIsCommunalMode_isTrue() throws RemoteException {
+ mBinder.setCommunalViewShowing(true);
+ assertThat(mBinder.isCommunalMode()).isTrue();
+ }
+
+ @Test
+ public void testIsCommunalMode_isFalse() throws RemoteException {
+ mBinder.setCommunalViewShowing(false);
+ assertThat(mBinder.isCommunalMode()).isFalse();
+ }
+
+ @Test
public void testIntercept_unlocked_communalOff_appNotEnabled_showWhenLockedOff() {
when(mKeyguardManager.isKeyguardLocked()).thenReturn(false);
mAInfo.flags = 0;