Loading api/test-current.txt +26 −0 Original line number Diff line number Diff line Loading @@ -3522,6 +3522,32 @@ package android.service.textclassifier { } package android.service.watchdog { public abstract class ExplicitHealthCheckService extends android.app.Service { ctor public ExplicitHealthCheckService(); method public final void notifyHealthCheckPassed(@NonNull String); method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); method public abstract void onCancelHealthCheck(@NonNull String); method @NonNull public abstract java.util.List<java.lang.String> onGetRequestedPackages(); method @NonNull public abstract java.util.List<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> onGetSupportedPackages(); method public abstract void onRequestHealthCheck(@NonNull String); method public void setCallback(@Nullable android.os.RemoteCallback); field public static final String BIND_PERMISSION = "android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE"; field public static final String SERVICE_INTERFACE = "android.service.watchdog.ExplicitHealthCheckService"; } public static final class ExplicitHealthCheckService.PackageConfig implements android.os.Parcelable { ctor public ExplicitHealthCheckService.PackageConfig(@NonNull String, long); method public int describeContents(); method public long getHealthCheckTimeoutMillis(); method @NonNull public String getPackageName(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> CREATOR; } } package android.telecom { public final class Call { Loading cmds/statsd/src/atoms.proto +7 −5 Original line number Diff line number Diff line Loading @@ -8697,13 +8697,12 @@ message RuntimeAppOpAccess { // Name of the package accessing app op optional string package_name = 2; // operation string id per OPSTR_ constants in AppOpsManager.java optional string op = 3; // deprecated - set to empty string optional string op_deprecated = 3 [deprecated = true]; // attribution_tag; provided by developer when accessing related API, limited at 50 chars by // API. // Attributions must be provided through manifest using <attribution> tag available in R and // above. // API. Attributions must be provided through manifest using <attribution> tag available in R // and above. optional string attribution_tag = 4; // message related to app op access, limited to 600 chars by API Loading @@ -8718,6 +8717,9 @@ message RuntimeAppOpAccess { // sampling strategy used to collect this message optional SamplingStrategy sampling_strategy = 6; // operation id optional android.app.AppOpEnum op = 7 [default = APP_OP_NONE]; } /* Loading core/java/android/service/watchdog/ExplicitHealthCheckService.java +14 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ import static android.os.Parcelable.Creator; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.content.pm.PackageManager; Loading Loading @@ -64,6 +66,7 @@ import java.util.concurrent.TimeUnit; * </pre> * @hide */ @TestApi @SystemApi public abstract class ExplicitHealthCheckService extends Service { Loading Loading @@ -158,6 +161,15 @@ public abstract class ExplicitHealthCheckService extends Service { return mWrapper; } /** * Sets {@link RemoteCallback}, for testing purpose. * * @hide */ @TestApi public void setCallback(@Nullable RemoteCallback callback) { mCallback = callback; } /** * Implementors should call this to notify the system when explicit health check passes * for {@code packageName}; Loading @@ -183,6 +195,7 @@ public abstract class ExplicitHealthCheckService extends Service { * * @hide */ @TestApi @SystemApi public static final class PackageConfig implements Parcelable { private static final long DEFAULT_HEALTH_CHECK_TIMEOUT_MILLIS = TimeUnit.HOURS.toMillis(1); Loading Loading @@ -263,7 +276,7 @@ public abstract class ExplicitHealthCheckService extends Service { } @Override public void writeToParcel(Parcel parcel, int flags) { public void writeToParcel(@SuppressLint({"MissingNullability"}) Parcel parcel, int flags) { parcel.writeString(mPackageName); parcel.writeLong(mHealthCheckTimeoutMillis); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +185 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_FORCE_OPAQUE; import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; Loading Loading @@ -56,6 +57,8 @@ import android.content.IntentFilter; import android.content.res.Configuration; import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.inputmethodservice.InputMethodService; import android.net.Uri; import android.os.Binder; Loading @@ -71,6 +74,7 @@ import android.telecom.TelecomManager; import android.text.TextUtils; import android.util.Log; import android.view.Display; import android.view.Gravity; import android.view.InsetsState.InternalInsetsType; import android.view.KeyEvent; import android.view.LayoutInflater; Loading Loading @@ -104,6 +108,7 @@ import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.CommandQueue; Loading Loading @@ -133,7 +138,7 @@ import dagger.Lazy; * on clicks and view states of the nav bar. */ public class NavigationBarFragment extends LifecycleFragment implements Callbacks, NavigationModeController.ModeChangedListener { NavigationModeController.ModeChangedListener, DisplayManager.DisplayListener { public static final String TAG = "NavigationBar"; private static final boolean DEBUG = false; Loading @@ -141,6 +146,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private static final String EXTRA_DISABLE2_STATE = "disabled2_state"; private static final String EXTRA_APPEARANCE = "appearance"; private static final String EXTRA_TRANSIENT_STATE = "transient_state"; private static final String FIXED_ROTATION_TRANSFORM_SETTING_NAME = "fixed_rotation_transform"; /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; Loading Loading @@ -199,6 +206,23 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private boolean mIsOnDefaultDisplay; public boolean mHomeBlockedThisTouch; /** * When user is QuickSwitching between apps of different orientations, we'll draw a fake * home handle on the orientation they originally touched down to start their swipe * gesture to indicate to them that they can continue in that orientation without having to * rotate the phone * The secondary handle will show when we get * {@link OverviewProxyListener#onQuickSwitchToNewTask(int)} callback with the * original handle hidden and we'll flip the visibilities once the * {@link #mTasksFrozenListener} fires */ private NavigationHandle mOrientationHandle; private WindowManager.LayoutParams mOrientationParams; private boolean mFrozenTasks; private int mStartingQuickSwitchRotation; private int mCurrentRotation; private boolean mFixedRotationEnabled; /** Only for default display */ @Nullable private AssistHandleViewController mAssistHandlerViewController; Loading Loading @@ -248,6 +272,12 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mShadeController.collapsePanel(true /* animate */); } @Override public void onQuickSwitchToNewTask(@Surface.Rotation int rotation) { mStartingQuickSwitchRotation = rotation; orientSecondaryHomeHandle(); } @Override public void startAssistant(Bundle bundle) { mAssistManager.startAssist(bundle); Loading @@ -271,6 +301,22 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } }; private TaskStackChangeListener mTasksFrozenListener = new TaskStackChangeListener() { @Override public void onRecentTaskListFrozenChanged(boolean frozen) { mFrozenTasks = frozen; orientSecondaryHomeHandle(); } }; private NavigationBarTransitions.DarkIntensityListener mOrientationHandleIntensityListener = new NavigationBarTransitions.DarkIntensityListener() { @Override public void onDarkIntensity(float darkIntensity) { mOrientationHandle.setDarkIntensity(darkIntensity); } }; private final ContextButtonListener mRotationButtonListener = (button, visible) -> { if (visible) { // If the button will actually become visible and the navbar is about to hide, Loading @@ -294,6 +340,14 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } }; private final ContentObserver mFixedRotationObserver = new ContentObserver( new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange, Uri uri) { updatedFixedRotation(); } }; private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = new DeviceConfig.OnPropertiesChangedListener() { @Override Loading Loading @@ -351,6 +405,10 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback Settings.Secure.getUriFor(Settings.Secure.ASSISTANT), false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL); mContentResolver.registerContentObserver( Settings.Global.getUriFor(FIXED_ROTATION_TRANSFORM_SETTING_NAME), false /* notifyForDescendants */, mFixedRotationObserver, UserHandle.USER_ALL); if (savedInstanceState != null) { mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0); mDisabledFlags2 = savedInstanceState.getInt(EXTRA_DISABLE2_STATE, 0); Loading @@ -376,6 +434,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mNavigationModeController.removeListener(this); mAccessibilityManagerWrapper.removeCallback(mAccessibilityListener); mContentResolver.unregisterContentObserver(mAssistContentObserver); mContentResolver.unregisterContentObserver(mFixedRotationObserver); DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); } Loading Loading @@ -406,6 +465,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } mNavigationBarView.setNavigationIconHints(mNavigationIconHints); mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); updatedFixedRotation(); prepareNavigationBarView(); checkNavBarModes(); Loading Loading @@ -442,6 +502,9 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback new AssistHandleViewController(mHandler, mNavigationBarView); getBarTransitions().addDarkIntensityListener(mAssistHandlerViewController); } initSecondaryHomeHandleForRotation(); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTasksFrozenListener); } @Override Loading @@ -458,6 +521,13 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } mOverviewProxyService.removeCallback(mOverviewProxyListener); mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver); ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTasksFrozenListener); if (mOrientationHandle != null) { resetSecondaryHandle(); getContext().getSystemService(DisplayManager.class).unregisterDisplayListener(this); getBarTransitions().removeDarkIntensityListener(mOrientationHandleIntensityListener); mWindowManager.removeView(mOrientationHandle); } } @Override Loading Loading @@ -490,6 +560,88 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback repositionNavigationBar(); } private void initSecondaryHomeHandleForRotation() { if (!canShowSecondaryHandle()) { return; } getContext().getSystemService(DisplayManager.class) .registerDisplayListener(this, new Handler(Looper.getMainLooper())); mOrientationHandle = new VerticalNavigationHandle(getContext()); getBarTransitions().addDarkIntensityListener(mOrientationHandleIntensityListener); mOrientationParams = new WindowManager.LayoutParams(0, 0, WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH | WindowManager.LayoutParams.FLAG_SLIPPERY, PixelFormat.TRANSLUCENT); mWindowManager.addView(mOrientationHandle, mOrientationParams); mOrientationHandle.setVisibility(View.GONE); } private void orientSecondaryHomeHandle() { if (!canShowSecondaryHandle()) { return; } if (!mFrozenTasks) { resetSecondaryHandle(); } else { int deltaRotation = deltaRotation(mCurrentRotation, mStartingQuickSwitchRotation); int height = 0; int width = 0; Rect dispSize = mWindowManager.getCurrentWindowMetrics().getBounds(); switch (deltaRotation) { case Surface.ROTATION_90: case Surface.ROTATION_270: height = dispSize.height(); width = getResources() .getDimensionPixelSize(R.dimen.navigation_bar_height); break; case Surface.ROTATION_180: case Surface.ROTATION_0: // TODO(b/152683657): Need to determine best UX for this resetSecondaryHandle(); return; } mOrientationParams.gravity = deltaRotation == Surface.ROTATION_90 ? Gravity.LEFT : Gravity.RIGHT; mOrientationParams.height = height; mOrientationParams.width = width; mWindowManager.updateViewLayout(mOrientationHandle, mOrientationParams); mNavigationBarView.setVisibility(View.GONE); mOrientationHandle.setVisibility(View.VISIBLE); } } private void resetSecondaryHandle() { if (mOrientationHandle != null) { // Case where nav mode is changed w/o ever invoking a quickstep // mOrientedHandle is initialized lazily mOrientationHandle.setVisibility(View.GONE); } mNavigationBarView.setVisibility(View.VISIBLE); } private int deltaRotation(int oldRotation, int newRotation) { int delta = newRotation - oldRotation; if (delta < 0) delta += 4; return delta; } private void updatedFixedRotation() { mFixedRotationEnabled = Settings.Global.getInt(getContext().getContentResolver(), FIXED_ROTATION_TRANSFORM_SETTING_NAME, 0) != 0; if (!canShowSecondaryHandle()) { resetSecondaryHandle(); } } @Override public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) { if (mNavigationBarView != null) { Loading Loading @@ -1112,6 +1264,10 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mNavBarMode = mode; updateScreenPinningGestures(); if (!canShowSecondaryHandle()) { resetSecondaryHandle(); } // Workaround for b/132825155, for secondary users, we currently don't receive configuration // changes on overlay package change since SystemUI runs for the system user. In this case, // trigger a new configuration change to ensure that the nav bar is updated in the same way. Loading Loading @@ -1156,6 +1312,34 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private final AccessibilityServicesStateChangeListener mAccessibilityListener = this::updateAccessibilityServicesState; @Override public void onDisplayAdded(int displayId) { } @Override public void onDisplayRemoved(int displayId) { } @Override public void onDisplayChanged(int displayId) { if (!canShowSecondaryHandle()) { return; } int rotation = getContext().getResources().getConfiguration() .windowConfiguration.getRotation(); if (rotation != mCurrentRotation) { mCurrentRotation = rotation; orientSecondaryHomeHandle(); } } private boolean canShowSecondaryHandle() { return mFixedRotationEnabled && mNavBarMode == NAV_BAR_MODE_GESTURAL; } private final Consumer<Integer> mRotationWatcher = rotation -> { if (mNavigationBarView != null && mNavigationBarView.needsReorient(rotation)) { Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java +3 −3 Original line number Diff line number Diff line Loading @@ -32,11 +32,11 @@ import com.android.systemui.R; public class NavigationHandle extends View implements ButtonInterface { private final Paint mPaint = new Paint(); protected final Paint mPaint = new Paint(); private @ColorInt final int mLightColor; private @ColorInt final int mDarkColor; private final int mRadius; private final int mBottom; protected final int mRadius; protected final int mBottom; private boolean mRequiresInvalidate; public NavigationHandle(Context context) { Loading Loading
api/test-current.txt +26 −0 Original line number Diff line number Diff line Loading @@ -3522,6 +3522,32 @@ package android.service.textclassifier { } package android.service.watchdog { public abstract class ExplicitHealthCheckService extends android.app.Service { ctor public ExplicitHealthCheckService(); method public final void notifyHealthCheckPassed(@NonNull String); method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); method public abstract void onCancelHealthCheck(@NonNull String); method @NonNull public abstract java.util.List<java.lang.String> onGetRequestedPackages(); method @NonNull public abstract java.util.List<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> onGetSupportedPackages(); method public abstract void onRequestHealthCheck(@NonNull String); method public void setCallback(@Nullable android.os.RemoteCallback); field public static final String BIND_PERMISSION = "android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE"; field public static final String SERVICE_INTERFACE = "android.service.watchdog.ExplicitHealthCheckService"; } public static final class ExplicitHealthCheckService.PackageConfig implements android.os.Parcelable { ctor public ExplicitHealthCheckService.PackageConfig(@NonNull String, long); method public int describeContents(); method public long getHealthCheckTimeoutMillis(); method @NonNull public String getPackageName(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> CREATOR; } } package android.telecom { public final class Call { Loading
cmds/statsd/src/atoms.proto +7 −5 Original line number Diff line number Diff line Loading @@ -8697,13 +8697,12 @@ message RuntimeAppOpAccess { // Name of the package accessing app op optional string package_name = 2; // operation string id per OPSTR_ constants in AppOpsManager.java optional string op = 3; // deprecated - set to empty string optional string op_deprecated = 3 [deprecated = true]; // attribution_tag; provided by developer when accessing related API, limited at 50 chars by // API. // Attributions must be provided through manifest using <attribution> tag available in R and // above. // API. Attributions must be provided through manifest using <attribution> tag available in R // and above. optional string attribution_tag = 4; // message related to app op access, limited to 600 chars by API Loading @@ -8718,6 +8717,9 @@ message RuntimeAppOpAccess { // sampling strategy used to collect this message optional SamplingStrategy sampling_strategy = 6; // operation id optional android.app.AppOpEnum op = 7 [default = APP_OP_NONE]; } /* Loading
core/java/android/service/watchdog/ExplicitHealthCheckService.java +14 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ import static android.os.Parcelable.Creator; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.content.pm.PackageManager; Loading Loading @@ -64,6 +66,7 @@ import java.util.concurrent.TimeUnit; * </pre> * @hide */ @TestApi @SystemApi public abstract class ExplicitHealthCheckService extends Service { Loading Loading @@ -158,6 +161,15 @@ public abstract class ExplicitHealthCheckService extends Service { return mWrapper; } /** * Sets {@link RemoteCallback}, for testing purpose. * * @hide */ @TestApi public void setCallback(@Nullable RemoteCallback callback) { mCallback = callback; } /** * Implementors should call this to notify the system when explicit health check passes * for {@code packageName}; Loading @@ -183,6 +195,7 @@ public abstract class ExplicitHealthCheckService extends Service { * * @hide */ @TestApi @SystemApi public static final class PackageConfig implements Parcelable { private static final long DEFAULT_HEALTH_CHECK_TIMEOUT_MILLIS = TimeUnit.HOURS.toMillis(1); Loading Loading @@ -263,7 +276,7 @@ public abstract class ExplicitHealthCheckService extends Service { } @Override public void writeToParcel(Parcel parcel, int flags) { public void writeToParcel(@SuppressLint({"MissingNullability"}) Parcel parcel, int flags) { parcel.writeString(mPackageName); parcel.writeLong(mHealthCheckTimeoutMillis); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +185 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_FORCE_OPAQUE; import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; Loading Loading @@ -56,6 +57,8 @@ import android.content.IntentFilter; import android.content.res.Configuration; import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.inputmethodservice.InputMethodService; import android.net.Uri; import android.os.Binder; Loading @@ -71,6 +74,7 @@ import android.telecom.TelecomManager; import android.text.TextUtils; import android.util.Log; import android.view.Display; import android.view.Gravity; import android.view.InsetsState.InternalInsetsType; import android.view.KeyEvent; import android.view.LayoutInflater; Loading Loading @@ -104,6 +108,7 @@ import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.CommandQueue; Loading Loading @@ -133,7 +138,7 @@ import dagger.Lazy; * on clicks and view states of the nav bar. */ public class NavigationBarFragment extends LifecycleFragment implements Callbacks, NavigationModeController.ModeChangedListener { NavigationModeController.ModeChangedListener, DisplayManager.DisplayListener { public static final String TAG = "NavigationBar"; private static final boolean DEBUG = false; Loading @@ -141,6 +146,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private static final String EXTRA_DISABLE2_STATE = "disabled2_state"; private static final String EXTRA_APPEARANCE = "appearance"; private static final String EXTRA_TRANSIENT_STATE = "transient_state"; private static final String FIXED_ROTATION_TRANSFORM_SETTING_NAME = "fixed_rotation_transform"; /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; Loading Loading @@ -199,6 +206,23 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private boolean mIsOnDefaultDisplay; public boolean mHomeBlockedThisTouch; /** * When user is QuickSwitching between apps of different orientations, we'll draw a fake * home handle on the orientation they originally touched down to start their swipe * gesture to indicate to them that they can continue in that orientation without having to * rotate the phone * The secondary handle will show when we get * {@link OverviewProxyListener#onQuickSwitchToNewTask(int)} callback with the * original handle hidden and we'll flip the visibilities once the * {@link #mTasksFrozenListener} fires */ private NavigationHandle mOrientationHandle; private WindowManager.LayoutParams mOrientationParams; private boolean mFrozenTasks; private int mStartingQuickSwitchRotation; private int mCurrentRotation; private boolean mFixedRotationEnabled; /** Only for default display */ @Nullable private AssistHandleViewController mAssistHandlerViewController; Loading Loading @@ -248,6 +272,12 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mShadeController.collapsePanel(true /* animate */); } @Override public void onQuickSwitchToNewTask(@Surface.Rotation int rotation) { mStartingQuickSwitchRotation = rotation; orientSecondaryHomeHandle(); } @Override public void startAssistant(Bundle bundle) { mAssistManager.startAssist(bundle); Loading @@ -271,6 +301,22 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } }; private TaskStackChangeListener mTasksFrozenListener = new TaskStackChangeListener() { @Override public void onRecentTaskListFrozenChanged(boolean frozen) { mFrozenTasks = frozen; orientSecondaryHomeHandle(); } }; private NavigationBarTransitions.DarkIntensityListener mOrientationHandleIntensityListener = new NavigationBarTransitions.DarkIntensityListener() { @Override public void onDarkIntensity(float darkIntensity) { mOrientationHandle.setDarkIntensity(darkIntensity); } }; private final ContextButtonListener mRotationButtonListener = (button, visible) -> { if (visible) { // If the button will actually become visible and the navbar is about to hide, Loading @@ -294,6 +340,14 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } }; private final ContentObserver mFixedRotationObserver = new ContentObserver( new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange, Uri uri) { updatedFixedRotation(); } }; private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = new DeviceConfig.OnPropertiesChangedListener() { @Override Loading Loading @@ -351,6 +405,10 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback Settings.Secure.getUriFor(Settings.Secure.ASSISTANT), false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL); mContentResolver.registerContentObserver( Settings.Global.getUriFor(FIXED_ROTATION_TRANSFORM_SETTING_NAME), false /* notifyForDescendants */, mFixedRotationObserver, UserHandle.USER_ALL); if (savedInstanceState != null) { mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0); mDisabledFlags2 = savedInstanceState.getInt(EXTRA_DISABLE2_STATE, 0); Loading @@ -376,6 +434,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mNavigationModeController.removeListener(this); mAccessibilityManagerWrapper.removeCallback(mAccessibilityListener); mContentResolver.unregisterContentObserver(mAssistContentObserver); mContentResolver.unregisterContentObserver(mFixedRotationObserver); DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); } Loading Loading @@ -406,6 +465,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } mNavigationBarView.setNavigationIconHints(mNavigationIconHints); mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); updatedFixedRotation(); prepareNavigationBarView(); checkNavBarModes(); Loading Loading @@ -442,6 +502,9 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback new AssistHandleViewController(mHandler, mNavigationBarView); getBarTransitions().addDarkIntensityListener(mAssistHandlerViewController); } initSecondaryHomeHandleForRotation(); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTasksFrozenListener); } @Override Loading @@ -458,6 +521,13 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } mOverviewProxyService.removeCallback(mOverviewProxyListener); mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver); ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTasksFrozenListener); if (mOrientationHandle != null) { resetSecondaryHandle(); getContext().getSystemService(DisplayManager.class).unregisterDisplayListener(this); getBarTransitions().removeDarkIntensityListener(mOrientationHandleIntensityListener); mWindowManager.removeView(mOrientationHandle); } } @Override Loading Loading @@ -490,6 +560,88 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback repositionNavigationBar(); } private void initSecondaryHomeHandleForRotation() { if (!canShowSecondaryHandle()) { return; } getContext().getSystemService(DisplayManager.class) .registerDisplayListener(this, new Handler(Looper.getMainLooper())); mOrientationHandle = new VerticalNavigationHandle(getContext()); getBarTransitions().addDarkIntensityListener(mOrientationHandleIntensityListener); mOrientationParams = new WindowManager.LayoutParams(0, 0, WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH | WindowManager.LayoutParams.FLAG_SLIPPERY, PixelFormat.TRANSLUCENT); mWindowManager.addView(mOrientationHandle, mOrientationParams); mOrientationHandle.setVisibility(View.GONE); } private void orientSecondaryHomeHandle() { if (!canShowSecondaryHandle()) { return; } if (!mFrozenTasks) { resetSecondaryHandle(); } else { int deltaRotation = deltaRotation(mCurrentRotation, mStartingQuickSwitchRotation); int height = 0; int width = 0; Rect dispSize = mWindowManager.getCurrentWindowMetrics().getBounds(); switch (deltaRotation) { case Surface.ROTATION_90: case Surface.ROTATION_270: height = dispSize.height(); width = getResources() .getDimensionPixelSize(R.dimen.navigation_bar_height); break; case Surface.ROTATION_180: case Surface.ROTATION_0: // TODO(b/152683657): Need to determine best UX for this resetSecondaryHandle(); return; } mOrientationParams.gravity = deltaRotation == Surface.ROTATION_90 ? Gravity.LEFT : Gravity.RIGHT; mOrientationParams.height = height; mOrientationParams.width = width; mWindowManager.updateViewLayout(mOrientationHandle, mOrientationParams); mNavigationBarView.setVisibility(View.GONE); mOrientationHandle.setVisibility(View.VISIBLE); } } private void resetSecondaryHandle() { if (mOrientationHandle != null) { // Case where nav mode is changed w/o ever invoking a quickstep // mOrientedHandle is initialized lazily mOrientationHandle.setVisibility(View.GONE); } mNavigationBarView.setVisibility(View.VISIBLE); } private int deltaRotation(int oldRotation, int newRotation) { int delta = newRotation - oldRotation; if (delta < 0) delta += 4; return delta; } private void updatedFixedRotation() { mFixedRotationEnabled = Settings.Global.getInt(getContext().getContentResolver(), FIXED_ROTATION_TRANSFORM_SETTING_NAME, 0) != 0; if (!canShowSecondaryHandle()) { resetSecondaryHandle(); } } @Override public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) { if (mNavigationBarView != null) { Loading Loading @@ -1112,6 +1264,10 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mNavBarMode = mode; updateScreenPinningGestures(); if (!canShowSecondaryHandle()) { resetSecondaryHandle(); } // Workaround for b/132825155, for secondary users, we currently don't receive configuration // changes on overlay package change since SystemUI runs for the system user. In this case, // trigger a new configuration change to ensure that the nav bar is updated in the same way. Loading Loading @@ -1156,6 +1312,34 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback private final AccessibilityServicesStateChangeListener mAccessibilityListener = this::updateAccessibilityServicesState; @Override public void onDisplayAdded(int displayId) { } @Override public void onDisplayRemoved(int displayId) { } @Override public void onDisplayChanged(int displayId) { if (!canShowSecondaryHandle()) { return; } int rotation = getContext().getResources().getConfiguration() .windowConfiguration.getRotation(); if (rotation != mCurrentRotation) { mCurrentRotation = rotation; orientSecondaryHomeHandle(); } } private boolean canShowSecondaryHandle() { return mFixedRotationEnabled && mNavBarMode == NAV_BAR_MODE_GESTURAL; } private final Consumer<Integer> mRotationWatcher = rotation -> { if (mNavigationBarView != null && mNavigationBarView.needsReorient(rotation)) { Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java +3 −3 Original line number Diff line number Diff line Loading @@ -32,11 +32,11 @@ import com.android.systemui.R; public class NavigationHandle extends View implements ButtonInterface { private final Paint mPaint = new Paint(); protected final Paint mPaint = new Paint(); private @ColorInt final int mLightColor; private @ColorInt final int mDarkColor; private final int mRadius; private final int mBottom; protected final int mRadius; protected final int mBottom; private boolean mRequiresInvalidate; public NavigationHandle(Context context) { Loading