diff options
24 files changed, 275 insertions, 264 deletions
diff --git a/data/sounds/AudioPackage11.mk b/data/sounds/AudioPackage11.mk index e16a92d767fd..2897b0474102 100644 --- a/data/sounds/AudioPackage11.mk +++ b/data/sounds/AudioPackage11.mk @@ -43,7 +43,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \ $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \ - $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \ + $(LOCAL_PATH)/notifications/ogg/Tejat_proc48.ogg:system/media/audio/notifications/Tejat.ogg \ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \ diff --git a/data/sounds/notifications/ogg/Tejat_proc48.ogg b/data/sounds/notifications/ogg/Tejat_proc48.ogg Binary files differnew file mode 100644 index 000000000000..b1637d7a625b --- /dev/null +++ b/data/sounds/notifications/ogg/Tejat_proc48.ogg diff --git a/data/sounds/notifications/wav/Deneb_processed_48kHz.wav b/data/sounds/notifications/wav/Deneb_processed_48kHz.wav Binary files differnew file mode 100644 index 000000000000..e2df8e99cc29 --- /dev/null +++ b/data/sounds/notifications/wav/Deneb_processed_48kHz.wav diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7/land_back.png b/docs/html/distribute/promote/device-art-resources/nexus_7/land_back.png Binary files differindex 697fb7dfede2..cc5b1af3766b 100644 --- a/docs/html/distribute/promote/device-art-resources/nexus_7/land_back.png +++ b/docs/html/distribute/promote/device-art-resources/nexus_7/land_back.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7/land_fore.png b/docs/html/distribute/promote/device-art-resources/nexus_7/land_fore.png Binary files differindex 735262f696e4..2625edb3c3a3 100644 --- a/docs/html/distribute/promote/device-art-resources/nexus_7/land_fore.png +++ b/docs/html/distribute/promote/device-art-resources/nexus_7/land_fore.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7/land_shadow.png b/docs/html/distribute/promote/device-art-resources/nexus_7/land_shadow.png Binary files differindex cfb7952d4b7d..9d91475fc54e 100644 --- a/docs/html/distribute/promote/device-art-resources/nexus_7/land_shadow.png +++ b/docs/html/distribute/promote/device-art-resources/nexus_7/land_shadow.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7/port_back.png b/docs/html/distribute/promote/device-art-resources/nexus_7/port_back.png Binary files differindex 5bb815a57f3d..f54a8afedc14 100644 --- a/docs/html/distribute/promote/device-art-resources/nexus_7/port_back.png +++ b/docs/html/distribute/promote/device-art-resources/nexus_7/port_back.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7/port_fore.png b/docs/html/distribute/promote/device-art-resources/nexus_7/port_fore.png Binary files differindex 1be3b210a77d..230bad4462bb 100644 --- a/docs/html/distribute/promote/device-art-resources/nexus_7/port_fore.png +++ b/docs/html/distribute/promote/device-art-resources/nexus_7/port_fore.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7/port_shadow.png b/docs/html/distribute/promote/device-art-resources/nexus_7/port_shadow.png Binary files differindex 7e8aff2bfa7e..2401d20e4da5 100644 --- a/docs/html/distribute/promote/device-art-resources/nexus_7/port_shadow.png +++ b/docs/html/distribute/promote/device-art-resources/nexus_7/port_shadow.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7/thumb.png b/docs/html/distribute/promote/device-art-resources/nexus_7/thumb.png Binary files differindex b5db82e3f462..57b4c0331244 100644 --- a/docs/html/distribute/promote/device-art-resources/nexus_7/thumb.png +++ b/docs/html/distribute/promote/device-art-resources/nexus_7/thumb.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_back.png b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_back.png Binary files differnew file mode 100644 index 000000000000..697fb7dfede2 --- /dev/null +++ b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_back.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_fore.png b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_fore.png Binary files differnew file mode 100644 index 000000000000..735262f696e4 --- /dev/null +++ b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_fore.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_shadow.png b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_shadow.png Binary files differnew file mode 100644 index 000000000000..cfb7952d4b7d --- /dev/null +++ b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/land_shadow.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_back.png b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_back.png Binary files differnew file mode 100644 index 000000000000..5bb815a57f3d --- /dev/null +++ b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_back.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_fore.png b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_fore.png Binary files differnew file mode 100644 index 000000000000..1be3b210a77d --- /dev/null +++ b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_fore.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_shadow.png b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_shadow.png Binary files differnew file mode 100644 index 000000000000..7e8aff2bfa7e --- /dev/null +++ b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/port_shadow.png diff --git a/docs/html/distribute/promote/device-art-resources/nexus_7_2012/thumb.png b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/thumb.png Binary files differnew file mode 100644 index 000000000000..b5db82e3f462 --- /dev/null +++ b/docs/html/distribute/promote/device-art-resources/nexus_7_2012/thumb.png diff --git a/docs/html/distribute/promote/device-art.jd b/docs/html/distribute/promote/device-art.jd index 58e183c9fcd4..09a39417fe46 100644 --- a/docs/html/distribute/promote/device-art.jd +++ b/docs/html/distribute/promote/device-art.jd @@ -173,12 +173,13 @@ feature image or screenshots for your Google Play app listing.</p> title: 'Nexus 7', url: 'http://www.google.com/nexus/7/', physicalSize: 7, - physicalHeight: 7.81, - density: '213dpi', + physicalHeight: 8, + actualResolution: [1200,1920], + density: 'XHDPI', landRes: ['shadow', 'back', 'fore'], - landOffset: [315,270], + landOffset: [326,245], portRes: ['shadow', 'back', 'fore'], - portOffset: [264,311], + portOffset: [244,326], portSize: [800,1280] }, { @@ -210,6 +211,20 @@ feature image or screenshots for your Google Play app listing.</p> archived: true }, { + id: 'nexus_7_2012', + title: 'Nexus 7 (2012)', + url: 'http://www.google.com/nexus/7/', + physicalSize: 7, + physicalHeight: 7.81, + density: '213dpi', + landRes: ['shadow', 'back', 'fore'], + landOffset: [315,270], + portRes: ['shadow', 'back', 'fore'], + portOffset: [264,311], + portSize: [800,1280], + archived: true + }, + { id: 'galaxy_nexus', title: 'Galaxy Nexus', url: 'http://www.android.com/devices/detail/galaxy-nexus', diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 8d58858b9f97..54bcdcbb27d2 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -384,6 +384,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { TelephonyManager mTelephonyManager; + // We only want one checkMobileProvisioning after booting. + volatile boolean mFirstProvisioningCheckStarted = false; + public ConnectivityService(Context context, INetworkManagementService netd, INetworkStatsService statsService, INetworkPolicyManager policyManager) { // Currently, omitting a NetworkFactory will create one internally @@ -2739,6 +2742,17 @@ public class ConnectivityService extends IConnectivityManager.Stub { state + "/" + info.getDetailedState()); } + // After booting we'll check once for mobile provisioning + // if we've provisioned by and connected. + if (!mFirstProvisioningCheckStarted + && (0 != Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.DEVICE_PROVISIONED, 0)) + && (state == NetworkInfo.State.CONNECTED)) { + log("check provisioning after booting"); + mFirstProvisioningCheckStarted = true; + checkMobileProvisioning(true, CheckMp.MAX_TIMEOUT_MS, null); + } + EventLogTags.writeConnectivityStateChanged( info.getType(), info.getSubtype(), info.getDetailedState().ordinal()); @@ -3557,6 +3571,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { + " resultReceiver=" + resultReceiver); enforceChangePermission(); + mFirstProvisioningCheckStarted = true; + int timeOutMs = suggestedTimeOutMs; if (suggestedTimeOutMs > CheckMp.MAX_TIMEOUT_MS) { timeOutMs = CheckMp.MAX_TIMEOUT_MS; diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java index 1203e027fb91..6f70712db20b 100644 --- a/services/java/com/android/server/power/PowerManagerService.java +++ b/services/java/com/android/server/power/PowerManagerService.java @@ -1702,24 +1702,30 @@ public final class PowerManagerService extends IPowerManager.Stub new DisplayPowerController.Callbacks() { @Override public void onStateChanged() { - mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED; - updatePowerStateLocked(); + synchronized (mLock) { + mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED; + updatePowerStateLocked(); + } } @Override public void onProximityPositive() { - mProximityPositive = true; - mDirty |= DIRTY_PROXIMITY_POSITIVE; - updatePowerStateLocked(); + synchronized (mLock) { + mProximityPositive = true; + mDirty |= DIRTY_PROXIMITY_POSITIVE; + updatePowerStateLocked(); + } } @Override public void onProximityNegative() { - mProximityPositive = false; - mDirty |= DIRTY_PROXIMITY_POSITIVE; - userActivityNoUpdateLocked(SystemClock.uptimeMillis(), - PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); - updatePowerStateLocked(); + synchronized (mLock) { + mProximityPositive = false; + mDirty |= DIRTY_PROXIMITY_POSITIVE; + userActivityNoUpdateLocked(SystemClock.uptimeMillis(), + PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); + updatePowerStateLocked(); + } } }; diff --git a/services/java/com/android/server/wm/InputMonitor.java b/services/java/com/android/server/wm/InputMonitor.java index d966001adb30..0e360329da18 100644 --- a/services/java/com/android/server/wm/InputMonitor.java +++ b/services/java/com/android/server/wm/InputMonitor.java @@ -19,7 +19,6 @@ package com.android.server.wm; import com.android.server.input.InputManagerService; import com.android.server.input.InputApplicationHandle; import com.android.server.input.InputWindowHandle; -import com.android.server.wm.WindowManagerService.AllWindowsIterator; import android.app.ActivityManagerNative; import android.graphics.Rect; @@ -31,7 +30,6 @@ import android.view.InputChannel; import android.view.KeyEvent; import android.view.WindowManager; -import java.util.ArrayList; import java.util.Arrays; final class InputMonitor implements InputManagerService.WindowManagerCallbacks { @@ -249,45 +247,48 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { } // Add all windows on the default display. - final AllWindowsIterator iterator = mService.new AllWindowsIterator( - WindowManagerService.REVERSE_ITERATOR); - while (iterator.hasNext()) { - final WindowState child = iterator.next(); - final InputChannel inputChannel = child.mInputChannel; - final InputWindowHandle inputWindowHandle = child.mInputWindowHandle; - if (inputChannel == null || inputWindowHandle == null || child.mRemoved) { - // Skip this window because it cannot possibly receive input. - continue; - } - - final int flags = child.mAttrs.flags; - final int type = child.mAttrs.type; - - final boolean hasFocus = (child == mInputFocus); - final boolean isVisible = child.isVisibleLw(); - final boolean hasWallpaper = (child == mService.mWallpaperTarget) - && (type != WindowManager.LayoutParams.TYPE_KEYGUARD); - final boolean onDefaultDisplay = (child.getDisplayId() == Display.DEFAULT_DISPLAY); - - // If there's a drag in progress and 'child' is a potential drop target, - // make sure it's been told about the drag - if (inDrag && isVisible && onDefaultDisplay) { - mService.mDragState.sendDragStartedIfNeededLw(child); - } + final int numDisplays = mService.mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = + mService.mDisplayContents.valueAt(displayNdx).getWindowList(); + for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { + final WindowState child = windows.get(winNdx); + final InputChannel inputChannel = child.mInputChannel; + final InputWindowHandle inputWindowHandle = child.mInputWindowHandle; + if (inputChannel == null || inputWindowHandle == null || child.mRemoved) { + // Skip this window because it cannot possibly receive input. + continue; + } + + final int flags = child.mAttrs.flags; + final int type = child.mAttrs.type; - if (universeBackground != null && !addedUniverse - && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) { - final WindowState u = universeBackground.mWin; - if (u.mInputChannel != null && u.mInputWindowHandle != null) { - addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags, - u.mAttrs.type, true, u == mInputFocus, false); + final boolean hasFocus = (child == mInputFocus); + final boolean isVisible = child.isVisibleLw(); + final boolean hasWallpaper = (child == mService.mWallpaperTarget) + && (type != WindowManager.LayoutParams.TYPE_KEYGUARD); + final boolean onDefaultDisplay = (child.getDisplayId() == Display.DEFAULT_DISPLAY); + + // If there's a drag in progress and 'child' is a potential drop target, + // make sure it's been told about the drag + if (inDrag && isVisible && onDefaultDisplay) { + mService.mDragState.sendDragStartedIfNeededLw(child); } - addedUniverse = true; - } - if (child.mWinAnimator != universeBackground) { - addInputWindowHandleLw(inputWindowHandle, child, flags, type, - isVisible, hasFocus, hasWallpaper); + if (universeBackground != null && !addedUniverse + && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) { + final WindowState u = universeBackground.mWin; + if (u.mInputChannel != null && u.mInputWindowHandle != null) { + addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags, + u.mAttrs.type, true, u == mInputFocus, false); + } + addedUniverse = true; + } + + if (child.mWinAnimator != universeBackground) { + addInputWindowHandleLw(inputWindowHandle, child, flags, type, + isVisible, hasFocus, hasWallpaper); + } } } diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 054a0759658a..425285757ff6 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -26,7 +26,6 @@ import android.view.SurfaceControl; import android.view.WindowManagerPolicy; import android.view.animation.Animation; -import com.android.server.wm.WindowManagerService.DisplayContentsIterator; import com.android.server.wm.WindowManagerService.LayoutFields; import java.io.PrintWriter; @@ -627,9 +626,9 @@ public class WindowAnimator { } boolean hasPendingLayoutChanges = false; - DisplayContentsIterator iterator = mService.new DisplayContentsIterator(); - while (iterator.hasNext()) { - final DisplayContent displayContent = iterator.next(); + final int numDisplays = mService.mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId()); if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING; diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index f2c1bbd3fb88..1399c16aa87a 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -450,7 +450,7 @@ public class WindowManagerService extends IWindowManager.Stub String mLastANRState; /** All DisplayDontents in the world, kept here */ - private SparseArray<DisplayContent> mDisplayContents = new SparseArray<DisplayContent>(); + SparseArray<DisplayContent> mDisplayContents = new SparseArray<DisplayContent>(); int mRotation = 0; int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @@ -4426,10 +4426,13 @@ public class WindowManagerService extends IWindowManager.Stub void dumpWindowsLocked() { int i = 0; - final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); - while (iterator.hasNext()) { - final WindowState w = iterator.next(); - Slog.v(TAG, " #" + i++ + ": " + w); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); + for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { + final WindowState w = windows.get(winNdx); + Slog.v(TAG, " #" + i++ + ": " + w); + } } } @@ -4574,9 +4577,9 @@ public class WindowManagerService extends IWindowManager.Stub if (tmpRemoveAppWindowsLocked(wtoken)) { if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:"); if (DEBUG_REORDER) dumpWindowsLocked(); - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while(iterator.hasNext()) { - final DisplayContent displayContent = iterator.next(); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); final WindowList windows = displayContent.getWindowList(); final int pos = findWindowOffsetLocked(windows, index); final int newPos = reAddAppWindowsLocked(displayContent, pos, wtoken); @@ -4628,9 +4631,9 @@ public class WindowManagerService extends IWindowManager.Stub } // And now add them back at the correct place. - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while (iterator.hasNext()) { - final DisplayContent displayContent = iterator.next(); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); final WindowList windows = displayContent.getWindowList(); // Where to start adding? int pos = findWindowOffsetLocked(windows, tokenPos); @@ -4846,13 +4849,17 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void closeSystemDialogs(String reason) { synchronized(mWindowMap) { - final AllWindowsIterator iterator = new AllWindowsIterator(); - while (iterator.hasNext()) { - final WindowState w = iterator.next(); - if (w.mHasSurface) { - try { - w.mClient.closeSystemDialogs(reason); - } catch (RemoteException e) { + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); + final int numWindows = windows.size(); + for (int winNdx = 0; winNdx < numWindows; ++winNdx) { + final WindowState w = windows.get(winNdx); + if (w.mHasSurface) { + try { + w.mClient.closeSystemDialogs(reason); + } catch (RemoteException e) { + } } } } @@ -4985,9 +4992,10 @@ public class WindowManagerService extends IWindowManager.Stub mPolicy.setCurrentUserLw(newUserId); // Hide windows that should not be seen by the new user. - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while (iterator.hasNext()) { - final WindowList windows = iterator.next().getWindowList(); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); + final WindowList windows = displayContent.getWindowList(); for (int i = 0; i < windows.size(); i++) { final WindowState win = windows.get(i); if (win.isHiddenFromUserLocked()) { @@ -5243,12 +5251,16 @@ public class WindowManagerService extends IWindowManager.Stub // the background..) if (on) { boolean isVisible = false; - final AllWindowsIterator iterator = new AllWindowsIterator(); - while (iterator.hasNext()) { - final WindowState ws = iterator.next(); - if (ws.mSession.mPid == pid && ws.isVisibleLw()) { - isVisible = true; - break; + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); + final int numWindows = windows.size(); + for (int winNdx = 0; winNdx < numWindows; ++winNdx) { + final WindowState ws = windows.get(winNdx); + if (ws.mSession.mPid == pid && ws.isVisibleLw()) { + isVisible = true; + break; + } } } if (!isVisible) { @@ -5998,9 +6010,10 @@ public class WindowManagerService extends IWindowManager.Stub WindowList windows = new WindowList(); synchronized (mWindowMap) { //noinspection unchecked - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while(iterator.hasNext()) { - windows.addAll(iterator.next().getWindowList()); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); + windows.addAll(displayContent.getWindowList()); } } @@ -6228,11 +6241,15 @@ public class WindowManagerService extends IWindowManager.Stub } synchronized (mWindowMap) { - final AllWindowsIterator iterator = new AllWindowsIterator(); - while (iterator.hasNext()) { - final WindowState w = iterator.next(); - if (System.identityHashCode(w) == hashCode) { - return w; + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); + final int numWindows = windows.size(); + for (int winNdx = 0; winNdx < numWindows; ++winNdx) { + final WindowState w = windows.get(winNdx); + if (System.identityHashCode(w) == hashCode) { + return w; + } } } } @@ -6780,12 +6797,16 @@ public class WindowManagerService extends IWindowManager.Stub // TODO(multidisplay): Call isScreenOn for each display. private void sendScreenStatusToClientsLocked() { final boolean on = mPowerManager.isScreenOn(); - final AllWindowsIterator iterator = new AllWindowsIterator(); - while (iterator.hasNext()) { - try { - iterator.next().mClient.dispatchScreenState(on); - } catch (RemoteException e) { - // Ignored + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); + final int numWindows = windows.size(); + for (int winNdx = 0; winNdx < numWindows; ++winNdx) { + try { + windows.get(winNdx).mClient.dispatchScreenState(on); + } catch (RemoteException e) { + // Ignored + } } } } @@ -7629,9 +7650,9 @@ public class WindowManagerService extends IWindowManager.Stub } final void rebuildAppWindowListLocked() { - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while (iterator.hasNext()) { - rebuildAppWindowListLocked(iterator.next()); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + rebuildAppWindowListLocked(mDisplayContents.valueAt(displayNdx)); } } @@ -8594,9 +8615,9 @@ public class WindowManagerService extends IWindowManager.Stub boolean focusDisplayed = false; boolean updateAllDrawn = false; - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while (iterator.hasNext()) { - final DisplayContent displayContent = iterator.next(); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); WindowList windows = displayContent.getWindowList(); DisplayInfo displayInfo = displayContent.getDisplayInfo(); final int displayId = displayContent.getDisplayId(); @@ -9035,9 +9056,9 @@ public class WindowManagerService extends IWindowManager.Stub defaultDisplay.layoutNeeded = true; } - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while (iterator.hasNext()) { - DisplayContent displayContent = iterator.next(); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); if (displayContent.pendingLayoutChanges != 0) { displayContent.layoutNeeded = true; } @@ -9224,9 +9245,10 @@ public class WindowManagerService extends IWindowManager.Stub } private boolean needsLayout() { - DisplayContentsIterator iterator = new DisplayContentsIterator(); - while (iterator.hasNext()) { - if (iterator.next().layoutNeeded) { + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); + if (displayContent.layoutNeeded) { return true; } } @@ -9287,35 +9309,38 @@ public class WindowManagerService extends IWindowManager.Stub // window list to make sure we haven't left any dangling surfaces // around. - AllWindowsIterator iterator = new AllWindowsIterator(); - Slog.i(TAG, "Out of memory for surface! Looking for leaks..."); - while (iterator.hasNext()) { - WindowState ws = iterator.next(); - WindowStateAnimator wsa = ws.mWinAnimator; - if (wsa.mSurfaceControl != null) { - if (!mSessions.contains(wsa.mSession)) { - Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): " - + ws + " surface=" + wsa.mSurfaceControl - + " token=" + ws.mToken - + " pid=" + ws.mSession.mPid - + " uid=" + ws.mSession.mUid); - if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); - wsa.mSurfaceControl.destroy(); - wsa.mSurfaceShown = false; - wsa.mSurfaceControl = null; - ws.mHasSurface = false; - mForceRemoves.add(ws); - leakedSurface = true; - } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) { - Slog.w(TAG, "LEAKED SURFACE (app token hidden): " - + ws + " surface=" + wsa.mSurfaceControl - + " token=" + ws.mAppToken); - if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); - wsa.mSurfaceControl.destroy(); - wsa.mSurfaceShown = false; - wsa.mSurfaceControl = null; - ws.mHasSurface = false; - leakedSurface = true; + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); + final int numWindows = windows.size(); + for (int winNdx = 0; winNdx < numWindows; ++winNdx) { + final WindowState ws = windows.get(winNdx); + WindowStateAnimator wsa = ws.mWinAnimator; + if (wsa.mSurfaceControl != null) { + if (!mSessions.contains(wsa.mSession)) { + Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): " + + ws + " surface=" + wsa.mSurfaceControl + + " token=" + ws.mToken + + " pid=" + ws.mSession.mPid + + " uid=" + ws.mSession.mUid); + if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); + wsa.mSurfaceControl.destroy(); + wsa.mSurfaceShown = false; + wsa.mSurfaceControl = null; + ws.mHasSurface = false; + mForceRemoves.add(ws); + leakedSurface = true; + } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) { + Slog.w(TAG, "LEAKED SURFACE (app token hidden): " + + ws + " surface=" + wsa.mSurfaceControl + + " token=" + ws.mAppToken); + if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); + wsa.mSurfaceControl.destroy(); + wsa.mSurfaceShown = false; + wsa.mSurfaceControl = null; + ws.mHasSurface = false; + leakedSurface = true; + } } } } @@ -9323,27 +9348,30 @@ public class WindowManagerService extends IWindowManager.Stub if (!leakedSurface) { Slog.w(TAG, "No leaked surfaces; killing applicatons!"); SparseIntArray pidCandidates = new SparseIntArray(); - iterator = new AllWindowsIterator(); - while (iterator.hasNext()) { - WindowState ws = iterator.next(); - if (mForceRemoves.contains(ws)) { - continue; - } - WindowStateAnimator wsa = ws.mWinAnimator; - if (wsa.mSurfaceControl != null) { - pidCandidates.append(wsa.mSession.mPid, wsa.mSession.mPid); - } - } - if (pidCandidates.size() > 0) { - int[] pids = new int[pidCandidates.size()]; - for (int i=0; i<pids.length; i++) { - pids[i] = pidCandidates.keyAt(i); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList(); + final int numWindows = windows.size(); + for (int winNdx = 0; winNdx < numWindows; ++winNdx) { + final WindowState ws = windows.get(winNdx); + if (mForceRemoves.contains(ws)) { + continue; + } + WindowStateAnimator wsa = ws.mWinAnimator; + if (wsa.mSurfaceControl != null) { + pidCandidates.append(wsa.mSession.mPid, wsa.mSession.mPid); + } } - try { - if (mActivityManager.killPids(pids, "Free memory", secure)) { - killedApps = true; + if (pidCandidates.size() > 0) { + int[] pids = new int[pidCandidates.size()]; + for (int i=0; i<pids.length; i++) { + pids[i] = pidCandidates.keyAt(i); + } + try { + if (mActivityManager.killPids(pids, "Free memory", secure)) { + killedApps = true; + } + } catch (RemoteException e) { } - } catch (RemoteException e) { } } } @@ -9974,9 +10002,9 @@ public class WindowManagerService extends IWindowManager.Stub void dumpDisplayContentsLocked(PrintWriter pw, boolean dumpAll) { pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)"); if (mDisplayReady) { - DisplayContentsIterator dCIterator = new DisplayContentsIterator(); - while (dCIterator.hasNext()) { - dCIterator.next().dump(" ", pw); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + mDisplayContents.valueAt(displayNdx).dump(" ", pw); } } else { pw.println(" NO DISPLAY"); @@ -9992,13 +10020,16 @@ public class WindowManagerService extends IWindowManager.Stub void dumpWindowsNoHeaderLocked(PrintWriter pw, boolean dumpAll, ArrayList<WindowState> windows) { int j = 0; - final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); - while (iterator.hasNext()) { - final WindowState w = iterator.next(); - if (windows == null || windows.contains(w)) { - pw.print(" Window #"); pw.print(j++); pw.print(' '); - pw.print(w); pw.println(":"); - w.dump(pw, " ", dumpAll || windows != null); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windowList = mDisplayContents.valueAt(displayNdx).getWindowList(); + for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) { + final WindowState w = windowList.get(winNdx); + if (windows == null || windows.contains(w)) { + pw.print(" Window #"); pw.print(j++); pw.print(' '); + pw.print(w); pw.println(":"); + w.dump(pw, " ", dumpAll || windows != null); + } } } if (mInputMethodDialogs.size() > 0) { @@ -10151,9 +10182,8 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled); if (needsLayout()) { pw.print(" layoutNeeded on displays="); - DisplayContentsIterator dcIterator = new DisplayContentsIterator(); - while (dcIterator.hasNext()) { - final DisplayContent displayContent = dcIterator.next(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); if (displayContent.layoutNeeded) { pw.print(displayContent.getDisplayId()); } @@ -10187,11 +10217,15 @@ public class WindowManagerService extends IWindowManager.Stub WindowList windows = new WindowList(); if ("visible".equals(name)) { synchronized(mWindowMap) { - final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); - while (iterator.hasNext()) { - final WindowState w = iterator.next(); - if (w.mWinAnimator.mSurfaceShown) { - windows.add(w); + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windowList = + mDisplayContents.valueAt(displayNdx).getWindowList(); + for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) { + final WindowState w = windowList.get(winNdx); + if (w.mWinAnimator.mSurfaceShown) { + windows.add(w); + } } } } @@ -10204,15 +10238,18 @@ public class WindowManagerService extends IWindowManager.Stub } catch (RuntimeException e) { } synchronized(mWindowMap) { - final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); - while (iterator.hasNext()) { - final WindowState w = iterator.next(); - if (name != null) { - if (w.mAttrs.getTitle().toString().contains(name)) { + final int numDisplays = mDisplayContents.size(); + for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { + final WindowList windowList = mDisplayContents.valueAt(displayNdx).getWindowList(); + for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) { + final WindowState w = windowList.get(winNdx); + if (name != null) { + if (w.mAttrs.getTitle().toString().contains(name)) { + windows.add(w); + } + } else if (System.identityHashCode(w) == objectId) { windows.add(w); } - } else if (System.identityHashCode(w) == objectId) { - windows.add(w); } } } @@ -10456,87 +10493,6 @@ public class WindowManagerService extends IWindowManager.Stub return displayContent; } - class DisplayContentsIterator implements Iterator<DisplayContent> { - private int cur; - - @Override - public boolean hasNext() { - return cur < mDisplayContents.size(); - } - - @Override - public DisplayContent next() { - if (hasNext()) { - return mDisplayContents.valueAt(cur++); - } - throw new NoSuchElementException(); - } - - @Override - public void remove() { - throw new IllegalArgumentException("AllDisplayContentIterator.remove not implemented"); - } - } - - final static boolean REVERSE_ITERATOR = true; - class AllWindowsIterator implements Iterator<WindowState> { - private DisplayContent mDisplayContent; - private DisplayContentsIterator mDisplayContentsIterator; - private WindowList mWindowList; - private int mWindowListIndex; - private boolean mReverse; - - AllWindowsIterator() { - mDisplayContentsIterator = new DisplayContentsIterator(); - mDisplayContent = mDisplayContentsIterator.next(); - mWindowList = mDisplayContent.getWindowList(); - } - - AllWindowsIterator(boolean reverse) { - this(); - mReverse = reverse; - mWindowListIndex = reverse ? mWindowList.size() - 1 : 0; - } - - @Override - public boolean hasNext() { - if (mReverse) { - return mWindowListIndex >= 0; - } - return mWindowListIndex < mWindowList.size(); - } - - @Override - public WindowState next() { - if (hasNext()) { - WindowState win = mWindowList.get(mWindowListIndex); - if (mReverse) { - mWindowListIndex--; - if (mWindowListIndex < 0 && mDisplayContentsIterator.hasNext()) { - mDisplayContent = mDisplayContentsIterator.next(); - mWindowList = mDisplayContent.getWindowList(); - mWindowListIndex = mWindowList.size() - 1; - } - } else { - mWindowListIndex++; - if (mWindowListIndex >= mWindowList.size() - && mDisplayContentsIterator.hasNext()) { - mDisplayContent = mDisplayContentsIterator.next(); - mWindowList = mDisplayContent.getWindowList(); - mWindowListIndex = 0; - } - } - return win; - } - throw new NoSuchElementException(); - } - - @Override - public void remove() { - throw new IllegalArgumentException("AllWindowsIterator.remove not implemented"); - } - } - // There is an inherent assumption that this will never return null. public DisplayContent getDefaultDisplayContentLocked() { return getDisplayContentLocked(Display.DEFAULT_DISPLAY); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java index cbefd3d27882..b909bec6299e 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java @@ -30,6 +30,7 @@ import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.resources.Density; import com.android.resources.ResourceType; +import com.android.resources.ScreenOrientation; import com.android.resources.ScreenSize; import android.content.res.Configuration; @@ -347,6 +348,23 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso config.compatScreenWidthDp = config.screenWidthDp; config.compatScreenHeightDp = config.screenHeightDp; + ScreenOrientation orientation = hardwareConfig.getOrientation(); + if (orientation != null) { + switch (orientation) { + case PORTRAIT: + config.orientation = Configuration.ORIENTATION_PORTRAIT; + break; + case LANDSCAPE: + config.orientation = Configuration.ORIENTATION_LANDSCAPE; + break; + case SQUARE: + config.orientation = Configuration.ORIENTATION_SQUARE; + break; + } + } else { + config.orientation = Configuration.ORIENTATION_UNDEFINED; + } + // TODO: fill in more config info. return config; |