diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/animation/Animator.java | 16 | ||||
-rw-r--r-- | core/java/android/animation/AnimatorSet.java | 41 | ||||
-rw-r--r-- | core/java/android/animation/ValueAnimator.java | 9 | ||||
-rw-r--r-- | core/java/android/app/LoadedApk.java | 17 | ||||
-rw-r--r-- | core/java/android/app/TimePickerDialog.java | 9 | ||||
-rw-r--r-- | core/java/android/app/backup/BackupTransport.java | 4 | ||||
-rw-r--r-- | core/java/android/content/Context.java | 1 | ||||
-rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 12 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageParser.java | 2 | ||||
-rw-r--r-- | core/java/android/util/DisplayMetrics.java | 4 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 6 | ||||
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 40 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 11 | ||||
-rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 7 | ||||
-rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 10 | ||||
-rw-r--r-- | core/res/res/drawable/btn_check_material_anim.xml | 32 |
16 files changed, 169 insertions, 52 deletions
diff --git a/core/java/android/animation/Animator.java b/core/java/android/animation/Animator.java index 129e52c..95f83ac 100644 --- a/core/java/android/animation/Animator.java +++ b/core/java/android/animation/Animator.java @@ -356,6 +356,22 @@ public abstract class Animator implements Cloneable { public void setTarget(Object target) { } + // Hide reverse() and canReverse() for now since reverse() only work for simple + // cases, like we don't support sequential, neither startDelay. + // TODO: make reverse() works for all the Animators. + /** + * @hide + */ + public boolean canReverse() { + return false; + } + + /** + * @hide + */ + public void reverse() { + } + /** * <p>An animation listener receives notifications from an animation. * Notifications indicate animation related events, such as the end or the diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java index 018a2d6..9156eeb 100644 --- a/core/java/android/animation/AnimatorSet.java +++ b/core/java/android/animation/AnimatorSet.java @@ -124,7 +124,7 @@ public final class AnimatorSet extends Animator { // was set on this AnimatorSet, so it should not be passed down to the children. private TimeInterpolator mInterpolator = null; - + private boolean mReversible = true; /** * Sets up this AnimatorSet to play all of the supplied animations at the same time. * This is equivalent to calling {@link #play(Animator)} with the first animator in the @@ -177,6 +177,7 @@ public final class AnimatorSet extends Animator { if (items.length == 1) { play(items[0]); } else { + mReversible = false; for (int i = 0; i < items.length - 1; ++i) { play(items[i]).before(items[i+1]); } @@ -196,6 +197,7 @@ public final class AnimatorSet extends Animator { if (items.size() == 1) { play(items.get(0)); } else { + mReversible = false; for (int i = 0; i < items.size() - 1; ++i) { play(items.get(i)).before(items.get(i+1)); } @@ -407,6 +409,9 @@ public final class AnimatorSet extends Animator { */ @Override public void setStartDelay(long startDelay) { + if (mStartDelay > 0) { + mReversible = false; + } mStartDelay = startDelay; } @@ -512,7 +517,7 @@ public final class AnimatorSet extends Animator { node.animation.setInterpolator(mInterpolator); } } - // First, sort the nodes (if necessary). This will ensure that sortedNodes + // First, sort the nodes (if necessary). This will ensure that sortedNodes // contains the animation nodes in the correct order. sortNodes(); @@ -626,6 +631,7 @@ public final class AnimatorSet extends Animator { anim.mNodeMap = new HashMap<Animator, Node>(); anim.mNodes = new ArrayList<Node>(); anim.mSortedNodes = new ArrayList<Node>(); + anim.mReversible = mReversible; // Walk through the old nodes list, cloning each node and adding it to the new nodemap. // One problem is that the old node dependencies point to nodes in the old AnimatorSet. @@ -908,6 +914,35 @@ public final class AnimatorSet extends Animator { } /** + * @hide + */ + @Override + public boolean canReverse() { + if (!mReversible) { + return false; + } + // Loop to make sure all the Nodes can reverse. + for (Node node : mNodes) { + if (!node.animation.canReverse() || node.animation.getStartDelay() > 0) { + return false; + } + } + return true; + } + + /** + * @hide + */ + @Override + public void reverse() { + if (canReverse()) { + for (Node node : mNodes) { + node.animation.reverse(); + } + } + } + + /** * Dependency holds information about the node that some other node is * dependent upon and the nature of that dependency. * @@ -1124,6 +1159,7 @@ public final class AnimatorSet extends Animator { * {@link AnimatorSet#play(Animator)} method ends. */ public Builder before(Animator anim) { + mReversible = false; Node node = mNodeMap.get(anim); if (node == null) { node = new Node(anim); @@ -1144,6 +1180,7 @@ public final class AnimatorSet extends Animator { * {@link AnimatorSet#play(Animator)} method to play. */ public Builder after(Animator anim) { + mReversible = false; Node node = mNodeMap.get(anim); if (node == null) { node = new Node(anim); diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java index 5338dd0..e3380a9 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -1038,6 +1038,7 @@ public class ValueAnimator extends Animator { * play backwards. This behavior is only set for the current animation; future playing * of the animation will use the default behavior of playing forward. */ + @Override public void reverse() { mPlayingBackwards = !mPlayingBackwards; if (mPlayingState == RUNNING) { @@ -1053,6 +1054,14 @@ public class ValueAnimator extends Animator { } /** + * @hide + */ + @Override + public boolean canReverse() { + return true; + } + + /** * Called internally to end an animation by removing it from the animations list. Must be * called on the UI thread. */ diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 12e18cc..38614a0 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -56,6 +56,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; +import java.util.Objects; final class IntentReceiverLeaked extends AndroidRuntimeException { public IntentReceiverLeaked(String msg) { @@ -252,6 +253,22 @@ public final class LoadedApk { } if (mIncludeCode && !mPackageName.equals("android")) { + // Avoid the binder call when the package is the current application package. + // The activity manager will perform ensure that dexopt is performed before + // spinning up the process. + if (!Objects.equals(mPackageName, ActivityThread.currentPackageName())) { + final String isa = VMRuntime.getRuntime().vmInstructionSet(); + try { + // TODO: We can probably do away with the isa argument since + // the AM and PM have enough information to figure this out + // themselves. If we do need it, we should match it against the + // list of devices ISAs before sending it down to installd. + ActivityThread.getPackageManager().performDexOptIfNeeded(mPackageName, isa); + } catch (RemoteException re) { + // Ignored. + } + } + final ArrayList<String> zipPaths = new ArrayList<>(); final ArrayList<String> libPaths = new ArrayList<>(); diff --git a/core/java/android/app/TimePickerDialog.java b/core/java/android/app/TimePickerDialog.java index ac74ca1..8a53e08 100644 --- a/core/java/android/app/TimePickerDialog.java +++ b/core/java/android/app/TimePickerDialog.java @@ -64,6 +64,8 @@ public class TimePickerDialog extends AlertDialog int mInitialMinute; boolean mIs24HourView; + private boolean mIsCanceled; + /** * @param context Parent. * @param callBack How parent is notified. @@ -124,10 +126,13 @@ public class TimePickerDialog extends AlertDialog mTimePicker.setDismissCallback(new TimePicker.TimePickerDismissCallback() { @Override public void dismiss(TimePicker view, boolean isCancel, int hourOfDay, int minute) { + mIsCanceled = isCancel; if (!isCancel) { mTimeSetCallback.onTimeSet(view, hourOfDay, minute); + TimePickerDialog.this.dismiss(); + } else { + TimePickerDialog.this.cancel(); } - TimePickerDialog.this.dismiss(); } }); mTimePicker.setIs24HourView(mIs24HourView); @@ -150,7 +155,7 @@ public class TimePickerDialog extends AlertDialog } private void tryNotifyTimeSet() { - if (mTimeSetCallback != null) { + if (mTimeSetCallback != null && !mIsCanceled) { mTimePicker.clearFocus(); mTimeSetCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute()); diff --git a/core/java/android/app/backup/BackupTransport.java b/core/java/android/app/backup/BackupTransport.java index ba2930b..28108a0 100644 --- a/core/java/android/app/backup/BackupTransport.java +++ b/core/java/android/app/backup/BackupTransport.java @@ -331,6 +331,10 @@ public class BackupTransport { * its datastore, if appropriate, and close the socket that had been provided in * {@link #performFullBackup(PackageInfo, ParcelFileDescriptor)}. * + * <p class="note">If the transport returns TRANSPORT_OK from this method, then the + * OS will always provide a matching call to {@link #finishBackup()} even if sending + * data via {@link #sendBackupData(int)} failed at some point. + * * @param targetPackage The package whose data is to follow. * @param socket The socket file descriptor through which the data will be provided. * If the transport returns {@link #TRANSPORT_PACKAGE_REJECTED} here, it must still diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index d068b1f..1569b9f 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2539,7 +2539,6 @@ public abstract class Context { * * @see #getSystemService * @see android.telecomm.TelecommManager - * @hide */ public static final String TELECOMM_SERVICE = "telecomm"; diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 3a98f5d..eb46cf0 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -384,10 +384,16 @@ interface IPackageManager { /** * Ask the package manager to perform dex-opt (if needed) on the given - * package, if it already hasn't done mode. Only does this if running - * in the special development "no pre-dexopt" mode. + * package and for the given instruction set if it already hasn't done + * so. + * + * If the supplied instructionSet is null, the package manager will use + * the packages default instruction set. + * + * In most cases, apps are dexopted in advance and this function will + * be a no-op. */ - boolean performDexOpt(String packageName); + boolean performDexOptIfNeeded(String packageName, String instructionSet); /** * Update status of external media on the package manager to scan and diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 43c2b15..ab33d75 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -4201,7 +4201,7 @@ public class PackageParser { public int mPreferredOrder = 0; // For use by package manager to keep track of where it needs to do dexopt. - public boolean mDexOptNeeded = true; + public final ArraySet<String> mDexOptPerformed = new ArraySet<>(4); // For use by package manager to keep track of when a package was last used. public long mLastPackageUsageTimeInMills; diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index 6cda905..3f10b92 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -75,9 +75,7 @@ public class DisplayMetrics { public static final int DENSITY_400 = 400; /** - * Standard quantized DPI for extra-extra-high-density screens. Applications - * should not generally worry about this density; relying on XHIGH graphics - * being scaled up to it should be sufficient for almost all cases. + * Standard quantized DPI for extra-extra-high-density screens. */ public static final int DENSITY_XXHIGH = 480; diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index f2f363a..8c9b819 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -327,6 +327,12 @@ public abstract class HardwareRenderer { } /** + * Indicates that the content drawn by HardwareDrawCallbacks needs to + * be updated, which will be done by the next call to draw() + */ + abstract void invalidateRoot(); + + /** * Draws the specified view. * * @param view The view to draw. diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index e2ebf6e..b033780 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -96,6 +96,7 @@ public class ThreadedRenderer extends HardwareRenderer { private RenderNode mRootNode; private Choreographer mChoreographer; private boolean mProfilingEnabled; + private boolean mRootNodeNeedsUpdate; ThreadedRenderer(Context context, boolean translucent) { final TypedArray a = context.obtainStyledAttributes( @@ -255,28 +256,39 @@ public class ThreadedRenderer extends HardwareRenderer { return changed; } - private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { + private void updateViewTreeDisplayList(View view) { view.mPrivateFlags |= View.PFLAG_DRAWN; - view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED) == View.PFLAG_INVALIDATED; view.mPrivateFlags &= ~View.PFLAG_INVALIDATED; + view.getDisplayList(); + view.mRecreateDisplayList = false; + } + private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); - HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight); - try { - canvas.save(); - canvas.translate(mInsetLeft, mInsetTop); - callbacks.onHardwarePreDraw(canvas); - canvas.drawRenderNode(view.getDisplayList()); - callbacks.onHardwarePostDraw(canvas); - canvas.restore(); - } finally { - mRootNode.end(canvas); - Trace.traceEnd(Trace.TRACE_TAG_VIEW); + updateViewTreeDisplayList(view); + + if (mRootNodeNeedsUpdate || !mRootNode.isValid()) { + HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight); + try { + canvas.save(); + canvas.translate(mInsetLeft, mInsetTop); + callbacks.onHardwarePreDraw(canvas); + canvas.drawRenderNode(view.getDisplayList()); + callbacks.onHardwarePostDraw(canvas); + canvas.restore(); + mRootNodeNeedsUpdate = false; + } finally { + mRootNode.end(canvas); + } } + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } - view.mRecreateDisplayList = false; + @Override + void invalidateRoot() { + mRootNodeNeedsUpdate = true; } @Override diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b554548..341419c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2440,8 +2440,11 @@ public final class ViewRootImpl implements ViewParent, if (attachInfo.mHardwareRenderer != null && attachInfo.mHardwareRenderer.isEnabled()) { // Draw with hardware renderer. mIsAnimating = false; - mHardwareYOffset = yOffset; - mHardwareXOffset = xOffset; + if (mHardwareYOffset != yOffset || mHardwareXOffset != xOffset) { + mHardwareYOffset = yOffset; + mHardwareXOffset = xOffset; + mAttachInfo.mHardwareRenderer.invalidateRoot(); + } mResizeAlpha = resizeAlpha; dirty.setEmpty(); @@ -2827,6 +2830,10 @@ public final class ViewRootImpl implements ViewParent, // Set the new focus host and node. mAccessibilityFocusedHost = view; mAccessibilityFocusedVirtualView = node; + + if (mAttachInfo.mHardwareRenderer != null) { + mAttachInfo.mHardwareRenderer.invalidateRoot(); + } } @Override diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index aab48b3..988d461 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -138,13 +138,6 @@ public: } } -protected: - virtual void damageSelf(TreeInfo& info) { - // Intentionally a no-op. As RootRenderNode gets a new DisplayListData - // every frame this would result in every draw push being a full inval, - // which is wrong. Only RootRenderNode has this issue. - } - private: sp<Looper> mLooper; std::vector<OnFinishedEvent> mOnFinishedEvents; diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 64366e5..1f7acec 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -39,6 +39,7 @@ #include <cutils/fs.h> #include <cutils/multiuser.h> #include <cutils/sched_policy.h> +#include <private/android_filesystem_config.h> #include <utils/String8.h> #include <selinux/android.h> #include <processgroup/processgroup.h> @@ -536,8 +537,15 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize( jint debug_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring se_name, jintArray fdsToClose) { + // Grant CAP_WAKE_ALARM to the Bluetooth process. + jlong capabilities = 0; + if (uid == AID_BLUETOOTH) { + capabilities |= (1LL << CAP_WAKE_ALARM); + } + return ForkAndSpecializeCommon(env, uid, gid, gids, debug_flags, - rlimits, 0, 0, mount_external, se_info, se_name, false, fdsToClose); + rlimits, capabilities, capabilities, mount_external, se_info, + se_name, false, fdsToClose); } static jint com_android_internal_os_Zygote_nativeForkSystemServer( diff --git a/core/res/res/drawable/btn_check_material_anim.xml b/core/res/res/drawable/btn_check_material_anim.xml index 73b8a3e..1e05e84 100644 --- a/core/res/res/drawable/btn_check_material_anim.xml +++ b/core/res/res/drawable/btn_check_material_anim.xml @@ -30,28 +30,28 @@ <transition android:fromId="@+id/off" android:toId="@+id/on"> <animation-list> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_001" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_001" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_002" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_002" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_003" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_003" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_004" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_004" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_005" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_005" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_006" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_006" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_007" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_on_mtrl_007" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> <bitmap android:src="@drawable/btn_check_to_on_mtrl_008" android:tint="?attr/colorControlActivated" /> @@ -106,28 +106,28 @@ <bitmap android:src="@drawable/btn_check_to_off_mtrl_007" android:tint="?attr/colorControlActivated" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_008" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_008" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_009" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_009" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_010" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_010" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_011" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_011" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_012" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_012" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_013" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_013" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_014" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_014" android:tint="?attr/colorControlNormal" /> </item> <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_015" android:tint="?attr/colorControlActivated" /> + <bitmap android:src="@drawable/btn_check_to_off_mtrl_015" android:tint="?attr/colorControlNormal" /> </item> </animation-list> </transition> |