summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/WindowManagerPolicy.java5
-rw-r--r--core/java/com/android/internal/policy/IKeyguardService.aidl3
-rw-r--r--core/java/com/android/server/BootReceiver.java42
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--obex/javax/obex/ClientOperation.java6
-rw-r--r--packages/PrintSpooler/res/layout/print_activity.xml5
-rw-r--r--packages/PrintSpooler/res/layout/printer_dropdown_item.xml3
-rw-r--r--packages/Shell/src/com/android/shell/BugreportStorageProvider.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java7
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java6
-rw-r--r--services/core/java/com/android/server/connectivity/LingerMonitor.java6
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java13
-rw-r--r--services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java30
-rw-r--r--services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java4
-rw-r--r--services/core/java/com/android/server/power/ShutdownThread.java2
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java14
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java10
-rw-r--r--services/core/java/com/android/server/wm/Task.java10
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java10
-rw-r--r--services/core/java/com/android/server/wm/WallpaperController.java21
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java6
-rw-r--r--services/net/Android.mk3
-rw-r--r--services/print/java/com/android/server/print/RemotePrintSpooler.java3
-rw-r--r--services/print/java/com/android/server/print/UserState.java18
-rw-r--r--telecomm/java/android/telecom/InCallService.java4
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)}.
*