Merge "Add MANAGED_PROVISIONING_DPC_DOWNLOADED."
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index e198489..1779a80 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -11074,6 +11074,13 @@
*
* <p>Do not modify the provided list after this method is called.</p>
*
+ * <p>Note: the system will put a limit of <code>200dp</code> on the vertical extent of the
+ * exclusions it takes into account. The limit does not apply while the navigation
+ * bar is {@link #SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the
+ * {@link android.inputmethodservice.InputMethodService input method} and
+ * {@link Intent#CATEGORY_HOME home activity}.
+ * </p>
+ *
* @param rects A list of precision gesture regions that this view needs to function correctly
*/
public void setSystemGestureExclusionRects(@NonNull List<Rect> rects) {
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index 9340b71..bcc6a55 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -35,6 +35,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
+import android.content.Intent;
import android.graphics.Insets;
import android.graphics.Rect;
import android.util.SparseArray;
@@ -644,6 +645,14 @@
* {@link View#setSystemGestureExclusionRects} outside of the
* {@link #getMandatorySystemGestureInsets() mandatory system gesture insets}.
*
+ * <p>Note: the system will put a limit of <code>200dp</code> on the vertical extent of the
+ * exclusions it takes into account. The limit does not apply while the navigation
+ * bar is {@link View#SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the
+ * {@link android.inputmethodservice.InputMethodService input method} and
+ * {@link Intent#CATEGORY_HOME home activity}.
+ * </p>
+ *
+ *
* <p>Simple taps are guaranteed to reach the window even within the system gesture insets,
* as long as they are outside the {@link #getTappableElementInsets() system window insets}.
*
diff --git a/core/java/android/view/textclassifier/SelectionEvent.java b/core/java/android/view/textclassifier/SelectionEvent.java
index 80c728f..12ed4b9 100644
--- a/core/java/android/view/textclassifier/SelectionEvent.java
+++ b/core/java/android/view/textclassifier/SelectionEvent.java
@@ -410,6 +410,15 @@
}
/**
+ * Sets the id of this event's user.
+ * <p>
+ * Package-private for SystemTextClassifier's use.
+ */
+ void setUserId(@UserIdInt int userId) {
+ mUserId = userId;
+ }
+
+ /**
* Returns the id of this event's user.
* @hide
*/
diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java
index b5f972a..a97c330 100644
--- a/core/java/android/view/textclassifier/SystemTextClassifier.java
+++ b/core/java/android/view/textclassifier/SystemTextClassifier.java
@@ -151,6 +151,7 @@
Utils.checkMainThread();
try {
+ event.setUserId(mUserId);
mManagerService.onSelectionEvent(mSessionId, event);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Error reporting selection event.", e);
@@ -163,6 +164,12 @@
Utils.checkMainThread();
try {
+ final TextClassificationContext tcContext = event.getEventContext() == null
+ ? new TextClassificationContext.Builder(mPackageName, WIDGET_TYPE_UNKNOWN)
+ .build()
+ : event.getEventContext();
+ tcContext.setUserId(mUserId);
+ event.setEventContext(tcContext);
mManagerService.onTextClassifierEvent(mSessionId, event);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Error reporting textclassifier event.", e);
diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java
index 57da829..a041296 100644
--- a/core/java/android/view/textclassifier/TextClassifierEvent.java
+++ b/core/java/android/view/textclassifier/TextClassifierEvent.java
@@ -139,7 +139,7 @@
@Nullable
private final String[] mEntityTypes;
@Nullable
- private final TextClassificationContext mEventContext;
+ private TextClassificationContext mEventContext;
@Nullable
private final String mResultId;
private final int mEventIndex;
@@ -289,6 +289,15 @@
}
/**
+ * Sets the event context.
+ * <p>
+ * Package-private for SystemTextClassifier's use.
+ */
+ void setEventContext(@Nullable TextClassificationContext eventContext) {
+ mEventContext = eventContext;
+ }
+
+ /**
* Returns the id of the text classifier result related to this event.
*/
@Nullable
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
index 8fe2316..7c50337 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
@@ -47,6 +47,13 @@
*/
public static final String NAS_MAX_SUGGESTIONS = "nas_max_suggestions";
+ // Flags related to controls
+
+ /**
+ * (boolean) Wether to have split behavior when opening QS
+ */
+ public static final String QS_SPLIT_ENABLED = "qs_split_enabled";
+
// Flags related to Smart Suggestions - these are read in SmartReplyConstants.
/** (boolean) Whether to enable smart suggestions in notifications. */
diff --git a/libs/hwui/surfacetexture/ImageConsumer.cpp b/libs/hwui/surfacetexture/ImageConsumer.cpp
index bae616b..17ee17d 100644
--- a/libs/hwui/surfacetexture/ImageConsumer.cpp
+++ b/libs/hwui/surfacetexture/ImageConsumer.cpp
@@ -71,13 +71,16 @@
void makeImage(sp<GraphicBuffer>& graphicBuffer, android_dataspace dataspace,
GrContext* context);
+ void newBufferContent(GrContext* context);
+
private:
// The only way to invoke dtor is with unref, when mUsageCount is 0.
~AutoBackendTextureRelease() {}
GrBackendTexture mBackendTexture;
GrAHardwareBufferUtils::DeleteImageProc mDeleteProc;
- GrAHardwareBufferUtils::DeleteImageCtx mDeleteCtx;
+ GrAHardwareBufferUtils::UpdateImageProc mUpdateProc;
+ GrAHardwareBufferUtils::TexImageCtx mImageCtx;
// Starting with refcount 1, because the first ref is held by SurfaceTexture. Additional refs
// are held by SkImages.
@@ -101,7 +104,8 @@
buffer->getWidth(),
buffer->getHeight(),
&mDeleteProc,
- &mDeleteCtx,
+ &mUpdateProc,
+ &mImageCtx,
createProtectedImage,
backendFormat,
false);
@@ -123,7 +127,7 @@
mUsageCount--;
if (mUsageCount <= 0) {
if (mBackendTexture.isValid()) {
- mDeleteProc(mDeleteCtx);
+ mDeleteProc(mImageCtx);
mBackendTexture = {};
}
delete this;
@@ -154,6 +158,12 @@
}
}
+void AutoBackendTextureRelease::newBufferContent(GrContext* context) {
+ if (mBackendTexture.isValid()) {
+ mUpdateProc(mImageCtx, context);
+ }
+}
+
void ImageConsumer::ImageSlot::createIfNeeded(sp<GraphicBuffer> graphicBuffer,
android_dataspace dataspace, bool forceCreate,
GrContext* context) {
@@ -166,6 +176,8 @@
if (!mTextureRelease) {
mTextureRelease = new AutoBackendTextureRelease(context, graphicBuffer.get());
+ } else {
+ mTextureRelease->newBufferContent(context);
}
mDataspace = dataspace;
diff --git a/libs/hwui/surfacetexture/ImageConsumer.h b/libs/hwui/surfacetexture/ImageConsumer.h
index 2fdece9..3e2a91a 100644
--- a/libs/hwui/surfacetexture/ImageConsumer.h
+++ b/libs/hwui/surfacetexture/ImageConsumer.h
@@ -26,11 +26,6 @@
#include <gui/BufferItem.h>
#include <system/graphics.h>
-namespace GrAHardwareBufferUtils {
-typedef void* DeleteImageCtx;
-typedef void (*DeleteImageProc)(DeleteImageCtx);
-}
-
namespace android {
namespace uirenderer {
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 4fae3c5..76c1045 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -42,6 +42,32 @@
android:visibility="gone"
/>
+ <LinearLayout
+ android:id="@+id/divider_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:background="@color/transparent" >
+
+ <android.widget.Space
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="@integer/qqs_split_fraction" />
+
+ <com.android.systemui.DarkReceiverImpl
+ android:id="@+id/divider"
+ android:layout_height="match_parent"
+ android:layout_width="1dp"
+ android:layout_marginTop="4dp"
+ android:layout_marginBottom="4dp" />
+
+ <android.widget.Space
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="@integer/qs_split_fraction" />
+
+ </LinearLayout>
+
<LinearLayout android:id="@+id/status_bar_contents"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/values/integers.xml b/packages/SystemUI/res/values/integers.xml
index a6dae45..deae7e2 100644
--- a/packages/SystemUI/res/values/integers.xml
+++ b/packages/SystemUI/res/values/integers.xml
@@ -27,4 +27,9 @@
performance issues arise. -->
<integer name="bubbles_max_rendered">5</integer>
+ <!-- Ratio of "left" end of status bar that will swipe to QQS. -->
+ <integer name="qqs_split_fraction">3</integer>
+ <!-- Ratio of "right" end of status bar that will swipe to QS. -->
+ <integer name="qs_split_fraction">2</integer>
+
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt b/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt
new file mode 100644
index 0000000..42d38cb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui
+
+import android.content.Context
+import android.graphics.Rect
+import android.util.AttributeSet
+import android.view.View
+import com.android.systemui.plugins.DarkIconDispatcher
+
+class DarkReceiverImpl @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyle: Int = 0,
+ defStyleRes: Int = 0
+) : View(context, attrs, defStyle, defStyleRes), DarkIconDispatcher.DarkReceiver {
+
+ private val dualToneHandler = DualToneHandler(context)
+
+ init {
+ onDarkChanged(Rect(), 1f, DarkIconDispatcher.DEFAULT_ICON_TINT)
+ }
+
+ override fun onDarkChanged(area: Rect?, darkIntensity: Float, tint: Int) {
+ val intensity = if (DarkIconDispatcher.isInArea(area, this)) darkIntensity else 0f
+ setBackgroundColor(dualToneHandler.getSingleColor(intensity))
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 9652992..01dcbc7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -41,6 +41,7 @@
import android.graphics.Region;
import android.os.PowerManager;
import android.os.SystemClock;
+import android.provider.DeviceConfig;
import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
@@ -54,6 +55,7 @@
import android.widget.FrameLayout;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.keyguard.KeyguardClockSwitch;
@@ -135,6 +137,8 @@
*/
public static final int FLING_HIDE = 2;
+ private double mQqsSplitFraction;
+
// Cap and total height of Roboto font. Needs to be adjusted when font for the big clock is
// changed.
private static final int CAP_HEIGHT = 1456;
@@ -527,6 +531,9 @@
com.android.internal.R.dimen.status_bar_height);
mHeadsUpInset = statusbarHeight + getResources().getDimensionPixelSize(
R.dimen.heads_up_status_bar_padding);
+ mQqsSplitFraction = ((float) getResources().getInteger(R.integer.qqs_split_fraction)) / (
+ getResources().getInteger(R.integer.qqs_split_fraction)
+ + getResources().getInteger(R.integer.qs_split_fraction));
}
/**
@@ -1269,6 +1276,17 @@
|| y <= mQs.getView().getY() + mQs.getView().getHeight());
}
+ private boolean isOnQsEndArea(float x) {
+ if (!isQsSplitEnabled()) return false;
+ if (getLayoutDirection() == LAYOUT_DIRECTION_LTR) {
+ return x >= mQsFrame.getX() + mQqsSplitFraction * mQsFrame.getWidth()
+ && x <= mQsFrame.getX() + mQsFrame.getWidth();
+ } else {
+ return x >= mQsFrame.getX()
+ && x <= mQsFrame.getX() + (1 - mQqsSplitFraction) * mQsFrame.getWidth();
+ }
+ }
+
private boolean isOpenQsEvent(MotionEvent event) {
final int pointerCount = event.getPointerCount();
final int action = event.getActionMasked();
@@ -1284,7 +1302,9 @@
&& (event.isButtonPressed(MotionEvent.BUTTON_SECONDARY)
|| event.isButtonPressed(MotionEvent.BUTTON_TERTIARY));
- return twoFingerDrag || stylusButtonClickDrag || mouseButtonClickDrag;
+ final boolean onHeaderRight = isOnQsEndArea(event.getX());
+
+ return twoFingerDrag || stylusButtonClickDrag || mouseButtonClickDrag || onHeaderRight;
}
private void handleQsDown(MotionEvent event) {
@@ -1538,6 +1558,7 @@
} else {
mKeyguardStatusBar.setAlpha(1f);
mKeyguardStatusBar.setVisibility(keyguardShowing ? View.VISIBLE : View.INVISIBLE);
+ ((PhoneStatusBarView) mBar).maybeShowDivider(keyguardShowing);
if (keyguardShowing && oldState != mBarState) {
if (mQs != null) {
mQs.hideImmediately();
@@ -3422,4 +3443,8 @@
mOnReinflationListener = onReinflationListener;
}
+ public static boolean isQsSplitEnabled() {
+ return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.QS_SPLIT_ENABLED, false);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
index a7d5aca..96b4b22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
@@ -32,7 +32,7 @@
private final PhoneStatusBarView mView;
private final float mIconAlphaWhenOpaque;
- private View mLeftSide, mStatusIcons, mBattery, mClock;
+ private View mLeftSide, mStatusIcons, mBattery, mClock, mDivider;
private Animator mCurrentAnimation;
public PhoneStatusBarTransitions(PhoneStatusBarView view) {
@@ -46,6 +46,7 @@
mLeftSide = mView.findViewById(R.id.status_bar_left_side);
mStatusIcons = mView.findViewById(R.id.statusIcons);
mBattery = mView.findViewById(R.id.battery);
+ mDivider = mView.findViewById(R.id.divider);
applyModeBackground(-1, getMode(), false /*animate*/);
applyMode(getMode(), false /*animate*/);
}
@@ -88,6 +89,7 @@
anims.playTogether(
animateTransitionTo(mLeftSide, newAlpha),
animateTransitionTo(mStatusIcons, newAlpha),
+ animateTransitionTo(mDivider, newAlpha),
animateTransitionTo(mBattery, newAlphaBC)
);
if (isLightsOut(mode)) {
@@ -98,6 +100,7 @@
} else {
mLeftSide.setAlpha(newAlpha);
mStatusIcons.setAlpha(newAlpha);
+ mDivider.setAlpha(newAlpha);
mBattery.setAlpha(newAlphaBC);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 8efd952..53e1467 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -26,6 +26,7 @@
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
+import android.provider.DeviceConfig;
import android.util.AttributeSet;
import android.util.EventLog;
import android.util.Pair;
@@ -40,6 +41,8 @@
import android.widget.FrameLayout;
import android.widget.LinearLayout;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+import com.android.systemui.DarkReceiverImpl;
import com.android.systemui.Dependency;
import com.android.systemui.EventLogTags;
import com.android.systemui.R;
@@ -78,6 +81,10 @@
private View mCutoutSpace;
@Nullable
private DisplayCutout mDisplayCutout;
+
+ private DarkReceiverImpl mSplitDivider;
+ private View mDividerContainer;
+ private QsSplitPropertyListener mPropertyListener;
/**
* Draw this many pixels into the left/right side of the cutout to optimally use the space
*/
@@ -109,6 +116,10 @@
mBattery = findViewById(R.id.battery);
mCutoutSpace = findViewById(R.id.cutout_space_view);
mCenterIconSpace = findViewById(R.id.centered_icon_area);
+ mSplitDivider = findViewById(R.id.divider);
+ mDividerContainer = findViewById(R.id.divider_container);
+ maybeShowDivider(true);
+ mPropertyListener = new QsSplitPropertyListener(mDividerContainer);
updateResources();
}
@@ -118,16 +129,26 @@
super.onAttachedToWindow();
// Always have Battery meters in the status bar observe the dark/light modes.
Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mBattery);
+ Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mSplitDivider);
+ maybeShowDivider(true);
if (updateOrientationAndCutout(getResources().getConfiguration().orientation)) {
updateLayoutForCutout();
}
+ if (mPropertyListener != null) {
+ DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+ mContext.getMainExecutor(), mPropertyListener);
+ }
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mBattery);
+ Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mSplitDivider);
mDisplayCutout = null;
+ if (mPropertyListener != null) {
+ DeviceConfig.removeOnPropertiesChangedListener(mPropertyListener);
+ }
}
@Override
@@ -196,6 +217,7 @@
public void onPanelPeeked() {
super.onPanelPeeked();
mBar.makeExpandedVisible(false);
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
@@ -204,6 +226,7 @@
// Close the status bar in the next frame so we can show the end of the animation.
post(mHideExpandedRunnable);
mIsFullyOpenedPanel = false;
+ maybeShowDivider(!mBar.mPanelExpanded);
}
public void removePendingHideExpandedRunnables() {
@@ -217,6 +240,7 @@
mPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
mIsFullyOpenedPanel = true;
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
@@ -240,24 +264,28 @@
mBar.onTrackingStarted();
mScrimController.onTrackingStarted();
removePendingHideExpandedRunnables();
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
public void onClosingFinished() {
super.onClosingFinished();
mBar.onClosingFinished();
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
public void onTrackingStopped(boolean expand) {
super.onTrackingStopped(expand);
mBar.onTrackingStopped(expand);
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
public void onExpandingFinished() {
super.onExpandingFinished();
mScrimController.onExpandingFinished();
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
@@ -390,4 +418,30 @@
protected boolean shouldPanelBeVisible() {
return mHeadsUpVisible || super.shouldPanelBeVisible();
}
+
+ void maybeShowDivider(boolean showDivider) {
+ int state =
+ showDivider && NotificationPanelView.isQsSplitEnabled() ? View.VISIBLE : View.GONE;
+ mDividerContainer.setVisibility(state);
+ }
+
+ private static class QsSplitPropertyListener implements
+ DeviceConfig.OnPropertiesChangedListener {
+ private final View mDivider;
+
+ QsSplitPropertyListener(View divider) {
+ mDivider = divider;
+ }
+
+ @Override
+ public void onPropertiesChanged(DeviceConfig.Properties properties) {
+ if (properties.getNamespace().equals(DeviceConfig.NAMESPACE_SYSTEMUI)
+ && properties.getKeyset().contains(
+ SystemUiDeviceConfigFlags.QS_SPLIT_ENABLED)) {
+ boolean splitEnabled = properties.getBoolean(
+ SystemUiDeviceConfigFlags.QS_SPLIT_ENABLED, false);
+ mDivider.setVisibility(splitEnabled ? VISIBLE : GONE);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelper.java b/services/core/java/com/android/server/pm/PackageAbiHelper.java
index 6f46564..c21d0cf 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelper.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelper.java
@@ -26,7 +26,7 @@
import java.util.Set;
@VisibleForTesting
-interface PackageAbiHelper {
+public interface PackageAbiHelper {
/**
* Derive and get the location of native libraries for the given package,
* which varies depending on where and how the package was installed.
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 8960dfb..2b99221 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -92,6 +92,7 @@
import static android.os.storage.StorageManager.FLAG_STORAGE_EXTERNAL;
import static android.permission.PermissionManager.KILL_APP_REASON_GIDS_CHANGED;
+import static com.android.internal.annotations.VisibleForTesting.Visibility;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME;
@@ -314,7 +315,6 @@
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.permission.PermissionsState;
import com.android.server.policy.PermissionPolicyInternal;
-import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback;
import com.android.server.security.VerityUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
import com.android.server.utils.TimingsTraceAndSlog;
@@ -663,7 +663,7 @@
// Lock for state used when installing and doing other long running
// operations. Methods that must be called with this lock held have
// the suffix "LI".
- final Object mInstallLock = new Object();
+ final Object mInstallLock;
// ----------------------------------------------------------------
@@ -697,6 +697,9 @@
*/
boolean mPromoteSystemApps;
+ private final PackageManagerInternal mPmInternal;
+
+
@GuardedBy("mLock")
final Settings mSettings;
@@ -752,25 +755,112 @@
private final Injector mInjector;
/**
- * Unit tests will instantiate and / or extend to mock dependencies / behaviors.
+ * Unit tests will instantiate, extend and/or mock to mock dependencies / behaviors.
+ *
+ * NOTE: All getters should return the same instance for every call.
*/
- @VisibleForTesting
- static class Injector {
- private final UserManagerInternal mUserManager;
- private final PackageAbiHelper mAbiHelper;
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ public static class Injector {
- Injector(UserManagerInternal userManager, PackageAbiHelper abiHelper) {
- mUserManager = userManager;
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ interface Producer<T> {
+ /** Produce an instance of type {@link T} */
+ T produce(Injector injector, PackageManagerService packageManager);
+ }
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ static class Singleton<T> {
+ private final Producer<T> mProducer;
+ private volatile T mInstance = null;
+ Singleton(Producer<T> producer) {
+ this.mProducer = producer;
+ }
+ T get(Injector injector, PackageManagerService packageManagerService) {
+ if (mInstance == null) {
+ mInstance = mProducer.produce(injector, packageManagerService);
+ }
+ return mInstance;
+ }
+ }
+
+ private final PackageAbiHelper mAbiHelper;
+ private final Context mContext;
+ private final Object mLock;
+ private final Installer mInstaller;
+ private final Object mInstallLock;
+
+ // ----- producers -----
+
+ private final Singleton<ComponentResolver> mComponentResolverProducer;
+ private final Singleton<PermissionManagerServiceInternal> mPermissionManagerProducer;
+ private final Singleton<UserManagerService> mUserManagerProducer;
+ private final Singleton<Settings> mSettingsProducer;
+ private PackageManagerService mPackageManager;
+
+ Injector(Context context, Object lock, Installer installer,
+ Object installLock, PackageAbiHelper abiHelper,
+ Producer<ComponentResolver> componentResolverProducer,
+ Producer<PermissionManagerServiceInternal> permissionManagerProducer,
+ Producer<UserManagerService> userManagerProducer,
+ Producer<Settings> settingsProducer) {
+ mContext = context;
+ mLock = lock;
+ mInstaller = installer;
mAbiHelper = abiHelper;
+ mInstallLock = installLock;
+ mComponentResolverProducer = new Singleton<>(componentResolverProducer);
+ mPermissionManagerProducer = new Singleton<>(permissionManagerProducer);
+ mUserManagerProducer = new Singleton<>(userManagerProducer);
+ mSettingsProducer = new Singleton<>(settingsProducer);
+ }
+
+ /**
+ * Bootstraps this injector with the {@link PackageManagerService instance to which it
+ * belongs.
+ */
+ public void bootstrap(PackageManagerService pm) {
+ this.mPackageManager = pm;
}
public UserManagerInternal getUserManager() {
- return mUserManager;
+ return getUserManagerService().getInternalForInjectorOnly();
}
public PackageAbiHelper getAbiHelper() {
return mAbiHelper;
}
+
+ public Object getInstallLock() {
+ return mInstallLock;
+ }
+
+ public UserManagerService getUserManagerService() {
+ return mUserManagerProducer.get(this, mPackageManager);
+ }
+
+ public Object getLock() {
+ return mLock;
+ }
+
+ public Installer getInstaller() {
+ return mInstaller;
+ }
+
+ public ComponentResolver getComponentResolver() {
+ return mComponentResolverProducer.get(this, mPackageManager);
+ }
+
+ public PermissionManagerServiceInternal getPermissionManagerServiceInternal() {
+ return mPermissionManagerProducer.get(this, mPackageManager);
+ }
+
+ public Context getContext() {
+ return mContext;
+ }
+
+ public Settings getSettings() {
+ return mSettingsProducer.get(this, mPackageManager);
+ }
}
private final AppsFilter mAppsFilter;
@@ -987,7 +1077,6 @@
// List of packages names to keep cached, even if they are uninstalled for all users
private List<String> mKeepUninstalledPackages;
- private UserManagerInternal mUserManagerInternal;
private ActivityManagerInternal mActivityManagerInternal;
private ActivityTaskManagerInternal mActivityTaskManagerInternal;
private StorageManagerInternal mStorageManagerInternal;
@@ -2239,10 +2328,30 @@
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
- final Object packageLock = new Object();
+ final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
+ Trace.TRACE_TAG_PACKAGE_MANAGER);
+ t.traceBegin("create package manager");
+ final Object lock = new Object();
+ final Object installLock = new Object();
- PackageManagerService m = new PackageManagerService(context, installer,
- factoryTest, onlyCore, packageLock);
+ Injector injector = new Injector(context, lock, installer, installLock,
+ new PackageAbiHelperImpl(),
+ (i, pm) ->
+ new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock),
+ (i, pm) ->
+ PermissionManagerService.create(context, lock),
+ (i, pm) ->
+ new UserManagerService(context, pm,
+ new UserDataPreparer(installer, installLock, context, onlyCore),
+ lock),
+ (i, pm) ->
+ new Settings(Environment.getDataDirectory(),
+ i.getPermissionManagerServiceInternal().getPermissionSettings(),
+ lock));
+
+ PackageManagerService m = new PackageManagerService(injector, factoryTest, onlyCore);
+ t.traceEnd(); // "create package manager"
+
m.enableSystemUserPackages();
ServiceManager.addService("package", m);
final PackageManagerNative pmn = m.new PackageManagerNative();
@@ -2333,12 +2442,13 @@
}
}
- public PackageManagerService(Context context, Installer installer, boolean factoryTest,
- boolean onlyCore, Object packageLock) {
+ public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
Trace.TRACE_TAG_PACKAGE_MANAGER);
- t.traceBegin("create package manager");
- mLock = packageLock;
+ mInjector = injector;
+ mInjector.bootstrap(this);
+ mLock = injector.getLock();
+ mInstallLock = injector.getInstallLock();
LockGuard.installLock(mLock, LockGuard.INDEX_PACKAGES);
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
SystemClock.uptimeMillis());
@@ -2347,38 +2457,25 @@
Slog.w(TAG, "**** ro.build.version.sdk not set!");
}
- mContext = context;
+ mContext = injector.getContext();
mFactoryTest = factoryTest;
mOnlyCore = onlyCore;
mMetrics = new DisplayMetrics();
- mInstaller = installer;
+ mInstaller = injector.getInstaller();
// Create sub-components that provide services / data. Order here is important.
t.traceBegin("createSubComponents");
- // CHECKSTYLE:OFF IndentationCheck
- synchronized (mInstallLock) {
- synchronized (mLock) {
- // Expose private service for system components to use.
- LocalServices.addService(
- PackageManagerInternal.class, new PackageManagerInternalImpl());
- sUserManager = new UserManagerService(context, this,
- new UserDataPreparer(mInstaller, mInstallLock, mContext, mOnlyCore),
- mLock);
- mComponentResolver = new ComponentResolver(sUserManager,
- LocalServices.getService(PackageManagerInternal.class),
- mLock);
- mPermissionManager = PermissionManagerService.create(context,
- mLock /*externalLock*/);
- mPermissionManagerService =
- (IPermissionManager) ServiceManager.getService("permissionmgr");
- mSettings = new Settings(Environment.getDataDirectory(),
- mPermissionManager.getPermissionSettings(), mLock);
- }
- }
- // TODO(b/137961986): We should pass this via constructor, but would first need to create
- // a packages lock that could also be passed in.
- mInjector = new Injector(getUserManagerInternal(), new PackageAbiHelperImpl());
+ // Expose private service for system components to use.
+ mPmInternal = new PackageManagerInternalImpl();
+ LocalServices.addService(PackageManagerInternal.class, mPmInternal);
+ sUserManager = injector.getUserManagerService();
+ mComponentResolver = injector.getComponentResolver();
+ mPermissionManager = injector.getPermissionManagerServiceInternal();
+ mSettings = injector.getSettings();
+ mPermissionManagerService = (IPermissionManager) ServiceManager.getService("permissionmgr");
+
+
// CHECKSTYLE:ON IndentationCheck
t.traceEnd();
@@ -2418,15 +2515,16 @@
mSeparateProcesses = null;
}
- mPackageDexOptimizer = new PackageDexOptimizer(installer, mInstallLock, context,
+ mPackageDexOptimizer = new PackageDexOptimizer(mInstaller, mInstallLock, mContext,
"*dexopt*");
- mDexManager = new DexManager(mContext, this, mPackageDexOptimizer, installer, mInstallLock);
- mArtManagerService = new ArtManagerService(mContext, this, installer, mInstallLock);
+ mDexManager =
+ new DexManager(mContext, this, mPackageDexOptimizer, mInstaller, mInstallLock);
+ mArtManagerService = new ArtManagerService(mContext, this, mInstaller, mInstallLock);
mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper());
mViewCompiler = new ViewCompiler(mInstallLock, mInstaller);
- getDefaultDisplayMetrics(context, mMetrics);
+ getDefaultDisplayMetrics(mContext, mMetrics);
t.traceBegin("get system config");
SystemConfig systemConfig = SystemConfig.getInstance();
@@ -2435,8 +2533,8 @@
mProtectedPackages = new ProtectedPackages(mContext);
- mApexManager = ApexManager.create(context);
- mAppsFilter = AppsFilter.create(context);
+ mApexManager = ApexManager.create(mContext);
+ mAppsFilter = AppsFilter.create(mContext);
// CHECKSTYLE:OFF IndentationCheck
synchronized (mInstallLock) {
@@ -3136,7 +3234,7 @@
// If this is the first boot or an update from pre-M, and it is a normal
// boot, then we need to initialize the default preferred apps across
// all defined users.
- if (!onlyCore && (mPromoteSystemApps || mFirstBoot)) {
+ if (!mOnlyCore && (mPromoteSystemApps || mFirstBoot)) {
for (UserInfo user : sUserManager.getUsers(true)) {
mSettings.applyDefaultPreferredAppsLPw(user.id);
primeDomainVerificationsLPw(user.id);
@@ -3197,7 +3295,7 @@
// Note that we do *not* clear the application profiles. These remain valid
// across OTAs and are used to drive profile verification (post OTA) and
// profile compilation (without waiting to collect a fresh set of profiles).
- if (mIsUpgrade && !onlyCore) {
+ if (mIsUpgrade && !mOnlyCore) {
Slog.i(TAG, "Build fingerprint changed; clearing code caches");
for (int i = 0; i < mSettings.mPackages.size(); i++) {
final PackageSetting ps = mSettings.mPackages.valueAt(i);
@@ -3214,7 +3312,7 @@
// Grandfather existing (installed before Q) non-system apps to hide
// their icons in launcher.
- if (!onlyCore && mIsPreQUpgrade) {
+ if (!mOnlyCore && mIsPreQUpgrade) {
Slog.i(TAG, "Whitelisting all existing apps to hide their icons");
int size = mSettings.mPackages.size();
for (int i = 0; i < size; i++) {
@@ -3286,7 +3384,7 @@
}
}
- mInstallerService = new PackageInstallerService(context, this, mApexManager);
+ mInstallerService = new PackageInstallerService(mContext, this, mApexManager);
final Pair<ComponentName, String> instantAppResolverComponent =
getInstantAppResolverLPr();
if (instantAppResolverComponent != null) {
@@ -3342,8 +3440,6 @@
PackageParser.readConfigUseRoundIcon(mContext.getResources());
mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L);
-
- t.traceEnd(); // "create package manager"
}
/**
@@ -4861,7 +4957,7 @@
// give them what they want
} else {
// Caller expressed no opinion, so match based on user state
- if (getUserManagerInternal().isUserUnlockingOrUnlocked(userId)) {
+ if (mInjector.getUserManager().isUserUnlockingOrUnlocked(userId)) {
flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE;
} else {
flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE;
@@ -4870,13 +4966,6 @@
return flags;
}
- private UserManagerInternal getUserManagerInternal() {
- if (mUserManagerInternal == null) {
- mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
- }
- return mUserManagerInternal;
- }
-
private ActivityManagerInternal getActivityManagerInternal() {
if (mActivityManagerInternal == null) {
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
@@ -10834,7 +10923,7 @@
if (!createNewPackage) {
final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0;
- setInstantAppForUser(userManager, pkgSetting, userId, instantApp, fullApp);
+ setInstantAppForUser(injector, pkgSetting, userId, instantApp, fullApp);
}
// TODO(patb): see if we can do away with disabled check here.
if (disabledPkgSetting != null
@@ -12299,7 +12388,7 @@
private void sendBootCompletedBroadcastToSystemApp(String packageName, boolean includeStopped,
int userId) {
// If user is not running, the app didn't miss any broadcast
- if (!mUserManagerInternal.isUserRunning(userId)) {
+ if (!mInjector.getUserManager().isUserRunning(userId)) {
return;
}
final IActivityManager am = ActivityManager.getService();
@@ -12315,7 +12404,7 @@
android.app.AppOpsManager.OP_NONE, null, false, false, userId);
// Deliver BOOT_COMPLETED only if user is unlocked
- if (mUserManagerInternal.isUserUnlockingOrUnlocked(userId)) {
+ if (mInjector.getUserManager().isUserUnlockingOrUnlocked(userId)) {
Intent bcIntent = new Intent(Intent.ACTION_BOOT_COMPLETED).setPackage(packageName);
if (includeStopped) {
bcIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
@@ -12614,8 +12703,7 @@
// upgrade app from instant to full; we don't allow app downgrade
installed = true;
}
- setInstantAppForUser(
- getUserManagerInternal(), pkgSetting, userId, instantApp, fullApp);
+ setInstantAppForUser(mInjector, pkgSetting, userId, instantApp, fullApp);
}
if (installed) {
@@ -12663,7 +12751,7 @@
}
}
- static void setInstantAppForUser(UserManagerInternal userManager, PackageSetting pkgSetting,
+ static void setInstantAppForUser(Injector injector, PackageSetting pkgSetting,
int userId, boolean instantApp, boolean fullApp) {
// no state specified; do nothing
if (!instantApp && !fullApp) {
@@ -12676,7 +12764,7 @@
pkgSetting.setInstantApp(false /*instantApp*/, userId);
}
} else {
- for (int currentUserId : userManager.getUserIds()) {
+ for (int currentUserId : injector.getUserManager().getUserIds()) {
if (instantApp && !pkgSetting.getInstantApp(currentUserId)) {
pkgSetting.setInstantApp(true /*instantApp*/, currentUserId);
} else if (fullApp && pkgSetting.getInstantApp(currentUserId)) {
@@ -18714,7 +18802,7 @@
final int appId = UserHandle.getAppId(pkg.applicationInfo.uid);
removeKeystoreDataIfNeeded(userId, appId);
- UserManagerInternal umInternal = getUserManagerInternal();
+ UserManagerInternal umInternal = mInjector.getUserManager();
final int flags;
if (umInternal.isUserUnlockingOrUnlocked(userId)) {
flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
@@ -21342,7 +21430,7 @@
// Reconcile app data for all started/unlocked users
final StorageManager sm = mContext.getSystemService(StorageManager.class);
final UserManager um = mContext.getSystemService(UserManager.class);
- UserManagerInternal umInternal = getUserManagerInternal();
+ UserManagerInternal umInternal = mInjector.getUserManager();
for (UserInfo user : um.getUsers()) {
final int flags;
if (umInternal.isUserUnlockingOrUnlocked(user.id)) {
@@ -21663,7 +21751,7 @@
}
final UserManager um = mContext.getSystemService(UserManager.class);
- UserManagerInternal umInternal = getUserManagerInternal();
+ UserManagerInternal umInternal = mInjector.getUserManager();
for (UserInfo user : um.getUsers()) {
final int flags;
if (umInternal.isUserUnlockingOrUnlocked(user.id)) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index f4ba449..2f30863 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -576,6 +576,14 @@
null, mHandler);
}
+ /**
+ * This method retrieves the {@link UserManagerInternal} only for the purpose of
+ * PackageManagerService construction.
+ */
+ UserManagerInternal getInternalForInjectorOnly() {
+ return mLocalService;
+ }
+
void cleanupPartialUsers() {
// Prune out any partially created, partially removed and ephemeral users.
ArrayList<UserInfo> partials = new ArrayList<>();
diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
index ab3d7b7..89a5305 100644
--- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
+++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
@@ -457,12 +457,12 @@
Preconditions.checkArgument(userId != UserHandle.USER_NULL, "Null userId");
final int callingUserId = UserHandle.getCallingUserId();
if (callingUserId != userId) {
- context.enforceCallingPermission(
+ context.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
"Invalid userId. UserId=" + userId + ", CallingUserId=" + callingUserId);
}
} catch (Exception e) {
- throw new RemoteException("Invalid request", e,
+ throw new RemoteException("Invalid request: " + e.getMessage(), e,
/* enableSuppression */ true, /* writableStackTrace */ true);
}
}
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index b94a7dc..cb15f57 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -42,184 +42,54 @@
import java.io.PrintWriter;
class ScreenRotationAnimation {
- static final String TAG = TAG_WITH_CLASS_NAME ? "ScreenRotationAnimation" : TAG_WM;
- static final boolean DEBUG_STATE = false;
- static final boolean DEBUG_TRANSFORMS = false;
- static final boolean TWO_PHASE_ANIMATION = false;
- static final boolean USE_CUSTOM_BLACK_FRAME = false;
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "ScreenRotationAnimation" : TAG_WM;
/*
* Layers for screen rotation animation. We put these layers above
* WINDOW_FREEZE_LAYER so that screen freeze will cover all windows.
*/
- static final int SCREEN_FREEZE_LAYER_BASE = WINDOW_FREEZE_LAYER + TYPE_LAYER_MULTIPLIER;
- static final int SCREEN_FREEZE_LAYER_ENTER = SCREEN_FREEZE_LAYER_BASE;
- static final int SCREEN_FREEZE_LAYER_SCREENSHOT = SCREEN_FREEZE_LAYER_BASE + 1;
- static final int SCREEN_FREEZE_LAYER_EXIT = SCREEN_FREEZE_LAYER_BASE + 2;
- static final int SCREEN_FREEZE_LAYER_CUSTOM = SCREEN_FREEZE_LAYER_BASE + 3;
+ private static final int SCREEN_FREEZE_LAYER_BASE = WINDOW_FREEZE_LAYER + TYPE_LAYER_MULTIPLIER;
+ private static final int SCREEN_FREEZE_LAYER_ENTER = SCREEN_FREEZE_LAYER_BASE;
+ private static final int SCREEN_FREEZE_LAYER_SCREENSHOT = SCREEN_FREEZE_LAYER_BASE + 1;
+ private static final int SCREEN_FREEZE_LAYER_EXIT = SCREEN_FREEZE_LAYER_BASE + 2;
- final Context mContext;
- final DisplayContent mDisplayContent;
- SurfaceControl mSurfaceControl;
- BlackFrame mCustomBlackFrame;
- BlackFrame mExitingBlackFrame;
- BlackFrame mEnteringBlackFrame;
- int mWidth, mHeight;
+ private final Context mContext;
+ private final DisplayContent mDisplayContent;
+ private final float[] mTmpFloats = new float[9];
+ private final Transformation mRotateExitTransformation = new Transformation();
+ private final Transformation mRotateEnterTransformation = new Transformation();
+ // Complete transformations being applied.
+ private final Transformation mExitTransformation = new Transformation();
+ private final Transformation mEnterTransformation = new Transformation();
+ private final Matrix mFrameInitialMatrix = new Matrix();
+ private final Matrix mSnapshotInitialMatrix = new Matrix();
+ private final Matrix mSnapshotFinalMatrix = new Matrix();
+ private final Matrix mExitFrameFinalMatrix = new Matrix();
+ private final WindowManagerService mService;
+ private SurfaceControl mSurfaceControl;
+ private BlackFrame mEnteringBlackFrame;
+ private int mWidth, mHeight;
- int mOriginalRotation;
- int mOriginalWidth, mOriginalHeight;
- int mCurRotation;
- Rect mOriginalDisplayRect = new Rect();
- Rect mCurrentDisplayRect = new Rect();
+ private int mOriginalRotation;
+ private int mOriginalWidth, mOriginalHeight;
+ private int mCurRotation;
- // For all animations, "exit" is for the UI elements that are going
- // away (that is the snapshot of the old screen), and "enter" is for
- // the new UI elements that are appearing (that is the active windows
- // in their final orientation).
-
- // The starting animation for the exiting and entering elements. This
- // animation applies a transformation while the rotation is in progress.
- // It is started immediately, before the new entering UI is ready.
- Animation mStartExitAnimation;
- final Transformation mStartExitTransformation = new Transformation();
- Animation mStartEnterAnimation;
- final Transformation mStartEnterTransformation = new Transformation();
- Animation mStartFrameAnimation;
- final Transformation mStartFrameTransformation = new Transformation();
-
- // The finishing animation for the exiting and entering elements. This
- // animation needs to undo the transformation of the starting animation.
- // It starts running once the new rotation UI elements are ready to be
- // displayed.
- Animation mFinishExitAnimation;
- final Transformation mFinishExitTransformation = new Transformation();
- Animation mFinishEnterAnimation;
- final Transformation mFinishEnterTransformation = new Transformation();
- Animation mFinishFrameAnimation;
- final Transformation mFinishFrameTransformation = new Transformation();
-
+ private Rect mOriginalDisplayRect = new Rect();
+ private Rect mCurrentDisplayRect = new Rect();
// The current active animation to move from the old to the new rotated
// state. Which animation is run here will depend on the old and new
// rotations.
- Animation mRotateExitAnimation;
- final Transformation mRotateExitTransformation = new Transformation();
- Animation mRotateEnterAnimation;
- final Transformation mRotateEnterTransformation = new Transformation();
- Animation mRotateFrameAnimation;
- final Transformation mRotateFrameTransformation = new Transformation();
-
- // A previously running rotate animation. This will be used if we need
- // to switch to a new rotation before finishing the previous one.
- Animation mLastRotateExitAnimation;
- final Transformation mLastRotateExitTransformation = new Transformation();
- Animation mLastRotateEnterAnimation;
- final Transformation mLastRotateEnterTransformation = new Transformation();
- Animation mLastRotateFrameAnimation;
- final Transformation mLastRotateFrameTransformation = new Transformation();
-
- // Complete transformations being applied.
- final Transformation mExitTransformation = new Transformation();
- final Transformation mEnterTransformation = new Transformation();
- final Transformation mFrameTransformation = new Transformation();
-
- boolean mStarted;
- boolean mAnimRunning;
- boolean mFinishAnimReady;
- long mFinishAnimStartTime;
- boolean mForceDefaultOrientation;
-
- final Matrix mFrameInitialMatrix = new Matrix();
- final Matrix mSnapshotInitialMatrix = new Matrix();
- final Matrix mSnapshotFinalMatrix = new Matrix();
- final Matrix mExitFrameFinalMatrix = new Matrix();
- final Matrix mTmpMatrix = new Matrix();
- final float[] mTmpFloats = new float[9];
+ private Animation mRotateExitAnimation;
+ private Animation mRotateEnterAnimation;
+ private boolean mStarted;
+ private boolean mAnimRunning;
+ private boolean mFinishAnimReady;
+ private long mFinishAnimStartTime;
+ private boolean mForceDefaultOrientation;
+ private BlackFrame mExitingBlackFrame;
private boolean mMoreRotateEnter;
private boolean mMoreRotateExit;
- private boolean mMoreRotateFrame;
- private boolean mMoreFinishEnter;
- private boolean mMoreFinishExit;
- private boolean mMoreFinishFrame;
- private boolean mMoreStartEnter;
- private boolean mMoreStartExit;
- private boolean mMoreStartFrame;
- long mHalfwayPoint;
-
- private final WindowManagerService mService;
-
- public void printTo(String prefix, PrintWriter pw) {
- pw.print(prefix); pw.print("mSurface="); pw.print(mSurfaceControl);
- pw.print(" mWidth="); pw.print(mWidth);
- pw.print(" mHeight="); pw.println(mHeight);
- if (USE_CUSTOM_BLACK_FRAME) {
- pw.print(prefix); pw.print("mCustomBlackFrame="); pw.println(mCustomBlackFrame);
- if (mCustomBlackFrame != null) {
- mCustomBlackFrame.printTo(prefix + " ", pw);
- }
- }
- pw.print(prefix); pw.print("mExitingBlackFrame="); pw.println(mExitingBlackFrame);
- if (mExitingBlackFrame != null) {
- mExitingBlackFrame.printTo(prefix + " ", pw);
- }
- pw.print(prefix); pw.print("mEnteringBlackFrame="); pw.println(mEnteringBlackFrame);
- if (mEnteringBlackFrame != null) {
- mEnteringBlackFrame.printTo(prefix + " ", pw);
- }
- pw.print(prefix); pw.print("mCurRotation="); pw.print(mCurRotation);
- pw.print(" mOriginalRotation="); pw.println(mOriginalRotation);
- pw.print(prefix); pw.print("mOriginalWidth="); pw.print(mOriginalWidth);
- pw.print(" mOriginalHeight="); pw.println(mOriginalHeight);
- pw.print(prefix); pw.print("mStarted="); pw.print(mStarted);
- pw.print(" mAnimRunning="); pw.print(mAnimRunning);
- pw.print(" mFinishAnimReady="); pw.print(mFinishAnimReady);
- pw.print(" mFinishAnimStartTime="); pw.println(mFinishAnimStartTime);
- pw.print(prefix); pw.print("mStartExitAnimation="); pw.print(mStartExitAnimation);
- pw.print(" "); mStartExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mStartEnterAnimation="); pw.print(mStartEnterAnimation);
- pw.print(" "); mStartEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mStartFrameAnimation="); pw.print(mStartFrameAnimation);
- pw.print(" "); mStartFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFinishExitAnimation="); pw.print(mFinishExitAnimation);
- pw.print(" "); mFinishExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFinishEnterAnimation="); pw.print(mFinishEnterAnimation);
- pw.print(" "); mFinishEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFinishFrameAnimation="); pw.print(mFinishFrameAnimation);
- pw.print(" "); mFinishFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mRotateExitAnimation="); pw.print(mRotateExitAnimation);
- pw.print(" "); mRotateExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mRotateEnterAnimation="); pw.print(mRotateEnterAnimation);
- pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mRotateFrameAnimation="); pw.print(mRotateFrameAnimation);
- pw.print(" "); mRotateFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mExitTransformation=");
- mExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mEnterTransformation=");
- mEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFrameTransformation=");
- mFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFrameInitialMatrix=");
- mFrameInitialMatrix.printShortString(pw);
- pw.println();
- pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
- mSnapshotInitialMatrix.printShortString(pw);
- pw.print(" mSnapshotFinalMatrix="); mSnapshotFinalMatrix.printShortString(pw);
- pw.println();
- pw.print(prefix); pw.print("mExitFrameFinalMatrix=");
- mExitFrameFinalMatrix.printShortString(pw);
- pw.println();
- pw.print(prefix); pw.print("mForceDefaultOrientation="); pw.print(mForceDefaultOrientation);
- if (mForceDefaultOrientation) {
- pw.print(" mOriginalDisplayRect="); pw.print(mOriginalDisplayRect.toShortString());
- pw.print(" mCurrentDisplayRect="); pw.println(mCurrentDisplayRect.toShortString());
- }
- }
-
- public void writeToProto(ProtoOutputStream proto, long fieldId) {
- final long token = proto.start(fieldId);
- proto.write(STARTED, mStarted);
- proto.write(ANIMATION_RUNNING, mAnimRunning);
- proto.end(token);
- }
+ private long mHalfwayPoint;
public ScreenRotationAnimation(Context context, DisplayContent displayContent,
boolean fixedToUserRotation, boolean isSecure, WindowManagerService service) {
@@ -276,7 +146,7 @@
final Surface surface = mService.mSurfaceFactory.make();
surface.copyFrom(mSurfaceControl);
SurfaceControl.ScreenshotGraphicBuffer gb =
- mService.mDisplayManagerInternal.screenshot(displayId);
+ mService.mDisplayManagerInternal.screenshot(displayId);
if (gb != null) {
try {
surface.attachAndQueueBufferWithColorSpace(gb.getGraphicBuffer(),
@@ -301,12 +171,42 @@
Slog.w(TAG, "Unable to allocate freeze surface", e);
}
- if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
- " FREEZE " + mSurfaceControl + ": CREATE");
+ if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
+ Slog.i(TAG_WM,
+ " FREEZE " + mSurfaceControl + ": CREATE");
+ }
setRotation(t, originalRotation);
t.apply();
}
+ private static void createRotationMatrix(int rotation, int width, int height,
+ Matrix outMatrix) {
+ switch (rotation) {
+ case Surface.ROTATION_0:
+ outMatrix.reset();
+ break;
+ case Surface.ROTATION_90:
+ outMatrix.setRotate(90, 0, 0);
+ outMatrix.postTranslate(height, 0);
+ break;
+ case Surface.ROTATION_180:
+ outMatrix.setRotate(180, 0, 0);
+ outMatrix.postTranslate(width, height);
+ break;
+ case Surface.ROTATION_270:
+ outMatrix.setRotate(270, 0, 0);
+ outMatrix.postTranslate(0, width);
+ break;
+ }
+ }
+
+ public void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long token = proto.start(fieldId);
+ proto.write(STARTED, mStarted);
+ proto.write(ANIMATION_RUNNING, mAnimRunning);
+ proto.end(token);
+ }
+
boolean hasScreenshot() {
return mSurfaceControl != null;
}
@@ -326,40 +226,55 @@
mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
t.setAlpha(mSurfaceControl, alpha);
- if (DEBUG_TRANSFORMS) {
- float[] srcPnts = new float[] { 0, 0, mWidth, mHeight };
- float[] dstPnts = new float[4];
- matrix.mapPoints(dstPnts, srcPnts);
- Slog.i(TAG, "Original : (" + srcPnts[0] + "," + srcPnts[1]
- + ")-(" + srcPnts[2] + "," + srcPnts[3] + ")");
- Slog.i(TAG, "Transformed: (" + dstPnts[0] + "," + dstPnts[1]
- + ")-(" + dstPnts[2] + "," + dstPnts[3] + ")");
- }
}
}
- public static void createRotationMatrix(int rotation, int width, int height,
- Matrix outMatrix) {
- switch (rotation) {
- case Surface.ROTATION_0:
- outMatrix.reset();
- break;
- case Surface.ROTATION_90:
- outMatrix.setRotate(90, 0, 0);
- outMatrix.postTranslate(height, 0);
- break;
- case Surface.ROTATION_180:
- outMatrix.setRotate(180, 0, 0);
- outMatrix.postTranslate(width, height);
- break;
- case Surface.ROTATION_270:
- outMatrix.setRotate(270, 0, 0);
- outMatrix.postTranslate(0, width);
- break;
+ public void printTo(String prefix, PrintWriter pw) {
+ pw.print(prefix); pw.print("mSurface="); pw.print(mSurfaceControl);
+ pw.print(" mWidth="); pw.print(mWidth);
+ pw.print(" mHeight="); pw.println(mHeight);
+ pw.print(prefix); pw.print("mExitingBlackFrame="); pw.println(mExitingBlackFrame);
+ if (mExitingBlackFrame != null) {
+ mExitingBlackFrame.printTo(prefix + " ", pw);
+ }
+ pw.print(prefix); pw.print("mEnteringBlackFrame="); pw.println(mEnteringBlackFrame);
+ if (mEnteringBlackFrame != null) {
+ mEnteringBlackFrame.printTo(prefix + " ", pw);
+ }
+ pw.print(prefix); pw.print("mCurRotation="); pw.print(mCurRotation);
+ pw.print(" mOriginalRotation="); pw.println(mOriginalRotation);
+ pw.print(prefix); pw.print("mOriginalWidth="); pw.print(mOriginalWidth);
+ pw.print(" mOriginalHeight="); pw.println(mOriginalHeight);
+ pw.print(prefix); pw.print("mStarted="); pw.print(mStarted);
+ pw.print(" mAnimRunning="); pw.print(mAnimRunning);
+ pw.print(" mFinishAnimReady="); pw.print(mFinishAnimReady);
+ pw.print(" mFinishAnimStartTime="); pw.println(mFinishAnimStartTime);
+ pw.print(prefix); pw.print("mRotateExitAnimation="); pw.print(mRotateExitAnimation);
+ pw.print(" "); mRotateExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mRotateEnterAnimation="); pw.print(mRotateEnterAnimation);
+ pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mExitTransformation=");
+ mExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mEnterTransformation=");
+ mEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mFrameInitialMatrix=");
+ mFrameInitialMatrix.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
+ mSnapshotInitialMatrix.printShortString(pw);
+ pw.print(" mSnapshotFinalMatrix="); mSnapshotFinalMatrix.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mExitFrameFinalMatrix=");
+ mExitFrameFinalMatrix.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mForceDefaultOrientation="); pw.print(mForceDefaultOrientation);
+ if (mForceDefaultOrientation) {
+ pw.print(" mOriginalDisplayRect="); pw.print(mOriginalDisplayRect.toShortString());
+ pw.print(" mCurrentDisplayRect="); pw.println(mCurrentDisplayRect.toShortString());
}
}
- private void setRotation(SurfaceControl.Transaction t, int rotation) {
+ public void setRotation(SurfaceControl.Transaction t, int rotation) {
mCurRotation = rotation;
// Compute the transformation matrix that must be applied
@@ -368,17 +283,12 @@
int delta = DisplayContent.deltaRotation(rotation, Surface.ROTATION_0);
createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix);
- if (DEBUG_STATE) Slog.v(TAG, "**** ROTATION: " + delta);
setSnapshotTransform(t, mSnapshotInitialMatrix, 1.0f);
}
public boolean setRotation(SurfaceControl.Transaction t, int rotation,
long maxAnimationDuration, float animationScale, int finalWidth, int finalHeight) {
setRotation(t, rotation);
- if (TWO_PHASE_ANIMATION) {
- return startAnimation(t, maxAnimationDuration, animationScale,
- finalWidth, finalHeight, false, 0, 0);
- }
// Don't start animation yet.
return false;
@@ -400,37 +310,9 @@
mStarted = true;
- boolean firstStart = false;
-
// Figure out how the screen has moved from the original rotation.
int delta = DisplayContent.deltaRotation(mCurRotation, mOriginalRotation);
- if (TWO_PHASE_ANIMATION && mFinishExitAnimation == null
- && (!dismissing || delta != Surface.ROTATION_0)) {
- if (DEBUG_STATE) Slog.v(TAG, "Creating start and finish animations");
- firstStart = true;
- mStartExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_start_exit);
- mStartEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_start_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mStartFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_start_frame);
- }
- mFinishExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_finish_exit);
- mFinishEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_finish_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mFinishFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_finish_frame);
- }
- }
-
- if (DEBUG_STATE) Slog.v(TAG, "Rotation delta: " + delta + " finalWidth="
- + finalWidth + " finalHeight=" + finalHeight
- + " origWidth=" + mOriginalWidth + " origHeight=" + mOriginalHeight);
-
final boolean customAnim;
if (exitAnim != 0 && enterAnim != 0) {
customAnim = true;
@@ -444,40 +326,24 @@
com.android.internal.R.anim.screen_rotate_0_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_0_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_0_frame);
- }
break;
case Surface.ROTATION_90:
mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_plus_90_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_plus_90_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_plus_90_frame);
- }
break;
case Surface.ROTATION_180:
mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_180_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_180_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_180_frame);
- }
break;
case Surface.ROTATION_270:
mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_minus_90_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_minus_90_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_minus_90_frame);
- }
break;
}
}
@@ -486,85 +352,16 @@
// means to allow supplying the last and next size. In this definition
// "%p" is the original (let's call it "previous") size, and "%" is the
// screen's current/new size.
- if (TWO_PHASE_ANIMATION && firstStart) {
- // Compute partial steps between original and final sizes. These
- // are used for the dimensions of the exiting and entering elements,
- // so they are never stretched too significantly.
- final int halfWidth = (finalWidth + mOriginalWidth) / 2;
- final int halfHeight = (finalHeight + mOriginalHeight) / 2;
-
- if (DEBUG_STATE) Slog.v(TAG, "Initializing start and finish animations");
- mStartEnterAnimation.initialize(finalWidth, finalHeight,
- halfWidth, halfHeight);
- mStartExitAnimation.initialize(halfWidth, halfHeight,
- mOriginalWidth, mOriginalHeight);
- mFinishEnterAnimation.initialize(finalWidth, finalHeight,
- halfWidth, halfHeight);
- mFinishExitAnimation.initialize(halfWidth, halfHeight,
- mOriginalWidth, mOriginalHeight);
- if (USE_CUSTOM_BLACK_FRAME) {
- mStartFrameAnimation.initialize(finalWidth, finalHeight,
- mOriginalWidth, mOriginalHeight);
- mFinishFrameAnimation.initialize(finalWidth, finalHeight,
- mOriginalWidth, mOriginalHeight);
- }
- }
mRotateEnterAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
mRotateExitAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation.initialize(finalWidth, finalHeight, mOriginalWidth,
- mOriginalHeight);
- }
mAnimRunning = false;
mFinishAnimReady = false;
mFinishAnimStartTime = -1;
- if (TWO_PHASE_ANIMATION && firstStart) {
- mStartExitAnimation.restrictDuration(maxAnimationDuration);
- mStartExitAnimation.scaleCurrentDuration(animationScale);
- mStartEnterAnimation.restrictDuration(maxAnimationDuration);
- mStartEnterAnimation.scaleCurrentDuration(animationScale);
- mFinishExitAnimation.restrictDuration(maxAnimationDuration);
- mFinishExitAnimation.scaleCurrentDuration(animationScale);
- mFinishEnterAnimation.restrictDuration(maxAnimationDuration);
- mFinishEnterAnimation.scaleCurrentDuration(animationScale);
- if (USE_CUSTOM_BLACK_FRAME) {
- mStartFrameAnimation.restrictDuration(maxAnimationDuration);
- mStartFrameAnimation.scaleCurrentDuration(animationScale);
- mFinishFrameAnimation.restrictDuration(maxAnimationDuration);
- mFinishFrameAnimation.scaleCurrentDuration(animationScale);
- }
- }
mRotateExitAnimation.restrictDuration(maxAnimationDuration);
mRotateExitAnimation.scaleCurrentDuration(animationScale);
mRotateEnterAnimation.restrictDuration(maxAnimationDuration);
mRotateEnterAnimation.scaleCurrentDuration(animationScale);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation.restrictDuration(maxAnimationDuration);
- mRotateFrameAnimation.scaleCurrentDuration(animationScale);
- }
-
- final int layerStack = mDisplayContent.getDisplay().getLayerStack();
- if (USE_CUSTOM_BLACK_FRAME && mCustomBlackFrame == null) {
- // 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
- // snapshot transformation because the snapshot is always based
- // of the native orientation of the screen, not the orientation
- // we were last in.
- createRotationMatrix(delta, mOriginalWidth, mOriginalHeight, mFrameInitialMatrix);
-
- try {
- Rect outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
- mOriginalWidth*2, mOriginalHeight*2);
- Rect inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
- mCustomBlackFrame = new BlackFrame(mService.mTransactionFactory, t, outer, inner,
- SCREEN_FREEZE_LAYER_CUSTOM, mDisplayContent, false);
- mCustomBlackFrame.setMatrix(t, mFrameInitialMatrix);
- } catch (OutOfResourcesException e) {
- Slog.w(TAG, "Unable to allocate black surface", e);
- }
- }
if (!customAnim && mExitingBlackFrame == null) {
try {
@@ -585,8 +382,8 @@
outer = mCurrentDisplayRect;
inner = mOriginalDisplayRect;
} else {
- outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
- mOriginalWidth*2, mOriginalHeight*2);
+ outer = new Rect(-mOriginalWidth * 1, -mOriginalHeight * 1,
+ mOriginalWidth * 2, mOriginalHeight * 2);
inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
}
mExitingBlackFrame = new BlackFrame(mService.mTransactionFactory, t, outer, inner,
@@ -599,8 +396,8 @@
if (customAnim && mEnteringBlackFrame == null) {
try {
- Rect outer = new Rect(-finalWidth*1, -finalHeight*1,
- finalWidth*2, finalHeight*2);
+ Rect outer = new Rect(-finalWidth * 1, -finalHeight * 1,
+ finalWidth * 2, finalHeight * 2);
Rect inner = new Rect(0, 0, finalWidth, finalHeight);
mEnteringBlackFrame = new BlackFrame(mService.mTransactionFactory, t, outer, inner,
SCREEN_FREEZE_LAYER_ENTER, mDisplayContent, false);
@@ -617,7 +414,6 @@
*/
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) {
// Can't do animation.
return false;
@@ -629,24 +425,20 @@
if (!mStarted) {
return false;
}
- if (DEBUG_STATE) Slog.v(TAG, "Setting mFinishAnimReady = true");
mFinishAnimReady = true;
return true;
}
public void kill() {
- if (DEBUG_STATE) Slog.v(TAG, "Kill!");
if (mSurfaceControl != null) {
if (SHOW_TRANSACTIONS ||
- SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
- " FREEZE " + mSurfaceControl + ": DESTROY");
+ SHOW_SURFACE_ALLOC) {
+ Slog.i(TAG_WM,
+ " FREEZE " + mSurfaceControl + ": DESTROY");
+ }
mService.mTransactionFactory.make().remove(mSurfaceControl).apply();
mSurfaceControl = null;
}
- if (mCustomBlackFrame != null) {
- mCustomBlackFrame.kill();
- mCustomBlackFrame = null;
- }
if (mExitingBlackFrame != null) {
mExitingBlackFrame.kill();
mExitingBlackFrame = null;
@@ -655,38 +447,6 @@
mEnteringBlackFrame.kill();
mEnteringBlackFrame = null;
}
- if (TWO_PHASE_ANIMATION) {
- if (mStartExitAnimation != null) {
- mStartExitAnimation.cancel();
- mStartExitAnimation = null;
- }
- if (mStartEnterAnimation != null) {
- mStartEnterAnimation.cancel();
- mStartEnterAnimation = null;
- }
- if (mFinishExitAnimation != null) {
- mFinishExitAnimation.cancel();
- mFinishExitAnimation = null;
- }
- if (mFinishEnterAnimation != null) {
- mFinishEnterAnimation.cancel();
- mFinishEnterAnimation = null;
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- if (mStartFrameAnimation != null) {
- mStartFrameAnimation.cancel();
- mStartFrameAnimation = null;
- }
- if (mRotateFrameAnimation != null) {
- mRotateFrameAnimation.cancel();
- mRotateFrameAnimation = null;
- }
- if (mFinishFrameAnimation != null) {
- mFinishFrameAnimation.cancel();
- mFinishFrameAnimation = null;
- }
- }
if (mRotateExitAnimation != null) {
mRotateExitAnimation.cancel();
mRotateExitAnimation = null;
@@ -698,7 +458,7 @@
}
public boolean isAnimating() {
- return hasAnimations() || (TWO_PHASE_ANIMATION && mFinishAnimReady);
+ return hasAnimations();
}
public boolean isRotating() {
@@ -706,13 +466,7 @@
}
private boolean hasAnimations() {
- return (TWO_PHASE_ANIMATION &&
- (mStartEnterAnimation != null || mStartExitAnimation != null
- || mFinishEnterAnimation != null || mFinishExitAnimation != null))
- || (USE_CUSTOM_BLACK_FRAME &&
- (mStartFrameAnimation != null || mRotateFrameAnimation != null
- || mFinishFrameAnimation != null))
- || mRotateEnterAnimation != null || mRotateExitAnimation != null;
+ return mRotateEnterAnimation != null || mRotateExitAnimation != null;
}
private boolean stepAnimation(long now) {
@@ -720,177 +474,45 @@
mHalfwayPoint = Long.MAX_VALUE;
}
if (mFinishAnimReady && mFinishAnimStartTime < 0) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: finish anim now ready");
mFinishAnimStartTime = now;
}
- if (TWO_PHASE_ANIMATION) {
- mMoreStartExit = false;
- if (mStartExitAnimation != null) {
- mMoreStartExit = mStartExitAnimation.getTransformation(now, mStartExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start exit: " + mStartExitTransformation);
- }
-
- mMoreStartEnter = false;
- if (mStartEnterAnimation != null) {
- mMoreStartEnter = mStartEnterAnimation.getTransformation(now, mStartEnterTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start enter: " + mStartEnterTransformation);
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- mMoreStartFrame = false;
- if (mStartFrameAnimation != null) {
- mMoreStartFrame = mStartFrameAnimation.getTransformation(now, mStartFrameTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start frame: " + mStartFrameTransformation);
- }
- }
-
- long finishNow = mFinishAnimReady ? (now - mFinishAnimStartTime) : 0;
- if (DEBUG_STATE) Slog.v(TAG, "Step: finishNow=" + finishNow);
-
- if (TWO_PHASE_ANIMATION) {
- mMoreFinishExit = false;
- if (mFinishExitAnimation != null) {
- mMoreFinishExit = mFinishExitAnimation.getTransformation(finishNow, mFinishExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish exit: " + mFinishExitTransformation);
- }
-
- mMoreFinishEnter = false;
- if (mFinishEnterAnimation != null) {
- mMoreFinishEnter = mFinishEnterAnimation.getTransformation(finishNow, mFinishEnterTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish enter: " + mFinishEnterTransformation);
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- mMoreFinishFrame = false;
- if (mFinishFrameAnimation != null) {
- mMoreFinishFrame = mFinishFrameAnimation.getTransformation(finishNow, mFinishFrameTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish frame: " + mFinishFrameTransformation);
- }
- }
-
mMoreRotateExit = false;
if (mRotateExitAnimation != null) {
- mMoreRotateExit = mRotateExitAnimation.getTransformation(now, mRotateExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate exit: " + mRotateExitTransformation);
+ mMoreRotateExit = mRotateExitAnimation.getTransformation(now,
+ mRotateExitTransformation);
}
mMoreRotateEnter = false;
if (mRotateEnterAnimation != null) {
- mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now, mRotateEnterTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate enter: " + mRotateEnterTransformation);
+ mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now,
+ mRotateEnterTransformation);
}
- if (USE_CUSTOM_BLACK_FRAME) {
- mMoreRotateFrame = false;
- if (mRotateFrameAnimation != null) {
- mMoreRotateFrame = mRotateFrameAnimation.getTransformation(now, mRotateFrameTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate frame: " + mRotateFrameTransformation);
- }
- }
-
- if (!mMoreRotateExit && (!TWO_PHASE_ANIMATION || (!mMoreStartExit && !mMoreFinishExit))) {
- if (TWO_PHASE_ANIMATION) {
- if (mStartExitAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing start exit anim!");
- mStartExitAnimation.cancel();
- mStartExitAnimation = null;
- mStartExitTransformation.clear();
- }
- if (mFinishExitAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing finish exit anim!");
- mFinishExitAnimation.cancel();
- mFinishExitAnimation = null;
- mFinishExitTransformation.clear();
- }
- }
+ if (!mMoreRotateExit) {
if (mRotateExitAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing rotate exit anim!");
mRotateExitAnimation.cancel();
mRotateExitAnimation = null;
mRotateExitTransformation.clear();
}
}
- if (!mMoreRotateEnter && (!TWO_PHASE_ANIMATION || (!mMoreStartEnter && !mMoreFinishEnter))) {
- if (TWO_PHASE_ANIMATION) {
- if (mStartEnterAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing start enter anim!");
- mStartEnterAnimation.cancel();
- mStartEnterAnimation = null;
- mStartEnterTransformation.clear();
- }
- if (mFinishEnterAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing finish enter anim!");
- mFinishEnterAnimation.cancel();
- mFinishEnterAnimation = null;
- mFinishEnterTransformation.clear();
- }
- }
+ if (!mMoreRotateEnter) {
if (mRotateEnterAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing rotate enter anim!");
mRotateEnterAnimation.cancel();
mRotateEnterAnimation = null;
mRotateEnterTransformation.clear();
}
}
- if (USE_CUSTOM_BLACK_FRAME && !mMoreStartFrame && !mMoreRotateFrame && !mMoreFinishFrame) {
- if (mStartFrameAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing start frame anim!");
- mStartFrameAnimation.cancel();
- mStartFrameAnimation = null;
- mStartFrameTransformation.clear();
- }
- if (mFinishFrameAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing finish frame anim!");
- mFinishFrameAnimation.cancel();
- mFinishFrameAnimation = null;
- mFinishFrameTransformation.clear();
- }
- if (mRotateFrameAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing rotate frame anim!");
- mRotateFrameAnimation.cancel();
- mRotateFrameAnimation = null;
- mRotateFrameTransformation.clear();
- }
- }
-
mExitTransformation.set(mRotateExitTransformation);
mEnterTransformation.set(mRotateEnterTransformation);
- if (TWO_PHASE_ANIMATION) {
- mExitTransformation.compose(mStartExitTransformation);
- mExitTransformation.compose(mFinishExitTransformation);
- mEnterTransformation.compose(mStartEnterTransformation);
- mEnterTransformation.compose(mFinishEnterTransformation);
- }
-
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final exit: " + mExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final enter: " + mEnterTransformation);
-
- if (USE_CUSTOM_BLACK_FRAME) {
- //mFrameTransformation.set(mRotateExitTransformation);
- //mFrameTransformation.compose(mStartExitTransformation);
- //mFrameTransformation.compose(mFinishExitTransformation);
- mFrameTransformation.set(mRotateFrameTransformation);
- mFrameTransformation.compose(mStartFrameTransformation);
- mFrameTransformation.compose(mFinishFrameTransformation);
- mFrameTransformation.getMatrix().preConcat(mFrameInitialMatrix);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final frame: " + mFrameTransformation);
- }
-
- final boolean more = (TWO_PHASE_ANIMATION
- && (mMoreStartEnter || mMoreStartExit || mMoreFinishEnter || mMoreFinishExit))
- || (USE_CUSTOM_BLACK_FRAME
- && (mMoreStartFrame || mMoreRotateFrame || mMoreFinishFrame))
- || mMoreRotateEnter || mMoreRotateExit
+ final boolean more = mMoreRotateEnter || mMoreRotateExit
|| !mFinishAnimReady;
mSnapshotFinalMatrix.setConcat(mExitTransformation.getMatrix(), mSnapshotInitialMatrix);
- if (DEBUG_STATE) Slog.v(TAG, "Step: more=" + more);
-
return more;
}
@@ -900,27 +522,17 @@
}
if (mSurfaceControl != null) {
- if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, hiding screenshot surface");
+ if (!mMoreRotateExit) {
t.hide(mSurfaceControl);
}
}
- if (mCustomBlackFrame != null) {
- if (!mMoreStartFrame && !mMoreFinishFrame && !mMoreRotateFrame) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding black frame");
- mCustomBlackFrame.hide(t);
- } else {
- mCustomBlackFrame.setMatrix(t, mFrameTransformation.getMatrix());
- }
- }
-
if (mExitingBlackFrame != null) {
- if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding exiting frame");
+ if (!mMoreRotateExit) {
mExitingBlackFrame.hide(t);
} else {
- mExitFrameFinalMatrix.setConcat(mExitTransformation.getMatrix(), mFrameInitialMatrix);
+ mExitFrameFinalMatrix.setConcat(mExitTransformation.getMatrix(),
+ mFrameInitialMatrix);
mExitingBlackFrame.setMatrix(t, mExitFrameFinalMatrix);
if (mForceDefaultOrientation) {
mExitingBlackFrame.setAlpha(t, mExitTransformation.getAlpha());
@@ -929,8 +541,7 @@
}
if (mEnteringBlackFrame != null) {
- if (!mMoreStartEnter && !mMoreFinishEnter && !mMoreRotateEnter) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding entering frame");
+ if (!mMoreRotateEnter) {
mEnteringBlackFrame.hide(t);
} else {
mEnteringBlackFrame.setMatrix(t, mEnterTransformation.getMatrix());
@@ -943,38 +554,11 @@
public boolean stepAnimationLocked(long now) {
if (!hasAnimations()) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: no animations running");
mFinishAnimReady = false;
return false;
}
if (!mAnimRunning) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: starting start, finish, rotate");
- if (TWO_PHASE_ANIMATION) {
- if (mStartEnterAnimation != null) {
- mStartEnterAnimation.setStartTime(now);
- }
- if (mStartExitAnimation != null) {
- mStartExitAnimation.setStartTime(now);
- }
- if (mFinishEnterAnimation != null) {
- mFinishEnterAnimation.setStartTime(0);
- }
- if (mFinishExitAnimation != null) {
- mFinishExitAnimation.setStartTime(0);
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- if (mStartFrameAnimation != null) {
- mStartFrameAnimation.setStartTime(now);
- }
- if (mFinishFrameAnimation != null) {
- mFinishFrameAnimation.setStartTime(0);
- }
- if (mRotateFrameAnimation != null) {
- mRotateFrameAnimation.setStartTime(now);
- }
- }
if (mRotateEnterAnimation != null) {
mRotateEnterAnimation.setStartTime(now);
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
index dd3d8b9..87afdfb 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
@@ -70,6 +70,14 @@
PackageAbiHelper mMockPackageAbiHelper;
@Mock
UserManagerInternal mMockUserManager;
+ @Mock
+ PackageManagerService.Injector mMockInjector;
+
+ @Before
+ public void setupInjector() {
+ when(mMockInjector.getAbiHelper()).thenReturn(mMockPackageAbiHelper);
+ when(mMockInjector.getUserManager()).thenReturn(mMockUserManager);
+ }
@Before
public void setupDefaultUser() {
@@ -401,7 +409,7 @@
final PackageManagerService.ScanResult scanResult = PackageManagerService.scanPackageOnlyLI(
createBasicScanRequestBuilder(basicPackage).build(),
- new PackageManagerService.Injector(mMockUserManager, mMockPackageAbiHelper),
+ mMockInjector,
true /*isUnderFactoryTest*/,
System.currentTimeMillis());
@@ -448,7 +456,7 @@
PackageManagerService.ScanRequest scanRequest) throws PackageManagerException {
return PackageManagerService.scanPackageOnlyLI(
scanRequest,
- new PackageManagerService.Injector(mMockUserManager, mMockPackageAbiHelper),
+ mMockInjector,
false /*isUnderFactoryTest*/,
System.currentTimeMillis());
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 4151ba5..292a294 100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2909,7 +2909,7 @@
defaults.putString(KEY_SUPL_VER_STRING, "0x20000");
defaults.putString(KEY_SUPL_MODE_STRING, "1");
defaults.putString(KEY_SUPL_ES_STRING, "1");
- defaults.putString(KEY_LPP_PROFILE_STRING, "0");
+ defaults.putString(KEY_LPP_PROFILE_STRING, "2");
defaults.putString(KEY_USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_STRING, "1");
defaults.putString(KEY_A_GLONASS_POS_PROTOCOL_SELECT_STRING, "0");
defaults.putString(KEY_GPS_LOCK_STRING, "3");