diff options
31 files changed, 236 insertions, 67 deletions
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index b52e4b019f8f..2b3d6436dd4e 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -507,6 +507,11 @@ public interface WindowManagerPolicy { * Retrieves the {@param outBounds} from the stack with id {@param stackId}. */ void getStackBounds(int stackId, Rect outBounds); + + /** + * Overrides all currently playing app animations with {@param a}. + */ + void overridePlayingAppAnimationsLw(Animation a); } public interface PointerEventListener { diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 83d75fba80f9..e51ad3f737b8 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -28,8 +28,9 @@ oneway interface IKeyguardService { * FLAG_SHOW_ON_LOCK_SCREEN. * * @param isOccluded Whether the Keyguard is occluded by another window. + * @param animate Whether to play an animation for the state change. */ - void setOccluded(boolean isOccluded); + void setOccluded(boolean isOccluded, boolean animate); void addStateMonitorCallback(IKeyguardStateCallback callback); void verifyUnlock(IKeyguardExitCallback callback); diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java index fbc51cdca6c2..5a50fbfd5277 100644 --- a/core/java/com/android/server/BootReceiver.java +++ b/core/java/com/android/server/BootReceiver.java @@ -79,6 +79,9 @@ public class BootReceiver extends BroadcastReceiver { private static final String LOG_FILES_FILE = "log-files.xml"; private static final AtomicFile sFile = new AtomicFile(new File( Environment.getDataSystemDirectory(), LOG_FILES_FILE)); + private static final String LAST_HEADER_FILE = "last-header.txt"; + private static final File lastHeaderFile = new File( + Environment.getDataSystemDirectory(), LAST_HEADER_FILE); @Override public void onReceive(final Context context, Intent intent) { @@ -113,9 +116,17 @@ public class BootReceiver extends BroadcastReceiver { Downloads.removeAllDownloadsByPackage(context, OLD_UPDATER_PACKAGE, OLD_UPDATER_CLASS); } - private void logBootEvents(Context ctx) throws IOException { - final DropBoxManager db = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE); - final String headers = new StringBuilder(512) + private String getPreviousBootHeaders() { + try { + return FileUtils.readTextFile(lastHeaderFile, 0, null); + } catch (IOException e) { + Slog.e(TAG, "Error reading " + lastHeaderFile, e); + return null; + } + } + + private String getCurrentBootHeaders() throws IOException { + return new StringBuilder(512) .append("Build: ").append(Build.FINGERPRINT).append("\n") .append("Hardware: ").append(Build.BOARD).append("\n") .append("Revision: ") @@ -125,6 +136,31 @@ public class BootReceiver extends BroadcastReceiver { .append("Kernel: ") .append(FileUtils.readTextFile(new File("/proc/version"), 1024, "...\n")) .append("\n").toString(); + } + + + private String getBootHeadersToLogAndUpdate() throws IOException { + final String oldHeaders = getPreviousBootHeaders(); + final String newHeaders = getCurrentBootHeaders(); + + try { + FileUtils.stringToFile(lastHeaderFile, newHeaders); + } catch (IOException e) { + Slog.e(TAG, "Error writing " + lastHeaderFile, e); + } + + if (oldHeaders == null) { + // If we failed to read the old headers, use the current headers + // but note this in the headers so we know + return "isPrevious: false\n" + newHeaders; + } + + return "isPrevious: true\n" + oldHeaders; + } + + private void logBootEvents(Context ctx) throws IOException { + final DropBoxManager db = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE); + final String headers = getBootHeadersToLogAndUpdate(); final String bootReason = SystemProperties.get("ro.boot.bootreason", null); String recovery = RecoverySystem.handleAftermath(ctx); diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index c687fe8b0d54..67ab8cbe0e16 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1942,6 +1942,7 @@ <java-symbol type="anim" name="lock_screen_behind_enter_fade_in" /> <java-symbol type="anim" name="lock_screen_wallpaper_exit" /> <java-symbol type="anim" name="launch_task_behind_source" /> + <java-symbol type="anim" name="wallpaper_open_exit" /> <java-symbol type="bool" name="config_alwaysUseCdmaRssi" /> <java-symbol type="dimen" name="status_bar_icon_size" /> diff --git a/obex/javax/obex/ClientOperation.java b/obex/javax/obex/ClientOperation.java index 883c8c6ed75d..b65598cdad63 100644 --- a/obex/javax/obex/ClientOperation.java +++ b/obex/javax/obex/ClientOperation.java @@ -207,7 +207,6 @@ public final class ClientOperation implements Operation, BaseStream { * object */ public synchronized int getResponseCode() throws IOException { - //avoid dup validateConnection if ((mReplyHeader.responseCode == -1) || (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) { validateConnection(); @@ -423,8 +422,9 @@ public final class ClientOperation implements Operation, BaseStream { private void validateConnection() throws IOException { ensureOpen(); - // to sure only one privateInput object exist. - if (mPrivateInput == null) { + // Make sure that a response has been recieved from remote + // before continuing + if (mPrivateInput == null || mReplyHeader.responseCode == -1) { startProcessing(); } } diff --git a/packages/PrintSpooler/res/layout/print_activity.xml b/packages/PrintSpooler/res/layout/print_activity.xml index 2db6fb06480c..31a776c99e80 100644 --- a/packages/PrintSpooler/res/layout/print_activity.xml +++ b/packages/PrintSpooler/res/layout/print_activity.xml @@ -16,7 +16,6 @@ <com.android.printspooler.widget.PrintContentView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:printspooler="http://schemas.android.com/apk/res/com.android.printspooler" android:id="@+id/options_content" android:layout_width="fill_parent" android:layout_height="fill_parent"> @@ -28,12 +27,14 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingStart="8dip" + android:layout_marginEnd="16dp" android:elevation="@dimen/preview_controls_elevation" android:background="?android:attr/colorPrimary"> <Spinner android:id="@+id/destination_spinner" - android:layout_width="@dimen/preview_destination_spinner_width" + android:layout_width="wrap_content" + android:minWidth="@dimen/preview_destination_spinner_width" android:layout_height="wrap_content" android:layout_marginTop="4dip" android:dropDownWidth="wrap_content" diff --git a/packages/PrintSpooler/res/layout/printer_dropdown_item.xml b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml index 103c157b873f..0d8a90abe64b 100644 --- a/packages/PrintSpooler/res/layout/printer_dropdown_item.xml +++ b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml @@ -16,7 +16,8 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" - android:layout_height="?android:attr/listPreferredItemHeightSmall" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeightSmall" style="?android:attr/spinnerItemStyle" android:orientation="horizontal" android:gravity="start|center_vertical"> diff --git a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java index 8b0759942df8..9fd80d3ef616 100644 --- a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java +++ b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java @@ -132,6 +132,7 @@ public class BugreportStorageProvider extends DocumentsProvider { if (!getFileForDocId(documentId).delete()) { throw new FileNotFoundException("Failed to delete: " + documentId); } + getContext().getContentResolver().notifyChange(getNotificationUri(), null); } // This is used by BugreportProgressService so that the notification uri shared by diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 84901ee67e71..b393cf7eb9d5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -90,10 +90,10 @@ public class KeyguardService extends Service { } @Override // Binder interface - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { Trace.beginSection("KeyguardService.mBinder#setOccluded"); checkPermission(); - mKeyguardViewMediator.setOccluded(isOccluded); + mKeyguardViewMediator.setOccluded(isOccluded, animate); Trace.endSection(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index de0c77b8a2d6..4449435dde40 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1114,11 +1114,11 @@ public class KeyguardViewMediator extends SystemUI { /** * Notify us when the keyguard is occluded by another window */ - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { Trace.beginSection("KeyguardViewMediator#setOccluded"); if (DEBUG) Log.d(TAG, "setOccluded " + isOccluded); mHandler.removeMessages(SET_OCCLUDED); - Message msg = mHandler.obtainMessage(SET_OCCLUDED, (isOccluded ? 1 : 0), 0); + Message msg = mHandler.obtainMessage(SET_OCCLUDED, isOccluded ? 1 : 0, animate ? 1 : 0); mHandler.sendMessage(msg); Trace.endSection(); } @@ -1126,7 +1126,7 @@ public class KeyguardViewMediator extends SystemUI { /** * Handles SET_OCCLUDED message sent by setOccluded() */ - private void handleSetOccluded(boolean isOccluded) { + private void handleSetOccluded(boolean isOccluded, boolean animate) { Trace.beginSection("KeyguardViewMediator#handleSetOccluded"); synchronized (KeyguardViewMediator.this) { if (mHiding && isOccluded) { @@ -1137,7 +1137,7 @@ public class KeyguardViewMediator extends SystemUI { if (mOccluded != isOccluded) { mOccluded = isOccluded; - mStatusBarKeyguardViewManager.setOccluded(isOccluded); + mStatusBarKeyguardViewManager.setOccluded(isOccluded, animate); updateActivityLockScreenState(); adjustStatusBarLocked(); } @@ -1468,7 +1468,7 @@ public class KeyguardViewMediator extends SystemUI { break; case SET_OCCLUDED: Trace.beginSection("KeyguardViewMediator#handleMessage SET_OCCLUDED"); - handleSetOccluded(msg.arg1 != 0); + handleSetOccluded(msg.arg1 != 0, msg.arg2 != 0); Trace.endSection(); break; case KEYGUARD_TIMEOUT: diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index af851014f04d..a6a5742e240c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -92,6 +92,7 @@ public abstract class PanelView extends FrameLayout { * Whether an instant expand request is currently pending and we are just waiting for layout. */ private boolean mInstantExpanding; + private boolean mAnimateAfterExpanding; PanelBar mBar; @@ -656,7 +657,7 @@ public abstract class PanelView extends FrameLayout { vel = 0; } mFlingAnimationUtils.apply(animator, mExpandedHeight, target, vel, getHeight()); - if (expandBecauseOfFalsing) { + if (vel == 0) { animator.setDuration(350); } } else { @@ -870,6 +871,7 @@ public abstract class PanelView extends FrameLayout { } mInstantExpanding = true; + mAnimateAfterExpanding = animate; mUpdateFlingOnLayout = false; abortAnimations(); cancelPeek(); @@ -894,7 +896,7 @@ public abstract class PanelView extends FrameLayout { if (mStatusBar.getStatusBarWindow().getHeight() != mStatusBar.getStatusBarHeight()) { getViewTreeObserver().removeOnGlobalLayoutListener(this); - if (animate) { + if (mAnimateAfterExpanding) { notifyExpandingStarted(); fling(0, true /* expand */); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 96fb7a8172d0..b1bea0287ddb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -279,6 +279,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, */ private static final int REMOTE_INPUT_KEPT_ENTRY_AUTO_CANCEL_DELAY = 200; + /** + * Never let the alpha become zero for surfaces that draw with SRC - otherwise the RenderNode + * won't draw anything and uninitialized memory will show through + * if mScrimSrcModeEnabled. Note that 0.001 is rounded down to 0 in + * libhwui. + */ + private static final float SRC_MIN_ALPHA = 0.002f; + static { boolean onlyCoreApps; boolean freeformWindowManagement; @@ -2209,17 +2217,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mBackdrop.getVisibility() != View.VISIBLE) { mBackdrop.setVisibility(View.VISIBLE); if (allowEnterAnimation) { - mBackdrop.animate().alpha(1f).withEndAction(new Runnable() { - @Override - public void run() { - mStatusBarWindowManager.setBackdropShowing(true); - } - }); + mBackdrop.setAlpha(SRC_MIN_ALPHA); + mBackdrop.animate().alpha(1f); } else { mBackdrop.animate().cancel(); mBackdrop.setAlpha(1f); - mStatusBarWindowManager.setBackdropShowing(true); } + mStatusBarWindowManager.setBackdropShowing(true); metaDataChanged = true; if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Fading in album artwork"); @@ -2282,11 +2286,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } else { mStatusBarWindowManager.setBackdropShowing(false); mBackdrop.animate() - // Never let the alpha become zero - otherwise the RenderNode - // won't draw anything and uninitialized memory will show through - // if mScrimSrcModeEnabled. Note that 0.001 is rounded down to 0 in - // libhwui. - .alpha(0.002f) + .alpha(SRC_MIN_ALPHA) .setInterpolator(Interpolators.ACCELERATE_DECELERATE) .setDuration(300) .setStartDelay(0) @@ -2301,7 +2301,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, }); if (mKeyguardFadingAway) { mBackdrop.animate() - // Make it disappear faster, as the focus should be on the activity // behind. .setDuration(mKeyguardFadingAwayDuration / 2) @@ -4120,6 +4119,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } /** + * Plays the animation when an activity that was occluding Keyguard goes away. + */ + public void animateKeyguardUnoccluding() { + mScrimController.animateKeyguardUnoccluding(500); + mNotificationPanel.setExpandedFraction(0f); + animateExpandNotificationsPanel(); + } + + /** * Starts the timeout when we try to start the affordances on Keyguard. We usually rely that * Keyguard goes away via fadeKeyguardAfterLaunchTransition, however, that might not happen * because the launched app crashed or something else went wrong. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 8b87a7fa1596..73a95c201bce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -196,6 +196,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } } + public void animateKeyguardUnoccluding(long duration) { + mAnimateChange = false; + setScrimBehindColor(0f); + mAnimateChange = true; + scheduleUpdate(); + mDurationOverride = duration; + } + public void animateGoingToFullShade(long delay, long duration) { mDurationOverride = duration; mAnimationDelay = delay; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index c72f994cf5a8..def4bc3c5790 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -242,7 +242,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb return mStatusBarWindowManager.isShowingWallpaper(); } - public void setOccluded(boolean occluded) { + public void setOccluded(boolean occluded, boolean animate) { if (occluded && !mOccluded && mShowing) { if (mPhoneStatusBar.isInLaunchTransition()) { mOccluded = true; @@ -258,9 +258,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } } mOccluded = occluded; - mPhoneStatusBar.updateMediaMetaData(false, false); + mPhoneStatusBar.updateMediaMetaData(false, animate && !occluded); mStatusBarWindowManager.setKeyguardOccluded(occluded); reset(); + if (animate && !occluded) { + mPhoneStatusBar.animateKeyguardUnoccluding(); + } } public boolean isOccluded() { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 14243c540fb1..86afe08cedce 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4699,9 +4699,6 @@ public class ConnectivityService extends IConnectivityManager.Stub if (VDBG) log(" accepting network in place of " + currentNetwork.name()); currentNetwork.removeRequest(nri.request.requestId); currentNetwork.lingerRequest(nri.request, now, mLingerDelayMs); - if (isDefaultRequest(nri)) { - mLingerMonitor.noteLingerDefaultNetwork(currentNetwork, newNetwork); - } affectedNetworks.add(currentNetwork); } else { if (VDBG) log(" accepting network in place of null"); @@ -4722,6 +4719,9 @@ public class ConnectivityService extends IConnectivityManager.Stub if (isDefaultRequest(nri)) { isNewDefault = true; oldDefaultNetwork = currentNetwork; + if (currentNetwork != null) { + mLingerMonitor.noteLingerDefaultNetwork(currentNetwork, newNetwork); + } } } } else if (newNetwork.isSatisfyingRequest(nri.request.requestId)) { diff --git a/services/core/java/com/android/server/connectivity/LingerMonitor.java b/services/core/java/com/android/server/connectivity/LingerMonitor.java index 40348770238a..064a9048535e 100644 --- a/services/core/java/com/android/server/connectivity/LingerMonitor.java +++ b/services/core/java/com/android/server/connectivity/LingerMonitor.java @@ -242,6 +242,12 @@ public class LingerMonitor { return; } + // Only show the notification if we switched away because a network became unvalidated, not + // because its score changed. + // TODO: instead of just skipping notification, keep a note of it, and show it if it becomes + // unvalidated. + if (fromNai.lastValidated) return; + if (isNotificationEnabled(fromNai, toNai)) { notify(fromNai, toNai, forceToast); } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a39add80ba8f..ec07812c71f6 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5318,15 +5318,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean showing = mKeyguardDelegate.isShowing(); if (wasOccluded && !isOccluded && showing) { mKeyguardOccluded = false; - mKeyguardDelegate.setOccluded(false); + mKeyguardDelegate.setOccluded(false, true /* animate */); mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD; if (!mKeyguardDelegate.hasLockscreenWallpaper()) { mStatusBar.getAttrs().flags |= FLAG_SHOW_WALLPAPER; } + Animation anim = AnimationUtils.loadAnimation(mContext, + com.android.internal.R.anim.wallpaper_open_exit); + mWindowManagerFuncs.overridePlayingAppAnimationsLw(anim); return true; } else if (!wasOccluded && isOccluded && showing) { mKeyguardOccluded = true; - mKeyguardDelegate.setOccluded(true); + mKeyguardDelegate.setOccluded(true, false /* animate */); mStatusBar.getAttrs().privateFlags &= ~PRIVATE_FLAG_KEYGUARD; mStatusBar.getAttrs().flags &= ~FLAG_SHOW_WALLPAPER; return true; @@ -6397,6 +6400,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } mWindowManagerDrawComplete = true; + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onDrawCompleteLw(); + } } finishScreenTurningOn(); @@ -6866,7 +6872,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override public void systemReady() { - mKeyguardDelegate = new KeyguardServiceDelegate(mContext); + mKeyguardDelegate = new KeyguardServiceDelegate(mContext, + mWindowManagerFuncs.getWindowManagerLock()); mKeyguardDelegate.onSystemReady(); readCameraLensCoverState(); diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 4fce49e16815..acf855f085c3 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -19,6 +19,7 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManagerPolicy.OnKeyguardExitResult; +import com.android.internal.annotations.GuardedBy; import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; @@ -43,6 +44,7 @@ public class KeyguardServiceDelegate { private static final int INTERACTIVE_STATE_AWAKE = 1; private static final int INTERACTIVE_STATE_GOING_TO_SLEEP = 2; + private final Object mWindowManagerLock; protected KeyguardServiceWrapper mKeyguardService; private final Context mContext; private final View mScrim; // shown if keyguard crashes @@ -50,6 +52,9 @@ public class KeyguardServiceDelegate { private final KeyguardState mKeyguardState = new KeyguardState(); private DrawnListener mDrawnListenerWhenConnect; + @GuardedBy("mWindowManagerLock") + private boolean mHideScrimPending; + private static final class KeyguardState { KeyguardState() { // Assume keyguard is showing and secure until we know for sure. This is here in @@ -92,10 +97,12 @@ public class KeyguardServiceDelegate { @Override public void onDrawn() throws RemoteException { if (DEBUG) Log.v(TAG, "**** SHOWN CALLED ****"); + synchronized (mWindowManagerLock) { + mHideScrimPending = true; + } if (mDrawnListener != null) { mDrawnListener.onDrawn(); } - hideScrim(); } }; @@ -116,7 +123,8 @@ public class KeyguardServiceDelegate { } }; - public KeyguardServiceDelegate(Context context) { + public KeyguardServiceDelegate(Context context, Object windowManagerLock) { + mWindowManagerLock = windowManagerLock; mContext = context; mScrimHandler = UiThread.getHandler(); mScrim = createScrim(context, mScrimHandler); @@ -180,7 +188,7 @@ public class KeyguardServiceDelegate { mKeyguardService.onBootCompleted(); } if (mKeyguardState.occluded) { - mKeyguardService.setOccluded(mKeyguardState.occluded); + mKeyguardService.setOccluded(mKeyguardState.occluded, false /* animate */); } } @@ -232,10 +240,10 @@ public class KeyguardServiceDelegate { } } - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { if (mKeyguardService != null) { - if (DEBUG) Log.v(TAG, "setOccluded(" + isOccluded + ")"); - mKeyguardService.setOccluded(isOccluded); + if (DEBUG) Log.v(TAG, "setOccluded(" + isOccluded + ") animate=" + animate); + mKeyguardService.setOccluded(isOccluded, animate); } mKeyguardState.occluded = isOccluded; } @@ -355,6 +363,16 @@ public class KeyguardServiceDelegate { } } + /** + * Called when all windows were fully drawn. + */ + public void onDrawCompleteLw() { + if (mHideScrimPending) { + hideScrim(); + mHideScrimPending = false; + } + } + private static View createScrim(Context context, Handler handler) { final View view = new View(context); diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index 55652fe3a4e4..2169927d89ee 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -63,9 +63,9 @@ public class KeyguardServiceWrapper implements IKeyguardService { } @Override // Binder interface - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { try { - mService.setOccluded(isOccluded); + mService.setOccluded(isOccluded, animate); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index 8ce2fd9c2a83..3d2839ff4448 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -68,7 +68,7 @@ public final class ShutdownThread extends Thread { private static final int MAX_BROADCAST_TIME = 10*1000; private static final int MAX_SHUTDOWN_WAIT_TIME = 20*1000; private static final int MAX_RADIO_WAIT_TIME = 12*1000; - private static final int MAX_UNCRYPT_WAIT_TIME = 15*60*1000; + private static final int MAX_UNCRYPT_WAIT_TIME = 30*60*1000; // constants for progress bar. the values are roughly estimated based on timeout. private static final int BROADCAST_STOP_PERCENT = 2; private static final int ACTIVITY_MANAGER_STOP_PERCENT = 4; diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 621e43a12d48..a8a0b0efb784 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -30,6 +30,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.WINDOW_REPLACEMENT_TIMEOUT_DURATION; import static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN; +import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; import com.android.server.input.InputApplicationHandle; import com.android.server.wm.WindowManagerService.H; @@ -44,6 +45,7 @@ import android.util.Slog; import android.view.IApplicationToken; import android.view.View; import android.view.WindowManager; +import android.view.animation.Animation; import java.io.PrintWriter; import java.util.ArrayDeque; @@ -838,6 +840,18 @@ class AppWindowToken extends WindowToken { } } + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw} + */ + void overridePlayingAppAnimations(Animation a) { + if (mAppAnimator.isAnimating()) { + final WindowState win = findMainWindow(); + final int width = win.mContainingFrame.width(); + final int height = win.mContainingFrame.height(); + mAppAnimator.setAnimation(a, width, height, false, STACK_CLIP_NONE); + } + } + @Override void dump(PrintWriter pw, String prefix) { super.dump(pw, prefix); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index aba64e8cc081..9b5b101f04fc 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -35,6 +35,7 @@ import android.util.Slog; import android.view.Display; import android.view.DisplayInfo; import android.view.Surface; +import android.view.animation.Animation; import java.io.PrintWriter; import java.util.ArrayList; @@ -674,4 +675,13 @@ class DisplayContent { return touchedWin; } + + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw}. + */ + void overridePlayingAppAnimationsLw(Animation a) { + for (int i = mStacks.size() - 1; i >= 0; i--) { + mStacks.get(i).overridePlayingAppAnimations(a); + } + } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index fb9fafc39caf..ca1830106fb5 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -38,6 +38,7 @@ import android.util.EventLog; import android.util.Slog; import android.view.DisplayInfo; import android.view.Surface; +import android.view.animation.Animation; import com.android.server.EventLogTags; @@ -765,6 +766,15 @@ class Task implements DimLayer.DimLayerUser { return mStack.getDisplayContent().getDisplayInfo(); } + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw} + */ + void overridePlayingAppAnimations(Animation a) { + for (int i = mAppTokens.size() - 1; i >= 0; i--) { + mAppTokens.get(i).overridePlayingAppAnimations(a); + } + } + @Override public String toString() { return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}"; diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index a665edd22e71..8f8f6422091c 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -44,6 +44,7 @@ import android.util.SparseArray; import android.view.DisplayInfo; import android.view.Surface; import android.view.SurfaceControl; +import android.view.animation.Animation; import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; @@ -1367,4 +1368,13 @@ public class TaskStack implements DimLayer.DimLayerUser, public boolean getBoundsAnimating() { return mBoundsAnimating; } + + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw} + */ + void overridePlayingAppAnimations(Animation a) { + for (int i = mTasks.size() - 1; i >= 0; --i) { + mTasks.get(i).overridePlayingAppAnimations(a); + } + } } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 2b66c3af2beb..e7ceba90bde3 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -757,14 +757,16 @@ class WallpaperController { } // Now stick it in. For apps over wallpaper keep the wallpaper at the bottommost - // layer. For keyguard over wallpaper put the wallpaper under the keyguard. + // layer. For keyguard over wallpaper put the wallpaper under the lowest window that + // is currently on screen, i.e. not hidden by policy. int insertionIndex = 0; if (visible && wallpaperTarget != null) { final int type = wallpaperTarget.mAttrs.type; final int privateFlags = wallpaperTarget.mAttrs.privateFlags; if ((privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 || type == TYPE_KEYGUARD_SCRIM) { - insertionIndex = windows.indexOf(wallpaperTarget); + insertionIndex = Math.min(windows.indexOf(wallpaperTarget), + findLowestWindowOnScreen(windows)); } } if (DEBUG_WALLPAPER_LIGHT || DEBUG_WINDOW_MOVEMENT @@ -781,6 +783,21 @@ class WallpaperController { return changed; } + /** + * @return The index in {@param windows} of the lowest window that is currently on screen and + * not hidden by the policy. + */ + private int findLowestWindowOnScreen(WindowList windows) { + final int size = windows.size(); + for (int index = 0; index < size; index++) { + final WindowState win = windows.get(index); + if (win.isOnScreen()) { + return index; + } + } + return Integer.MAX_VALUE; + } + boolean adjustWallpaperWindows() { mService.mWindowPlacerLocked.mWallpaperMayChange = false; diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index b0d357c6320c..47b0f3b41833 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -234,14 +234,12 @@ public class WindowAnimator { boolean allowWhenLocked = false; // Show IME over the keyguard if the target allows it allowWhenLocked |= (win.mIsImWindow || imeTarget == win) && showImeOverKeyguard; - // Show SHOW_WHEN_LOCKED windows that turn on the screen - allowWhenLocked |= (win.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0 && win.mTurnOnScreen; + // Show SHOW_WHEN_LOCKED windows + allowWhenLocked |= (win.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0; if (appShowWhenLocked != null) { allowWhenLocked |= appShowWhenLocked == win.mAppToken - // Show all SHOW_WHEN_LOCKED windows if some apps are shown over lockscreen - || (win.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0 - // Show error dialogs over apps that dismiss keyguard. + // Show error dialogs over apps that are shown on lockscreen || (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 2145e9b58059..47a4114d7df8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -249,6 +249,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING; +import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; /** {@hide} */ public class WindowManagerService extends IWindowManager.Stub @@ -5211,6 +5212,11 @@ public class WindowManagerService extends IWindowManager.Stub } } + @Override + public void overridePlayingAppAnimationsLw(Animation a) { + getDefaultDisplayContentLocked().overridePlayingAppAnimationsLw(a); + } + /** * Re-sizes a stack and its containing tasks. * @param stackId Id of stack to resize. diff --git a/services/net/Android.mk b/services/net/Android.mk index 920f7c0ab8d4..408794e7d0b9 100644 --- a/services/net/Android.mk +++ b/services/net/Android.mk @@ -5,8 +5,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := services.net LOCAL_SRC_FILES += \ - $(call all-java-files-under,java) \ - ../../../../system/netd/server/binder/android/net/INetd.aidl + $(call all-java-files-under,java) LOCAL_AIDL_INCLUDES += \ system/netd/server/binder diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java index 07cc9c05f57a..07b26e83e934 100644 --- a/services/print/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java @@ -57,6 +57,9 @@ import java.util.concurrent.TimeoutException; * spooler if needed, to make the timed remote calls, to handle * remote exceptions, and to bind/unbind to the remote instance as * needed. + * + * The calls might be blocking and need the main thread of to be unblocked to finish. Hence do not + * call this while holding any monitors that might need to be acquired the main thread. */ final class RemotePrintSpooler { diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index 05301c1cb5f2..a91cdb38a15a 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -434,12 +434,12 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } public void createPrinterDiscoverySession(@NonNull IPrinterDiscoveryObserver observer) { + mSpooler.clearCustomPrinterIconCache(); + synchronized (mLock) { throwIfDestroyedLocked(); if (mPrinterDiscoverySession == null) { - mSpooler.clearCustomPrinterIconCache(); - // If we do not have a session, tell all service to create one. mPrinterDiscoverySession = new PrinterDiscoverySessionMediator(mContext) { @Override @@ -731,6 +731,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, @Override public void onCustomPrinterIconLoaded(PrinterId printerId, Icon icon) { + mSpooler.onCustomPrinterIconLoaded(printerId, icon); + synchronized (mLock) { throwIfDestroyedLocked(); @@ -738,7 +740,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, if (mPrinterDiscoverySession == null) { return; } - mSpooler.onCustomPrinterIconLoaded(printerId, icon); mPrinterDiscoverySession.onCustomPrinterIconLoadedLocked(printerId); } } @@ -979,18 +980,21 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, * Prune persistent state if a print service was uninstalled */ public void prunePrintServices() { + ArrayList<ComponentName> installedComponents; + synchronized (mLock) { - ArrayList<ComponentName> installedComponents = getInstalledComponents(); + installedComponents = getInstalledComponents(); // Remove unnecessary entries from persistent state "disabled services" boolean disabledServicesUninstalled = mDisabledServices.retainAll(installedComponents); if (disabledServicesUninstalled) { writeDisabledPrintServicesLocked(mDisabledServices); } - - // Remove unnecessary entries from persistent state "approved services" - mSpooler.pruneApprovedPrintServices(installedComponents); } + + // Remove unnecessary entries from persistent state "approved services" + mSpooler.pruneApprovedPrintServices(installedComponents); + } private void onConfigurationChangedLocked() { diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java index df6715d41a3f..69de89d5ed74 100644 --- a/telecomm/java/android/telecom/InCallService.java +++ b/telecomm/java/android/telecom/InCallService.java @@ -449,8 +449,8 @@ public abstract class InCallService extends Service { } /** - * Called when a {@link Call} has received a connection event issued by the - * {@link ConnectionService}. + * Unused; to handle connection events issued by a {@link ConnectionService}, implement the + * {@link android.telecom.Call.Callback#onConnectionEvent(Call, String, Bundle)} callback. * <p> * See {@link Connection#sendConnectionEvent(String, Bundle)}. * |