diff options
38 files changed, 336 insertions, 97 deletions
diff --git a/config/preloaded-classes b/config/preloaded-classes index 5da78091448e..1b8ab49af6ed 100644 --- a/config/preloaded-classes +++ b/config/preloaded-classes @@ -1159,6 +1159,7 @@ android.icu.impl.ICUService android.icu.impl.ICUService$CacheEntry android.icu.impl.ICUService$Factory android.icu.impl.ICUService$Key +android.icu.impl.IDNA2003 android.icu.impl.LocaleIDParser android.icu.impl.LocaleIDs android.icu.impl.Norm2AllModes @@ -1254,6 +1255,7 @@ android.icu.impl.locale.BaseLocale$Key android.icu.impl.locale.LocaleObjectCache android.icu.impl.locale.LocaleObjectCache$CacheEntry android.icu.impl.locale.LocaleSyntaxException +android.icu.impl.number.Parse android.icu.lang.UCharacter android.icu.lang.UCharacterEnums$ECharacterCategory android.icu.lang.UCharacterEnums$ECharacterDirection @@ -1468,6 +1470,7 @@ android.media.IRingtonePlayer android.media.IRingtonePlayer$Stub android.media.IRingtonePlayer$Stub$Proxy android.media.Image +android.media.ImageReader android.media.JetPlayer android.media.MediaCodec$BufferInfo android.media.MediaCodec$BufferMap @@ -1478,9 +1481,11 @@ android.media.MediaCodecInfo$AudioCapabilities android.media.MediaCodecInfo$CodecProfileLevel android.media.MediaCodecInfo$Feature android.media.MediaCodecInfo$VideoCapabilities +android.media.MediaCodecList android.media.MediaFormat android.media.MediaMetadata$1 android.media.MediaMetadata$Builder +android.media.MediaPlayer android.media.MediaPlayer$1 android.media.MediaPlayer$2 android.media.MediaPlayer$EventHandler @@ -1511,6 +1516,7 @@ android.media.PlayerBase$IPlayerWrapper android.media.PlayerBase$PlayerIdCard$1 android.media.RemoteDisplay android.media.Ringtone$MyOnCompletionListener +android.media.SoundPool android.media.SubtitleController$Listener android.media.ToneGenerator android.media.Utils @@ -2050,6 +2056,7 @@ android.text.FontConfig$Font android.text.GetChars android.text.GraphicsOperations android.text.Html +android.text.Html$HtmlParser android.text.HtmlToSpannedConverter$Href android.text.Hyphenator android.text.Hyphenator$HyphenationData @@ -2099,6 +2106,7 @@ android.text.TextUtils$SimpleStringSplitter android.text.TextUtils$StringSplitter android.text.TextUtils$TruncateAt android.text.TextWatcher +android.text.format.Formatter android.text.format.Time$TimeCalculator android.text.method.AllCapsTransformationMethod android.text.method.ArrowKeyMovementMethod @@ -4501,6 +4509,7 @@ org.ccil.cowan.tagsoup.AttributesImpl org.ccil.cowan.tagsoup.AutoDetector org.ccil.cowan.tagsoup.Element org.ccil.cowan.tagsoup.ElementType +org.ccil.cowan.tagsoup.HTMLScanner org.ccil.cowan.tagsoup.HTMLSchema org.ccil.cowan.tagsoup.Parser$1 org.ccil.cowan.tagsoup.ScanHandler diff --git a/config/preloaded-classes-extra b/config/preloaded-classes-extra index 1934cbca27ad..959fff5c1e5c 100644 --- a/config/preloaded-classes-extra +++ b/config/preloaded-classes-extra @@ -1 +1,13 @@ android.icu.impl.coll.CollationRoot +android.icu.impl.IDNA2003 +android.icu.impl.number.Parse +android.icu.util.TimeZone +android.media.ImageReader +android.media.MediaCodecList +android.media.MediaPlayer +android.media.SoundPool +android.text.format.Formatter +android.text.Html$HtmlParser +com.android.org.conscrypt.TrustedCertificateStore +org.ccil.cowan.tagsoup.HTMLScanner +sun.security.jca.Providers diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index 7d4d70d49d53..9b2bfc5702cb 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -1006,9 +1006,12 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { final int numElements = mTransitioningViews == null ? 0 : mTransitioningViews.size(); for (int i = 0; i < numElements; i++) { final View view = mTransitioningViews.get(i); - view.setTransitionVisibility(visiblity); if (invalidate) { - view.invalidate(); + // Allow the view to be invalidated by the visibility change + view.setVisibility(visiblity); + } else { + // Don't invalidate the view with the visibility change + view.setTransitionVisibility(visiblity); } } } diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java index af26a88e877c..74555de5f291 100644 --- a/core/java/android/view/FocusFinder.java +++ b/core/java/android/view/FocusFinder.java @@ -574,10 +574,10 @@ public class FocusFinder { switch (direction) { case View.FOCUS_LEFT: case View.FOCUS_RIGHT: - return (rect2.bottom >= rect1.top) && (rect2.top <= rect1.bottom); + return (rect2.bottom > rect1.top) && (rect2.top < rect1.bottom); case View.FOCUS_UP: case View.FOCUS_DOWN: - return (rect2.right >= rect1.left) && (rect2.left <= rect1.right); + return (rect2.right > rect1.left) && (rect2.left < rect1.right); } throw new IllegalArgumentException("direction must be one of " + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}."); diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java index 8de17c072b59..8696d0d5df7f 100644 --- a/core/java/android/widget/TabHost.java +++ b/core/java/android/widget/TabHost.java @@ -146,12 +146,17 @@ mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1"); // and relays them to the tab content. mTabKeyListener = new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { + if (KeyEvent.isModifierKey(keyCode)) { + return false; + } switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_TAB: + case KeyEvent.KEYCODE_SPACE: case KeyEvent.KEYCODE_ENTER: return false; diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 5f1932c9cfff..b13560c10326 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2456,6 +2456,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { decor.setSystemUiVisibility( decor.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } + if (a.getBoolean(R.styleable.Window_windowLightNavigationBar, false)) { + decor.setSystemUiVisibility( + decor.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } if (mAlwaysReadCloseOnTouchAttr || getContext().getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java index 592576bb41d0..e53162cc97fd 100644 --- a/core/java/com/android/internal/widget/PointerLocationView.java +++ b/core/java/com/android/internal/widget/PointerLocationView.java @@ -25,6 +25,7 @@ import android.hardware.input.InputManager; import android.hardware.input.InputManager.InputDeviceListener; import android.os.SystemProperties; import android.util.Log; +import android.util.Slog; import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; @@ -630,6 +631,12 @@ public class PointerLocationView extends View implements InputDeviceListener, >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; // will be 0 for UP final int id = event.getPointerId(index); + if (id >= NP) { + Slog.wtf(TAG, "Got pointer ID out of bounds: id=" + id + " arraysize=" + + NP + " pointerindex=" + index + + " action=0x" + Integer.toHexString(action)); + return; + } final PointerState ps = mPointers.get(id); ps.mCurDown = false; diff --git a/core/jni/android_os_HwBlob.cpp b/core/jni/android_os_HwBlob.cpp index 0c23797b627b..40d49b7662d9 100644 --- a/core/jni/android_os_HwBlob.cpp +++ b/core/jni/android_os_HwBlob.cpp @@ -83,12 +83,6 @@ JHwBlob::JHwBlob(JNIEnv *env, jobject thiz, size_t size) mSize(size), mOwnsBuffer(true), mHandle(0) { - jclass clazz = env->GetObjectClass(thiz); - CHECK(clazz != NULL); - - mClass = (jclass)env->NewGlobalRef(clazz); - mObject = env->NewWeakGlobalRef(thiz); - if (size > 0) { mBuffer = malloc(size); } @@ -99,14 +93,6 @@ JHwBlob::~JHwBlob() { free(mBuffer); mBuffer = nullptr; } - - JNIEnv *env = AndroidRuntime::getJNIEnv(); - - env->DeleteWeakGlobalRef(mObject); - mObject = NULL; - - env->DeleteGlobalRef(mClass); - mClass = NULL; } void JHwBlob::setTo(const void *ptr, size_t handle) { diff --git a/core/jni/android_os_HwBlob.h b/core/jni/android_os_HwBlob.h index 09204880881b..39393cb76c23 100644 --- a/core/jni/android_os_HwBlob.h +++ b/core/jni/android_os_HwBlob.h @@ -70,9 +70,6 @@ private: sp<JHwBlob> mBlob; }; - jclass mClass; - jobject mObject; - void *mBuffer; size_t mSize; bool mOwnsBuffer; diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index b412b6a016b6..9494fb8e7eef 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -166,10 +166,6 @@ JHwParcel::JHwParcel(JNIEnv *env, jobject thiz) mOwnsParcel(false), mTransactCallback(nullptr), mWasSent(false) { - jclass clazz = env->GetObjectClass(thiz); - CHECK(clazz != NULL); - - mObject = env->NewWeakGlobalRef(thiz); } JHwParcel::~JHwParcel() { @@ -178,9 +174,6 @@ JHwParcel::~JHwParcel() { mStorage.release(env); setParcel(NULL, false /* assumeOwnership */); - - env->DeleteWeakGlobalRef(mObject); - mObject = NULL; } hardware::Parcel *JHwParcel::getParcel() { diff --git a/core/jni/android_os_HwParcel.h b/core/jni/android_os_HwParcel.h index f6e61004b0e3..2c26993a0439 100644 --- a/core/jni/android_os_HwParcel.h +++ b/core/jni/android_os_HwParcel.h @@ -53,8 +53,6 @@ protected: virtual ~JHwParcel(); private: - jobject mObject; - hardware::Parcel *mParcel; bool mOwnsParcel; diff --git a/data/sounds/AudioPackageGo.mk b/data/sounds/AudioPackageGo.mk index 3756d3056da9..ae742df8f9bb 100644 --- a/data/sounds/AudioPackageGo.mk +++ b/data/sounds/AudioPackageGo.mk @@ -40,3 +40,9 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \ + $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ diff --git a/legacy-test/Android.mk b/legacy-test/Android.mk index ef2950b2f026..0e6b31e6ebd9 100644 --- a/legacy-test/Android.mk +++ b/legacy-test/Android.mk @@ -94,11 +94,10 @@ LOCAL_MODULE := legacy.test.stubs LOCAL_SOURCE_FILES_ALL_GENERATED := true -include $(BUILD_STATIC_JAVA_LIBRARY) - # Make sure to run droiddoc first to generate the stub source files. -$(full_classes_compiled_jar) : $(legacy_test_api_gen_stamp) -$(full_classes_jack) : $(legacy_test_api_gen_stamp) +LOCAL_ADDITIONAL_DEPENDENCIES := $(legacy_test_api_gen_stamp) + +include $(BUILD_STATIC_JAVA_LIBRARY) # Archive a copy of the classes.jar in SDK build. $(call dist-for-goals,sdk win_sdk,$(full_classes_jar):legacy.test.stubs.jar) diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index aa6d2f3513d7..4a5b2c72b02a 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -162,8 +162,8 @@ public: void addRenderNode(RenderNode* node, bool placeFront); void removeRenderNode(RenderNode* node); - void setContentDrawBounds(int left, int top, int right, int bottom) { - mContentDrawBounds.set(left, top, right, bottom); + void setContentDrawBounds(const Rect& bounds) { + mContentDrawBounds = bounds; } RenderState& getRenderState() { diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 7d641d3ac7c7..a097272df359 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -32,6 +32,7 @@ namespace renderthread { DrawFrameTask::DrawFrameTask() : mRenderThread(nullptr) , mContext(nullptr) + , mContentDrawBounds(0, 0, 0, 0) , mSyncResult(SyncResult::OK) { } @@ -123,6 +124,7 @@ bool DrawFrameTask::syncFrameState(TreeInfo& info) { mLayers[i]->apply(); } mLayers.clear(); + mContext->setContentDrawBounds(mContentDrawBounds); mContext->prepareTree(info, mFrameInfo, mSyncQueued, mTargetNode); // This is after the prepareTree so that any pending operations diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h index fb480626d421..83ecb98f548f 100644 --- a/libs/hwui/renderthread/DrawFrameTask.h +++ b/libs/hwui/renderthread/DrawFrameTask.h @@ -61,6 +61,9 @@ public: virtual ~DrawFrameTask(); void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode); + void setContentDrawBounds(int left, int top, int right, int bottom) { + mContentDrawBounds.set(left, top, right, bottom); + } void pushLayerUpdate(DeferredLayerUpdater* layer); void removeLayerUpdate(DeferredLayerUpdater* layer); @@ -82,6 +85,7 @@ private: RenderThread* mRenderThread; CanvasContext* mContext; RenderNode* mTargetNode = nullptr; + Rect mContentDrawBounds; /********************************************* * Single frame data diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 7fe966dde316..9048bd14b35c 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -551,20 +551,8 @@ void RenderProxy::drawRenderNode(RenderNode* node) { staticPostAndWait(task); } -CREATE_BRIDGE5(setContentDrawBounds, CanvasContext* context, int left, int top, - int right, int bottom) { - args->context->setContentDrawBounds(args->left, args->top, args->right, args->bottom); - return nullptr; -} - void RenderProxy::setContentDrawBounds(int left, int top, int right, int bottom) { - SETUP_TASK(setContentDrawBounds); - args->context = mContext; - args->left = left; - args->top = top; - args->right = right; - args->bottom = bottom; - staticPostAndWait(task); + mDrawFrameTask.setContentDrawBounds(left, top, right, bottom); } CREATE_BRIDGE1(serializeDisplayListTree, CanvasContext* context) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index c596398cf804..d95402cdb5dc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -50,6 +50,7 @@ import android.media.AudioManager; import android.os.BatteryManager; import android.os.CancellationSignal; import android.os.Handler; +import android.os.IBinder; import android.os.IRemoteCallback; import android.os.Message; import android.os.RemoteException; @@ -58,6 +59,8 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.service.dreams.DreamService; +import android.service.dreams.IDreamManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -67,8 +70,6 @@ import android.util.Log; import android.util.SparseBooleanArray; import android.util.SparseIntArray; -import com.google.android.collect.Lists; - import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.PhoneConstants; @@ -77,6 +78,8 @@ import com.android.internal.widget.LockPatternUtils; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener; +import com.google.android.collect.Lists; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; @@ -217,6 +220,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private UserManager mUserManager; private int mFingerprintRunningState = FINGERPRINT_STATE_STOPPED; private LockPatternUtils mLockPatternUtils; + private final IDreamManager mDreamManager; + private boolean mIsDreaming; /** * Short delay before restarting fingerprint authentication after a successful try @@ -458,6 +463,26 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { updateFingerprintListeningState(); } + /** + * @return a cached version of DreamManager.isDreaming() + */ + public boolean isDreaming() { + return mIsDreaming; + } + + /** + * If the device is dreaming, awakens the device + */ + public void awakenFromDream() { + if (mIsDreaming && mDreamManager != null) { + try { + mDreamManager.awaken(); + } catch (RemoteException e) { + Log.e(TAG, "Unable to awaken from dream"); + } + } + } + private void onFingerprintAuthenticated(int userId) { Trace.beginSection("KeyGuardUpdateMonitor#onFingerPrintAuthenticated"); mUserFingerprintAuthenticated.put(userId, true); @@ -1037,11 +1062,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleDreamingStateChanged(int dreamStart) { final int count = mCallbacks.size(); - boolean showingDream = dreamStart == 1; + mIsDreaming = dreamStart == 1; for (int i = 0; i < count; i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { - cb.onDreamingStateChanged(showingDream); + cb.onDreamingStateChanged(mIsDreaming); } } } @@ -1146,6 +1171,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mLockPatternUtils = new LockPatternUtils(context); mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker); + mDreamManager = IDreamManager.Stub.asInterface( + ServiceManager.getService(DreamService.DREAM_SERVICE)); + if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); } @@ -1183,7 +1211,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean shouldListenForFingerprint() { return (mKeyguardIsVisible || !mDeviceInteractive || (mBouncer && !mKeyguardGoingAway) || mGoingToSleep || - shouldListenForFingerprintAssistant()) + shouldListenForFingerprintAssistant() || (mKeyguardOccluded && mIsDreaming)) && !mSwitchingUser && !isFingerprintDisabled(getCurrentUser()) && !mKeyguardGoingAway; } diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 97a596242fbd..a9a915b23a0c 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -42,6 +42,7 @@ import com.android.systemui.power.PowerNotificationWarnings; import com.android.systemui.power.PowerUI; import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.ManagedProfileController; import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -296,12 +297,13 @@ public class Dependency extends SystemUI { mProviders.put(UiOffloadThread.class, UiOffloadThread::new); - mProviders.put(PowerUI.WarningsUI.class, () -> new PowerNotificationWarnings(mContext)); mProviders.put(IconLogger.class, () -> new IconLoggerImpl(mContext, getDependency(BG_LOOPER), getDependency(MetricsLogger.class))); + mProviders.put(LightBarController.class, () -> new LightBarController(mContext)); + // Put all dependencies above here so the factory can override them if it wants. SystemUIFactory.getInstance().injectDependencies(mProviders, mContext); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 6c95a8013108..5a3081cd6664 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -18,6 +18,7 @@ package com.android.systemui.qs.customize; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; +import android.app.AlertDialog; import android.content.Context; import android.content.res.Configuration; import android.graphics.drawable.Drawable; @@ -35,6 +36,8 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import android.widget.LinearLayout; import android.widget.Toolbar; import android.widget.Toolbar.OnMenuItemClickListener; @@ -48,7 +51,9 @@ import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSContainerImpl; import com.android.systemui.qs.QSDetailClipper; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; +import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.KeyguardMonitor.Callback; @@ -67,6 +72,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene private static final String EXTRA_QS_CUSTOMIZING = "qs_customizing"; private final QSDetailClipper mClipper; + private final LightBarController mLightBarController; private boolean isShown; private QSTileHost mHost; @@ -80,6 +86,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene private int mX; private int mY; private boolean mOpening; + private boolean mIsShowingNavBackdrop; public QSCustomizer(Context context, AttributeSet attrs) { super(new ContextThemeWrapper(context, R.style.edit_theme), attrs); @@ -114,6 +121,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene DefaultItemAnimator animator = new DefaultItemAnimator(); animator.setMoveDuration(TileAdapter.MOVE_DURATION); mRecyclerView.setItemAnimator(animator); + mLightBarController = Dependency.get(LightBarController.class); updateNavBackDrop(getResources().getConfiguration()); } @@ -125,11 +133,16 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene private void updateNavBackDrop(Configuration newConfig) { View navBackdrop = findViewById(R.id.nav_bar_background); + mIsShowingNavBackdrop = newConfig.smallestScreenWidthDp >= 600 + || newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE; if (navBackdrop != null) { - boolean shouldShow = newConfig.smallestScreenWidthDp >= 600 - || newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE; - navBackdrop.setVisibility(shouldShow ? View.VISIBLE : View.GONE); + navBackdrop.setVisibility(mIsShowingNavBackdrop ? View.VISIBLE : View.GONE); } + updateNavColors(); + } + + private void updateNavColors() { + mLightBarController.setQsCustomizing(mIsShowingNavBackdrop && isShown); } public void setHost(QSTileHost host) { @@ -161,6 +174,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene announceForAccessibility(mContext.getString( R.string.accessibility_desc_quick_settings_edit)); Dependency.get(KeyguardMonitor.class).addCallback(mKeyguardCallback); + updateNavColors(); } } @@ -176,6 +190,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene mNotifQsContainer.setCustomizerAnimating(false); mNotifQsContainer.setCustomizerShowing(true); Dependency.get(KeyguardMonitor.class).addCallback(mKeyguardCallback); + updateNavColors(); } } @@ -201,6 +216,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene announceForAccessibility(mContext.getString( R.string.accessibility_desc_quick_settings)); Dependency.get(KeyguardMonitor.class).removeCallback(mKeyguardCallback); + updateNavColors(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 184b95d56260..5557dde7a5d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -380,6 +380,15 @@ public class NotificationShelf extends ActivatableNotificationView implements } } + @Override + public void setFakeShadowIntensity(float shadowIntensity, float outlineAlpha, int shadowYEnd, + int outlineTranslation) { + if (!mHasItemsInStableShelf) { + shadowIntensity = 0.0f; + } + super.setFakeShadowIntensity(shadowIntensity, outlineAlpha, shadowYEnd, outlineTranslation); + } + /** * @return the icon amount how much this notification is in the shelf; */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java index 316d229e4f1a..00cb5329d2e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java @@ -85,6 +85,11 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { public static final int MODE_DISMISS_BOUNCER = 6; /** + * Mode in which fingerprint wakes and unlocks the device from a dream. + */ + public static final int MODE_WAKE_AND_UNLOCK_FROM_DREAM = 7; + + /** * How much faster we collapse the lockscreen when authenticating with fingerprint. */ private static final float FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR = 1.1f; @@ -230,16 +235,19 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { } Trace.endSection(); break; + case MODE_WAKE_AND_UNLOCK_FROM_DREAM: case MODE_WAKE_AND_UNLOCK_PULSING: case MODE_WAKE_AND_UNLOCK: if (mMode == MODE_WAKE_AND_UNLOCK_PULSING) { Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING"); mStatusBar.updateMediaMetaData(false /* metaDataChanged */, true /* allowEnterAnimation */); - } else { + } else if (mMode == MODE_WAKE_AND_UNLOCK){ Trace.beginSection("MODE_WAKE_AND_UNLOCK"); - mDozeScrimController.abortDoze(); + } else { + Trace.beginSection("MODE_WAKE_AND_UNLOCK_FROM_DREAM"); + mUpdateMonitor.awakenFromDream(); } mStatusBarWindowManager.setStatusBarFocusable(false); mKeyguardViewMediator.onWakeAndUnlocking(); @@ -299,6 +307,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { private int calculateMode() { boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithFingerprintAllowed(); + boolean deviceDreaming = mUpdateMonitor.isDreaming(); if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { @@ -311,6 +320,9 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { return MODE_SHOW_BOUNCER; } } + if (unlockingAllowed && deviceDreaming) { + return MODE_WAKE_AND_UNLOCK_FROM_DREAM; + } if (mStatusBarKeyguardViewManager.isShowing()) { if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) { return MODE_DISMISS_BOUNCER; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index fd95cc4adc1d..165ed78996b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -27,6 +27,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.view.WindowInsets; import android.view.accessibility.AccessibilityEvent; import com.android.internal.widget.LockPatternUtils; @@ -247,12 +248,16 @@ public class KeyguardBouncer { removeView(); mHandler.removeCallbacks(mRemoveViewRunnable); mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null); - mKeyguardView = (KeyguardHostView) mRoot.findViewById(R.id.keyguard_host_view); + mKeyguardView = mRoot.findViewById(R.id.keyguard_host_view); mKeyguardView.setLockPatternUtils(mLockPatternUtils); mKeyguardView.setViewMediatorCallback(mCallback); mContainer.addView(mRoot, mContainer.getChildCount()); mRoot.setVisibility(View.INVISIBLE); - mRoot.dispatchApplyWindowInsets(mRoot.getRootWindowInsets()); + + final WindowInsets rootInsets = mRoot.getRootWindowInsets(); + if (rootInsets != null) { + mRoot.dispatchApplyWindowInsets(rootInsets); + } } protected void removeView() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java index 917a56fbc99d..533771a31d0e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java @@ -72,6 +72,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final Rect mLastFullscreenBounds = new Rect(); private final Rect mLastDockedBounds = new Rect(); + private boolean mQsCustomizing; public LightBarController(Context ctx) { mDarkModeColor = Color.valueOf(ctx.getColor(R.color.dark_mode_icon_color_single_tone)); @@ -129,7 +130,8 @@ public class LightBarController implements BatteryController.BatteryStateChangeC mHasLightNavigationBar = isLight(vis, navigationBarMode, View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); mNavigationLight = mHasLightNavigationBar - && (mScrimAlphaBelowThreshold || !mInvertLightNavBarWithScrim); + && (mScrimAlphaBelowThreshold || !mInvertLightNavBarWithScrim) + && !mQsCustomizing; if (mNavigationLight != last) { updateNavigation(); } @@ -146,6 +148,12 @@ public class LightBarController implements BatteryController.BatteryStateChangeC mLastNavigationBarMode); } + public void setQsCustomizing(boolean customizing) { + if (mQsCustomizing == customizing) return; + mQsCustomizing = customizing; + reevaluate(); + } + public void setScrimAlpha(float alpha) { mScrimAlpha = alpha; boolean belowThresholdBefore = mScrimAlphaBelowThreshold; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 7c6e886ad0a6..00ba1f293b8a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1125,7 +1125,7 @@ public class StatusBar extends SystemUI implements DemoMode, } }); - mLightBarController = new LightBarController(context); + mLightBarController = Dependency.get(LightBarController.class); if (mNavigationBar != null) { mNavigationBar.setLightBarController(mLightBarController); } @@ -4788,7 +4788,7 @@ public class StatusBar extends SystemUI implements DemoMode, animateCollapsePanels(); return true; } - if (mKeyguardUserSwitcher.hideIfNotSimple(true)) { + if (mKeyguardUserSwitcher != null && mKeyguardUserSwitcher.hideIfNotSimple(true)) { return true; } return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index 1411a544c346..f9c2130e4e81 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -159,6 +159,11 @@ public class UnlockMethodCache { public void onScreenTurnedOff() { update(false /* updateAlways */); } + + @Override + public void onKeyguardVisibilityChanged(boolean showing) { + update(false /* updateAlways */); + } }; public boolean isTrustManaged() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 4e592dbed322..75532d9e09be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -23,14 +23,12 @@ import android.animation.PropertyValuesHolder; import android.animation.TimeAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.annotation.ColorInt; import android.annotation.FloatRange; import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.PorterDuff; @@ -1083,6 +1081,20 @@ public class NotificationStackScrollLayout extends ViewGroup @Override public ExpandableView getChildAtPosition(float touchX, float touchY) { + return getChildAtPosition(touchX, touchY, true /* requireMinHeight */); + + } + + /** + * Get the child at a certain screen location. + * + * @param touchX the x coordinate + * @param touchY the y coordinate + * @param requireMinHeight Whether a minimum height is required for a child to be returned. + * @return the child at the given location. + */ + private ExpandableView getChildAtPosition(float touchX, float touchY, + boolean requireMinHeight) { // find the view under the pointer, accounting for GONE views final int count = getChildCount(); for (int childIdx = 0; childIdx < count; childIdx++) { @@ -1101,7 +1113,7 @@ public class NotificationStackScrollLayout extends ViewGroup int left = 0; int right = getWidth(); - if (bottom - top >= mMinInteractionHeight + if ((bottom - top >= mMinInteractionHeight || !requireMinHeight) && touchY >= top && touchY <= bottom && touchX >= left && touchX <= right) { if (slidingChild instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) slidingChild; @@ -3220,7 +3232,7 @@ public class NotificationStackScrollLayout extends ViewGroup case MotionEvent.ACTION_DOWN: { final int y = (int) ev.getY(); mScrolledToTopOnFirstDown = isScrolledToTop(); - if (getChildAtPosition(ev.getX(), y) == null) { + if (getChildAtPosition(ev.getX(), y, false /* requireMinHeight */) == null) { setIsBeingDragged(false); recycleVelocityTracker(); break; diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java index 66d00dd6c5c6..65d969932ef5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java +++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java @@ -54,6 +54,7 @@ public abstract class SysuiTestCase { @Before public void SysuiSetup() throws Exception { System.setProperty("dexmaker.share_classloader", "true"); + mContext.setTheme(R.style.Theme_SystemUI); SystemUIFactory.createFromConfig(mContext); mRealInstrumentation = InstrumentationRegistry.getInstrumentation(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java new file mode 100644 index 000000000000..40512205a8f8 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2017 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.statusbar.phone; + +import static org.mockito.Mockito.mock; + +import android.content.Context; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.test.UiThreadTest; +import android.view.ContextThemeWrapper; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.ViewMediatorCallback; +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.keyguard.DismissCallbackRegistry; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class KeyguardBouncerTest extends SysuiTestCase { + + @UiThreadTest + @Test + public void inflateDetached() { + final ViewGroup container = new FrameLayout(getContext()); + final KeyguardBouncer bouncer = new KeyguardBouncer(getContext(), + mock(ViewMediatorCallback.class), mock(LockPatternUtils.class), container, mock( + DismissCallbackRegistry.class)); + + // Detached bouncer should still be able to be inflated + bouncer.inflateView(); + } + +} diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 56ae57bd69cd..791b2c066821 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1214,11 +1214,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // Still waiting for something to pause; can't sleep yet. if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still waiting to pause " + mPausingActivity); shouldSleep = false; - } else if (mLastPausedActivity == topActivity()) { - // Our top activity is currently paused, we need to ensure we move it to the stopped - // state. - stopActivityLocked(mLastPausedActivity); - shouldSleep = false; } if (!shuttingDown) { diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java index db72c5e4cbab..efc930ebf8ea 100644 --- a/services/core/java/com/android/server/clipboard/ClipboardService.java +++ b/services/core/java/com/android/server/clipboard/ClipboardService.java @@ -20,6 +20,7 @@ import android.app.ActivityManager; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.IActivityManager; +import android.app.KeyguardManager; import android.content.ClipData; import android.content.ClipDescription; import android.content.ContentProvider; @@ -304,7 +305,7 @@ public class ClipboardService extends SystemService { public ClipData getPrimaryClip(String pkg) { synchronized (this) { if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, pkg, - Binder.getCallingUid())) { + Binder.getCallingUid()) || isDeviceLocked()) { return null; } addActiveOwnerLocked(Binder.getCallingUid(), pkg); @@ -316,7 +317,7 @@ public class ClipboardService extends SystemService { public ClipDescription getPrimaryClipDescription(String callingPackage) { synchronized (this) { if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, callingPackage, - Binder.getCallingUid())) { + Binder.getCallingUid()) || isDeviceLocked()) { return null; } PerUserClipboard clipboard = getClipboard(); @@ -328,7 +329,7 @@ public class ClipboardService extends SystemService { public boolean hasPrimaryClip(String callingPackage) { synchronized (this) { if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, callingPackage, - Binder.getCallingUid())) { + Binder.getCallingUid()) || isDeviceLocked()) { return false; } return getClipboard().primaryClip != null; @@ -355,7 +356,7 @@ public class ClipboardService extends SystemService { public boolean hasClipboardText(String callingPackage) { synchronized (this) { if (!clipboardAccessAllowed(AppOpsManager.OP_READ_CLIPBOARD, callingPackage, - Binder.getCallingUid())) { + Binder.getCallingUid()) || isDeviceLocked()) { return false; } PerUserClipboard clipboard = getClipboard(); @@ -433,6 +434,12 @@ public class ClipboardService extends SystemService { } } + private boolean isDeviceLocked() { + final KeyguardManager keyguardManager = getContext().getSystemService( + KeyguardManager.class); + return keyguardManager != null && keyguardManager.isDeviceLocked(); + } + private final void checkUriOwnerLocked(Uri uri, int uid) { if (!"content".equals(uri.getScheme())) { return; diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java index 553fd8c453a0..76195c4ac7d4 100644 --- a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java +++ b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java @@ -109,6 +109,10 @@ public class OffloadHardwareInterface { mLog.e("tethering offload control not supported: " + e); return false; } + if (mOffloadControl == null) { + mLog.e("tethering IOffloadControl.getService() returned null"); + return false; + } } final String logmsg = String.format("initOffloadControl(%s)", diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index da6e26e17122..6253857d1aa4 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -53,7 +53,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub { private final static boolean DEBUG_DEXOPT = true; // The synthetic library dependencies denoting "no checks." - private final static String[] NO_LIBRARIES = new String[] { "&" }; + private final static String[] NO_LIBRARIES = + new String[] { PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK }; // The amount of "available" (free - low threshold) space necessary at the start of an OTA to // not bulk-delete unused apps' odex files. @@ -322,11 +323,6 @@ public class OtaDexoptService extends IOtaDexopt.Stub { new DexoptOptions(pkg.packageName, compilationReason, DexoptOptions.DEXOPT_BOOT_COMPLETE)); - mPackageManagerService.getDexManager().dexoptSecondaryDex( - new DexoptOptions(pkg.packageName, compilationReason, - DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX | - DexoptOptions.DEXOPT_BOOT_COMPLETE)); - return commands; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 4145e60af191..f594b38c8f17 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2711,8 +2711,14 @@ public class PackageManagerService extends IPackageManager.Stub // Actual deletion of code and data will be handled by later // reconciliation step } else { - final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(ps.name); - if (disabledPs.codePath == null || !disabledPs.codePath.exists()) { + // we still have a disabled system package, but, it still might have + // been removed. check the code path still exists and check there's + // still a package. the latter can happen if an OTA keeps the same + // code path, but, changes the package name. + final PackageSetting disabledPs = + mSettings.getDisabledSystemPkgLPr(ps.name); + if (disabledPs.codePath == null || !disabledPs.codePath.exists() + || disabledPs.pkg == null) { possiblyDeletedUpdatedSystemApps.add(ps.name); } } @@ -11398,6 +11404,10 @@ public class PackageManagerService extends IPackageManager.Stub + " but expected at " + known.codePathString + "; ignoring."); } + } else { + throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION, + "Application package " + pkg.packageName + + " not found; ignoring."); } } } diff --git a/services/core/java/com/android/server/pm/dex/DexoptUtils.java b/services/core/java/com/android/server/pm/dex/DexoptUtils.java index ef2ee4a41555..e1310a2f1ab3 100644 --- a/services/core/java/com/android/server/pm/dex/DexoptUtils.java +++ b/services/core/java/com/android/server/pm/dex/DexoptUtils.java @@ -21,6 +21,7 @@ import android.util.Slog; import android.util.SparseArray; import com.android.internal.os.ClassLoaderFactory; +import com.android.server.pm.PackageDexOptimizer; import java.io.File; import java.util.ArrayList; @@ -238,10 +239,15 @@ public final class DexoptUtils { /** * Encodes a single class loader dependency starting from {@param path} and * {@param classLoaderName}. + * When classpath is {@link PackageDexOptimizer#SKIP_SHARED_LIBRARY_CHECK}, the method returns + * the same. This special property is used only during OTA. * NOTE: Keep this in sync with the dexopt expectations! Right now that is either "PCL[path]" * for a PathClassLoader or "DLC[path]" for a DelegateLastClassLoader. */ - private static String encodeClassLoader(String classpath, String classLoaderName) { + /*package*/ static String encodeClassLoader(String classpath, String classLoaderName) { + if (classpath.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK)) { + return classpath; + } String classLoaderDexoptEncoding = classLoaderName; if (ClassLoaderFactory.isPathClassLoaderName(classLoaderName)) { classLoaderDexoptEncoding = "PCL"; @@ -255,10 +261,17 @@ public final class DexoptUtils { /** * Links to dependencies together in a format accepted by dexopt. + * For the special case when either of cl1 or cl2 equals + * {@link PackageDexOptimizer#SKIP_SHARED_LIBRARY_CHECK}, the method returns the same. This + * property is used only during OTA. * NOTE: Keep this in sync with the dexopt expectations! Right now that is a list of split * dependencies {@see encodeClassLoader} separated by ';'. */ - private static String encodeClassLoaderChain(String cl1, String cl2) { + /*package*/ static String encodeClassLoaderChain(String cl1, String cl2) { + if (cl1.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK) || + cl2.equals(PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK)) { + return PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK; + } if (cl1.isEmpty()) return cl2; if (cl2.isEmpty()) return cl1; return cl1 + ";" + cl2; diff --git a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp index f9cbd1601290..9a17635721b8 100644 --- a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp +++ b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp @@ -113,7 +113,7 @@ static jboolean android_server_connectivity_tethering_OffloadHardwareInterface_c hidl_handle h1(handleFromFileDescriptor(std::move(fd1))), h2(handleFromFileDescriptor(std::move(fd2))); - bool rval; + bool rval(false); hidl_string msg; const auto status = configInterface->setHandles(h1, h2, [&rval, &msg](bool success, const hidl_string& errMsg) { @@ -123,6 +123,8 @@ static jboolean android_server_connectivity_tethering_OffloadHardwareInterface_c if (!status.isOk() || !rval) { ALOGE("IOffloadConfig::setHandles() error: '%s' / '%s'", status.description().c_str(), msg.c_str()); + // If status is somehow not ok, make sure rval captures this too. + rval = false; } return rval; diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java index c8c8eb1aa5c6..150f7f0c948c 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java @@ -16,10 +16,14 @@ package com.android.server.pm.dex; +import com.android.server.pm.PackageDexOptimizer; + +import static com.android.server.pm.PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import android.content.pm.ApplicationInfo; import android.support.test.filters.SmallTest; @@ -369,4 +373,49 @@ public class DexoptUtilsTest { } assertTrue(gotException); } + + @Test + public void testEncodeClassLoader() { + assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader( + SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.PathClassLoader")); + assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader( + SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.DexClassLoader")); + assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoader( + SKIP_SHARED_LIBRARY_CHECK, "dalvik.system.DelegateLastClassLoader")); + assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz", + "dalvik.system.PathClassLoader")); + assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz", + "dalvik.system.DexClassLoader")); + assertEquals("DLC[xyz]", DexoptUtils.encodeClassLoader("xyz", + "dalvik.system.DelegateLastClassLoader")); + assertEquals("PCL[xyz]", DexoptUtils.encodeClassLoader("xyz", null)); + assertEquals("abc[xyz]", DexoptUtils.encodeClassLoader("xyz", "abc")); + + try { + DexoptUtils.encodeClassLoader(null, "abc"); + fail(); // Exception should be caught. + } catch (NullPointerException expected) {} + } + + @Test + public void testEncodeClassLoaderChain() { + assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain( + SKIP_SHARED_LIBRARY_CHECK, "PCL[a]")); + assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain("PCL[a]", + SKIP_SHARED_LIBRARY_CHECK)); + assertEquals("PCL[a];DLC[b]", DexoptUtils.encodeClassLoaderChain("PCL[a]", + "DLC[b]")); + assertEquals(SKIP_SHARED_LIBRARY_CHECK, DexoptUtils.encodeClassLoaderChain("PCL[a]", + SKIP_SHARED_LIBRARY_CHECK)); + + try { + DexoptUtils.encodeClassLoaderChain("a", null); + fail(); // exception is expected + } catch (NullPointerException expected) {} + + try { + DexoptUtils.encodeClassLoaderChain(null, "b"); + fail(); // exception is expected + } catch (NullPointerException expected) {} + } } diff --git a/test-runner/Android.mk b/test-runner/Android.mk index 3c3718adff0e..060a51895474 100644 --- a/test-runner/Android.mk +++ b/test-runner/Android.mk @@ -107,11 +107,10 @@ LOCAL_JAVA_LIBRARIES := \ LOCAL_SOURCE_FILES_ALL_GENERATED := true -include $(BUILD_STATIC_JAVA_LIBRARY) - # Make sure to run droiddoc first to generate the stub source files. -$(full_classes_compiled_jar) : $(android_test_runner_api_gen_stamp) -$(full_classes_jack) : $(android_test_runner_api_gen_stamp) +LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_runner_api_gen_stamp) + +include $(BUILD_STATIC_JAVA_LIBRARY) # Archive a copy of the classes.jar in SDK build. $(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.runner.stubs.jar) @@ -202,11 +201,10 @@ LOCAL_MODULE := android.test.mock.stubs LOCAL_SOURCE_FILES_ALL_GENERATED := true -include $(BUILD_STATIC_JAVA_LIBRARY) - # Make sure to run droiddoc first to generate the stub source files. -$(full_classes_compiled_jar) : $(android_test_mock_gen_stamp) -$(full_classes_jack) : $(android_test_mock_gen_stamp) +LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_mock_gen_stamp) + +include $(BUILD_STATIC_JAVA_LIBRARY) # Archive a copy of the classes.jar in SDK build. $(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.mock.stubs.jar) |