Merge "Disable clicks on buttons without actions" into pi-dev
diff --git a/api/current.txt b/api/current.txt
index f92896d..eab90be 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7419,12 +7419,14 @@
method public int getEventType();
method public java.lang.String getPackageName();
method public java.lang.String getShortcutId();
+ method public int getStandbyBucket();
method public long getTimeStamp();
field public static final int CONFIGURATION_CHANGE = 5; // 0x5
field public static final int MOVE_TO_BACKGROUND = 2; // 0x2
field public static final int MOVE_TO_FOREGROUND = 1; // 0x1
field public static final int NONE = 0; // 0x0
field public static final int SHORTCUT_INVOCATION = 8; // 0x8
+ field public static final int STANDBY_BUCKET_CHANGED = 11; // 0xb
field public static final int USER_INTERACTION = 7; // 0x7
}
@@ -28678,7 +28680,7 @@
field public static final int IEEE8021X = 3; // 0x3
field public static final int NONE = 0; // 0x0
field public static final int WPA_EAP = 2; // 0x2
- field public static final deprecated int WPA_PSK = 1; // 0x1
+ field public static final int WPA_PSK = 1; // 0x1
field public static final java.lang.String[] strings;
field public static final java.lang.String varName = "key_mgmt";
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 5ec84fe..288fb00 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -719,10 +719,8 @@
public static final class UsageEvents.Event {
method public java.lang.String getNotificationChannelId();
- method public int getStandbyBucket();
field public static final int NOTIFICATION_INTERRUPTION = 12; // 0xc
field public static final int NOTIFICATION_SEEN = 10; // 0xa
- field public static final int STANDBY_BUCKET_CHANGED = 11; // 0xb
}
public final class UsageStatsManager {
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index f7fb84b..4c7e97b 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -109,11 +109,11 @@
public static final int NOTIFICATION_SEEN = 10;
/**
- * An event type denoting a change in App Standby Bucket. Additional bucket information
- * is contained in mBucketAndReason.
- * @hide
+ * An event type denoting a change in App Standby Bucket. The new bucket can be
+ * retrieved by calling {@link #getStandbyBucket()}.
+ *
+ * @see UsageStatsManager#getAppStandbyBucket()
*/
- @SystemApi
public static final int STANDBY_BUCKET_CHANGED = 11;
/**
@@ -254,8 +254,11 @@
/**
* The event type.
*
- * See {@link #MOVE_TO_BACKGROUND}
- * See {@link #MOVE_TO_FOREGROUND}
+ * @see #MOVE_TO_BACKGROUND
+ * @see #MOVE_TO_FOREGROUND
+ * @see #CONFIGURATION_CHANGE
+ * @see #USER_INTERACTION
+ * @see #STANDBY_BUCKET_CHANGED
*/
public int getEventType() {
return mEventType;
@@ -283,9 +286,8 @@
* Returns the standby bucket of the app, if the event is of type
* {@link #STANDBY_BUCKET_CHANGED}, otherwise returns 0.
* @return the standby bucket associated with the event.
- * @hide
+ *
*/
- @SystemApi
public int getStandbyBucket() {
return (mBucketAndReason & 0xFFFF0000) >>> 16;
}
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index f468942..504f840 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -23,6 +23,7 @@
import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayInfo;
+import android.view.SurfaceControl;
/**
* Display manager local system service interface.
@@ -115,7 +116,7 @@
* Called by the window manager to perform traversals while holding a
* surface flinger transaction.
*/
- public abstract void performTraversalInTransactionFromWindowManager();
+ public abstract void performTraversal(SurfaceControl.Transaction t);
/**
* Tells the display manager about properties of the display that depend on the windows on it.
diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
index 4580c47..00f54e1 100644
--- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
+++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
@@ -18,12 +18,14 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.os.BadParcelableException;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.util.Preconditions;
import java.security.cert.CertPath;
+import java.security.cert.CertificateException;
import java.util.List;
/**
@@ -54,7 +56,7 @@
private long mCounterId = DEFAULT_COUNTER_ID;
private byte[] mServerParams;
private byte[] mPublicKey; // The raw public key bytes used
- private CertPath mCertPath; // The certificate path including the intermediate certificates
+ private RecoveryCertPath mCertPath; // The cert path including necessary intermediate certs
private List<KeyChainProtectionParams> mKeyChainProtectionParams;
private List<WrappedApplicationKey> mEntryRecoveryData;
private byte[] mEncryptedRecoveryKeyBlob;
@@ -127,7 +129,17 @@
*/
// TODO: Change to @NonNull
public CertPath getTrustedHardwareCertPath() {
- return mCertPath;
+ if (mCertPath == null) {
+ return null;
+ } else {
+ try {
+ return mCertPath.getCertPath();
+ } catch (CertificateException e) {
+ // Rethrow an unchecked exception as it should not happen. If such an issue exists,
+ // an exception should have been thrown during service initialization.
+ throw new BadParcelableException(e);
+ }
+ }
}
/**
@@ -232,11 +244,17 @@
* contain a certificate of the trusted hardware public key and any necessary intermediate
* certificates.
*
- * @param certPath The public key
+ * @param certPath The certificate path
+ * @throws CertificateException if the given certificate path cannot be encoded properly
* @return This builder.
*/
- public Builder setTrustedHardwareCertPath(CertPath certPath) {
- mInstance.mCertPath = certPath;
+ public Builder setTrustedHardwareCertPath(CertPath certPath) throws CertificateException {
+ // TODO: Make it NonNull when the caller code is all updated
+ if (certPath == null) {
+ mInstance.mCertPath = null;
+ } else {
+ mInstance.mCertPath = RecoveryCertPath.createRecoveryCertPath(certPath);
+ }
return this;
}
@@ -302,6 +320,7 @@
out.writeLong(mCounterId);
out.writeByteArray(mServerParams);
out.writeByteArray(mPublicKey);
+ out.writeTypedObject(mCertPath, /* no flags */ 0);
}
/**
@@ -316,6 +335,7 @@
mCounterId = in.readLong();
mServerParams = in.createByteArray();
mPublicKey = in.createByteArray();
+ mCertPath = in.readTypedObject(RecoveryCertPath.CREATOR);
}
@Override
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index cfcfb95..4530f80 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -40,6 +40,7 @@
import android.provider.Settings;
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
@@ -2594,15 +2595,26 @@
loadSetting(stmt, Settings.Global.CALL_AUTO_RETRY, 0);
// Set the preferred network mode to target desired value or Default
- // value defined in RILConstants
- int type;
- type = RILConstants.PREFERRED_NETWORK_MODE;
- loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, type);
+ // value defined in system property
+ String val = "";
+ String mode;
+ for (int phoneId = 0;
+ phoneId < TelephonyManager.getDefault().getPhoneCount(); phoneId++) {
+ mode = TelephonyManager.getTelephonyProperty(phoneId,
+ "ro.telephony.default_network",
+ Integer.toString(RILConstants.PREFERRED_NETWORK_MODE));
+ if (phoneId == 0) {
+ val = mode;
+ } else {
+ val = val + "," + mode;
+ }
+ }
+ loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, val);
// Set the preferred cdma subscription source to target desired value or default
// value defined in Phone
- type = SystemProperties.getInt("ro.telephony.default_cdma_sub",
- Phone.PREFERRED_CDMA_SUBSCRIPTION);
+ int type = SystemProperties.getInt("ro.telephony.default_cdma_sub",
+ Phone.PREFERRED_CDMA_SUBSCRIPTION);
loadSetting(stmt, Settings.Global.CDMA_SUBSCRIPTION_MODE, type);
loadIntegerSetting(stmt, Settings.Global.LOW_BATTERY_SOUND_TIMEOUT,
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java
index 6131acc..aa2fb32 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java
@@ -16,6 +16,7 @@
import android.graphics.Canvas;
import android.view.MotionEvent;
+import android.view.View;
import com.android.systemui.plugins.Plugin;
import com.android.systemui.plugins.annotations.ProvidesInterface;
@@ -42,6 +43,8 @@
public void onLayout(boolean changed, int left, int top, int right, int bottom);
+ public void onNavigationButtonLongPress(View v);
+
public default void destroy() { }
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
index ef36610..8612445 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
@@ -80,4 +80,17 @@
* Sent when overview is to be hidden.
*/
void onOverviewHidden(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
+
+ /**
+ * Sent when a user swipes up over the navigation bar to launch overview. Swipe up is determined
+ * by passing the touch slop in the direction towards launcher from navigation bar. During and
+ * after this event is sent the caller will continue to send motion events. The motion
+ * {@param event} passed after the touch slop was exceeded will also be passed after by
+ * {@link onMotionEvent}. Since motion events will be sent, motion up or cancel can still be
+ * sent to cancel overview regardless the current state of launcher (eg. if overview is already
+ * visible, this event will still be sent if user swipes up). When this signal is sent,
+ * navigation bar will not handle any gestures such as quick scrub or switch and the home button
+ * will cancel (long) press.
+ */
+ void onQuickStep(in MotionEvent event);
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index 846aadd..4799f39 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -36,11 +36,6 @@
void startScreenPinning(int taskId) = 1;
/**
- * Called when the overview service has started the recents animation.
- */
- void onRecentsAnimationStarted() = 2;
-
- /**
* Specifies the text to be shown for onboarding the new swipe-up gesture to access recents.
*/
void setRecentsOnboardingText(CharSequence text) = 3;
diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
index 041af0e..a4af6b2 100644
--- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
@@ -102,15 +102,6 @@
}
}
- public void onRecentsAnimationStarted() {
- long token = Binder.clearCallingIdentity();
- try {
- mHandler.post(OverviewProxyService.this::notifyRecentsAnimationStarted);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
public void onSplitScreenInvoked() {
long token = Binder.clearCallingIdentity();
try {
@@ -283,9 +274,9 @@
}
}
- private void notifyRecentsAnimationStarted() {
+ public void notifyQuickStepStarted() {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
- mConnectionCallbacks.get(i).onRecentsAnimationStarted();
+ mConnectionCallbacks.get(i).onQuickStepStarted();
}
}
@@ -300,7 +291,7 @@
public interface OverviewProxyListener {
default void onConnectionChanged(boolean isConnected) {}
- default void onRecentsAnimationStarted() {}
+ default void onQuickStepStarted() {}
default void onInteractionFlagsChanged(@InteractionType int flags) {}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 4d54bdd..e790061 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -239,10 +239,13 @@
| WindowManager.LayoutParams.FLAG_SLIPPERY
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
- lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS
+ | WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
+
if (!DEBUG_SCREENSHOT_ROUNDED_CORNERS) {
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
}
+
lp.setTitle("ScreenDecorOverlay");
lp.gravity = Gravity.TOP | Gravity.LEFT;
lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index d9359a4..c348187 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -189,7 +189,7 @@
}
}
- public void onRecentsAnimationStarted() {
+ public void onQuickStepStarted() {
boolean alreadySeenRecentsOnboarding = Prefs.getBoolean(mContext,
Prefs.Key.HAS_SEEN_RECENTS_ONBOARDING, false);
if (!alreadySeenRecentsOnboarding) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 9fa06f7..ce8e746 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -175,8 +175,8 @@
}
@Override
- public void onRecentsAnimationStarted() {
- mNavigationBarView.setRecentsAnimationStarted(true);
+ public void onQuickStepStarted() {
+ mNavigationBarView.onQuickStepStarted();
// Use navbar dragging as a signal to hide the rotate button
setRotateSuggestionButtonState(false);
@@ -751,6 +751,7 @@
if (shouldDisableNavbarGestures()) {
return false;
}
+ mNavigationBarView.onNavigationButtonLongPress(v);
mMetricsLogger.action(MetricsEvent.ACTION_ASSIST_LONG_PRESS);
mAssistManager.startAssist(new Bundle() /* args */);
mStatusBar.awakenDreams();
@@ -787,10 +788,12 @@
}
private boolean onLongPressBackHome(View v) {
+ mNavigationBarView.onNavigationButtonLongPress(v);
return onLongPressNavigationButtons(v, R.id.back, R.id.home);
}
private boolean onLongPressBackRecents(View v) {
+ mNavigationBarView.onNavigationButtonLongPress(v);
return onLongPressNavigationButtons(v, R.id.back, R.id.recent_apps);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
index 6a1ed51..cd000fe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
@@ -19,31 +19,22 @@
import static android.view.WindowManager.DOCKED_INVALID;
import static android.view.WindowManager.DOCKED_LEFT;
import static android.view.WindowManager.DOCKED_TOP;
-import static com.android.systemui.OverviewProxyService.DEBUG_OVERVIEW_PROXY;
-import static com.android.systemui.OverviewProxyService.TAG_OPS;
import android.app.ActivityManager;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
-import android.graphics.Matrix;
import android.graphics.Rect;
-import android.os.RemoteException;
-import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget;
import com.android.systemui.Dependency;
-import com.android.systemui.OverviewProxyService;
-import com.android.systemui.OverviewProxyService.OverviewProxyListener;
import com.android.systemui.R;
import com.android.systemui.RecentsComponent;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper;
-import com.android.systemui.shared.recents.IOverviewProxy;
-import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.tuner.TunerService;
@@ -75,25 +66,14 @@
private NavigationBarView mNavigationBarView;
private boolean mIsVertical;
- private final QuickScrubController mQuickScrubController;
+ private final QuickStepController mQuickStepController;
private final int mScrollTouchSlop;
- private final Matrix mTransformGlobalMatrix = new Matrix();
- private final Matrix mTransformLocalMatrix = new Matrix();
private final StatusBar mStatusBar;
private int mTouchDownX;
private int mTouchDownY;
private boolean mDownOnRecents;
private VelocityTracker mVelocityTracker;
- private OverviewProxyService mOverviewProxyService = Dependency.get(OverviewProxyService.class);
- private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() {
- @Override
- public void onRecentsAnimationStarted() {
- mRecentsAnimationStarted = true;
- mQuickScrubController.setRecentsAnimationStarted(true /* started */);
- }
- };
- private boolean mRecentsAnimationStarted;
private boolean mDockWindowEnabled;
private boolean mDockWindowTouchSlopExceeded;
private int mDragMode;
@@ -103,14 +83,12 @@
mStatusBar = SysUiServiceProvider.getComponent(context, StatusBar.class);
Resources r = context.getResources();
mScrollTouchSlop = r.getDimensionPixelSize(R.dimen.navigation_bar_min_swipe_distance);
- mQuickScrubController = new QuickScrubController(context);
+ mQuickStepController = new QuickStepController(context);
Dependency.get(TunerService.class).addTunable(this, KEY_DOCK_WINDOW_GESTURE);
- mOverviewProxyService.addCallback(mOverviewProxyListener);
}
public void destroy() {
Dependency.get(TunerService.class).removeTunable(this);
- mOverviewProxyService.removeCallback(mOverviewProxyListener);
}
public void setComponents(RecentsComponent recentsComponent, Divider divider,
@@ -118,65 +96,19 @@
mRecentsComponent = recentsComponent;
mDivider = divider;
mNavigationBarView = navigationBarView;
- mQuickScrubController.setComponents(mNavigationBarView);
+ mQuickStepController.setComponents(mNavigationBarView);
}
public void setBarState(boolean isVertical, boolean isRTL) {
mIsVertical = isVertical;
- mQuickScrubController.setBarState(isVertical, isRTL);
- }
-
- private boolean proxyMotionEvents(MotionEvent event) {
- final IOverviewProxy overviewProxy = mOverviewProxyService.getProxy();
- if (overviewProxy != null && mNavigationBarView.isQuickStepSwipeUpEnabled()) {
- mNavigationBarView.requestUnbufferedDispatch(event);
- event.transform(mTransformGlobalMatrix);
- try {
- if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
- overviewProxy.onPreMotionEvent(mNavigationBarView.getDownHitTarget());
- }
- overviewProxy.onMotionEvent(event);
- if (DEBUG_OVERVIEW_PROXY) {
- Log.d(TAG_OPS, "Send MotionEvent: " + event.toString());
- }
- return true;
- } catch (RemoteException e) {
- Log.e(TAG, "Callback failed", e);
- } finally {
- event.transform(mTransformLocalMatrix);
- }
- }
- return false;
+ mQuickStepController.setBarState(isVertical, isRTL);
}
public boolean onInterceptTouchEvent(MotionEvent event) {
- if (mNavigationBarView.inScreenPinning() || mStatusBar.isKeyguardShowing()
- || !mStatusBar.isPresenterFullyCollapsed()) {
+ if (!canHandleGestures()) {
return false;
}
-
- int action = event.getActionMasked();
- switch (action) {
- case MotionEvent.ACTION_DOWN: {
- mTouchDownX = (int) event.getX();
- mTouchDownY = (int) event.getY();
- mTransformGlobalMatrix.set(Matrix.IDENTITY_MATRIX);
- mTransformLocalMatrix.set(Matrix.IDENTITY_MATRIX);
- mNavigationBarView.transformMatrixToGlobal(mTransformGlobalMatrix);
- mNavigationBarView.transformMatrixToLocal(mTransformLocalMatrix);
- mRecentsAnimationStarted = false;
- mQuickScrubController.setRecentsAnimationStarted(false /* started */);
- break;
- }
- }
- boolean handledByQuickscrub = mQuickScrubController.onInterceptTouchEvent(event);
- if (!handledByQuickscrub) {
- // Proxy motion events until we start intercepting for quickscrub
- proxyMotionEvents(event);
- }
-
- boolean result = handledByQuickscrub;
- result |= mRecentsAnimationStarted;
+ boolean result = mQuickStepController.onInterceptTouchEvent(event);
if (mDockWindowEnabled) {
result |= interceptDockWindowEvent(event);
}
@@ -184,18 +116,10 @@
}
public boolean onTouchEvent(MotionEvent event) {
- if (mNavigationBarView.inScreenPinning() || mStatusBar.isKeyguardShowing()
- || !mStatusBar.isPresenterFullyCollapsed()) {
+ if (!canHandleGestures()) {
return false;
}
-
- // The same down event was just sent on intercept and therefore can be ignored here
- boolean ignoreProxyDownEvent = event.getAction() == MotionEvent.ACTION_DOWN
- && mOverviewProxyService.getProxy() != null;
- boolean result = mQuickScrubController.onTouchEvent(event)
- || ignoreProxyDownEvent
- || proxyMotionEvents(event);
- result |= mRecentsAnimationStarted;
+ boolean result = mQuickStepController.onTouchEvent(event);
if (mDockWindowEnabled) {
result |= handleDockWindowEvent(event);
}
@@ -203,17 +127,19 @@
}
public void onDraw(Canvas canvas) {
- if (mNavigationBarView.isQuickScrubEnabled()) {
- mQuickScrubController.onDraw(canvas);
- }
+ mQuickStepController.onDraw(canvas);
}
public void onLayout(boolean changed, int left, int top, int right, int bottom) {
- mQuickScrubController.onLayout(changed, left, top, right, bottom);
+ mQuickStepController.onLayout(changed, left, top, right, bottom);
}
public void onDarkIntensityChange(float intensity) {
- mQuickScrubController.onDarkIntensityChange(intensity);
+ mQuickStepController.onDarkIntensityChange(intensity);
+ }
+
+ public void onNavigationButtonLongPress(View v) {
+ mQuickStepController.onNavigationButtonLongPress(v);
}
private boolean interceptDockWindowEvent(MotionEvent event) {
@@ -342,6 +268,11 @@
mVelocityTracker = null;
}
+ private boolean canHandleGestures() {
+ return !mNavigationBarView.inScreenPinning() && !mStatusBar.isKeyguardShowing()
+ && mStatusBar.isPresenterFullyCollapsed();
+ }
+
private int calculateDragMode() {
if (mIsVertical && !mDivider.getView().isHorizontalDivision()) {
return DRAG_MODE_DIVIDER;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index e97fa85..fcbd37c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -290,18 +290,12 @@
notifyVerticalChangedListener(mVertical);
}
- public void setRecentsAnimationStarted(boolean started) {
+ public void onQuickStepStarted() {
if (mRecentsOnboarding != null) {
- mRecentsOnboarding.onRecentsAnimationStarted();
+ mRecentsOnboarding.onQuickStepStarted();
}
}
- public void onConnectionChanged(boolean isConnected) {
- updateSlippery();
- updateNavButtonIcons();
- setUpSwipeUpOnboarding(isConnected);
- }
-
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
@@ -675,6 +669,10 @@
}
}
+ public void onNavigationButtonLongPress(View v) {
+ mGestureHelper.onNavigationButtonLongPress(v);
+ }
+
public void onPanelExpandedChange(boolean expanded) {
updateSlippery();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
similarity index 65%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
index 00aff53..19544b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
@@ -25,6 +25,7 @@
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.graphics.Canvas;
+import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
@@ -55,10 +56,10 @@
/**
* Class to detect gestures on the navigation bar and implement quick scrub and switch.
*/
-public class QuickScrubController extends GestureDetector.SimpleOnGestureListener implements
+public class QuickStepController extends GestureDetector.SimpleOnGestureListener implements
GestureHelper {
- private static final String TAG = "QuickScrubController";
+ private static final String TAG = "QuickStepController";
private static final int QUICK_SWITCH_FLING_VELOCITY = 0;
private static final int ANIM_DURATION_MS = 200;
private static final long LONG_PRESS_DELAY_MS = 225;
@@ -75,7 +76,8 @@
private boolean mDraggingActive;
private boolean mQuickScrubActive;
private boolean mAllowQuickSwitch;
- private boolean mRecentsAnimationStarted;
+ private boolean mAllowGestureDetection;
+ private boolean mQuickStepStarted;
private float mDownOffset;
private float mTranslation;
private int mTouchDownX;
@@ -101,6 +103,8 @@
private final ValueAnimator mButtonAnimator;
private final AnimatorSet mQuickScrubEndAnimator;
private final Context mContext;
+ private final Matrix mTransformGlobalMatrix = new Matrix();
+ private final Matrix mTransformLocalMatrix = new Matrix();
private final ArgbEvaluator mTrackColorEvaluator = new ArgbEvaluator();
private final AnimatorUpdateListener mTrackAnimatorListener = valueAnimator -> {
@@ -123,7 +127,6 @@
private AnimatorListenerAdapter mQuickScrubEndListener = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- mNavigationBarView.getHomeButton().setClickable(true);
mQuickScrubActive = false;
mTranslation = 0;
mQuickScrubEndAnimator.setCurrentPlayTime(mQuickScrubEndAnimator.getDuration());
@@ -165,7 +168,7 @@
}
};
- public QuickScrubController(Context context) {
+ public QuickStepController(Context context) {
mContext = context;
mScrollTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
mOverviewEventSender = Dependency.get(OverviewProxyService.class);
@@ -197,31 +200,35 @@
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
- final ButtonDispatcher homeButton = mNavigationBarView.getHomeButton();
- if (!mNavigationBarView.isQuickScrubEnabled()) {
- homeButton.setDelayTouchFeedback(false);
- return false;
- }
-
return handleTouchEvent(event);
}
/**
- * @return true if we want to handle touch events for quick scrub/switch and prevent proxying
- * the event to the overview service.
+ * @return true if we want to handle touch events for quick scrub/switch or if down event (that
+ * will get consumed and ignored). No events will be proxied to the overview service.
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
- return handleTouchEvent(event);
+ // The same down event was just sent on intercept and therefore can be ignored here
+ final boolean ignoreProxyDownEvent = event.getAction() == MotionEvent.ACTION_DOWN
+ && mOverviewEventSender.getProxy() != null;
+ return ignoreProxyDownEvent || handleTouchEvent(event);
}
private boolean handleTouchEvent(MotionEvent event) {
- final IOverviewProxy overviewProxy = mOverviewEventSender.getProxy();
+ if (!mNavigationBarView.isQuickScrubEnabled()
+ && !mNavigationBarView.isQuickStepSwipeUpEnabled()) {
+ mNavigationBarView.getHomeButton().setDelayTouchFeedback(false /* delay */);
+ return false;
+ }
+ mNavigationBarView.requestUnbufferedDispatch(event);
+
final ButtonDispatcher homeButton = mNavigationBarView.getHomeButton();
if (mGestureDetector.onTouchEvent(event)) {
// If the fling has been handled on UP, then skip proxying the UP
return true;
}
+ final boolean homePressed = mNavigationBarView.getDownHitTarget() == HIT_TARGET_HOME;
int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
@@ -232,89 +239,99 @@
mQuickScrubEndAnimator.end();
}
mHomeButtonView = homeButton.getCurrentView();
- if (mNavigationBarView.isQuickScrubEnabled()
- && mNavigationBarView.getDownHitTarget() == HIT_TARGET_HOME) {
- mTouchDownX = x;
- mTouchDownY = y;
- homeButton.setDelayTouchFeedback(true);
+ homeButton.setDelayTouchFeedback(true /* delay */);
+ mTouchDownX = x;
+ mTouchDownY = y;
+ if (homePressed) {
mHandler.postDelayed(mLongPressRunnable, LONG_PRESS_DELAY_MS);
- } else {
- homeButton.setDelayTouchFeedback(false);
- mTouchDownX = mTouchDownY = -1;
}
+ mTransformGlobalMatrix.set(Matrix.IDENTITY_MATRIX);
+ mTransformLocalMatrix.set(Matrix.IDENTITY_MATRIX);
+ mNavigationBarView.transformMatrixToGlobal(mTransformGlobalMatrix);
+ mNavigationBarView.transformMatrixToLocal(mTransformLocalMatrix);
+ mQuickStepStarted = false;
mAllowQuickSwitch = true;
+ mAllowGestureDetection = true;
break;
}
case MotionEvent.ACTION_MOVE: {
- if (mTouchDownX != -1) {
- int x = (int) event.getX();
- int y = (int) event.getY();
- int xDiff = Math.abs(x - mTouchDownX);
- int yDiff = Math.abs(y - mTouchDownY);
- boolean exceededTouchSlopX = xDiff > mScrollTouchSlop && xDiff > yDiff;
- boolean exceededTouchSlopY = yDiff > mScrollTouchSlop && yDiff > xDiff;
- boolean exceededTouchSlop, exceededPerpendicularTouchSlop;
- int pos, touchDown, offset, trackSize;
+ if (mQuickStepStarted || !mAllowGestureDetection){
+ break;
+ }
+ int x = (int) event.getX();
+ int y = (int) event.getY();
+ int xDiff = Math.abs(x - mTouchDownX);
+ int yDiff = Math.abs(y - mTouchDownY);
+ boolean exceededTouchSlopX = xDiff > mScrollTouchSlop && xDiff > yDiff;
+ boolean exceededTouchSlopY = yDiff > mScrollTouchSlop && yDiff > xDiff;
+ boolean exceededTouchSlop, exceededPerpendicularTouchSlop;
+ int pos, touchDown, offset, trackSize;
- if (mIsVertical) {
- exceededTouchSlop = exceededTouchSlopY;
- exceededPerpendicularTouchSlop = exceededTouchSlopX;
- pos = y;
- touchDown = mTouchDownY;
- offset = pos - mTrackRect.top;
- trackSize = mTrackRect.height();
- } else {
- exceededTouchSlop = exceededTouchSlopX;
- exceededPerpendicularTouchSlop = exceededTouchSlopY;
- pos = x;
- touchDown = mTouchDownX;
- offset = pos - mTrackRect.left;
- trackSize = mTrackRect.width();
+ if (mIsVertical) {
+ exceededTouchSlop = exceededTouchSlopY;
+ exceededPerpendicularTouchSlop = exceededTouchSlopX;
+ pos = y;
+ touchDown = mTouchDownY;
+ offset = pos - mTrackRect.top;
+ trackSize = mTrackRect.height();
+ } else {
+ exceededTouchSlop = exceededTouchSlopX;
+ exceededPerpendicularTouchSlop = exceededTouchSlopY;
+ pos = x;
+ touchDown = mTouchDownX;
+ offset = pos - mTrackRect.left;
+ trackSize = mTrackRect.width();
+ }
+ // Decide to start quickstep if dragging away from the navigation bar, otherwise in
+ // the parallel direction, decide to start quickscrub. Only one may run.
+ if (!mDraggingActive && !mQuickScrubActive && exceededPerpendicularTouchSlop) {
+ if (mNavigationBarView.isQuickStepSwipeUpEnabled()) {
+ startQuickStep(event);
}
- // Do not start scrubbing when dragging in the perpendicular direction if we
- // haven't already started quickscrub
- if (!mDraggingActive && !mQuickScrubActive && exceededPerpendicularTouchSlop) {
- mHandler.removeCallbacksAndMessages(null);
- return false;
- }
- if (!mDragPositive) {
- offset -= mIsVertical ? mTrackRect.height() : mTrackRect.width();
- }
+ break;
+ }
- // Control the button movement
- if (!mDraggingActive && exceededTouchSlop && !mRecentsAnimationStarted) {
- boolean allowDrag = !mDragPositive
- ? offset < 0 && pos < touchDown : offset >= 0 && pos > touchDown;
- if (allowDrag) {
- mDownOffset = offset;
- homeButton.setClickable(false);
- mDraggingActive = true;
- }
+ // Do not handle quick scrub/switch if disabled or hit target is not home button
+ if (!homePressed || !mNavigationBarView.isQuickScrubEnabled()) {
+ break;
+ }
+
+ if (!mDragPositive) {
+ offset -= mIsVertical ? mTrackRect.height() : mTrackRect.width();
+ }
+
+ // Control the button movement
+ if (!mDraggingActive && exceededTouchSlop) {
+ boolean allowDrag = !mDragPositive
+ ? offset < 0 && pos < touchDown : offset >= 0 && pos > touchDown;
+ if (allowDrag) {
+ mDownOffset = offset;
+ homeButton.abortCurrentGesture();
+ mDraggingActive = true;
}
- if (mDraggingActive && (mDragPositive && offset >= 0
- || !mDragPositive && offset <= 0)) {
- float scrubFraction =
- Utilities.clamp(Math.abs(offset) * 1f / trackSize, 0, 1);
- mTranslation = !mDragPositive
- ? Utilities.clamp(offset - mDownOffset, -trackSize, 0)
- : Utilities.clamp(offset - mDownOffset, 0, trackSize);
- if (mQuickScrubActive) {
- try {
- mOverviewEventSender.getProxy().onQuickScrubProgress(scrubFraction);
- if (DEBUG_OVERVIEW_PROXY) {
- Log.d(TAG_OPS, "Quick Scrub Progress:" + scrubFraction);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to send progress of quick scrub.", e);
+ }
+ if (mDraggingActive && (mDragPositive && offset >= 0
+ || !mDragPositive && offset <= 0)) {
+ float scrubFraction = Utilities.clamp(Math.abs(offset) * 1f / trackSize, 0, 1);
+ mTranslation = !mDragPositive
+ ? Utilities.clamp(offset - mDownOffset, -trackSize, 0)
+ : Utilities.clamp(offset - mDownOffset, 0, trackSize);
+ if (mQuickScrubActive) {
+ try {
+ mOverviewEventSender.getProxy().onQuickScrubProgress(scrubFraction);
+ if (DEBUG_OVERVIEW_PROXY) {
+ Log.d(TAG_OPS, "Quick Scrub Progress:" + scrubFraction);
}
- } else {
- mTranslation /= SWITCH_STICKINESS;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to send progress of quick scrub.", e);
}
- if (mIsVertical) {
- mHomeButtonView.setTranslationY(mTranslation);
- } else {
- mHomeButtonView.setTranslationX(mTranslation);
- }
+ } else {
+ mTranslation /= SWITCH_STICKINESS;
+ }
+ if (mIsVertical) {
+ mHomeButtonView.setTranslationY(mTranslation);
+ } else {
+ mHomeButtonView.setTranslationX(mTranslation);
}
}
break;
@@ -324,11 +341,20 @@
endQuickScrub(true /* animate */);
break;
}
- return mDraggingActive || mQuickScrubActive;
+
+ // Proxy motion events to launcher if not handled by quick scrub/switch
+ boolean handled = mDraggingActive || mQuickScrubActive;
+ if (!handled && mAllowGestureDetection) {
+ proxyMotionEvents(event);
+ }
+ return handled || mQuickStepStarted;
}
@Override
public void onDraw(Canvas canvas) {
+ if (mNavigationBarView.isQuickScrubEnabled()) {
+ return;
+ }
int color = (int) mTrackColorEvaluator.evaluate(mDarkIntensity, mLightTrackColor,
mDarkTrackColor);
mTrackPaint.setColor(color);
@@ -381,6 +407,31 @@
}
}
+ @Override
+ public void onNavigationButtonLongPress(View v) {
+ mAllowGestureDetection = false;
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
+ private void startQuickStep(MotionEvent event) {
+ mQuickStepStarted = true;
+ event.transform(mTransformGlobalMatrix);
+ try {
+ mOverviewEventSender.getProxy().onQuickStep(event);
+ if (DEBUG_OVERVIEW_PROXY) {
+ Log.d(TAG_OPS, "Quick Step Start");
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to send quick step started.", e);
+ } finally {
+ event.transform(mTransformLocalMatrix);
+ }
+ mOverviewEventSender.notifyQuickStepStarted();
+ mNavigationBarView.getHomeButton().abortCurrentGesture();
+ cancelQuickSwitch();
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
private void startQuickScrub() {
if (!mQuickScrubActive && mDraggingActive) {
mQuickScrubActive = true;
@@ -396,9 +447,6 @@
} catch (RemoteException e) {
Log.e(TAG, "Failed to send start of quick scrub.", e);
}
- } else {
- // After long press do not allow quick scrub/switch
- mTouchDownX = -1;
}
}
@@ -421,11 +469,24 @@
mDraggingActive = false;
}
- public void setRecentsAnimationStarted(boolean started) {
- mRecentsAnimationStarted = started;
- if (started) {
- cancelQuickSwitch();
+ private boolean proxyMotionEvents(MotionEvent event) {
+ final IOverviewProxy overviewProxy = mOverviewEventSender.getProxy();
+ event.transform(mTransformGlobalMatrix);
+ try {
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ overviewProxy.onPreMotionEvent(mNavigationBarView.getDownHitTarget());
+ }
+ overviewProxy.onMotionEvent(event);
+ if (DEBUG_OVERVIEW_PROXY) {
+ Log.d(TAG_OPS, "Send MotionEvent: " + event.toString());
+ }
+ return true;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Callback failed", e);
+ } finally {
+ event.transform(mTransformLocalMatrix);
}
+ return false;
}
public void cancelQuickSwitch() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index 3bcfd4b..e5fefd3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -224,8 +224,10 @@
case MotionEvent.ACTION_DOWN:
mDownTime = SystemClock.uptimeMillis();
mLongClicked = false;
- mTouchDownX = (int) ev.getX();
- mTouchDownY = (int) ev.getY();
+
+ // Use raw X and Y to detect gestures in case a parent changes the x and y values
+ mTouchDownX = (int) ev.getRawX();
+ mTouchDownY = (int) ev.getRawY();
if (mCode != 0) {
sendEvent(KeyEvent.ACTION_DOWN, 0, mDownTime);
} else {
@@ -241,8 +243,8 @@
postDelayed(mCheckLongPress, ViewConfiguration.getLongPressTimeout());
break;
case MotionEvent.ACTION_MOVE:
- x = (int)ev.getX();
- y = (int)ev.getY();
+ x = (int)ev.getRawX();
+ y = (int)ev.getRawY();
boolean exceededTouchSlopX = Math.abs(x - mTouchDownX) > mTouchSlop;
boolean exceededTouchSlopY = Math.abs(y - mTouchDownY) > mTouchSlop;
if (exceededTouchSlopX || exceededTouchSlopY) {
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 62e82a0..3896871 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -65,7 +65,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
@@ -164,14 +163,9 @@
private int[] mDataActivity;
+ // Connection state of default APN type data (i.e. internet) of phones
private int[] mDataConnectionState;
- private ArrayList<String>[] mConnectedApns;
-
- private LinkProperties[] mDataConnectionLinkProperties;
-
- private NetworkCapabilities[] mDataConnectionNetworkCapabilities;
-
private Bundle[] mCellLocation;
private int[] mDataConnectionNetworkType;
@@ -323,9 +317,8 @@
mBatteryStats = BatteryStatsService.getService();
int numPhones = TelephonyManager.getDefault().getPhoneCount();
- if (DBG) log("TelephonyRegistor: ctor numPhones=" + numPhones);
+ if (DBG) log("TelephonyRegistry: ctor numPhones=" + numPhones);
mNumPhones = numPhones;
- mConnectedApns = new ArrayList[numPhones];
mCallState = new int[numPhones];
mDataActivity = new int[numPhones];
mDataConnectionState = new int[numPhones];
@@ -339,8 +332,6 @@
mMessageWaiting = new boolean[numPhones];
mCallForwarding = new boolean[numPhones];
mCellLocation = new Bundle[numPhones];
- mDataConnectionLinkProperties = new LinkProperties[numPhones];
- mDataConnectionNetworkCapabilities = new NetworkCapabilities[numPhones];
mCellInfo = new ArrayList<List<CellInfo>>();
mPhysicalChannelConfigs = new ArrayList<List<PhysicalChannelConfig>>();
for (int i = 0; i < numPhones; i++) {
@@ -358,7 +349,6 @@
mCellLocation[i] = new Bundle();
mCellInfo.add(i, null);
mPhysicalChannelConfigs.add(i, null);
- mConnectedApns[i] = new ArrayList<String>();
}
// Note that location can be null for non-phone builds like
@@ -1219,36 +1209,12 @@
int phoneId = SubscriptionManager.getPhoneId(subId);
synchronized (mRecords) {
if (validatePhoneId(phoneId)) {
- boolean modified = false;
- if (state == TelephonyManager.DATA_CONNECTED) {
- if (!mConnectedApns[phoneId].contains(apnType)) {
- mConnectedApns[phoneId].add(apnType);
- if (mDataConnectionState[phoneId] != state) {
- mDataConnectionState[phoneId] = state;
- modified = true;
- }
- }
- } else {
- if (mConnectedApns[phoneId].remove(apnType)) {
- if (mConnectedApns[phoneId].isEmpty()) {
- mDataConnectionState[phoneId] = state;
- modified = true;
- } else {
- // leave mDataConnectionState as is and
- // send out the new status for the APN in question.
- }
- }
- }
- mDataConnectionLinkProperties[phoneId] = linkProperties;
- mDataConnectionNetworkCapabilities[phoneId] = networkCapabilities;
- if (mDataConnectionNetworkType[phoneId] != networkType) {
- mDataConnectionNetworkType[phoneId] = networkType;
- // need to tell registered listeners about the new network type
- modified = true;
- }
- if (modified) {
- String str = "onDataConnectionStateChanged(" + mDataConnectionState[phoneId]
- + ", " + mDataConnectionNetworkType[phoneId] + ")";
+ // We only call the callback when the change is for default APN type.
+ if (PhoneConstants.APN_TYPE_DEFAULT.equals(apnType)
+ && (mDataConnectionState[phoneId] != state
+ || mDataConnectionNetworkType[phoneId] != networkType)) {
+ String str = "onDataConnectionStateChanged(" + state
+ + ", " + networkType + ")";
log(str);
mLocalLog.log(str);
for (Record r : mRecords) {
@@ -1259,15 +1225,16 @@
if (DBG) {
log("Notify data connection state changed on sub: " + subId);
}
- r.callback.onDataConnectionStateChanged(
- mDataConnectionState[phoneId],
- mDataConnectionNetworkType[phoneId]);
+ r.callback.onDataConnectionStateChanged(state, networkType);
} catch (RemoteException ex) {
mRemoveList.add(r.binder);
}
}
}
handleRemoveListLocked();
+
+ mDataConnectionState[phoneId] = state;
+ mDataConnectionNetworkType[phoneId] = networkType;
}
mPreciseDataConnectionState = new PreciseDataConnectionState(state, networkType,
apnType, apn, reason, linkProperties, "");
@@ -1503,14 +1470,10 @@
pw.println("mCallForwarding=" + mCallForwarding[i]);
pw.println("mDataActivity=" + mDataActivity[i]);
pw.println("mDataConnectionState=" + mDataConnectionState[i]);
- pw.println("mDataConnectionLinkProperties=" + mDataConnectionLinkProperties[i]);
- pw.println("mDataConnectionNetworkCapabilities=" +
- mDataConnectionNetworkCapabilities[i]);
pw.println("mCellLocation=" + mCellLocation[i]);
pw.println("mCellInfo=" + mCellInfo.get(i));
pw.decreaseIndent();
}
- pw.println("mConnectedApns=" + Arrays.toString(mConnectedApns));
pw.println("mPreciseDataConnectionState=" + mPreciseDataConnectionState);
pw.println("mPreciseCallState=" + mPreciseCallState);
pw.println("mCarrierNetworkChangeState=" + mCarrierNetworkChangeState);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 26f83f5..eb4e32e 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -3390,10 +3390,15 @@
return;
}
+ app = r.app;
+ if (app != null && app.debugging) {
+ // The app's being debugged; let it ride
+ return;
+ }
+
if (DEBUG_BACKGROUND_CHECK) {
Slog.i(TAG, "Service foreground-required timeout for " + r);
}
- app = r.app;
r.fgWaiting = false;
stopServiceLocked(r);
}
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index 3a8e291..2405925 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -45,7 +45,7 @@
private Rect mCurrentDisplayRect;
// The display device owns its surface, but it should only set it
- // within a transaction from performTraversalInTransactionLocked.
+ // within a transaction from performTraversalLocked.
private Surface mCurrentSurface;
// DEBUG STATE: Last device info which was written to the log, or null if none.
@@ -122,7 +122,7 @@
/**
* Gives the display device a chance to update its properties while in a transaction.
*/
- public void performTraversalInTransactionLocked() {
+ public void performTraversalLocked(SurfaceControl.Transaction t) {
}
/**
@@ -140,7 +140,7 @@
/**
* Sets the mode, if supported.
*/
- public void requestDisplayModesInTransactionLocked(int colorMode, int modeId) {
+ public void requestDisplayModesLocked(int colorMode, int modeId) {
}
public void onOverlayChangedLocked() {
@@ -149,10 +149,10 @@
/**
* Sets the display layer stack while in a transaction.
*/
- public final void setLayerStackInTransactionLocked(int layerStack) {
+ public final void setLayerStackLocked(SurfaceControl.Transaction t, int layerStack) {
if (mCurrentLayerStack != layerStack) {
mCurrentLayerStack = layerStack;
- SurfaceControl.setDisplayLayerStack(mDisplayToken, layerStack);
+ t.setDisplayLayerStack(mDisplayToken, layerStack);
}
}
@@ -166,7 +166,7 @@
* mapped to. displayRect is specified post-orientation, that is
* it uses the orientation seen by the end-user
*/
- public final void setProjectionInTransactionLocked(int orientation,
+ public final void setProjectionLocked(SurfaceControl.Transaction t, int orientation,
Rect layerStackRect, Rect displayRect) {
if (mCurrentOrientation != orientation
|| mCurrentLayerStackRect == null
@@ -185,7 +185,7 @@
}
mCurrentDisplayRect.set(displayRect);
- SurfaceControl.setDisplayProjection(mDisplayToken,
+ t.setDisplayProjection(mDisplayToken,
orientation, layerStackRect, displayRect);
}
}
@@ -193,10 +193,10 @@
/**
* Sets the display surface while in a transaction.
*/
- public final void setSurfaceInTransactionLocked(Surface surface) {
+ public final void setSurfaceLocked(SurfaceControl.Transaction t, Surface surface) {
if (mCurrentSurface != surface) {
mCurrentSurface = surface;
- SurfaceControl.setDisplaySurface(mDisplayToken, surface);
+ t.setDisplaySurface(mDisplayToken, surface);
}
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index a5c1fe2..9861ea7 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -74,6 +74,7 @@
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
+import android.view.SurfaceControl;
import com.android.internal.util.Preconditions;
import com.android.server.AnimationThread;
@@ -457,14 +458,14 @@
}
@VisibleForTesting
- void performTraversalInTransactionFromWindowManagerInternal() {
+ void performTraversalInternal(SurfaceControl.Transaction t) {
synchronized (mSyncRoot) {
if (!mPendingTraversal) {
return;
}
mPendingTraversal = false;
- performTraversalInTransactionLocked();
+ performTraversalLocked(t);
}
// List is self-synchronized copy-on-write.
@@ -1056,7 +1057,7 @@
return changed;
}
- private void performTraversalInTransactionLocked() {
+ private void performTraversalLocked(SurfaceControl.Transaction t) {
// Clear all viewports before configuring displays so that we can keep
// track of which ones we have configured.
clearViewportsLocked();
@@ -1065,8 +1066,8 @@
final int count = mDisplayDevices.size();
for (int i = 0; i < count; i++) {
DisplayDevice device = mDisplayDevices.get(i);
- configureDisplayInTransactionLocked(device);
- device.performTraversalInTransactionLocked();
+ configureDisplayLocked(t, device);
+ device.performTraversalLocked(t);
}
// Tell the input system about these new viewports.
@@ -1150,7 +1151,7 @@
mVirtualTouchViewports.clear();
}
- private void configureDisplayInTransactionLocked(DisplayDevice device) {
+ private void configureDisplayLocked(SurfaceControl.Transaction t, DisplayDevice device) {
final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
final boolean ownContent = (info.flags & DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY) != 0;
@@ -1175,7 +1176,7 @@
+ device.getDisplayDeviceInfoLocked());
return;
}
- display.configureDisplayInTransactionLocked(device, info.state == Display.STATE_OFF);
+ display.configureDisplayLocked(t, device, info.state == Display.STATE_OFF);
// Update the viewports if needed.
if (!mDefaultViewport.valid
@@ -1233,7 +1234,7 @@
mHandler.sendMessage(msg);
}
- // Requests that performTraversalsInTransactionFromWindowManager be called at a
+ // Requests that performTraversals be called at a
// later time to apply changes to surfaces and displays.
private void scheduleTraversalLocked(boolean inTraversal) {
if (!mPendingTraversal && mWindowManagerInternal != null) {
@@ -2031,8 +2032,8 @@
}
@Override
- public void performTraversalInTransactionFromWindowManager() {
- performTraversalInTransactionFromWindowManagerInternal();
+ public void performTraversal(SurfaceControl.Transaction t) {
+ performTraversalInternal(t);
}
@Override
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 0d8ec6d..5ca9abc 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -584,10 +584,9 @@
}
@Override
- public void requestDisplayModesInTransactionLocked(
- int colorMode, int modeId) {
- if (requestModeInTransactionLocked(modeId) ||
- requestColorModeInTransactionLocked(colorMode)) {
+ public void requestDisplayModesLocked(int colorMode, int modeId) {
+ if (requestModeLocked(modeId) ||
+ requestColorModeLocked(colorMode)) {
updateDeviceInfoLocked();
}
}
@@ -597,7 +596,7 @@
updateDeviceInfoLocked();
}
- public boolean requestModeInTransactionLocked(int modeId) {
+ public boolean requestModeLocked(int modeId) {
if (modeId == 0) {
modeId = mDefaultModeId;
} else if (mSupportedModes.indexOfKey(modeId) < 0) {
@@ -623,7 +622,7 @@
return true;
}
- public boolean requestColorModeInTransactionLocked(int colorMode) {
+ public boolean requestColorModeLocked(int colorMode) {
if (mActiveColorMode == colorMode) {
return false;
}
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index e582fdf..23ee56b 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -21,6 +21,7 @@
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
+import android.view.SurfaceControl;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -304,17 +305,18 @@
* @param device The display device to modify.
* @param isBlanked True if the device is being blanked.
*/
- public void configureDisplayInTransactionLocked(DisplayDevice device,
+ public void configureDisplayLocked(SurfaceControl.Transaction t,
+ DisplayDevice device,
boolean isBlanked) {
// Set the layer stack.
- device.setLayerStackInTransactionLocked(isBlanked ? BLANK_LAYER_STACK : mLayerStack);
+ device.setLayerStackLocked(t, isBlanked ? BLANK_LAYER_STACK : mLayerStack);
// Set the color mode and mode.
if (device == mPrimaryDisplayDevice) {
- device.requestDisplayModesInTransactionLocked(
+ device.requestDisplayModesLocked(
mRequestedColorMode, mRequestedModeId);
} else {
- device.requestDisplayModesInTransactionLocked(0, 0); // Revert to default.
+ device.requestDisplayModesLocked(0, 0); // Revert to default.
}
// Only grab the display info now as it may have been changed based on the requests above.
@@ -377,7 +379,7 @@
mTempDisplayRect.right += mDisplayOffsetX;
mTempDisplayRect.top += mDisplayOffsetY;
mTempDisplayRect.bottom += mDisplayOffsetY;
- device.setProjectionInTransactionLocked(orientation, mTempLayerStackRect, mTempDisplayRect);
+ device.setProjectionLocked(t, orientation, mTempLayerStackRect, mTempDisplayRect);
}
/**
diff --git a/services/core/java/com/android/server/display/OWNERS b/services/core/java/com/android/server/display/OWNERS
index 8361421..98e3299 100644
--- a/services/core/java/com/android/server/display/OWNERS
+++ b/services/core/java/com/android/server/display/OWNERS
@@ -1,3 +1,5 @@
michaelwr@google.com
+hackbod@google.com
+ogunwale@google.com
-per-file ColorDisplayService.java=christyfranks@google.com
\ No newline at end of file
+per-file ColorDisplayService.java=christyfranks@google.com
diff --git a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
index 27327d4..e65637f 100644
--- a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
@@ -271,12 +271,12 @@
}
@Override
- public void performTraversalInTransactionLocked() {
+ public void performTraversalLocked(SurfaceControl.Transaction t) {
if (mSurfaceTexture != null) {
if (mSurface == null) {
mSurface = new Surface(mSurfaceTexture);
}
- setSurfaceInTransactionLocked(mSurface);
+ setSurfaceLocked(t, mSurface);
}
}
@@ -315,7 +315,7 @@
}
@Override
- public void requestDisplayModesInTransactionLocked(int color, int id) {
+ public void requestDisplayModesLocked(int color, int id) {
int index = -1;
if (id == 0) {
// Use the default.
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index f86d576..6111c23 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -269,12 +269,12 @@
}
@Override
- public void performTraversalInTransactionLocked() {
+ public void performTraversalLocked(SurfaceControl.Transaction t) {
if ((mPendingChanges & PENDING_RESIZE) != 0) {
- SurfaceControl.setDisplaySize(getDisplayTokenLocked(), mWidth, mHeight);
+ t.setDisplaySize(getDisplayTokenLocked(), mWidth, mHeight);
}
if ((mPendingChanges & PENDING_SURFACE_CHANGE) != 0) {
- setSurfaceInTransactionLocked(mSurface);
+ setSurfaceLocked(t, mSurface);
}
mPendingChanges = 0;
}
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index 3293379..e8d6ad4 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -620,9 +620,9 @@
}
@Override
- public void performTraversalInTransactionLocked() {
+ public void performTraversalLocked(SurfaceControl.Transaction t) {
if (mSurface != null) {
- setSurfaceInTransactionLocked(mSurface);
+ setSurfaceLocked(t, mSurface);
}
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
index 1bd5f42..5bfdf41 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
@@ -45,6 +45,7 @@
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
+import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -295,17 +296,23 @@
// If application keys are not updated, snapshot will not be created on next unlock.
mRecoverableKeyStoreDb.setShouldCreateSnapshot(mUserId, recoveryAgentUid, false);
- mRecoverySnapshotStorage.put(recoveryAgentUid, new KeyChainSnapshot.Builder()
+ KeyChainSnapshot.Builder keyChainSnapshotBuilder = new KeyChainSnapshot.Builder()
.setSnapshotVersion(getSnapshotVersion(recoveryAgentUid, recreateCurrentVersion))
.setMaxAttempts(TRUSTED_HARDWARE_MAX_ATTEMPTS)
.setCounterId(counterId)
.setTrustedHardwarePublicKey(SecureBox.encodePublicKey(publicKey))
- .setTrustedHardwareCertPath(certPath)
.setServerParams(vaultHandle)
.setKeyChainProtectionParams(metadataList)
.setWrappedApplicationKeys(createApplicationKeyEntries(encryptedApplicationKeys))
- .setEncryptedRecoveryKeyBlob(encryptedRecoveryKey)
- .build());
+ .setEncryptedRecoveryKeyBlob(encryptedRecoveryKey);
+ try {
+ keyChainSnapshotBuilder.setTrustedHardwareCertPath(certPath);
+ } catch(CertificateException e) {
+ // Should not happen, as it's just deserialized from bytes stored in the db
+ Log.wtf(TAG, "Cannot serialize CertPath when calling setTrustedHardwareCertPath", e);
+ return;
+ }
+ mRecoverySnapshotStorage.put(recoveryAgentUid, keyChainSnapshotBuilder.build());
mSnapshotListenersStorage.recoverySnapshotAvailable(recoveryAgentUid);
}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index b2f153a..fef615d 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -1092,7 +1092,7 @@
mService.registerAppFreezeListener(this);
mService.mAppsFreezingScreen++;
if (mService.mAppsFreezingScreen == 1) {
- mService.startFreezingDisplayLocked(false, 0, 0, getDisplayContent());
+ mService.startFreezingDisplayLocked(0, 0, getDisplayContent());
mService.mH.removeMessages(H.APP_FREEZE_TIMEOUT);
mService.mH.sendEmptyMessageDelayed(H.APP_FREEZE_TIMEOUT, 2000);
}
diff --git a/services/core/java/com/android/server/wm/BlackFrame.java b/services/core/java/com/android/server/wm/BlackFrame.java
index f19cd0f..1977e12 100644
--- a/services/core/java/com/android/server/wm/BlackFrame.java
+++ b/services/core/java/com/android/server/wm/BlackFrame.java
@@ -41,7 +41,7 @@
final int layer;
final SurfaceControl surface;
- BlackSurface(int layer,
+ BlackSurface(SurfaceControl.Transaction transaction, int layer,
int l, int t, int r, int b, DisplayContent dc) throws OutOfResourcesException {
left = l;
top = t;
@@ -56,24 +56,24 @@
.setParent(null) // TODO: Work-around for b/69259549
.build();
- surface.setAlpha(1);
- surface.setLayer(layer);
- surface.show();
+ transaction.setAlpha(surface, 1);
+ transaction.setLayer(surface, layer);
+ transaction.show(surface);
if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
" BLACK " + surface + ": CREATE layer=" + layer);
}
- void setAlpha(float alpha) {
- surface.setAlpha(alpha);
+ void setAlpha(SurfaceControl.Transaction t, float alpha) {
+ t.setAlpha(surface, alpha);
}
- void setMatrix(Matrix matrix) {
+ void setMatrix(SurfaceControl.Transaction t, Matrix matrix) {
mTmpMatrix.setTranslate(left, top);
mTmpMatrix.postConcat(matrix);
mTmpMatrix.getValues(mTmpFloats);
- surface.setPosition(mTmpFloats[Matrix.MTRANS_X],
+ t.setPosition(surface, mTmpFloats[Matrix.MTRANS_X],
mTmpFloats[Matrix.MTRANS_Y]);
- surface.setMatrix(
+ t.setMatrix(surface,
mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
if (false) {
@@ -87,8 +87,8 @@
}
}
- void clearMatrix() {
- surface.setMatrix(1, 0, 0, 1);
+ void clearMatrix(SurfaceControl.Transaction t) {
+ t.setMatrix(surface, 1, 0, 0, 1);
}
}
@@ -113,7 +113,8 @@
}
}
- public BlackFrame(Rect outer, Rect inner, int layer, DisplayContent dc,
+ public BlackFrame(SurfaceControl.Transaction t,
+ Rect outer, Rect inner, int layer, DisplayContent dc,
boolean forceDefaultOrientation) throws OutOfResourcesException {
boolean success = false;
@@ -125,19 +126,19 @@
mInnerRect = new Rect(inner);
try {
if (outer.top < inner.top) {
- mBlackSurfaces[0] = new BlackSurface(layer,
+ mBlackSurfaces[0] = new BlackSurface(t, layer,
outer.left, outer.top, inner.right, inner.top, dc);
}
if (outer.left < inner.left) {
- mBlackSurfaces[1] = new BlackSurface(layer,
+ mBlackSurfaces[1] = new BlackSurface(t, layer,
outer.left, inner.top, inner.left, outer.bottom, dc);
}
if (outer.bottom > inner.bottom) {
- mBlackSurfaces[2] = new BlackSurface(layer,
+ mBlackSurfaces[2] = new BlackSurface(t, layer,
inner.left, inner.bottom, outer.right, outer.bottom, dc);
}
if (outer.right > inner.right) {
- mBlackSurfaces[3] = new BlackSurface(layer,
+ mBlackSurfaces[3] = new BlackSurface(t, layer,
inner.right, outer.top, outer.right, inner.bottom, dc);
}
success = true;
@@ -161,36 +162,36 @@
}
}
- public void hide() {
+ public void hide(SurfaceControl.Transaction t) {
if (mBlackSurfaces != null) {
for (int i=0; i<mBlackSurfaces.length; i++) {
if (mBlackSurfaces[i] != null) {
- mBlackSurfaces[i].surface.hide();
+ t.hide(mBlackSurfaces[i].surface);
}
}
}
}
- public void setAlpha(float alpha) {
+ public void setAlpha(SurfaceControl.Transaction t, float alpha) {
for (int i=0; i<mBlackSurfaces.length; i++) {
if (mBlackSurfaces[i] != null) {
- mBlackSurfaces[i].setAlpha(alpha);
+ mBlackSurfaces[i].setAlpha(t, alpha);
}
}
}
- public void setMatrix(Matrix matrix) {
+ public void setMatrix(SurfaceControl.Transaction t, Matrix matrix) {
for (int i=0; i<mBlackSurfaces.length; i++) {
if (mBlackSurfaces[i] != null) {
- mBlackSurfaces[i].setMatrix(matrix);
+ mBlackSurfaces[i].setMatrix(t, matrix);
}
}
}
- public void clearMatrix() {
+ public void clearMatrix(SurfaceControl.Transaction t) {
for (int i=0; i<mBlackSurfaces.length; i++) {
if (mBlackSurfaces[i] != null) {
- mBlackSurfaces[i].clearMatrix();
+ mBlackSurfaces[i].clearMatrix(t);
}
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 2dce913..59babcf 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -258,7 +258,7 @@
* Current rotation of the display.
* Constants as per {@link android.view.Surface.Rotation}.
*
- * @see #updateRotationUnchecked(boolean)
+ * @see #updateRotationUnchecked()
*/
private int mRotation = 0;
@@ -274,7 +274,7 @@
* Flag indicating that the application is receiving an orientation that has different metrics
* than it expected. E.g. Portrait instead of Landscape.
*
- * @see #updateRotationUnchecked(boolean)
+ * @see #updateRotationUnchecked()
*/
private boolean mAltOrientation = false;
@@ -926,7 +926,7 @@
* Returns true if the rotation has been changed. In this case YOU MUST CALL
* {@link WindowManagerService#sendNewConfiguration(int)} TO UNFREEZE THE SCREEN.
*/
- boolean updateRotationUnchecked(boolean inTransaction) {
+ boolean updateRotationUnchecked() {
if (mService.mDeferredRotationPauseCount > 0) {
// Rotation updates have been paused temporarily. Defer the update until
// updates have been resumed.
@@ -1030,7 +1030,7 @@
mService.mPolicy.selectRotationAnimationLw(anim);
if (!rotateSeamlessly) {
- mService.startFreezingDisplayLocked(inTransaction, anim[0], anim[1], this);
+ mService.startFreezingDisplayLocked(anim[0], anim[1], this);
// startFreezingDisplayLocked can reset the ScreenRotationAnimation.
screenRotationAnimation = mService.mAnimator.getScreenRotationAnimationLocked(
mDisplayId);
@@ -1041,9 +1041,7 @@
// to their rotated state independently and without a freeze required.
screenRotationAnimation = null;
- // We have to reset this in case a window was removed before it
- // finished seamless rotation.
- mService.mSeamlessRotationCount = 0;
+ mService.startSeamlessRotation();
}
// We need to update our screen size information to match the new rotation. If the rotation
@@ -1053,40 +1051,27 @@
// #computeScreenConfiguration() later.
updateDisplayAndOrientation(getConfiguration().uiMode);
- if (!inTransaction) {
- if (SHOW_TRANSACTIONS) {
- Slog.i(TAG_WM, ">>> OPEN TRANSACTION setRotationUnchecked");
- }
- mService.openSurfaceTransaction();
- }
- try {
- // NOTE: We disable the rotation in the emulator because
- // it doesn't support hardware OpenGL emulation yet.
- if (CUSTOM_SCREEN_ROTATION && screenRotationAnimation != null
- && screenRotationAnimation.hasScreenshot()) {
- if (screenRotationAnimation.setRotationInTransaction(rotation,
- MAX_ANIMATION_DURATION, mService.getTransitionAnimationScaleLocked(),
- mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight)) {
- mService.scheduleAnimationLocked();
- }
- }
-
- if (rotateSeamlessly) {
- forAllWindows(w -> {
- w.mWinAnimator.seamlesslyRotateWindow(oldRotation, rotation);
- }, true /* traverseTopToBottom */);
- }
-
- mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager();
- } finally {
- if (!inTransaction) {
- mService.closeSurfaceTransaction("setRotationUnchecked");
- if (SHOW_LIGHT_TRANSACTIONS) {
- Slog.i(TAG_WM, "<<< CLOSE TRANSACTION setRotationUnchecked");
- }
+ // NOTE: We disable the rotation in the emulator because
+ // it doesn't support hardware OpenGL emulation yet.
+ if (CUSTOM_SCREEN_ROTATION && screenRotationAnimation != null
+ && screenRotationAnimation.hasScreenshot()) {
+ if (screenRotationAnimation.setRotation(getPendingTransaction(), rotation,
+ MAX_ANIMATION_DURATION, mService.getTransitionAnimationScaleLocked(),
+ mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight)) {
+ mService.scheduleAnimationLocked();
}
}
+ if (rotateSeamlessly) {
+ forAllWindows(w -> {
+ w.mWinAnimator.seamlesslyRotateWindow(getPendingTransaction(),
+ oldRotation, rotation);
+ }, true /* traverseTopToBottom */);
+ }
+
+ mService.mDisplayManagerInternal.performTraversal(getPendingTransaction());
+ scheduleAnimation();
+
forAllWindows(w -> {
if (w.mHasSurface && !rotateSeamlessly) {
if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Set mOrientationChanging of " + w);
@@ -2808,7 +2793,7 @@
if (isDefaultDisplay && (pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) {
if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout");
- if (mService.updateOrientationFromAppTokensLocked(true, mDisplayId)) {
+ if (mService.updateOrientationFromAppTokensLocked(mDisplayId)) {
setLayoutNeeded();
mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, mDisplayId).sendToTarget();
}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index f32c275..32ae523 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -37,6 +37,7 @@
import android.util.proto.ProtoOutputStream;
import android.view.Display;
import android.view.DisplayInfo;
+import android.view.SurfaceControl;
import android.view.WindowManager;
import com.android.internal.util.ArrayUtils;
@@ -128,6 +129,11 @@
private final Handler mHandler;
private String mCloseSystemDialogsReason;
+
+ // Only a seperate transaction until we seperate the apply surface changes
+ // transaction from the global transaction.
+ private final SurfaceControl.Transaction mDisplayTransaction = new SurfaceControl.Transaction();
+
private final Consumer<WindowState> mCloseSystemDialogsConsumer = w -> {
if (w.mHasSurface) {
try {
@@ -725,7 +731,7 @@
if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
// TODO(multi-display): Update rotation for different displays separately.
final int displayId = defaultDisplay.getDisplayId();
- if (defaultDisplay.updateRotationUnchecked(false /* inTransaction */)) {
+ if (defaultDisplay.updateRotationUnchecked()) {
mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget();
} else {
mUpdateRotation = false;
@@ -735,7 +741,7 @@
// PhoneWindowManager.
final DisplayContent vrDisplay = mService.mVr2dDisplayId != INVALID_DISPLAY
? getDisplayContent(mService.mVr2dDisplayId) : null;
- if (vrDisplay != null && vrDisplay.updateRotationUnchecked(false /* inTransaction */)) {
+ if (vrDisplay != null && vrDisplay.updateRotationUnchecked()) {
mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, mService.mVr2dDisplayId)
.sendToTarget();
}
@@ -835,7 +841,8 @@
// Give the display manager a chance to adjust properties like display rotation if it needs
// to.
- mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager();
+ mService.mDisplayManagerInternal.performTraversal(mDisplayTransaction);
+ SurfaceControl.mergeToGlobalTransaction(mDisplayTransaction);
}
/**
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index 5a39de5..ad2fabb 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -224,8 +224,7 @@
}
public ScreenRotationAnimation(Context context, DisplayContent displayContent,
- boolean inTransaction, boolean forceDefaultOrientation,
- boolean isSecure, WindowManagerService service) {
+ boolean forceDefaultOrientation, boolean isSecure, WindowManagerService service) {
mService = service;
mContext = context;
mDisplayContent = displayContent;
@@ -260,52 +259,39 @@
mOriginalWidth = originalWidth;
mOriginalHeight = originalHeight;
- if (!inTransaction) {
- if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM,
- ">>> OPEN TRANSACTION ScreenRotationAnimation");
- mService.openSurfaceTransaction();
- }
-
+ final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
try {
- try {
- mSurfaceControl = displayContent.makeOverlay()
- .setName("ScreenshotSurface")
- .setSize(mWidth, mHeight)
- .setSecure(isSecure)
- .build();
+ mSurfaceControl = displayContent.makeOverlay()
+ .setName("ScreenshotSurface")
+ .setSize(mWidth, mHeight)
+ .setSecure(isSecure)
+ .build();
- // capture a screenshot into the surface we just created
- Surface sur = new Surface();
- sur.copyFrom(mSurfaceControl);
- // TODO(multidisplay): we should use the proper display
- SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay(
- SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN), sur);
- mSurfaceControl.setLayer(SCREEN_FREEZE_LAYER_SCREENSHOT);
- mSurfaceControl.setAlpha(0);
- mSurfaceControl.show();
- sur.destroy();
- } catch (OutOfResourcesException e) {
- Slog.w(TAG, "Unable to allocate freeze surface", e);
- }
-
- if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
- " FREEZE " + mSurfaceControl + ": CREATE");
-
- setRotationInTransaction(originalRotation);
- } finally {
- if (!inTransaction) {
- mService.closeSurfaceTransaction("ScreenRotationAnimation");
- if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM,
- "<<< CLOSE TRANSACTION ScreenRotationAnimation");
- }
+ // capture a screenshot into the surface we just created
+ Surface sur = new Surface();
+ sur.copyFrom(mSurfaceControl);
+ // TODO(multidisplay): we should use the proper display
+ SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay(
+ SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN), sur);
+ t.setLayer(mSurfaceControl, SCREEN_FREEZE_LAYER_SCREENSHOT);
+ t.setAlpha(mSurfaceControl, 0);
+ t.show(mSurfaceControl);
+ sur.destroy();
+ } catch (OutOfResourcesException e) {
+ Slog.w(TAG, "Unable to allocate freeze surface", e);
}
+
+ if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
+ " FREEZE " + mSurfaceControl + ": CREATE");
+ setRotation(t, originalRotation);
+ t.apply();
}
boolean hasScreenshot() {
return mSurfaceControl != null;
}
- private void setSnapshotTransformInTransaction(Matrix matrix, float alpha) {
+ private void setSnapshotTransform(SurfaceControl.Transaction t, Matrix matrix, float alpha) {
if (mSurfaceControl != null) {
matrix.getValues(mTmpFloats);
float x = mTmpFloats[Matrix.MTRANS_X];
@@ -315,11 +301,11 @@
x -= mCurrentDisplayRect.left;
y -= mCurrentDisplayRect.top;
}
- mSurfaceControl.setPosition(x, y);
- mSurfaceControl.setMatrix(
+ t.setPosition(mSurfaceControl, x, y);
+ t.setMatrix(mSurfaceControl,
mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
- mSurfaceControl.setAlpha(alpha);
+ t.setAlpha(mSurfaceControl, alpha);
if (DEBUG_TRANSFORMS) {
float[] srcPnts = new float[] { 0, 0, mWidth, mHeight };
float[] dstPnts = new float[4];
@@ -353,8 +339,7 @@
}
}
- // Must be called while in a transaction.
- private void setRotationInTransaction(int rotation) {
+ private void setRotation(SurfaceControl.Transaction t, int rotation) {
mCurRotation = rotation;
// Compute the transformation matrix that must be applied
@@ -364,15 +349,14 @@
createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix);
if (DEBUG_STATE) Slog.v(TAG, "**** ROTATION: " + delta);
- setSnapshotTransformInTransaction(mSnapshotInitialMatrix, 1.0f);
+ setSnapshotTransform(t, mSnapshotInitialMatrix, 1.0f);
}
- // Must be called while in a transaction.
- public boolean setRotationInTransaction(int rotation,
+ public boolean setRotation(SurfaceControl.Transaction t, int rotation,
long maxAnimationDuration, float animationScale, int finalWidth, int finalHeight) {
- setRotationInTransaction(rotation);
+ setRotation(t, rotation);
if (TWO_PHASE_ANIMATION) {
- return startAnimation(maxAnimationDuration, animationScale,
+ return startAnimation(t, maxAnimationDuration, animationScale,
finalWidth, finalHeight, false, 0, 0);
}
@@ -383,7 +367,7 @@
/**
* Returns true if animating.
*/
- private boolean startAnimation(long maxAnimationDuration,
+ private boolean startAnimation(SurfaceControl.Transaction t, long maxAnimationDuration,
float animationScale, int finalWidth, int finalHeight, boolean dismissing,
int exitAnim, int enterAnim) {
if (mSurfaceControl == null) {
@@ -542,11 +526,6 @@
final int layerStack = mDisplayContent.getDisplay().getLayerStack();
if (USE_CUSTOM_BLACK_FRAME && mCustomBlackFrame == null) {
- if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
- TAG_WM,
- ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
- mService.openSurfaceTransaction();
-
// Compute the transformation matrix that must be applied
// the the black frame to make it stay in the initial position
// before the new screen rotation. This is different than the
@@ -559,24 +538,15 @@
Rect outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
mOriginalWidth*2, mOriginalHeight*2);
Rect inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
- mCustomBlackFrame = new BlackFrame(outer, inner,
+ mCustomBlackFrame = new BlackFrame(t, outer, inner,
SCREEN_FREEZE_LAYER_CUSTOM, mDisplayContent, false);
- mCustomBlackFrame.setMatrix(mFrameInitialMatrix);
+ mCustomBlackFrame.setMatrix(t, mFrameInitialMatrix);
} catch (OutOfResourcesException e) {
Slog.w(TAG, "Unable to allocate black surface", e);
- } finally {
- mService.closeSurfaceTransaction("ScreenRotationAnimation.startAnimation");
- if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
- TAG_WM,
- "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
}
}
if (!customAnim && mExitingBlackFrame == null) {
- if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
- TAG_WM,
- ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
- mService.openSurfaceTransaction();
try {
// Compute the transformation matrix that must be applied
// the the black frame to make it stay in the initial position
@@ -599,38 +569,23 @@
mOriginalWidth*2, mOriginalHeight*2);
inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
}
- mExitingBlackFrame = new BlackFrame(outer, inner,
+ mExitingBlackFrame = new BlackFrame(t, outer, inner,
SCREEN_FREEZE_LAYER_EXIT, mDisplayContent, mForceDefaultOrientation);
- mExitingBlackFrame.setMatrix(mFrameInitialMatrix);
+ mExitingBlackFrame.setMatrix(t, mFrameInitialMatrix);
} catch (OutOfResourcesException e) {
Slog.w(TAG, "Unable to allocate black surface", e);
- } finally {
- mService.closeSurfaceTransaction("ScreenRotationAnimation.startAnimation");
- if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
- TAG_WM,
- "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
}
}
if (customAnim && mEnteringBlackFrame == null) {
- if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
- TAG_WM,
- ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
- mService.openSurfaceTransaction();
-
try {
Rect outer = new Rect(-finalWidth*1, -finalHeight*1,
finalWidth*2, finalHeight*2);
Rect inner = new Rect(0, 0, finalWidth, finalHeight);
- mEnteringBlackFrame = new BlackFrame(outer, inner,
+ mEnteringBlackFrame = new BlackFrame(t, outer, inner,
SCREEN_FREEZE_LAYER_ENTER, mDisplayContent, false);
} catch (OutOfResourcesException e) {
Slog.w(TAG, "Unable to allocate black surface", e);
- } finally {
- mService.closeSurfaceTransaction("ScreenRotationAnimation.startAnimation");
- if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
- TAG_WM,
- "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
}
}
@@ -640,7 +595,7 @@
/**
* Returns true if animating.
*/
- public boolean dismiss(long maxAnimationDuration,
+ public boolean dismiss(SurfaceControl.Transaction t, long maxAnimationDuration,
float animationScale, int finalWidth, int finalHeight, int exitAnim, int enterAnim) {
if (DEBUG_STATE) Slog.v(TAG, "Dismiss!");
if (mSurfaceControl == null) {
@@ -648,7 +603,7 @@
return false;
}
if (!mStarted) {
- startAnimation(maxAnimationDuration, animationScale, finalWidth, finalHeight,
+ startAnimation(t, maxAnimationDuration, animationScale, finalWidth, finalHeight,
true, exitAnim, enterAnim);
}
if (!mStarted) {
@@ -919,7 +874,7 @@
return more;
}
- void updateSurfacesInTransaction() {
+ void updateSurfaces(SurfaceControl.Transaction t) {
if (!mStarted) {
return;
}
@@ -927,28 +882,28 @@
if (mSurfaceControl != null) {
if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, hiding screenshot surface");
- mSurfaceControl.hide();
+ t.hide(mSurfaceControl);
}
}
if (mCustomBlackFrame != null) {
if (!mMoreStartFrame && !mMoreFinishFrame && !mMoreRotateFrame) {
if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding black frame");
- mCustomBlackFrame.hide();
+ mCustomBlackFrame.hide(t);
} else {
- mCustomBlackFrame.setMatrix(mFrameTransformation.getMatrix());
+ mCustomBlackFrame.setMatrix(t, mFrameTransformation.getMatrix());
}
}
if (mExitingBlackFrame != null) {
if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding exiting frame");
- mExitingBlackFrame.hide();
+ mExitingBlackFrame.hide(t);
} else {
mExitFrameFinalMatrix.setConcat(mExitTransformation.getMatrix(), mFrameInitialMatrix);
- mExitingBlackFrame.setMatrix(mExitFrameFinalMatrix);
+ mExitingBlackFrame.setMatrix(t, mExitFrameFinalMatrix);
if (mForceDefaultOrientation) {
- mExitingBlackFrame.setAlpha(mExitTransformation.getAlpha());
+ mExitingBlackFrame.setAlpha(t, mExitTransformation.getAlpha());
}
}
}
@@ -956,13 +911,13 @@
if (mEnteringBlackFrame != null) {
if (!mMoreStartEnter && !mMoreFinishEnter && !mMoreRotateEnter) {
if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding entering frame");
- mEnteringBlackFrame.hide();
+ mEnteringBlackFrame.hide(t);
} else {
- mEnteringBlackFrame.setMatrix(mEnterTransformation.getMatrix());
+ mEnteringBlackFrame.setMatrix(t, mEnterTransformation.getMatrix());
}
}
- setSnapshotTransformInTransaction(mSnapshotFinalMatrix, mExitTransformation.getAlpha());
+ setSnapshotTransform(t, mSnapshotFinalMatrix, mExitTransformation.getAlpha());
}
public boolean stepAnimationLocked(long now) {
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index ab10197..793ffce 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -30,6 +30,7 @@
import android.util.SparseArray;
import android.util.TimeUtils;
import android.view.Choreographer;
+import android.view.SurfaceControl;
import com.android.server.AnimationThread;
import com.android.server.policy.WindowManagerPolicy;
@@ -94,6 +95,8 @@
private final ArrayList<Runnable> mAfterPrepareSurfacesRunnables = new ArrayList<>();
private boolean mInExecuteAfterPrepareSurfacesRunnables;
+ private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
+
WindowAnimator(final WindowManagerService service) {
mService = service;
mContext = service.mContext;
@@ -203,7 +206,7 @@
final ScreenRotationAnimation screenRotationAnimation =
mDisplayContentsAnimators.valueAt(i).mScreenRotationAnimation;
if (screenRotationAnimation != null) {
- screenRotationAnimation.updateSurfacesInTransaction();
+ screenRotationAnimation.updateSurfaces(mTransaction);
}
orAnimating(dc.getDockedDividerController().animate(mCurrentTime));
//TODO (multidisplay): Magnification is supported only for the default display.
@@ -219,6 +222,8 @@
if (mService.mWatermark != null) {
mService.mWatermark.drawIfNeeded();
}
+
+ SurfaceControl.mergeToGlobalTransaction(mTransaction);
} catch (RuntimeException e) {
Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
} finally {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 82fbb51..be009d2 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -667,11 +667,18 @@
WindowManagerInternal.OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener;
SettingsObserver mSettingsObserver;
- // A count of the windows which are 'seamlessly rotated', e.g. a surface
- // at an old orientation is being transformed. We freeze orientation updates
- // while any windows are seamlessly rotated, so we need to track when this
- // hits zero so we can apply deferred orientation updates.
- int mSeamlessRotationCount = 0;
+ /**
+ * A count of the windows which are 'seamlessly rotated', e.g. a surface
+ * at an old orientation is being transformed. We freeze orientation updates
+ * while any windows are seamlessly rotated, so we need to track when this
+ * hits zero so we can apply deferred orientation updates.
+ */
+ private int mSeamlessRotationCount = 0;
+ /**
+ * True in the interval from starting seamless rotation until the last rotated
+ * window draws in the new orientation.
+ */
+ private boolean mRotatingSeamlessly = false;
private final class SettingsObserver extends ContentObserver {
private final Uri mDisplayInversionEnabledUri =
@@ -809,6 +816,8 @@
SurfaceBuilderFactory mSurfaceBuilderFactory = SurfaceControl.Builder::new;
TransactionFactory mTransactionFactory = SurfaceControl.Transaction::new;
+ private final SurfaceControl.Transaction mTransaction = mTransactionFactory.make();
+
static void boostPriorityForLockedSection() {
sThreadPriorityBooster.boost();
}
@@ -1487,7 +1496,7 @@
if (localLOGV || DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "addWindow: New client "
+ client.asBinder() + ": window=" + win + " Callers=" + Debug.getCallers(5));
- if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false, displayId)) {
+ if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(displayId)) {
reportNewConfig = true;
}
}
@@ -2049,7 +2058,7 @@
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
"relayoutWindow: updateOrientationFromAppTokens");
- configChanged = updateOrientationFromAppTokensLocked(false, displayId);
+ configChanged = updateOrientationFromAppTokensLocked(displayId);
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
if (toBeDisplayed && win.mIsWallpaper) {
@@ -2340,7 +2349,7 @@
}
Configuration config = null;
- if (updateOrientationFromAppTokensLocked(false, displayId)) {
+ if (updateOrientationFromAppTokensLocked(displayId)) {
// If we changed the orientation but mOrientationChangeComplete is already true,
// we used seamless rotation, and we don't need to freeze the screen.
if (freezeThisOneIfNeeded != null && !mRoot.mOrientationChangeComplete) {
@@ -2367,7 +2376,7 @@
int anim[] = new int[2];
mPolicy.selectRotationAnimationLw(anim);
- startFreezingDisplayLocked(false, anim[0], anim[1], displayContent);
+ startFreezingDisplayLocked(anim[0], anim[1], displayContent);
config = new Configuration(mTempConfiguration);
}
}
@@ -2387,7 +2396,7 @@
* tokens.
* @see android.view.IWindowManager#updateOrientationFromAppTokens(Configuration, IBinder, int)
*/
- boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId) {
+ boolean updateOrientationFromAppTokensLocked(int displayId) {
long ident = Binder.clearCallingIdentity();
try {
final DisplayContent dc = mRoot.getDisplayContent(displayId);
@@ -2400,7 +2409,7 @@
if (dc.isDefaultDisplay) {
mPolicy.setCurrentOrientationLw(req);
}
- if (dc.updateRotationUnchecked(inTransaction)) {
+ if (dc.updateRotationUnchecked()) {
// changed
return true;
}
@@ -2873,7 +2882,7 @@
mClientFreezingScreen = true;
final long origId = Binder.clearCallingIdentity();
try {
- startFreezingDisplayLocked(false, exitAnim, enterAnim);
+ startFreezingDisplayLocked(exitAnim, enterAnim);
mH.removeMessages(H.CLIENT_FREEZE_TIMEOUT);
mH.sendEmptyMessageDelayed(H.CLIENT_FREEZE_TIMEOUT, 5000);
} finally {
@@ -3774,8 +3783,7 @@
if (mDeferredRotationPauseCount == 0) {
// TODO(multi-display): Update rotation for different displays separately.
final DisplayContent displayContent = getDefaultDisplayContentLocked();
- final boolean changed = displayContent.updateRotationUnchecked(
- false /* inTransaction */);
+ final boolean changed = displayContent.updateRotationUnchecked();
if (changed) {
mH.obtainMessage(H.SEND_NEW_CONFIGURATION, displayContent.getDisplayId())
.sendToTarget();
@@ -3800,8 +3808,7 @@
synchronized (mWindowMap) {
final DisplayContent displayContent = getDefaultDisplayContentLocked();
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "updateRotation: display");
- rotationChanged = displayContent.updateRotationUnchecked(
- false /* inTransaction */);
+ rotationChanged = displayContent.updateRotationUnchecked();
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
if (!rotationChanged || forceRelayout) {
displayContent.setLayoutNeeded();
@@ -5326,8 +5333,7 @@
displayContent.setLayoutNeeded();
final int displayId = displayContent.getDisplayId();
- boolean configChanged = updateOrientationFromAppTokensLocked(false /* inTransaction */,
- displayId);
+ boolean configChanged = updateOrientationFromAppTokensLocked(displayId);
final Configuration currentDisplayConfig = displayContent.getConfiguration();
mTempConfiguration.setTo(currentDisplayConfig);
displayContent.computeScreenConfiguration(mTempConfiguration);
@@ -5335,7 +5341,7 @@
if (configChanged) {
mWaitingForConfig = true;
- startFreezingDisplayLocked(false /* inTransaction */, 0 /* exitAnim */,
+ startFreezingDisplayLocked(0 /* exitAnim */,
0 /* enterAnim */, displayContent);
mH.obtainMessage(H.SEND_NEW_CONFIGURATION, displayId).sendToTarget();
}
@@ -5651,14 +5657,14 @@
return false;
}
- void startFreezingDisplayLocked(boolean inTransaction, int exitAnim, int enterAnim) {
- startFreezingDisplayLocked(inTransaction, exitAnim, enterAnim,
+ void startFreezingDisplayLocked(int exitAnim, int enterAnim) {
+ startFreezingDisplayLocked(exitAnim, enterAnim,
getDefaultDisplayContentLocked());
}
- void startFreezingDisplayLocked(boolean inTransaction, int exitAnim, int enterAnim,
+ void startFreezingDisplayLocked(int exitAnim, int enterAnim,
DisplayContent displayContent) {
- if (mDisplayFrozen) {
+ if (mDisplayFrozen || mRotatingSeamlessly) {
return;
}
@@ -5669,8 +5675,8 @@
}
if (DEBUG_ORIENTATION) Slog.d(TAG_WM,
- "startFreezingDisplayLocked: inTransaction=" + inTransaction
- + " exitAnim=" + exitAnim + " enterAnim=" + enterAnim
+ "startFreezingDisplayLocked: exitAnim="
+ + exitAnim + " enterAnim=" + enterAnim
+ " called by " + Debug.getCallers(8));
mScreenFrozenLock.acquire();
@@ -5714,7 +5720,7 @@
displayContent.updateDisplayInfo();
screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent,
- inTransaction, mPolicy.isDefaultOrientationForced(), isSecure,
+ mPolicy.isDefaultOrientationForced(), isSecure,
this);
mAnimator.setScreenRotationAnimationLocked(mFrozenDisplayId,
screenRotationAnimation);
@@ -5777,9 +5783,10 @@
if (!mPolicy.validateRotationAnimationLw(mExitAnimId, mEnterAnimId, false)) {
mExitAnimId = mEnterAnimId = 0;
}
- if (screenRotationAnimation.dismiss(MAX_ANIMATION_DURATION,
+ if (screenRotationAnimation.dismiss(mTransaction, MAX_ANIMATION_DURATION,
getTransitionAnimationScaleLocked(), displayInfo.logicalWidth,
displayInfo.logicalHeight, mExitAnimId, mEnterAnimId)) {
+ mTransaction.apply();
scheduleAnimationLocked();
} else {
screenRotationAnimation.kill();
@@ -5802,7 +5809,7 @@
// to avoid inconsistent states. However, something interesting
// could have actually changed during that time so re-evaluate it
// now to catch that.
- configChanged = updateOrientationFromAppTokensLocked(false, displayId);
+ configChanged = updateOrientationFromAppTokensLocked(displayId);
// A little kludge: a lot could have happened while the
// display was frozen, so now that we are coming back we
@@ -5816,8 +5823,7 @@
if (updateRotation) {
if (DEBUG_ORIENTATION) Slog.d(TAG_WM, "Performing post-rotate rotation");
- configChanged |= displayContent.updateRotationUnchecked(
- false /* inTransaction */);
+ configChanged |= displayContent.updateRotationUnchecked();
}
if (configChanged) {
@@ -7027,8 +7033,10 @@
if (DEBUG_ORIENTATION) {
Slog.i(TAG, "Performing post-rotate rotation after seamless rotation");
}
+ finishSeamlessRotation();
+
final DisplayContent displayContent = w.getDisplayContent();
- if (displayContent.updateRotationUnchecked(false /* inTransaction */)) {
+ if (displayContent.updateRotationUnchecked()) {
mH.obtainMessage(H.SEND_NEW_CONFIGURATION, displayContent.getDisplayId())
.sendToTarget();
}
@@ -7439,6 +7447,18 @@
.sendToTarget();
}
+ void startSeamlessRotation() {
+ // We are careful to reset this in case a window was removed before it finished
+ // seamless rotation.
+ mSeamlessRotationCount = 0;
+
+ mRotatingSeamlessly = true;
+ }
+
+ void finishSeamlessRotation() {
+ mRotatingSeamlessly = false;
+ }
+
/**
* Called when the state of lock task mode changes. This should be used to disable immersive
* mode confirmation.
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 68bb530..8866fe5 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2015,7 +2015,7 @@
removeImmediately();
// Removing a visible window will effect the computed orientation
// So just update orientation if needed.
- if (wasVisible && mService.updateOrientationFromAppTokensLocked(false, displayId)) {
+ if (wasVisible && mService.updateOrientationFromAppTokensLocked(displayId)) {
mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget();
}
mService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 13f05e0..46a9961 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1415,7 +1415,8 @@
}
}
- void seamlesslyRotateWindow(int oldRotation, int newRotation) {
+ void seamlesslyRotateWindow(SurfaceControl.Transaction t,
+ int oldRotation, int newRotation) {
final WindowState w = mWin;
if (!w.isVisibleNow() || w.mIsWallpaper) {
return;
@@ -1456,11 +1457,9 @@
float DsDy = mService.mTmpFloats[Matrix.MSCALE_Y];
float nx = mService.mTmpFloats[Matrix.MTRANS_X];
float ny = mService.mTmpFloats[Matrix.MTRANS_Y];
- mSurfaceController.setPositionInTransaction(nx, ny, false);
- mSurfaceController.setMatrixInTransaction(DsDx * w.mHScale,
- DtDx * w.mVScale,
- DtDy * w.mHScale,
- DsDy * w.mVScale, false);
+ mSurfaceController.setPosition(t, nx, ny, false);
+ mSurfaceController.setMatrix(t, DsDx * w.mHScale, DtDx * w.mVScale, DtDy
+ * w.mHScale, DsDy * w.mVScale, false);
}
/** The force-scaled state for a given window can persist past
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index 9d6f8f7..f6c0a54 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -242,6 +242,11 @@
}
void setPositionInTransaction(float left, float top, boolean recoveringMemory) {
+ setPosition(null, left, top, recoveringMemory);
+ }
+
+ void setPosition(SurfaceControl.Transaction t, float left, float top,
+ boolean recoveringMemory) {
final boolean surfaceMoved = mSurfaceX != left || mSurfaceY != top;
if (surfaceMoved) {
mSurfaceX = left;
@@ -251,7 +256,11 @@
if (SHOW_TRANSACTIONS) logSurface(
"POS (setPositionInTransaction) @ (" + left + "," + top + ")", null);
- mSurfaceControl.setPosition(left, top);
+ if (t == null) {
+ mSurfaceControl.setPosition(left, top);
+ } else {
+ t.setPosition(mSurfaceControl, left, top);
+ }
} catch (RuntimeException e) {
Slog.w(TAG, "Error positioning surface of " + this
+ " pos=(" + left + "," + top + ")", e);
@@ -268,6 +277,11 @@
void setMatrixInTransaction(float dsdx, float dtdx, float dtdy, float dsdy,
boolean recoveringMemory) {
+ setMatrix(null, dsdx, dtdx, dtdy, dsdy, false);
+ }
+
+ void setMatrix(SurfaceControl.Transaction t, float dsdx, float dtdx,
+ float dtdy, float dsdy, boolean recoveringMemory) {
final boolean matrixChanged = mLastDsdx != dsdx || mLastDtdx != dtdx ||
mLastDtdy != dtdy || mLastDsdy != dsdy;
if (!matrixChanged) {
@@ -282,8 +296,11 @@
try {
if (SHOW_TRANSACTIONS) logSurface(
"MATRIX [" + dsdx + "," + dtdx + "," + dtdy + "," + dsdy + "]", null);
- mSurfaceControl.setMatrix(
- dsdx, dtdx, dtdy, dsdy);
+ if (t == null) {
+ mSurfaceControl.setMatrix(dsdx, dtdx, dtdy, dsdy);
+ } else {
+ t.setMatrix(mSurfaceControl, dsdx, dtdx, dtdy, dsdy);
+ }
} catch (RuntimeException e) {
// If something goes wrong with the surface (such
// as running out of memory), don't take down the
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
index 1211f00..2f2afd7 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -44,6 +44,7 @@
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.mock;
@SmallTest
public class DisplayManagerServiceTest extends AndroidTestCase {
@@ -123,7 +124,7 @@
"Test Virtual Display", width, height, dpi, null /* surface */, flags /* flags */,
uniqueId);
- displayManager.performTraversalInTransactionFromWindowManagerInternal();
+ displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
// flush the handler
displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */);
@@ -161,7 +162,7 @@
"Test Virtual Display", width, height, dpi, null /* surface */, flags /* flags */,
uniqueId);
- displayManager.performTraversalInTransactionFromWindowManagerInternal();
+ displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class));
// flush the handler
displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */);
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index a3a3080..ee7084a 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -25,6 +25,7 @@
*/
import android.os.SystemProperties;
+import android.telephony.TelephonyManager;
/**
* {@hide}
@@ -162,8 +163,8 @@
int NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = 20; /* TD-SCDMA, GSM/WCDMA and LTE */
int NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 21; /*TD-SCDMA,EvDo,CDMA,GSM/WCDMA*/
int NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 22; /* TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo */
- int PREFERRED_NETWORK_MODE = SystemProperties.getInt("ro.telephony.default_network",
- NETWORK_MODE_WCDMA_PREF);
+ int PREFERRED_NETWORK_MODE = Integer.parseInt(TelephonyManager.getTelephonyProperty(0,
+ "ro.telephony.default_network", Integer.toString(NETWORK_MODE_WCDMA_PREF)));
int BAND_MODE_UNSPECIFIED = 0; //"unspecified" (selected by baseband automatically)
int BAND_MODE_EURO = 1; //"EURO band" (GSM-900 / DCS-1800 / WCDMA-IMT-2000)
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 93fa598..6865f77 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -86,9 +86,6 @@
/** WPA is not used; plaintext or static WEP could be used. */
public static final int NONE = 0;
/** WPA pre-shared key (requires {@code preSharedKey} to be specified). */
- /** @deprecated Due to security and performance limitations, use of WPA-1 networks
- * is discouraged. WPA-2 (RSN) should be used instead. */
- @Deprecated
public static final int WPA_PSK = 1;
/** WPA using EAP authentication. Generally used with an external authentication server. */
public static final int WPA_EAP = 2;
@@ -122,7 +119,7 @@
public static final String varName = "key_mgmt";
- public static final String[] strings = { "NONE", /* deprecated */ "WPA_PSK", "WPA_EAP",
+ public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP",
"IEEE8021X", "WPA2_PSK", "OSEN", "FT_PSK", "FT_EAP" };
}
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java b/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
index eca8406..ebf6007 100644
--- a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
+++ b/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
@@ -133,7 +133,8 @@
* match filter. For {@link PublishConfig#PUBLISH_TYPE_SOLICITED},
* {@link SubscribeConfig#SUBSCRIBE_TYPE_ACTIVE} discovery sessions this
* is the subscriber's match filter.
- * @param distanceMm The measured distance to the Publisher in mm.
+ * @param distanceMm The measured distance to the Publisher in mm. Note: the measured distance
+ * may be negative for very close devices.
*/
public void onServiceDiscoveredWithinRange(PeerHandle peerHandle,
byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm) {
diff --git a/wifi/java/android/net/wifi/rtt/RangingResult.java b/wifi/java/android/net/wifi/rtt/RangingResult.java
index 4705e1d..7fe85be 100644
--- a/wifi/java/android/net/wifi/rtt/RangingResult.java
+++ b/wifi/java/android/net/wifi/rtt/RangingResult.java
@@ -147,6 +147,8 @@
* @return The distance (in mm) to the device specified by {@link #getMacAddress()} or
* {@link #getPeerHandle()}.
* <p>
+ * Note: the measured distance may be negative for very close devices.
+ * <p>
* Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
* exception.
*/