diff options
-rw-r--r-- | api/current.xml | 28 | ||||
-rw-r--r-- | core/java/android/app/ActivityThread.java | 4 | ||||
-rw-r--r-- | core/java/android/content/res/Configuration.java | 40 | ||||
-rw-r--r-- | core/java/android/service/wallpaper/WallpaperService.java | 3 | ||||
-rw-r--r-- | core/java/android/view/IWindowSession.aidl | 7 | ||||
-rw-r--r-- | core/java/android/view/SurfaceView.java | 6 | ||||
-rw-r--r-- | core/java/android/view/ViewRoot.java | 49 | ||||
-rw-r--r-- | services/java/com/android/server/WindowManagerService.java | 56 | ||||
-rw-r--r-- | tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java | 2 |
9 files changed, 146 insertions, 49 deletions
diff --git a/api/current.xml b/api/current.xml index 8a9e4ce..e982dfcb 100644 --- a/api/current.xml +++ b/api/current.xml @@ -47612,6 +47612,32 @@ <parameter name="interestingChanges" type="int"> </parameter> </method> +<method name="readFromParcel" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="source" type="android.os.Parcel"> +</parameter> +</method> +<method name="setTo" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="o" type="android.content.res.Configuration"> +</parameter> +</method> <method name="setToDefaults" return="void" abstract="false" @@ -121947,7 +121973,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="text" type="java.lang.String"> +<parameter name="message" type="java.lang.String"> </parameter> </method> </class> diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 35d1948..1c980e3 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3913,6 +3913,8 @@ public final class ActivityThread { mResConfiguration = new Configuration(); } if (!mResConfiguration.isOtherSeqNewer(config)) { + if (DEBUG_CONFIGURATION) Log.v(TAG, "Skipping new config: curSeq=" + + mResConfiguration.seq + ", newSeq=" + config.seq); return; } mResConfiguration.updateFrom(config); @@ -3936,6 +3938,8 @@ public final class ActivityThread { WeakReference<Resources> v = it.next(); Resources r = v.get(); if (r != null) { + if (DEBUG_CONFIGURATION) Log.v(TAG, "Changing resources " + + r + " config to: " + config); r.updateConfiguration(config, dm); //Log.i(TAG, "Updated app resources " + v.getKey() // + " " + r + ": " + r.getConfiguration()); diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 6598264..1a0c867 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -219,6 +219,10 @@ public final class Configuration implements Parcelable, Comparable<Configuration * Makes a deep copy suitable for modification. */ public Configuration(Configuration o) { + setTo(o); + } + + public void setTo(Configuration o) { fontScale = o.fontScale; mcc = o.mcc; mnc = o.mnc; @@ -237,7 +241,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration uiMode = o.uiMode; seq = o.seq; } - + public String toString() { StringBuilder sb = new StringBuilder(128); sb.append("{ scale="); @@ -552,21 +556,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration dest.writeInt(seq); } - public static final Parcelable.Creator<Configuration> CREATOR - = new Parcelable.Creator<Configuration>() { - public Configuration createFromParcel(Parcel source) { - return new Configuration(source); - } - - public Configuration[] newArray(int size) { - return new Configuration[size]; - } - }; - - /** - * Construct this Configuration object, reading from the Parcel. - */ - private Configuration(Parcel source) { + public void readFromParcel(Parcel source) { fontScale = source.readFloat(); mcc = source.readInt(); mnc = source.readInt(); @@ -586,6 +576,24 @@ public final class Configuration implements Parcelable, Comparable<Configuration uiMode = source.readInt(); seq = source.readInt(); } + + public static final Parcelable.Creator<Configuration> CREATOR + = new Parcelable.Creator<Configuration>() { + public Configuration createFromParcel(Parcel source) { + return new Configuration(source); + } + + public Configuration[] newArray(int size) { + return new Configuration[size]; + } + }; + + /** + * Construct this Configuration object, reading from the Parcel. + */ + private Configuration(Parcel source) { + readFromParcel(source); + } public int compareTo(Configuration that) { int n; diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 444135a..f47a8d0 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -141,6 +141,7 @@ public abstract class WallpaperService extends Service { final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); final Rect mContentInsets = new Rect(); + final Configuration mConfiguration = new Configuration(); final WindowManager.LayoutParams mLayout = new WindowManager.LayoutParams(); @@ -494,7 +495,7 @@ public abstract class WallpaperService extends Service { final int relayoutResult = mSession.relayout( mWindow, mLayout, mWidth, mHeight, View.VISIBLE, false, mWinFrame, mContentInsets, - mVisibleInsets, mSurfaceHolder.mSurface); + mVisibleInsets, mConfiguration, mSurfaceHolder.mSurface); if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface + ", frame=" + mWinFrame); diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index b6b009b..01f07d6 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -17,6 +17,7 @@ package android.view; +import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.Region; import android.os.Bundle; @@ -63,6 +64,9 @@ interface IWindowSession { * contents to make sure the user can see it. This is different than * <var>outContentInsets</var> in that these insets change transiently, * so complex relayout of the window should not happen based on them. + * @param outConfiguration New configuration of window, if it is now + * becoming visible and the global configuration has changed since it + * was last displayed. * @param outSurface Object in which is placed the new display surface. * * @return int Result flags: {@link WindowManagerImpl#RELAYOUT_SHOW_FOCUS}, @@ -71,7 +75,8 @@ interface IWindowSession { int relayout(IWindow window, in WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, boolean insetsPending, out Rect outFrame, out Rect outContentInsets, - out Rect outVisibleInsets, out Surface outSurface); + out Rect outVisibleInsets, out Configuration outConfig, + out Surface outSurface); /** * Give the window manager a hint of the part of the window that is diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 0722699..d8010bc 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -39,7 +39,6 @@ import android.util.Log; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.concurrent.locks.ReentrantLock; -import java.lang.ref.WeakReference; /** * Provides a dedicated drawing surface embedded inside of a view hierarchy. @@ -102,7 +101,8 @@ public class SurfaceView extends View { final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); final Rect mContentInsets = new Rect(); - + final Configuration mConfiguration = new Configuration(); + static final int KEEP_SCREEN_ON_MSG = 1; static final int GET_NEW_SURFACE_MSG = 2; @@ -428,7 +428,7 @@ public class SurfaceView extends View { final int relayoutResult = mSession.relayout( mWindow, mLayout, mWidth, mHeight, visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets, - mVisibleInsets, mSurface); + mVisibleInsets, mConfiguration, mSurface); if (localLOGV) Log.i(TAG, "New surface: " + mSurface + ", vis=" + visible + ", frame=" + mWinFrame); diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 484922d..c87ffee 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -80,6 +80,7 @@ public final class ViewRoot extends Handler implements ViewParent, private static final boolean DEBUG_ORIENTATION = false || LOCAL_LOGV; private static final boolean DEBUG_TRACKBALL = false || LOCAL_LOGV; private static final boolean DEBUG_IMF = false || LOCAL_LOGV; + private static final boolean DEBUG_CONFIGURATION = false || LOCAL_LOGV; private static final boolean WATCH_POINTER = false; private static final boolean MEASURE_LATENCY = false; @@ -176,6 +177,9 @@ public final class ViewRoot extends Handler implements ViewParent, final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets = new ViewTreeObserver.InternalInsetsInfo(); + final Configuration mLastConfiguration = new Configuration(); + final Configuration mPendingConfiguration = new Configuration(); + class ResizedInfo { Rect coveredInsets; Rect visibleInsets; @@ -719,6 +723,7 @@ public final class ViewRoot extends Handler implements ViewParent, attachInfo.mRecomputeGlobalAttributes = false; attachInfo.mKeepScreenOn = false; viewVisibilityChanged = false; + mLastConfiguration.setTo(host.getResources().getConfiguration()); host.dispatchAttachedToWindow(attachInfo, 0); //Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn); @@ -904,6 +909,13 @@ public final class ViewRoot extends Handler implements ViewParent, + " visible=" + mPendingVisibleInsets.toShortString() + " surface=" + mSurface); + if (mPendingConfiguration.seq != 0) { + if (DEBUG_CONFIGURATION) Log.v(TAG, "Visible with new config: " + + mPendingConfiguration); + updateConfiguration(mPendingConfiguration, !mFirst); + mPendingConfiguration.seq = 0; + } + contentInsetsChanged = !mPendingContentInsets.equals( mAttachInfo.mContentInsets); visibleInsetsChanged = !mPendingVisibleInsets.equals( @@ -1627,6 +1639,30 @@ public final class ViewRoot extends Handler implements ViewParent, } } + void updateConfiguration(Configuration config, boolean force) { + if (DEBUG_CONFIGURATION) Log.v(TAG, + "Applying new config to window " + + mWindowAttributes.getTitle() + + ": " + config); + synchronized (sConfigCallbacks) { + for (int i=sConfigCallbacks.size()-1; i>=0; i--) { + sConfigCallbacks.get(i).onConfigurationChanged(config); + } + } + if (mView != null) { + // At this point the resources have been updated to + // have the most recent config, whatever that is. Use + // the on in them which may be newer. + if (mView != null) { + config = mView.getResources().getConfiguration(); + } + if (force || mLastConfiguration.diff(config) != 0) { + mLastConfiguration.setTo(config); + mView.dispatchConfigurationChanged(config); + } + } + } + /** * Return true if child is an ancestor of parent, (or equal to the parent). */ @@ -1815,14 +1851,7 @@ public final class ViewRoot extends Handler implements ViewParent, if (mAdded) { Configuration config = ((ResizedInfo)msg.obj).newConfig; if (config != null) { - synchronized (sConfigCallbacks) { - for (int i=sConfigCallbacks.size()-1; i>=0; i--) { - sConfigCallbacks.get(i).onConfigurationChanged(config); - } - } - if (mView != null) { - mView.dispatchConfigurationChanged(config); - } + updateConfiguration(config, false); } mWinFrame.left = 0; mWinFrame.right = msg.arg1; @@ -2500,12 +2529,14 @@ public final class ViewRoot extends Handler implements ViewParent, if (params != null) { if (DBG) Log.d(TAG, "WindowLayout in layoutWindow:" + params); } + mPendingConfiguration.seq = 0; int relayoutResult = sWindowSession.relayout( mWindow, params, (int) (mView.mMeasuredWidth * appScale + 0.5f), (int) (mView.mMeasuredHeight * appScale + 0.5f), viewVisibility, insetsPending, mWinFrame, - mPendingContentInsets, mPendingVisibleInsets, mSurface); + mPendingContentInsets, mPendingVisibleInsets, + mPendingConfiguration, mSurface); if (restore) { params.restore(); } diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index b27736a..93e45fc 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -143,6 +143,7 @@ public class WindowManagerService extends IWindowManager.Stub static final boolean DEBUG_VISIBILITY = false; static final boolean DEBUG_WINDOW_MOVEMENT = false; static final boolean DEBUG_ORIENTATION = false; + static final boolean DEBUG_CONFIGURATION = false; static final boolean DEBUG_APP_TRANSITIONS = false; static final boolean DEBUG_STARTING_WINDOW = false; static final boolean DEBUG_REORDER = false; @@ -2317,7 +2318,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, boolean insetsPending, Rect outFrame, Rect outContentInsets, Rect outVisibleInsets, - Surface outSurface) { + Configuration outConfig, Surface outSurface) { boolean displayed = false; boolean inTouchMode; boolean configChanged; @@ -2390,16 +2391,30 @@ public class WindowManagerService extends IWindowManager.Stub if (oldVisibility == View.GONE) { win.mEnterAnimationPending = true; } - if (displayed && win.mSurface != null && !win.mDrawPending - && !win.mCommitDrawPending && !mDisplayFrozen - && mPolicy.isScreenOn()) { - applyEnterAnimationLocked(win); - } - if (displayed && (win.mAttrs.flags - & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) { - if (DEBUG_VISIBILITY) Slog.v(TAG, - "Relayout window turning screen on: " + win); - win.mTurnOnScreen = true; + if (displayed) { + if (win.mSurface != null && !win.mDrawPending + && !win.mCommitDrawPending && !mDisplayFrozen + && mPolicy.isScreenOn()) { + applyEnterAnimationLocked(win); + } + if ((win.mAttrs.flags + & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) { + if (DEBUG_VISIBILITY) Slog.v(TAG, + "Relayout window turning screen on: " + win); + win.mTurnOnScreen = true; + } + int diff = 0; + if (win.mConfiguration != mCurConfiguration + && (win.mConfiguration == null + || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) { + win.mConfiguration = mCurConfiguration; + if (DEBUG_CONFIGURATION) { + Slog.i(TAG, "Window " + win + " visible with new config: " + + win.mConfiguration + " / 0x" + + Integer.toHexString(diff)); + } + outConfig.setTo(mCurConfiguration); + } } if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) { // To change the format, we need to re-build the surface. @@ -6694,10 +6709,10 @@ public class WindowManagerService extends IWindowManager.Stub public int relayout(IWindow window, WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewFlags, boolean insetsPending, Rect outFrame, Rect outContentInsets, - Rect outVisibleInsets, Surface outSurface) { + Rect outVisibleInsets, Configuration outConfig, Surface outSurface) { return relayoutWindow(this, window, attrs, requestedWidth, requestedHeight, viewFlags, insetsPending, - outFrame, outContentInsets, outVisibleInsets, outSurface); + outFrame, outContentInsets, outVisibleInsets, outConfig, outSurface); } public void setTransparentRegion(IWindow window, Region region) { @@ -10163,6 +10178,10 @@ public class WindowManagerService extends IWindowManager.Stub w.mConfiguration != mCurConfiguration && (w.mConfiguration == null || mCurConfiguration.diff(w.mConfiguration) != 0); + if (DEBUG_CONFIGURATION && configChanged) { + Slog.v(TAG, "Win " + w + " config changed: " + + mCurConfiguration); + } if (localLOGV) Slog.v(TAG, "Resizing " + w + ": configChanged=" + configChanged + " last=" + w.mLastFrame + " frame=" + w.mFrame); @@ -10507,16 +10526,19 @@ public class WindowManagerService extends IWindowManager.Stub try { if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, "Reporting new frame to " + win + ": " + win.mFrame); + int diff = 0; boolean configChanged = win.mConfiguration != mCurConfiguration && (win.mConfiguration == null - || mCurConfiguration.diff(win.mConfiguration) != 0); - win.mConfiguration = mCurConfiguration; - if ((DEBUG_RESIZE || DEBUG_ORIENTATION) && configChanged) { + || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0); + if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION) + && configChanged) { Slog.i(TAG, "Sending new config to window " + win + ": " + win.mFrame.width() + "x" + win.mFrame.height() - + " / " + win.mConfiguration); + + " / " + mCurConfiguration + " / 0x" + + Integer.toHexString(diff)); } + win.mConfiguration = mCurConfiguration; win.mClient.resized(win.mFrame.width(), win.mFrame.height(), win.mLastContentInsets, win.mLastVisibleInsets, win.mDrawPending, diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java index 8e9e75f..4201e80 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -1032,7 +1032,7 @@ public final class Bridge implements ILayoutBridge { @SuppressWarnings("unused") public int relayout(IWindow arg0, LayoutParams arg1, int arg2, int arg3, int arg4, - boolean arg4_5, Rect arg5, Rect arg6, Rect arg7, Surface arg8) + boolean arg4_5, Rect arg5, Rect arg6, Rect arg7, Configuration arg7b, Surface arg8) throws RemoteException { // pass for now. return 0; |