diff options
Diffstat (limited to 'services/core')
3 files changed, 63 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 69a1ac9..2729392 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -28,7 +28,6 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.os.Binder; import android.os.Bundle; import android.os.Environment; @@ -36,6 +35,7 @@ import android.os.FileUtils; import android.os.Handler; import android.os.IUserManager; import android.os.Message; +import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; @@ -111,6 +111,7 @@ public class UserManagerService extends IUserManager.Stub { private static final String USER_INFO_DIR = "system" + File.separator + "users"; private static final String USER_LIST_FILENAME = "userlist.xml"; private static final String USER_PHOTO_FILENAME = "photo.png"; + private static final String USER_PHOTO_FILENAME_TMP = USER_PHOTO_FILENAME + ".tmp"; private static final String RESTRICTIONS_FILE_PREFIX = "res_"; private static final String XML_SUFFIX = ".xml"; @@ -433,7 +434,8 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public Bitmap getUserIcon(int userId) { + public ParcelFileDescriptor getUserIcon(int userId) { + String iconPath; synchronized (mPackagesLock) { UserInfo info = mUsers.get(userId); if (info == null || info.partial) { @@ -448,8 +450,16 @@ public class UserManagerService extends IUserManager.Stub { if (info.iconPath == null) { return null; } - return BitmapFactory.decodeFile(info.iconPath); + iconPath = info.iconPath; } + + try { + return ParcelFileDescriptor.open( + new File(iconPath), ParcelFileDescriptor.MODE_READ_ONLY); + } catch (FileNotFoundException e) { + Log.e(LOG_TAG, "Couldn't find icon file", e); + } + return null; } public void makeInitialized(int userId) { @@ -572,6 +582,7 @@ public class UserManagerService extends IUserManager.Stub { try { File dir = new File(mUsersDir, Integer.toString(info.id)); File file = new File(dir, USER_PHOTO_FILENAME); + File tmp = new File(dir, USER_PHOTO_FILENAME_TMP); if (!dir.exists()) { dir.mkdir(); FileUtils.setPermissions( @@ -580,7 +591,8 @@ public class UserManagerService extends IUserManager.Stub { -1, -1); } FileOutputStream os; - if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, os = new FileOutputStream(file))) { + if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, os = new FileOutputStream(tmp)) + && tmp.renameTo(file)) { info.iconPath = file.getAbsolutePath(); } try { @@ -588,6 +600,7 @@ public class UserManagerService extends IUserManager.Stub { } catch (IOException ioe) { // What the ... ! } + tmp.delete(); } catch (FileNotFoundException e) { Slog.w(LOG_TAG, "Error setting photo for user ", e); } @@ -1787,7 +1800,8 @@ public class UserManagerService extends IUserManager.Stub { public int getUserHandle(int userSerialNumber) { synchronized (mPackagesLock) { for (int userId : mUserIds) { - if (getUserInfoLocked(userId).serialNumber == userSerialNumber) return userId; + UserInfo info = getUserInfoLocked(userId); + if (info != null && info.serialNumber == userSerialNumber) return userId; } // Not found return -1; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 271ec75..b90d263 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -457,6 +457,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final Rect mTmpNavigationFrame = new Rect(); WindowState mTopFullscreenOpaqueWindowState; + WindowState mTopFullscreenOpaqueOrDimmingWindowState; HashSet<IApplicationToken> mAppsToBeHidden = new HashSet<IApplicationToken>(); HashSet<IApplicationToken> mAppsThatDismissKeyguard = new HashSet<IApplicationToken>(); boolean mTopIsFullscreen; @@ -3972,6 +3973,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void beginPostLayoutPolicyLw(int displayWidth, int displayHeight) { mTopFullscreenOpaqueWindowState = null; + mTopFullscreenOpaqueOrDimmingWindowState = null; mAppsToBeHidden.clear(); mAppsThatDismissKeyguard.clear(); mForceStatusBar = false; @@ -4060,6 +4062,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { && attrs.height == WindowManager.LayoutParams.MATCH_PARENT) { if (DEBUG_LAYOUT) Slog.v(TAG, "Fullscreen window: " + win); mTopFullscreenOpaqueWindowState = win; + if (mTopFullscreenOpaqueOrDimmingWindowState == null) { + mTopFullscreenOpaqueOrDimmingWindowState = win; + } if (!mAppsThatDismissKeyguard.isEmpty() && mDismissKeyguard == DISMISS_KEYGUARD_NONE) { if (DEBUG_LAYOUT) Slog.v(TAG, @@ -4085,6 +4090,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } + if (mTopFullscreenOpaqueOrDimmingWindowState == null + && win.isVisibleOrBehindKeyguardLw() && !win.isGoneForLayoutLw() + && win.isDimming()) { + mTopFullscreenOpaqueOrDimmingWindowState = win; + } } /** {@inheritDoc} */ @@ -6051,6 +6061,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mForcingShowNavBar && win.getSurfaceLayer() < mForcingShowNavBarLayer) { tmpVisibility &= ~PolicyControl.adjustClearableFlags(win, View.SYSTEM_UI_CLEARABLE_FLAGS); } + tmpVisibility = updateLightStatusBarLw(tmpVisibility); final int visibility = updateSystemBarsLw(win, mLastSystemUiFlags, tmpVisibility); final int diff = visibility ^ mLastSystemUiFlags; final boolean needsMenu = win.getNeedsMenuLw(mTopFullscreenOpaqueWindowState); @@ -6079,6 +6090,26 @@ public class PhoneWindowManager implements WindowManagerPolicy { return diff; } + private int updateLightStatusBarLw(int vis) { + WindowState statusColorWin = isStatusBarKeyguard() && !mHideLockScreen + ? mStatusBar + : mTopFullscreenOpaqueOrDimmingWindowState; + + if (statusColorWin != null) { + if (statusColorWin == mTopFullscreenOpaqueWindowState) { + // If the top fullscreen-or-dimming window is also the top fullscreen, respect + // its light flag. + vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + vis |= PolicyControl.getSystemUiVisibility(statusColorWin, null) + & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } else if (statusColorWin != null && statusColorWin.isDimming()) { + // Otherwise if it's dimming, clear the light flag. + vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } + } + return vis; + } + private int updateSystemBarsLw(WindowState win, int oldVis, int vis) { // apply translucent bar vis flags WindowState transWin = isStatusBarKeyguard() && !mHideLockScreen @@ -6383,6 +6414,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mTopFullscreenOpaqueWindowState="); pw.println(mTopFullscreenOpaqueWindowState); } + if (mTopFullscreenOpaqueOrDimmingWindowState != null) { + pw.print(prefix); pw.print("mTopFullscreenOpaqueOrDimmingWindowState="); + pw.println(mTopFullscreenOpaqueOrDimmingWindowState); + } if (mForcingShowNavBar) { pw.print(prefix); pw.print("mForcingShowNavBar="); pw.println(mForcingShowNavBar); pw.print( "mForcingShowNavBarLayer="); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 99cc03e..d58b2b0 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1288,6 +1288,15 @@ final class WindowState implements WindowManagerPolicy.WindowState { return displayContent.isDefaultDisplay; } + @Override + public boolean isDimming() { + TaskStack stack = getStack(); + if (stack == null) { + return false; + } + return stack.isDimming(mWinAnimator); + } + public void setShowToOwnerOnlyLocked(boolean showToOwnerOnly) { mShowToOwnerOnly = showToOwnerOnly; } |