Merge "Create API to set taskbar to kids mode."

This commit is contained in:
Pat Manning
2022-01-06 17:26:05 +00:00
committed by Android (Google) Code Review
10 changed files with 183 additions and 1 deletions

View File

@@ -859,7 +859,11 @@ package android.app {
public class StatusBarManager {
method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo();
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public int getNavBarModeOverride();
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean);
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setNavBarModeOverride(int);
field public static final int NAV_BAR_MODE_OVERRIDE_KIDS = 1; // 0x1
field public static final int NAV_BAR_MODE_OVERRIDE_NONE = 0; // 0x0
}
public static final class StatusBarManager.DisableInfo {

View File

@@ -282,6 +282,33 @@ public class StatusBarManager {
@Retention(RetentionPolicy.SOURCE)
public @interface RequestResult {}
/**
* Constant for {@link #setNavBarModeOverride(int)} indicating the default navbar mode.
*
* @hide
*/
@SystemApi
public static final int NAV_BAR_MODE_OVERRIDE_NONE = 0;
/**
* Constant for {@link #setNavBarModeOverride(int)} indicating kids navbar mode.
*
* <p>When used, back and home icons will change drawables and layout, recents will be hidden,
* and the navbar will remain visible when apps are in immersive mode.
*
* @hide
*/
@SystemApi
public static final int NAV_BAR_MODE_OVERRIDE_KIDS = 1;
/** @hide */
@IntDef(prefix = {"NAV_BAR_MODE_OVERRIDE_"}, value = {
NAV_BAR_MODE_OVERRIDE_NONE,
NAV_BAR_MODE_OVERRIDE_KIDS
})
@Retention(RetentionPolicy.SOURCE)
public @interface NavBarModeOverride {}
@UnsupportedAppUsage
private Context mContext;
private IStatusBarService mService;
@@ -687,6 +714,52 @@ public class StatusBarManager {
}
}
/**
* Sets or removes the navigation bar mode override.
*
* @param navBarModeOverride the mode of the navigation bar override to be set.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.STATUS_BAR)
public void setNavBarModeOverride(@NavBarModeOverride int navBarModeOverride) {
if (navBarModeOverride != NAV_BAR_MODE_OVERRIDE_NONE
&& navBarModeOverride != NAV_BAR_MODE_OVERRIDE_KIDS) {
throw new UnsupportedOperationException(
"Supplied navBarModeOverride not supported: " + navBarModeOverride);
}
try {
final IStatusBarService svc = getService();
if (svc != null) {
svc.setNavBarModeOverride(navBarModeOverride);
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Gets the navigation bar mode override. Returns default value if no override is set.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.STATUS_BAR)
public @NavBarModeOverride int getNavBarModeOverride() {
int navBarModeOverride = NAV_BAR_MODE_OVERRIDE_NONE;
try {
final IStatusBarService svc = getService();
if (svc != null) {
navBarModeOverride = svc.getNavBarModeOverride();
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
return navBarModeOverride;
}
/** @hide */
public static String windowStateToString(int state) {
if (state == WINDOW_STATE_HIDING) return "WINDOW_STATE_HIDING";

View File

@@ -10118,6 +10118,14 @@ public final class Settings {
public static final String THEME_CUSTOMIZATION_OVERLAY_PACKAGES =
"theme_customization_overlay_packages";
/**
* Indicates whether the device is in kids nav mode.
* <p>Type: int (0 for false, 1 for true)
*
* @hide
*/
public static final String NAV_BAR_KIDS_MODE = "nav_bar_kids_mode";
/**
* Navigation bar mode.
* 0 = 3 button

View File

@@ -162,4 +162,20 @@ interface IStatusBarService
void requestAddTile(in ComponentName componentName, in CharSequence label, in Icon icon, int userId, in IAddTileResultCallback callback);
void cancelRequestAddTile(in String packageName);
/**
* Overrides the navigation bar mode.
*
* @param navBarModeOverride the mode of the navigation bar override to be set.
*
* @hide
*/
void setNavBarModeOverride(int navBarModeOverride);
/**
* Gets the navigation bar mode override.
*
* @hide
*/
int getNavBarModeOverride();
}

View File

@@ -383,6 +383,7 @@ message SecureSettingsProto {
optional SettingProto multi_press_timeout = 38 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto nav_bar_kids_mode = 91 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto navigation_mode = 76 [ (android.privacy).dest = DEST_AUTOMATIC ];
message NfcPayment {
@@ -665,5 +666,5 @@ message SecureSettingsProto {
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
// Next tag = 91;
// Next tag = 92;
}

View File

@@ -229,6 +229,7 @@ public class SecureSettingsValidators {
VALIDATORS.put(Secure.SKIP_DIRECTION, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.SILENCE_GESTURE, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES, JSON_OBJECT_VALIDATOR);
VALIDATORS.put(Secure.NAV_BAR_KIDS_MODE, BOOLEAN_VALIDATOR);
VALIDATORS.put(
Secure.NAVIGATION_MODE, new DiscreteValueValidator(new String[] {"0", "1", "2"}));
VALIDATORS.put(Secure.BACK_GESTURE_INSET_SCALE_LEFT,

View File

@@ -2243,6 +2243,10 @@ class SettingsProtoDumpUtil {
Settings.Secure.MULTI_PRESS_TIMEOUT,
SecureSettingsProto.MULTI_PRESS_TIMEOUT);
dumpSetting(s, p,
Settings.Secure.NAV_BAR_KIDS_MODE,
SecureSettingsProto.NAV_BAR_KIDS_MODE);
dumpSetting(s, p,
Settings.Secure.NAVIGATION_MODE,
SecureSettingsProto.NAVIGATION_MODE);

View File

@@ -18,6 +18,9 @@ package com.android.server.statusbar;
import static android.app.StatusBarManager.DISABLE2_GLOBAL_ACTIONS;
import static android.app.StatusBarManager.DISABLE2_NOTIFICATION_SHADE;
import static android.app.StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS;
import static android.app.StatusBarManager.NAV_BAR_MODE_OVERRIDE_NONE;
import static android.app.StatusBarManager.NavBarModeOverride;
import static android.view.Display.DEFAULT_DISPLAY;
import android.Manifest;
@@ -59,6 +62,7 @@ import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.NotificationStats;
import android.service.quicksettings.TileService;
import android.text.TextUtils;
@@ -1846,6 +1850,51 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
return mContext.getResources().getStringArray(R.array.config_statusBarIcons);
}
/**
* Sets or removes the navigation bar mode override.
*
* @param navBarModeOverride the mode of the navigation bar override to be set.
*/
public void setNavBarModeOverride(@NavBarModeOverride int navBarModeOverride) {
enforceStatusBar();
if (navBarModeOverride != NAV_BAR_MODE_OVERRIDE_NONE
&& navBarModeOverride != NAV_BAR_MODE_OVERRIDE_KIDS) {
throw new UnsupportedOperationException(
"Supplied navBarModeOverride not supported: " + navBarModeOverride);
}
final int userId = mCurrentUserId;
final long userIdentity = Binder.clearCallingIdentity();
try {
Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.NAV_BAR_KIDS_MODE, navBarModeOverride, userId);
} finally {
Binder.restoreCallingIdentity(userIdentity);
}
}
/**
* Gets the navigation bar mode override. Returns default value if no override is set.
*
* @hide
*/
public @NavBarModeOverride int getNavBarModeOverride() {
enforceStatusBar();
int navBarKidsMode = NAV_BAR_MODE_OVERRIDE_NONE;
final int userId = mCurrentUserId;
final long userIdentity = Binder.clearCallingIdentity();
try {
navBarKidsMode = Settings.Secure.getIntForUser(mContext.getContentResolver(),
Settings.Secure.NAV_BAR_KIDS_MODE, userId);
} catch (Settings.SettingNotFoundException ex) {
return navBarKidsMode;
} finally {
Binder.restoreCallingIdentity(userIdentity);
}
return navBarKidsMode;
}
/** @hide */
public void passThroughShellCommand(String[] args, FileDescriptor fd) {
enforceStatusBarOrShell();

View File

@@ -57,6 +57,7 @@
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>
<uses-permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.STATUS_BAR"/>
<uses-permission android:name="android.permission.STATUS_BAR_SERVICE"/>
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"/>
<uses-permission android:name="android.permission.READ_FRAME_BUFFER"/>

View File

@@ -21,6 +21,7 @@ import static android.app.ActivityManager.PROCESS_STATE_TOP;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.any;
@@ -575,6 +576,30 @@ public class StatusBarManagerServiceTest {
}
}
@Test
public void testSetNavBarModeOverride_setsOverrideModeKids() {
int navBarModeOverrideKids = StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS;
mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideKids);
assertEquals(navBarModeOverrideKids, mStatusBarManagerService.getNavBarModeOverride());
}
@Test
public void testSetNavBarModeOverride_setsOverrideModeNone() {
int navBarModeOverrideNone = StatusBarManager.NAV_BAR_MODE_OVERRIDE_NONE;
mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideNone);
assertEquals(navBarModeOverrideNone, mStatusBarManagerService.getNavBarModeOverride());
}
@Test
public void testSetNavBarModeOverride_invalidInputThrowsError() {
int navBarModeOverrideInvalid = -1;
assertThrows(UnsupportedOperationException.class,
() -> mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideInvalid));
}
private void mockUidCheck() {
mockUidCheck(TEST_PACKAGE);
}