Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6378cf4 authored by Fyodor Kupolov's avatar Fyodor Kupolov
Browse files

Don't hold a lock while loading default wallpaper

It currently causes lock contention during user switch, when instance of
WallpaperManager in SystemUI is accessed from multiple threads

Bug: 29039588
Change-Id: I4b827d54d10fbd3b188fb94f47e78a2967ecb480
parent bb6f52d0
Loading
Loading
Loading
Loading
+20 −16
Original line number Diff line number Diff line
@@ -266,7 +266,7 @@ public class WallpaperManager {
    }

    static class Globals extends IWallpaperManagerCallback.Stub {
        private IWallpaperManager mService;
        private final IWallpaperManager mService;
        private Bitmap mCachedWallpaper;
        private int mCachedWallpaperUserId;
        private Bitmap mDefaultWallpaper;
@@ -293,7 +293,6 @@ public class WallpaperManager {

        public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault,
                @SetWallpaperFlags int which, int userId) {
            synchronized (this) {
            if (mService != null) {
                try {
                    if (!mService.isWallpaperSupported(context.getOpPackageName())) {
@@ -303,6 +302,7 @@ public class WallpaperManager {
                    throw e.rethrowFromSystemServer();
                }
            }
            synchronized (this) {
                if (mCachedWallpaper != null && mCachedWallpaperUserId == userId) {
                    return mCachedWallpaper;
                }
@@ -317,17 +317,21 @@ public class WallpaperManager {
                if (mCachedWallpaper != null) {
                    return mCachedWallpaper;
                }
            }
            if (returnDefault) {
                    if (mDefaultWallpaper == null) {
                        mDefaultWallpaper = getDefaultWallpaperLocked(context, which);
                Bitmap defaultWallpaper = mDefaultWallpaper;
                if (defaultWallpaper == null) {
                    defaultWallpaper = getDefaultWallpaper(context, which);
                    synchronized (this) {
                        mDefaultWallpaper = defaultWallpaper;
                    }
                    return mDefaultWallpaper;
                }
                return null;
                return defaultWallpaper;
            }
            return null;
        }

        public void forgetLoadedWallpaper() {
        void forgetLoadedWallpaper() {
            synchronized (this) {
                mCachedWallpaper = null;
                mCachedWallpaperUserId = 0;
@@ -362,7 +366,7 @@ public class WallpaperManager {
            return null;
        }

        private Bitmap getDefaultWallpaperLocked(Context context, @SetWallpaperFlags int which) {
        private Bitmap getDefaultWallpaper(Context context, @SetWallpaperFlags int which) {
            InputStream is = openDefaultWallpaper(context, which);
            if (is != null) {
                try {