diff options
Diffstat (limited to 'services/java')
10 files changed, 242 insertions, 112 deletions
diff --git a/services/java/com/android/server/BluetoothManagerService.java b/services/java/com/android/server/BluetoothManagerService.java index 9404dce..e68686d 100755 --- a/services/java/com/android/server/BluetoothManagerService.java +++ b/services/java/com/android/server/BluetoothManagerService.java @@ -75,12 +75,12 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private void registerForAirplaneMode(IntentFilter filter) { final ContentResolver resolver = mContext.getContentResolver(); - final String airplaneModeRadios = Settings.System.getString(resolver, - Settings.System.AIRPLANE_MODE_RADIOS); - final String toggleableRadios = Settings.System.getString(resolver, - Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS); + final String airplaneModeRadios = Settings.Global.getString(resolver, + Settings.Global.AIRPLANE_MODE_RADIOS); + final String toggleableRadios = Settings.Global.getString(resolver, + Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); boolean mIsAirplaneSensitive = airplaneModeRadios == null ? true : - airplaneModeRadios.contains(Settings.System.RADIO_BLUETOOTH); + airplaneModeRadios.contains(Settings.Global.RADIO_BLUETOOTH); if (mIsAirplaneSensitive) { filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); } @@ -151,8 +151,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { * Returns true if airplane mode is currently on */ private final boolean isAirplaneModeOn() { - return Settings.System.getInt(mContext.getContentResolver(), - Settings.System.AIRPLANE_MODE_ON, 0) == 1; + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) == 1; } /** diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index 6bc5e10..7ed4f8a 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -1179,17 +1179,17 @@ public class WifiService extends IWifiManager.Stub { } private boolean isAirplaneSensitive() { - String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(), - Settings.System.AIRPLANE_MODE_RADIOS); + String airplaneModeRadios = Settings.Global.getString(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_RADIOS); return airplaneModeRadios == null - || airplaneModeRadios.contains(Settings.System.RADIO_WIFI); + || airplaneModeRadios.contains(Settings.Global.RADIO_WIFI); } private boolean isAirplaneToggleable() { - String toggleableRadios = Settings.System.getString(mContext.getContentResolver(), - Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS); + String toggleableRadios = Settings.Global.getString(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); return toggleableRadios != null - && toggleableRadios.contains(Settings.System.RADIO_WIFI); + && toggleableRadios.contains(Settings.Global.RADIO_WIFI); } /** @@ -1198,8 +1198,8 @@ public class WifiService extends IWifiManager.Stub { * @return {@code true} if airplane mode is on. */ private boolean isAirplaneModeOn() { - return isAirplaneSensitive() && Settings.System.getInt(mContext.getContentResolver(), - Settings.System.AIRPLANE_MODE_ON, 0) == 1; + return isAirplaneSensitive() && Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) == 1; } @Override @@ -1213,8 +1213,8 @@ public class WifiService extends IWifiManager.Stub { } pw.println("Wi-Fi is " + mWifiStateMachine.syncGetWifiStateByName()); pw.println("Stay-awake conditions: " + - Settings.System.getInt(mContext.getContentResolver(), - Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0)); + Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0)); pw.println(); pw.println("Internal state:"); diff --git a/services/java/com/android/server/display/DisplayDevice.java b/services/java/com/android/server/display/DisplayDevice.java index 8eeefb4..f5aa3d4 100644 --- a/services/java/com/android/server/display/DisplayDevice.java +++ b/services/java/com/android/server/display/DisplayDevice.java @@ -176,6 +176,12 @@ abstract class DisplayDevice { } else { viewport.physicalFrame.setEmpty(); } + + boolean isRotated = (mCurrentOrientation == Surface.ROTATION_90 + || mCurrentOrientation == Surface.ROTATION_270); + DisplayDeviceInfo info = getDisplayDeviceInfoLocked(); + viewport.deviceWidth = isRotated ? info.height : info.width; + viewport.deviceHeight = isRotated ? info.width : info.height; } /** diff --git a/services/java/com/android/server/display/DisplayViewport.java b/services/java/com/android/server/display/DisplayViewport.java index ed4016d..5080556 100644 --- a/services/java/com/android/server/display/DisplayViewport.java +++ b/services/java/com/android/server/display/DisplayViewport.java @@ -44,12 +44,20 @@ public final class DisplayViewport { // should be scaled or translated after rotation. public final Rect physicalFrame = new Rect(); + // The full width and height of the display device, rotated in the same + // manner as physicalFrame. This expresses the full native size of the display device. + // The physical frame should usually fit within this area. + public int deviceWidth; + public int deviceHeight; + public void copyFrom(DisplayViewport viewport) { valid = viewport.valid; displayId = viewport.displayId; orientation = viewport.orientation; logicalFrame.set(viewport.logicalFrame); physicalFrame.set(viewport.physicalFrame); + deviceWidth = viewport.deviceWidth; + deviceHeight = viewport.deviceHeight; } // For debugging purposes. @@ -60,6 +68,8 @@ public final class DisplayViewport { + ", orientation=" + orientation + ", logicalFrame=" + logicalFrame + ", physicalFrame=" + physicalFrame + + ", deviceWidth=" + deviceWidth + + ", deviceHeight=" + deviceHeight + "}"; } } diff --git a/services/java/com/android/server/input/InputManagerService.java b/services/java/com/android/server/input/InputManagerService.java index 95655a5..805818a 100644 --- a/services/java/com/android/server/input/InputManagerService.java +++ b/services/java/com/android/server/input/InputManagerService.java @@ -149,7 +149,8 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeSetDisplayViewport(int ptr, boolean external, int displayId, int rotation, int logicalLeft, int logicalTop, int logicalRight, int logicalBottom, - int physicalLeft, int physicalTop, int physicalRight, int physicalBottom); + int physicalLeft, int physicalTop, int physicalRight, int physicalBottom, + int deviceWidth, int deviceHeight); private static native int nativeGetScanCodeState(int ptr, int deviceId, int sourceMask, int scanCode); @@ -305,7 +306,8 @@ public class InputManagerService extends IInputManager.Stub viewport.logicalFrame.left, viewport.logicalFrame.top, viewport.logicalFrame.right, viewport.logicalFrame.bottom, viewport.physicalFrame.left, viewport.physicalFrame.top, - viewport.physicalFrame.right, viewport.physicalFrame.bottom); + viewport.physicalFrame.right, viewport.physicalFrame.bottom, + viewport.deviceWidth, viewport.deviceHeight); } /** diff --git a/services/java/com/android/server/location/ComprehensiveCountryDetector.java b/services/java/com/android/server/location/ComprehensiveCountryDetector.java index 1026a0d..354858b 100755 --- a/services/java/com/android/server/location/ComprehensiveCountryDetector.java +++ b/services/java/com/android/server/location/ComprehensiveCountryDetector.java @@ -384,8 +384,8 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { } protected boolean isAirplaneModeOff() { - return Settings.System.getInt( - mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 0; + return Settings.Global.getInt( + mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 0; } /** diff --git a/services/java/com/android/server/pm/Installer.java b/services/java/com/android/server/pm/Installer.java index 3329acb..4268ae0 100644 --- a/services/java/com/android/server/pm/Installer.java +++ b/services/java/com/android/server/pm/Installer.java @@ -359,6 +359,14 @@ class Installer { return execute("movefiles"); } + /** + * Links the native library directory in an application's directory to its + * real location. + * + * @param dataPath data directory where the application is + * @param nativeLibPath target native library path + * @return -1 on error + */ public int linkNativeLibraryDirectory(String dataPath, String nativeLibPath) { if (dataPath == null) { Slog.e(TAG, "unlinkNativeLibraryDirectory dataPath is null"); diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 4bb6e38..b5ae214 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -25,6 +25,11 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static com.android.internal.util.ArrayUtils.appendInt; import static com.android.internal.util.ArrayUtils.removeInt; import static libcore.io.OsConstants.S_ISLNK; +import static libcore.io.OsConstants.S_IRWXU; +import static libcore.io.OsConstants.S_IRGRP; +import static libcore.io.OsConstants.S_IXGRP; +import static libcore.io.OsConstants.S_IROTH; +import static libcore.io.OsConstants.S_IXOTH; import com.android.internal.app.IMediaContainerService; import com.android.internal.app.ResolverActivity; @@ -147,6 +152,7 @@ import java.util.Set; import libcore.io.ErrnoException; import libcore.io.IoUtils; import libcore.io.Libcore; +import libcore.io.OsConstants; import libcore.io.StructStat; /** @@ -276,7 +282,7 @@ public class PackageManagerService extends IPackageManager.Stub { // This is the object monitoring mDrmAppPrivateInstallDir. final FileObserver mDrmAppInstallObserver; - // Used for priviledge escalation. MUST NOT BE CALLED WITH mPackages + // Used for privilege escalation. MUST NOT BE CALLED WITH mPackages // LOCK HELD. Can be called with mInstallLock held. final Installer mInstaller; @@ -286,6 +292,12 @@ public class PackageManagerService extends IPackageManager.Stub { final File mAppInstallDir; final File mDalvikCacheDir; + /** + * Directory to which applications installed internally have native + * libraries copied. + */ + private File mAppLibInstallDir; + // Directory containing the private parts (e.g. code and non-resource assets) of forward-locked // apps. final File mDrmAppPrivateInstallDir; @@ -1215,6 +1227,7 @@ public class PackageManagerService extends IPackageManager.Stub { } mAppInstallDir = new File(dataDir, "app"); + mAppLibInstallDir = new File(dataDir, "app-lib"); //look for any incomplete package installations ArrayList<PackageSetting> deletePkgsList = mSettings.getListOfIncompleteInstallPackagesLPr(); //clean up list @@ -3607,6 +3620,13 @@ public class PackageManagerService extends IPackageManager.Stub { res = resInner; } } + + final File nativeLibraryFile = new File(mAppLibInstallDir, packageName); + NativeLibraryHelper.removeNativeBinariesFromDirLI(nativeLibraryFile); + if (!nativeLibraryFile.delete()) { + Slog.w(TAG, "Couldn't delete native library directory " + nativeLibraryFile.getPath()); + } + return res; } @@ -4048,9 +4068,7 @@ public class PackageManagerService extends IPackageManager.Stub { */ if (pkg.applicationInfo.nativeLibraryDir == null && pkg.applicationInfo.dataDir != null) { if (pkgSetting.nativeLibraryPathString == null) { - final String nativeLibraryPath = new File(dataPath, LIB_DIR_NAME).getPath(); - pkg.applicationInfo.nativeLibraryDir = nativeLibraryPath; - pkgSetting.nativeLibraryPathString = nativeLibraryPath; + setInternalAppNativeLibraryPath(pkg, pkgSetting); } else { pkg.applicationInfo.nativeLibraryDir = pkgSetting.nativeLibraryPathString; } @@ -4072,7 +4090,7 @@ public class PackageManagerService extends IPackageManager.Stub { */ if (pkg.applicationInfo.nativeLibraryDir != null) { try { - final File nativeLibraryDir = new File(pkg.applicationInfo.nativeLibraryDir); + File nativeLibraryDir = new File(pkg.applicationInfo.nativeLibraryDir); final String dataPathString = dataPath.getCanonicalPath(); if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg)) { @@ -4087,30 +4105,31 @@ public class PackageManagerService extends IPackageManager.Stub { Log.i(TAG, "removed obsolete native libraries for system package " + path); } - } else if (nativeLibraryDir.getParentFile().getCanonicalPath() - .equals(dataPathString)) { - /* - * Make sure the native library dir isn't a symlink to - * something. If it is, ask installd to remove it and create - * a directory so we can copy to it afterwards. - */ - boolean isSymLink; - try { - isSymLink = S_ISLNK(Libcore.os.lstat(nativeLibraryDir.getPath()).st_mode); - } catch (ErrnoException e) { - // This shouldn't happen, but we'll fail-safe. - isSymLink = true; + } else if (!isForwardLocked(pkg) && !isExternal(pkg)) { + // Update native library dir if it starts with /data/data + if (nativeLibraryDir.getParent().startsWith(dataPathString)) { + setInternalAppNativeLibraryPath(pkg, pkgSetting); + nativeLibraryDir = new File(pkg.applicationInfo.nativeLibraryDir); } - if (isSymLink) { - mInstaller.unlinkNativeLibraryDirectory(dataPathString); + + try { + if (copyNativeLibrariesForInternalApp(scanFile, nativeLibraryDir) != PackageManager.INSTALL_SUCCEEDED) { + Slog.e(TAG, "Unable to copy native libraries"); + mLastScanError = PackageManager.INSTALL_FAILED_INTERNAL_ERROR; + return null; + } + } catch (IOException e) { + Slog.e(TAG, "Unable to copy native libraries", e); + mLastScanError = PackageManager.INSTALL_FAILED_INTERNAL_ERROR; + return null; } - /* - * If this is an internal application or our - * nativeLibraryPath points to our data directory, unpack - * the libraries if necessary. - */ - NativeLibraryHelper.copyNativeBinariesIfNeededLI(scanFile, nativeLibraryDir); + if (mInstaller.linkNativeLibraryDirectory(dataPathString, + pkg.applicationInfo.nativeLibraryDir) == -1) { + Slog.e(TAG, "Unable to link native library directory"); + mLastScanError = PackageManager.INSTALL_FAILED_INTERNAL_ERROR; + return null; + } } else { Slog.i(TAG, "Linking native library dir for " + path); int ret = mInstaller.linkNativeLibraryDirectory(dataPathString, @@ -4122,7 +4141,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } } catch (IOException ioe) { - Log.e(TAG, "Unable to get canonical file " + ioe.toString()); + Slog.e(TAG, "Unable to get canonical file " + ioe.toString()); } } pkg.mScanPath = path; @@ -4437,6 +4456,37 @@ public class PackageManagerService extends IPackageManager.Stub { return pkg; } + private void setInternalAppNativeLibraryPath(PackageParser.Package pkg, + PackageSetting pkgSetting) { + final String apkLibPath = getApkName(pkgSetting.codePathString); + final String nativeLibraryPath = new File(mAppLibInstallDir, apkLibPath).getPath(); + pkg.applicationInfo.nativeLibraryDir = nativeLibraryPath; + pkgSetting.nativeLibraryPathString = nativeLibraryPath; + } + + private static int copyNativeLibrariesForInternalApp(File scanFile, final File nativeLibraryDir) + throws IOException { + if (!nativeLibraryDir.isDirectory()) { + nativeLibraryDir.delete(); + if (!nativeLibraryDir.mkdir()) { + throw new IOException("Cannot create " + nativeLibraryDir.getPath()); + } + try { + Libcore.os.chmod(nativeLibraryDir.getPath(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH + | S_IXOTH); + } catch (ErrnoException e) { + throw new IOException("Cannot chmod native library directory " + + nativeLibraryDir.getPath(), e); + } + } + + /* + * If this is an internal application or our nativeLibraryPath points to + * the app-lib directory, unpack the libraries if necessary. + */ + return NativeLibraryHelper.copyNativeBinariesIfNeededLI(scanFile, nativeLibraryDir); + } + private void killApplication(String pkgName, int appId) { // Request the ActivityManager to kill the process(only for existing packages) // so that we do not end up in a confused state while the user is still using the older @@ -6737,7 +6787,7 @@ public class PackageManagerService extends IPackageManager.Stub { String apkName = getNextCodePath(null, pkgName, ".apk"); codeFileName = new File(installDir, apkName + ".apk").getPath(); resourceFileName = getResourcePathFromCodePath(); - libraryPath = new File(dataDir, LIB_DIR_NAME).getPath(); + libraryPath = new File(mAppLibInstallDir, pkgName).getPath(); } boolean checkFreeStorage(IMediaContainerService imcs) throws RemoteException { @@ -6774,6 +6824,7 @@ public class PackageManagerService extends IPackageManager.Stub { installDir = isFwdLocked() ? mDrmAppPrivateInstallDir : mAppInstallDir; codeFileName = createTempPackageFile(installDir).getPath(); resourceFileName = getResourcePathFromCodePath(); + libraryPath = getLibraryPathFromCodePath(); created = true; } @@ -6828,6 +6879,23 @@ public class PackageManagerService extends IPackageManager.Stub { return PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; } } + + final File nativeLibraryFile = new File(getNativeLibraryPath()); + Slog.i(TAG, "Copying native libraries to " + nativeLibraryFile.getPath()); + if (nativeLibraryFile.exists()) { + NativeLibraryHelper.removeNativeBinariesFromDirLI(nativeLibraryFile); + nativeLibraryFile.delete(); + } + try { + int copyRet = copyNativeLibrariesForInternalApp(codeFile, nativeLibraryFile); + if (copyRet != PackageManager.INSTALL_SUCCEEDED) { + return copyRet; + } + } catch (IOException e) { + Slog.e(TAG, "Copying native libraries failed", e); + ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR; + } + return ret; } @@ -6845,6 +6913,7 @@ public class PackageManagerService extends IPackageManager.Stub { } else { final File oldCodeFile = new File(getCodePath()); final File oldResourceFile = new File(getResourcePath()); + final File oldLibraryFile = new File(getNativeLibraryPath()); // Rename APK file based on packageName final String apkName = getNextCodePath(oldCodePath, pkgName, ".apk"); @@ -6859,7 +6928,20 @@ public class PackageManagerService extends IPackageManager.Stub { if (isFwdLocked() && !oldResourceFile.renameTo(newResFile)) { return false; } - resourceFileName = getResourcePathFromCodePath(); + resourceFileName = newResFile.getPath(); + + // Rename library path + final File newLibraryFile = new File(getLibraryPathFromCodePath()); + if (newLibraryFile.exists()) { + NativeLibraryHelper.removeNativeBinariesFromDirLI(newLibraryFile); + newLibraryFile.delete(); + } + if (!oldLibraryFile.renameTo(newLibraryFile)) { + Slog.e(TAG, "Cannot rename native library directory " + + oldLibraryFile.getPath() + " to " + newLibraryFile.getPath()); + return false; + } + libraryPath = newLibraryFile.getPath(); // Attempt to set permissions if (!setPermissions()) { @@ -6910,8 +6992,15 @@ public class PackageManagerService extends IPackageManager.Stub { } } + private String getLibraryPathFromCodePath() { + return new File(mAppLibInstallDir, getApkName(getCodePath())).getPath(); + } + @Override String getNativeLibraryPath() { + if (libraryPath == null) { + libraryPath = getLibraryPathFromCodePath(); + } return libraryPath; } @@ -6937,6 +7026,15 @@ public class PackageManagerService extends IPackageManager.Stub { publicSourceFile.delete(); } } + + if (libraryPath != null) { + File nativeLibraryFile = new File(libraryPath); + NativeLibraryHelper.removeNativeBinariesFromDirLI(nativeLibraryFile); + if (!nativeLibraryFile.delete()) { + Slog.w(TAG, "Couldn't delete native library directory " + libraryPath); + } + } + return ret; } @@ -9779,31 +9877,26 @@ public class PackageManagerService extends IPackageManager.Stub { final String newNativePath = mp.targetArgs .getNativeLibraryPath(); - try { - final File newNativeDir = new File(newNativePath); + final File newNativeDir = new File(newNativePath); - final String libParentDir = newNativeDir.getParentFile() - .getCanonicalPath(); - if (newNativeDir.getParentFile().getCanonicalPath() - .equals(pkg.applicationInfo.dataDir)) { - if (mInstaller - .unlinkNativeLibraryDirectory(pkg.applicationInfo.dataDir) < 0) { + if (!isForwardLocked(pkg) && !isExternal(pkg)) { + synchronized (mInstallLock) { + if (mInstaller.linkNativeLibraryDirectory( + pkg.applicationInfo.dataDir, newNativePath) < 0) { returnCode = PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE; - } else { - NativeLibraryHelper.copyNativeBinariesIfNeededLI( - new File(newCodePath), newNativeDir); } - } else { + } + NativeLibraryHelper.copyNativeBinariesIfNeededLI(new File( + newCodePath), newNativeDir); + } else { + synchronized (mInstallLock) { if (mInstaller.linkNativeLibraryDirectory( pkg.applicationInfo.dataDir, newNativePath) < 0) { returnCode = PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE; } } - } catch (IOException e) { - returnCode = PackageManager.MOVE_FAILED_INVALID_LOCATION; } - if (returnCode == PackageManager.MOVE_SUCCEEDED) { pkg.mPath = newCodePath; // Move dex files around diff --git a/services/java/com/android/server/wm/InputMonitor.java b/services/java/com/android/server/wm/InputMonitor.java index 5ff8a9b..aa18ee4 100644 --- a/services/java/com/android/server/wm/InputMonitor.java +++ b/services/java/com/android/server/wm/InputMonitor.java @@ -19,11 +19,13 @@ 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.graphics.Rect; import android.os.RemoteException; import android.util.Log; import android.util.Slog; +import android.view.Display; import android.view.InputChannel; import android.view.KeyEvent; import android.view.WindowManager; @@ -225,10 +227,11 @@ final class InputMonitor implements InputManagerService.Callbacks { addInputWindowHandleLw(mService.mFakeWindows.get(i).mWindowHandle); } - // TODO(multidisplay): Input only occurs on the default display. - final WindowList windows = mService.getDefaultWindowList(); - for (int i = windows.size() - 1; i >= 0; i--) { - final WindowState child = windows.get(i); + // 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) { @@ -243,15 +246,16 @@ final class InputMonitor implements InputManagerService.Callbacks { 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) { + if (inDrag && isVisible && onDefaultDisplay) { mService.mDragState.sendDragStartedIfNeededLw(child); } if (universeBackground != null && !addedUniverse - && child.mBaseLayer < aboveUniverseLayer) { + && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) { final WindowState u = universeBackground.mWin; if (u.mInputChannel != null && u.mInputWindowHandle != null) { addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags, diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index cdca8bc..17f4a96 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -434,6 +434,7 @@ public class WindowManagerService extends IWindowManager.Stub final float[] mTmpFloats = new float[9]; + boolean mDisplayReady; boolean mSafeMode; boolean mDisplayEnabled = false; boolean mSystemBooted = false; @@ -503,8 +504,6 @@ public class WindowManagerService extends IWindowManager.Stub final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>(); final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>(); - Display mDefaultDisplay; - boolean mIsTouchDevice; final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); @@ -2085,7 +2084,7 @@ public class WindowManagerService extends IWindowManager.Stub long origId; synchronized(mWindowMap) { - if (mDefaultDisplay == null) { + if (!mDisplayReady) { throw new IllegalStateException("Display has not been initialialized"); } @@ -5604,8 +5603,10 @@ public class WindowManagerService extends IWindowManager.Stub ">>> OPEN TRANSACTION showStrictModeViolation"); Surface.openTransaction(); try { + // TODO(multi-display): support multiple displays if (mStrictModeFlash == null) { - mStrictModeFlash = new StrictModeFlash(mDefaultDisplay, mFxSession); + mStrictModeFlash = new StrictModeFlash( + getDefaultDisplayContent().getDisplay(), mFxSession); } mStrictModeFlash.setVisibility(on); } finally { @@ -5718,7 +5719,7 @@ public class WindowManagerService extends IWindowManager.Stub } // The screenshot API does not apply the current screen rotation. - rot = mDefaultDisplay.getRotation(); + rot = getDefaultDisplayContent().getDisplay().getRotation(); int fw = frame.width(); int fh = frame.height(); @@ -6751,7 +6752,7 @@ public class WindowManagerService extends IWindowManager.Stub } boolean computeScreenConfigurationLocked(Configuration config) { - if (mDefaultDisplay == null) { + if (!mDisplayReady) { return false; } @@ -6785,13 +6786,8 @@ public class WindowManagerService extends IWindowManager.Stub } if (config != null) { - int orientation = Configuration.ORIENTATION_SQUARE; - if (dw < dh) { - orientation = Configuration.ORIENTATION_PORTRAIT; - } else if (dw > dh) { - orientation = Configuration.ORIENTATION_LANDSCAPE; - } - config.orientation = orientation; + config.orientation = (dw <= dh) ? Configuration.ORIENTATION_PORTRAIT : + Configuration.ORIENTATION_LANDSCAPE; } // Update application display metrics. @@ -6958,9 +6954,12 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { try { if (mDragState == null) { + // TODO(multi-display): support other displays + final DisplayContent displayContent = getDefaultDisplayContent(); + final Display display = displayContent.getDisplay(); Surface surface = new Surface(session, "drag surface", width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN); - surface.setLayerStack(mDefaultDisplay.getLayerStack()); + surface.setLayerStack(display.getLayerStack()); if (SHOW_TRANSACTIONS) Slog.i(TAG, " DRAG " + surface + ": CREATE"); outSurface.copyFrom(surface); @@ -7102,26 +7101,28 @@ public class WindowManagerService extends IWindowManager.Stub } public void displayReady() { - WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); - final Display display = wm.getDefaultDisplay(); - displayReady(display.getDisplayId()); + displayReady(Display.DEFAULT_DISPLAY); synchronized(mWindowMap) { - readForcedDisplaySizeAndDensityLocked(getDefaultDisplayContent()); + final DisplayContent displayContent = getDefaultDisplayContent(); + final Display display = displayContent.getDisplay(); + readForcedDisplaySizeAndDensityLocked(displayContent); - mDefaultDisplay = display; + mDisplayReady = true; mIsTouchDevice = mContext.getPackageManager().hasSystemFeature( - PackageManager.FEATURE_TOUCHSCREEN); + PackageManager.FEATURE_TOUCHSCREEN); mAnimator.initializeLocked(display.getLayerStack()); final DisplayInfo displayInfo = getDefaultDisplayInfo(); - mAnimator.setDisplayDimensions(displayInfo.logicalWidth, displayInfo.logicalHeight, - displayInfo.appWidth, displayInfo.appHeight); + mAnimator.setDisplayDimensions( + displayInfo.logicalWidth, displayInfo.logicalHeight, + displayInfo.appWidth, displayInfo.appHeight); - final DisplayContent displayContent = getDefaultDisplayContent(); - mPolicy.setInitialDisplaySize(mDefaultDisplay, displayContent.mInitialDisplayWidth, - displayContent.mInitialDisplayHeight, displayContent.mInitialDisplayDensity); + mPolicy.setInitialDisplaySize(displayContent.getDisplay(), + displayContent.mInitialDisplayWidth, + displayContent.mInitialDisplayHeight, + displayContent.mInitialDisplayDensity); } try { @@ -7802,6 +7803,7 @@ public class WindowManagerService extends IWindowManager.Stub } // TODO(multidisplay): For now rotations are only main screen. final DisplayContent displayContent = getDefaultDisplayContent(); + final Display display = displayContent.getDisplay(); if (displayContent.mBaseDisplayWidth < displayContent.mInitialDisplayWidth || displayContent.mBaseDisplayHeight < displayContent.mInitialDisplayHeight) { int initW, initH, baseW, baseH; @@ -7829,7 +7831,7 @@ public class WindowManagerService extends IWindowManager.Stub Rect inner = new Rect(0, 0, baseW, baseH); try { mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER, - mDefaultDisplay.getLayerStack()); + display.getLayerStack()); } catch (Surface.OutOfResourcesException e) { } } @@ -7929,8 +7931,10 @@ public class WindowManagerService extends IWindowManager.Stub private void reconfigureDisplayLocked(DisplayContent displayContent) { // TODO: Multidisplay: for now only use with default display. - mPolicy.setInitialDisplaySize(mDefaultDisplay, displayContent.mBaseDisplayWidth, - displayContent.mBaseDisplayHeight, displayContent.mBaseDisplayDensity); + mPolicy.setInitialDisplaySize(displayContent.getDisplay(), + displayContent.mBaseDisplayWidth, + displayContent.mBaseDisplayHeight, + displayContent.mBaseDisplayDensity); displayContent.layoutNeeded = true; @@ -8154,7 +8158,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } - if (mDefaultDisplay == null) { + if (!mDisplayReady) { // Not yet initialized, nothing to do. return; } @@ -8600,11 +8604,14 @@ public class WindowManagerService extends IWindowManager.Stub Rect dirty = new Rect(0, 0, mNextAppTransitionThumbnail.getWidth(), mNextAppTransitionThumbnail.getHeight()); try { + // TODO(multi-display): support other displays + final DisplayContent displayContent = getDefaultDisplayContent(); + final Display display = displayContent.getDisplay(); Surface surface = new Surface(mFxSession, "thumbnail anim", dirty.width(), dirty.height(), PixelFormat.TRANSLUCENT, Surface.HIDDEN); - surface.setLayerStack(mDefaultDisplay.getLayerStack()); + surface.setLayerStack(display.getLayerStack()); topOpeningApp.mAppAnimator.thumbnail = surface; if (SHOW_TRANSACTIONS) Slog.i(TAG, " THUMBNAIL " + surface + ": CREATE"); @@ -9857,7 +9864,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } - if (mDefaultDisplay == null || !mPolicy.isScreenOnFully()) { + if (!mDisplayReady || !mPolicy.isScreenOnFully()) { // No need to freeze the screen before the system is ready or if // the screen is off. return; @@ -9889,10 +9896,12 @@ public class WindowManagerService extends IWindowManager.Stub } // TODO(multidisplay): rotation on main screen only. - DisplayInfo displayInfo = getDefaultDisplayContent().getDisplayInfo(); + final DisplayContent displayContent = getDefaultDisplayContent(); + final Display display = displayContent.getDisplay(); + final DisplayInfo displayInfo = displayContent.getDisplayInfo(); mAnimator.mScreenRotationAnimation = new ScreenRotationAnimation(mContext, - mDefaultDisplay, mFxSession, inTransaction, displayInfo.logicalWidth, - displayInfo.logicalHeight, mDefaultDisplay.getRotation()); + display, mFxSession, inTransaction, displayInfo.logicalWidth, + displayInfo.logicalHeight, display.getRotation()); } } @@ -10003,8 +10012,8 @@ public class WindowManagerService extends IWindowManager.Stub if (line != null) { String[] toks = line.split("%"); if (toks != null && toks.length > 0) { - mWatermark = - new Watermark(mDefaultDisplay, mRealDisplayMetrics, mFxSession, toks); + mWatermark = new Watermark(getDefaultDisplayContent().getDisplay(), + mRealDisplayMetrics, mFxSession, toks); } } } catch (FileNotFoundException e) { @@ -10372,7 +10381,7 @@ public class WindowManagerService extends IWindowManager.Stub } } pw.println(); - if (mDefaultDisplay != null) { + if (mDisplayReady) { DisplayContentsIterator dCIterator = new DisplayContentsIterator(); while (dCIterator.hasNext()) { dCIterator.next().dump(pw); @@ -10744,7 +10753,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - boolean REVERSE_ITERATOR = true; + final static boolean REVERSE_ITERATOR = true; class AllWindowsIterator implements Iterator<WindowState> { private DisplayContent mDisplayContent; private DisplayContentsIterator mDisplayContentsIterator; @@ -10804,9 +10813,7 @@ public class WindowManagerService extends IWindowManager.Stub } public DisplayContent getDefaultDisplayContent() { - final int displayId = mDefaultDisplay == null - ? Display.DEFAULT_DISPLAY : mDefaultDisplay.getDisplayId(); - return getDisplayContent(displayId); + return getDisplayContent(Display.DEFAULT_DISPLAY); } public WindowList getDefaultWindowList() { |
