19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.os.ParcelFileDescriptor.*;
20111bd4acdb378266221b430a284f88a3990a3958Christopher Tate
215dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.app.ActivityManagerNative;
224e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasaniimport android.app.AppGlobals;
235dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.app.IUserSwitchObserver;
248cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.IWallpaperManager;
258cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.IWallpaperManagerCallback;
26dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackbornimport android.app.PendingIntent;
27eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.app.WallpaperInfo;
284528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.BackupManager;
2937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasaniimport android.app.backup.WallpaperBackupHelper;
30135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.content.BroadcastReceiver;
314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ComponentName;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
34135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.content.IntentFilter;
354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ServiceConnection;
364e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasaniimport android.content.pm.IPackageManager;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ResolveInfo;
394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ServiceInfo;
409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.pm.PackageManager.NameNotFoundException;
416474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasaniimport android.content.pm.UserInfo;
429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.res.Resources;
4341f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlockimport android.graphics.Point;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
45284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackbornimport android.os.Bundle;
46135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.Environment;
478bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.IBinder;
495dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.os.IRemoteCallback;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileObserver;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteCallbackList;
54554cb0c290406f5bba34908489db5382a69d0a9arpcraigimport android.os.SELinux;
554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.ServiceManager;
560cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackbornimport android.os.SystemClock;
57f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
586474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasaniimport android.os.UserManager;
594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperConnection;
604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperEngine;
614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperService;
624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.WallpaperService;
638a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
6437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasaniimport android.util.SparseArray;
659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.util.Xml;
6644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.view.Display;
674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowManager;
684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.FileDescriptor;
719bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.IOException;
729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.InputStream;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileInputStream;
769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileOutputStream;
77eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.PrintWriter;
784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport java.util.List;
799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParser;
819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParserException;
829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlSerializer;
839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
8421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport com.android.internal.content.PackageMonitor;
852269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.FastXmlSerializer;
861afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport com.android.internal.util.JournaledFile;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
888cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornclass WallpaperManagerService extends IWallpaperManager.Stub {
894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    static final String TAG = "WallpaperService";
90cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn    static final boolean DEBUG = false;
919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
92407ec78b828173257b0c5dae221649a4ccd8b058Romain Guy    final Object mLock = new Object[0];
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
940cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    /**
950cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * Minimum time between crashes of a wallpaper service for us to consider
960cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * restarting it vs. just reverting to the static wallpaper.
970cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     */
980cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final long MIN_WALLPAPER_CRASH_TIME = 10000;
990cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final String WALLPAPER = "wallpaper";
10037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    static final String WALLPAPER_INFO = "wallpaper_info.xml";
1019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
103bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn     * Name of the component used to display bitmap wallpapers from either the gallery or
104bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn     * built-in wallpapers.
105bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn     */
106bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn    static final ComponentName IMAGE_WALLPAPER = new ComponentName("com.android.systemui",
107bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn            "com.android.systemui.ImageWallpaper");
108bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn
109bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn    /**
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the wallpaper has changed. The CREATE is triggered when there is no
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wallpaper set and is created for the first time. The CLOSE_WRITE is triggered
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * everytime the wallpaper is changed.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private class WallpaperObserver extends FileObserver {
11637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
11737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final WallpaperData mWallpaper;
11837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final File mWallpaperDir;
11937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final File mWallpaperFile;
12037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
12137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public WallpaperObserver(WallpaperData wallpaper) {
12237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            super(getWallpaperDir(wallpaper.userId).getAbsolutePath(),
12337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    CLOSE_WRITE | DELETE | DELETE_SELF);
12437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperDir = getWallpaperDir(wallpaper.userId);
12537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaper = wallpaper;
12637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperFile = new File(mWallpaperDir, WALLPAPER);
12737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
12837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
12937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        @Override
13037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public void onEvent(int event, String path) {
13137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (path == null) {
13237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                return;
13337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
13437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            synchronized (mLock) {
13537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                // changing the wallpaper means we'll need to back up the new one
13637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                long origId = Binder.clearCallingIdentity();
13737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                BackupManager bm = new BackupManager(mContext);
13837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                bm.dataChanged();
13937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                Binder.restoreCallingIdentity(origId);
14037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
14137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                File changedFile = new File(mWallpaperDir, path);
14237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaperFile.equals(changedFile)) {
14337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    notifyCallbacksLocked(mWallpaper);
14437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (mWallpaper.wallpaperComponent == null || event != CLOSE_WRITE
14537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            || mWallpaper.imageWallpaperPending) {
14637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        if (event == CLOSE_WRITE) {
14737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            mWallpaper.imageWallpaperPending = false;
1489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        }
149bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                        bindWallpaperComponentLocked(IMAGE_WALLPAPER, true,
1505dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                                false, mWallpaper, null);
15137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        saveSettingsLocked(mWallpaper);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
15537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
15637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
15737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
1584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final Context mContext;
1594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final IWindowManager mIWindowManager;
1604e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani    final IPackageManager mIPackageManager;
16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    final MyPackageMonitor mMonitor;
16237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    WallpaperData mLastWallpaper;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    SparseArray<WallpaperData> mWallpaperMap = new SparseArray<WallpaperData>();
16507213e6d8895af10951851435adf96a779863f6cDianne Hackborn
16637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    int mCurrentUserId;
16737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
16837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    static class WallpaperData {
16937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int userId;
17137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File wallpaperFile;
17337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
17537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * Client is currently writing a new image wallpaper.
17637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
17737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        boolean imageWallpaperPending;
17837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
18037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * Resource name if using a picture from the wallpaper gallery
18137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
18237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        String name = "";
18337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
18437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
18537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * The component name of the currently set live wallpaper.
18637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
18737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        ComponentName wallpaperComponent;
18837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
18937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
19037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * The component name of the wallpaper that should be set next.
19137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
19237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        ComponentName nextWallpaperComponent;
19337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
19437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperConnection connection;
19537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        long lastDiedTime;
19637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        boolean wallpaperUpdating;
19737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperObserver wallpaperObserver;
19837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
19937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
20037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * List of callbacks registered they should each be notified when the wallpaper is changed.
20137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
20237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        private RemoteCallbackList<IWallpaperManagerCallback> callbacks
20337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                = new RemoteCallbackList<IWallpaperManagerCallback>();
20437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
20537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int width = -1;
20637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int height = -1;
20737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
20837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData(int userId) {
20937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            this.userId = userId;
21037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaperFile = new File(getWallpaperDir(userId), WALLPAPER);
21137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
21237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
21307213e6d8895af10951851435adf96a779863f6cDianne Hackborn
2144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    class WallpaperConnection extends IWallpaperConnection.Stub
2154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            implements ServiceConnection {
216eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        final WallpaperInfo mInfo;
2174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final Binder mToken = new Binder();
2184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperService mService;
2194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperEngine mEngine;
22037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData mWallpaper;
2215dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        IRemoteCallback mReply;
2224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
2235203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright        boolean mDimensionsChanged = false;
2245203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright
22537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public WallpaperConnection(WallpaperInfo info, WallpaperData wallpaper) {
226eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            mInfo = info;
22737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaper = wallpaper;
228eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
2295dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
2305dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
2324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
23337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
23437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
2354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mService = IWallpaperService.Stub.asInterface(service);
23637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    attachServiceLocked(this, mWallpaper);
237eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // XXX should probably do saveSettingsLocked() later
238eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // when we have an engine, but I'm not sure about
239eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // locking there and anyway we always need to be able to
240eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // recover if there is something wrong.
24137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    saveSettingsLocked(mWallpaper);
2424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
2434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2465dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceDisconnected(ComponentName name) {
2484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
2494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mService = null;
2504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mEngine = null;
25137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
25237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    Slog.w(TAG, "Wallpaper service gone: " + mWallpaper.wallpaperComponent);
25337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (!mWallpaper.wallpaperUpdating
25437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && (mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME)
25537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                > SystemClock.uptimeMillis()
25637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && mWallpaper.userId == mCurrentUserId) {
2578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Reverting to built-in wallpaper!");
2585dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        clearWallpaperLocked(true, mWallpaper.userId, null);
2590cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                    }
2600cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
2614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
26337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
2645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void attachEngine(IWallpaperEngine engine) {
2665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            synchronized (mLock) {
2675dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                mEngine = engine;
2685203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                if (mDimensionsChanged) {
2695203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                    try {
2705203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                        mEngine.setDesiredSize(mWallpaper.width, mWallpaper.height);
2715203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                    } catch (RemoteException e) {
2725203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                        Slog.w(TAG, "Failed to set wallpaper dimensions", e);
2735203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                    }
2745203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                    mDimensionsChanged = false;
2755203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                }
2765dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
2775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
2785dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
2795dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2805dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        public void engineShown(IWallpaperEngine engine) {
2815dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            synchronized (mLock) {
2825dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (mReply != null) {
2835dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    long ident = Binder.clearCallingIdentity();
2845dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    try {
2855dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        mReply.sendResult(null);
2865dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    } catch (RemoteException e) {
2875dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        Binder.restoreCallingIdentity(ident);
2885dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    }
2895dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    mReply = null;
2905dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
2915dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
2924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
29337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
2945dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public ParcelFileDescriptor setWallpaper(String name) {
2964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
29737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
29837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    return updateWallpaperBitmapLocked(name, mWallpaper);
2994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
3004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                return null;
3014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
3024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
3034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
30437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
30521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    class MyPackageMonitor extends PackageMonitor {
30621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
30721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateFinished(String packageName, int uid) {
30821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
309c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
310c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
311c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
312c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
313c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
31437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent != null
31537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
31637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperUpdating = false;
31737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        ComponentName comp = wallpaper.wallpaperComponent;
31837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        clearWallpaperComponentLocked(wallpaper);
319c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                        if (!bindWallpaperComponentLocked(comp, false, false,
320c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                                wallpaper, null)) {
32137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.w(TAG, "Wallpaper no longer available; reverting to default");
3225dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            clearWallpaperLocked(false, wallpaper.userId, null);
32337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        }
32480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    }
32580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
32680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
32780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        }
32880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn
32980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        @Override
33080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        public void onPackageModified(String packageName) {
33180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            synchronized (mLock) {
332c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
333c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
334c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
335c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
336c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
33737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent == null
33837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            || !wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
339c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                        return;
34037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
341d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    doPackagesChangedLocked(true, wallpaper);
34221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
34321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
34421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
34521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
34621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
34721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateStarted(String packageName, int uid) {
34821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
349c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
350c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
351c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
352c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
353c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
35437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent != null
35537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
35637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperUpdating = true;
35737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
35821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
35921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
36021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
36121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
36221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
36321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
364d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            synchronized (mLock) {
365d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                boolean changed = false;
366c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
367c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return false;
368c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
369c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
370c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
371d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    boolean res = doPackagesChangedLocked(doit, wallpaper);
372d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    changed |= res;
373d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
374d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                return changed;
37537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
37621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
37721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
37821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
37921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onSomePackagesChanged() {
380d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            synchronized (mLock) {
381c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
382c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
383c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
384c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
385c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
386d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    doPackagesChangedLocked(true, wallpaper);
387d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
38837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
38921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
39037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
391d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn        boolean doPackagesChangedLocked(boolean doit, WallpaperData wallpaper) {
39221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            boolean changed = false;
393d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.wallpaperComponent != null) {
394d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                int change = isPackageDisappearing(wallpaper.wallpaperComponent
395d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        .getPackageName());
396d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                if (change == PACKAGE_PERMANENT_CHANGE
397d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        || change == PACKAGE_TEMPORARY_CHANGE) {
398d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    changed = true;
399d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    if (doit) {
400d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        Slog.w(TAG, "Wallpaper uninstalled, removing: "
40137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                + wallpaper.wallpaperComponent);
4025dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        clearWallpaperLocked(false, wallpaper.userId, null);
40321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
40421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
405d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
406d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.nextWallpaperComponent != null) {
407d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                int change = isPackageDisappearing(wallpaper.nextWallpaperComponent
408d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        .getPackageName());
409d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                if (change == PACKAGE_PERMANENT_CHANGE
410d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        || change == PACKAGE_TEMPORARY_CHANGE) {
411d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    wallpaper.nextWallpaperComponent = null;
412d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
413d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
414d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.wallpaperComponent != null
415d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    && isPackageModified(wallpaper.wallpaperComponent.getPackageName())) {
416d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                try {
417d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    mContext.getPackageManager().getServiceInfo(
418d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            wallpaper.wallpaperComponent, 0);
419d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                } catch (NameNotFoundException e) {
420d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    Slog.w(TAG, "Wallpaper component gone, removing: "
421d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            + wallpaper.wallpaperComponent);
4225dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    clearWallpaperLocked(false, wallpaper.userId, null);
423d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
424d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
425d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.nextWallpaperComponent != null
426d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    && isPackageModified(wallpaper.nextWallpaperComponent.getPackageName())) {
427d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                try {
428d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    mContext.getPackageManager().getServiceInfo(
429d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            wallpaper.nextWallpaperComponent, 0);
430d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                } catch (NameNotFoundException e) {
431d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    wallpaper.nextWallpaperComponent = null;
43221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
43321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
43421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return changed;
43521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
43621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
43721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
4388cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public WallpaperManagerService(Context context) {
4398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "WallpaperService startup");
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
4414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        mIWindowManager = IWindowManager.Stub.asInterface(
4424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                ServiceManager.getService(Context.WINDOW_SERVICE));
4434e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani        mIPackageManager = AppGlobals.getPackageManager();
44421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        mMonitor = new MyPackageMonitor();
445c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn        mMonitor.register(context, null, UserHandle.ALL, true);
44661f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        getWallpaperDir(UserHandle.USER_OWNER).mkdirs();
44761f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        loadSettingsLocked(UserHandle.USER_OWNER);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private static File getWallpaperDir(int userId) {
45161f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        return Environment.getUserSystemDirectory(userId);
45237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
45337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
45737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        for (int i = 0; i < mWallpaperMap.size(); i++) {
45837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.valueAt(i);
45937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.wallpaperObserver.stopWatching();
46037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
462135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
463a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public void systemRunning() {
4648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "systemReady");
46561f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(UserHandle.USER_OWNER);
4665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        switchWallpaper(wallpaper, null);
46737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
46837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperObserver.startWatching();
46937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
470135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        IntentFilter userFilter = new IntentFilter();
471135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        userFilter.addAction(Intent.ACTION_USER_REMOVED);
472756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        userFilter.addAction(Intent.ACTION_USER_STOPPING);
473135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        mContext.registerReceiver(new BroadcastReceiver() {
47437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            @Override
475135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            public void onReceive(Context context, Intent intent) {
476135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                String action = intent.getAction();
4775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (Intent.ACTION_USER_REMOVED.equals(action)) {
478756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                    onRemoveUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
479756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                            UserHandle.USER_NULL));
480135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                }
4810c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // TODO: Race condition causing problems when cleaning up on stopping a user.
4820c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // Comment this out for now.
4830c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // else if (Intent.ACTION_USER_STOPPING.equals(action)) {
4840c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                //     onStoppingUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
4850c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                //             UserHandle.USER_NULL));
4860c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // }
48737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
488135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        }, userFilter);
489756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani
4905dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        try {
4915dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            ActivityManagerNative.getDefault().registerUserSwitchObserver(
4925dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    new IUserSwitchObserver.Stub() {
4935dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        @Override
4945dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        public void onUserSwitching(int newUserId, IRemoteCallback reply) {
4955dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            switchUser(newUserId, reply);
4965dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        }
4975dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
4985dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        @Override
4995dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        public void onUserSwitchComplete(int newUserId) throws RemoteException {
5005dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        }
5015dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    });
5025dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        } catch (RemoteException e) {
5035dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            // TODO Auto-generated catch block
5045dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            e.printStackTrace();
5055dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
50637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
50737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
50837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    String getName() {
5095dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        synchronized (mLock) {
5105dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            return mWallpaperMap.get(0).name;
5115dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
51237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
51337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
514756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani    void onStoppingUser(int userId) {
515756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        if (userId < 1) return;
516135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        synchronized (mLock) {
517135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
518135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            if (wallpaper != null) {
519756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                if (wallpaper.wallpaperObserver != null) {
520756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                    wallpaper.wallpaperObserver.stopWatching();
521756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                    wallpaper.wallpaperObserver = null;
522756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                }
523135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                mWallpaperMap.remove(userId);
524135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            }
525756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        }
526756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani    }
527756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani
528756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani    void onRemoveUser(int userId) {
529756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        if (userId < 1) return;
530756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        synchronized (mLock) {
531756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani            onStoppingUser(userId);
532135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            File wallpaperFile = new File(getWallpaperDir(userId), WALLPAPER);
533135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            wallpaperFile.delete();
534135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            File wallpaperInfoFile = new File(getWallpaperDir(userId), WALLPAPER_INFO);
535135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            wallpaperInfoFile.delete();
536135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        }
537135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    }
538135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
5395dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void switchUser(int userId, IRemoteCallback reply) {
54037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        synchronized (mLock) {
54137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mCurrentUserId = userId;
54237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
54337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper == null) {
54437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper = new WallpaperData(userId);
54537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                mWallpaperMap.put(userId, wallpaper);
54637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                loadSettingsLocked(userId);
5476474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            }
5486474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            // Not started watching yet, in case wallpaper data was loaded for other reasons.
5496474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            if (wallpaper.wallpaperObserver == null) {
55037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
55137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.wallpaperObserver.startWatching();
55237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
5535dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            switchWallpaper(wallpaper, reply);
55437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
55537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
55637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
5575dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void switchWallpaper(WallpaperData wallpaper, IRemoteCallback reply) {
558f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        synchronized (mLock) {
55980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            RuntimeException e = null;
560f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
56137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                ComponentName cname = wallpaper.wallpaperComponent != null ?
56237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperComponent : wallpaper.nextWallpaperComponent;
5635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (bindWallpaperComponentLocked(cname, true, false, wallpaper, reply)) {
56480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return;
565f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                }
56680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            } catch (RuntimeException e1) {
56780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                e = e1;
568f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
56980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            Slog.w(TAG, "Failure starting previous wallpaper", e);
5705dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            clearWallpaperLocked(false, wallpaper.userId, reply);
571f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
572f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
57337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() {
5758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "clearWallpaper");
5769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
5775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            clearWallpaperLocked(false, UserHandle.getCallingUserId(), null);
57821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
57921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
58021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5815dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void clearWallpaperLocked(boolean defaultFailed, int userId, IRemoteCallback reply) {
58237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(userId);
58337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File f = new File(getWallpaperDir(userId), WALLPAPER);
58421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (f.exists()) {
58521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            f.delete();
58621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
58721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        final long ident = Binder.clearCallingIdentity();
58880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        RuntimeException e = null;
58921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        try {
59037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.imageWallpaperPending = false;
59137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (userId != mCurrentUserId) return;
59280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            if (bindWallpaperComponentLocked(defaultFailed
593bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    ? IMAGE_WALLPAPER
5945dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    : null, true, false, wallpaper, reply)) {
59580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return;
59680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
59780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        } catch (IllegalArgumentException e1) {
59880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            e = e1;
59921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        } finally {
60021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Binder.restoreCallingIdentity(ident);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn
60380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // This can happen if the default wallpaper component doesn't
60480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // exist.  This should be a system configuration problem, but
60580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // let's not let it crash the system and just live with no
60680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // wallpaper.
60780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        Slog.e(TAG, "Default wallpaper component not found!", e);
60837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        clearWallpaperComponentLocked(wallpaper);
6095dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        if (reply != null) {
6105dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            try {
6115dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                reply.sendResult(null);
6125dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            } catch (RemoteException e1) {
6135dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6145dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6175dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public boolean hasNamedWallpaper(String name) {
6185dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        synchronized (mLock) {
6196474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            List<UserInfo> users;
6206474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            long ident = Binder.clearCallingIdentity();
6216474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            try {
6226474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                users = ((UserManager) mContext.getSystemService(Context.USER_SERVICE)).getUsers();
6236474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            } finally {
6246474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                Binder.restoreCallingIdentity(ident);
6256474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            }
6266474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            for (UserInfo user: users) {
6276474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                WallpaperData wd = mWallpaperMap.get(user.id);
6286474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                if (wd == null) {
6296474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                    // User hasn't started yet, so load her settings to peek at the wallpaper
6306474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                    loadSettingsLocked(user.id);
6316474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                    wd = mWallpaperMap.get(user.id);
6326474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                }
6336474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                if (wd != null && name.equals(wd.name)) {
6345dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    return true;
6355dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
6365dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6385dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        return false;
6395dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64141f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock    private Point getDefaultDisplaySize() {
64241f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock        Point p = new Point();
643d6e836c4a0ebf3af571c46986d324c1bd599ba95John Spurlock        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
644d6e836c4a0ebf3af571c46986d324c1bd599ba95John Spurlock        Display d = wm.getDefaultDisplay();
645d6e836c4a0ebf3af571c46986d324c1bd599ba95John Spurlock        d.getRealSize(p);
64641f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock        return p;
64741f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock    }
64841f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock
6495dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public void setDimensionHints(int width, int height) throws RemoteException {
6505dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        checkPermission(android.Manifest.permission.SET_WALLPAPER_HINTS);
6519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
6525dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
6535dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
6545dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
6555dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
6565dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6575dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (width <= 0 || height <= 0) {
6585dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalArgumentException("width and height must be > 0");
6595dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
66041f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock            // Make sure it is at least as large as the display.
66141f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock            Point displaySize = getDefaultDisplaySize();
66241f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock            width = Math.max(width, displaySize.x);
66341f6464b3f247c6ee0828e1b1aa3300e56e8cabbJohn Spurlock            height = Math.max(height, displaySize.y);
6645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
66537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (width != wallpaper.width || height != wallpaper.height) {
66637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.width = width;
66737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.height = height;
66837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                saveSettingsLocked(wallpaper);
66937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mCurrentUserId != userId) return; // Don't change the properties now
67037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.connection != null) {
67137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.connection.mEngine != null) {
672284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        try {
67337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            wallpaper.connection.mEngine.setDesiredSize(
674284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    width, height);
675284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        } catch (RemoteException e) {
676284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        }
67737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        notifyCallbacksLocked(wallpaper);
6785203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                    } else if (wallpaper.connection.mService != null) {
6795203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                        // We've attached to the service but the engine hasn't attached back to us
6805203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                        // yet. This means it will be created with the previous dimensions, so we
6815203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                        // need to update it to the new dimensions once it attaches.
6825203a8b50b28764971fbeac637b2bfaaaec56322Michael Wright                        wallpaper.connection.mDimensionsChanged = true;
683284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    }
684284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
6859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWidthHint() throws RemoteException {
6909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
691f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId());
69237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            return wallpaper.width;
6939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getHeightHint() throws RemoteException {
6979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
698f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId());
69937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            return wallpaper.height;
7009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
703284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn    public ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb,
704284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            Bundle outParams) {
7059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
70637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // This returns the current user's wallpaper, if called by a system service. Else it
70737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // returns the wallpaper for the calling user.
70837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            int callingUid = Binder.getCallingUid();
70937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            int wallpaperUserId = 0;
71037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (callingUid == android.os.Process.SYSTEM_UID) {
71137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaperUserId = mCurrentUserId;
71237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            } else {
713f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                wallpaperUserId = UserHandle.getUserId(callingUid);
71437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
71537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(wallpaperUserId);
7169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
717284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (outParams != null) {
71837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    outParams.putInt("width", wallpaper.width);
71937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    outParams.putInt("height", wallpaper.height);
720284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
72137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.callbacks.register(cb);
72237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                File f = new File(getWallpaperDir(wallpaperUserId), WALLPAPER);
7239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (!f.exists()) {
7249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return null;
7259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
7269bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                return ParcelFileDescriptor.open(f, MODE_READ_ONLY);
7279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (FileNotFoundException e) {
7289bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                /* Shouldn't happen as we check to see if the file exists */
7298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Error getting wallpaper", e);
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            return null;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
735eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public WallpaperInfo getWallpaperInfo() {
736f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int userId = UserHandle.getCallingUserId();
737eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
73837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
73937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection != null) {
74037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                return wallpaper.connection.mInfo;
741eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
742eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return null;
743eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
744eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
74537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
7469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    public ParcelFileDescriptor setWallpaper(String name) {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPermission(android.Manifest.permission.SET_WALLPAPER);
7489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
7495dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (DEBUG) Slog.v(TAG, "setWallpaper");
7505dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
7515dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
7525dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
7535dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
7545dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
7550cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            final long ident = Binder.clearCallingIdentity();
7560cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            try {
75737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name, wallpaper);
7580cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                if (pfd != null) {
75937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.imageWallpaperPending = true;
7600cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
7610cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                return pfd;
7620cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            } finally {
7630cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                Binder.restoreCallingIdentity(ident);
7644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
7654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
7664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
7674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
76837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    ParcelFileDescriptor updateWallpaperBitmapLocked(String name, WallpaperData wallpaper) {
7694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        if (name == null) name = "";
7704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
77137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File dir = getWallpaperDir(wallpaper.userId);
77237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!dir.exists()) {
77337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                dir.mkdir();
774ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                FileUtils.setPermissions(
77537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        dir.getPath(),
776ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
777ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                        -1, -1);
778ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn            }
779554cb0c290406f5bba34908489db5382a69d0a9arpcraig            File file = new File(dir, WALLPAPER);
780554cb0c290406f5bba34908489db5382a69d0a9arpcraig            ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
7814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    MODE_CREATE|MODE_READ_WRITE);
782554cb0c290406f5bba34908489db5382a69d0a9arpcraig            if (!SELinux.restorecon(file)) {
783554cb0c290406f5bba34908489db5382a69d0a9arpcraig                return null;
784554cb0c290406f5bba34908489db5382a69d0a9arpcraig            }
78537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = name;
7864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return fd;
7874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (FileNotFoundException e) {
7888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Error setting wallpaper", e);
7894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
7904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return null;
7914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
7924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
7934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public void setWallpaperComponent(ComponentName name) {
7944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);
7954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        synchronized (mLock) {
7965dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name);
7975dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
7985dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
7995dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
8005dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
8015dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
8024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            final long ident = Binder.clearCallingIdentity();
8039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
80437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.imageWallpaperPending = false;
8055dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                bindWallpaperComponentLocked(name, false, true, wallpaper, null);
806f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } finally {
807f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                Binder.restoreCallingIdentity(ident);
808f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
809f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
810f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
811f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
81237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force,
8135dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            boolean fromUser, WallpaperData wallpaper, IRemoteCallback reply) {
8148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName);
815f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        // Has the component changed?
8169ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn        if (!force) {
81737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection != null) {
81837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.wallpaperComponent == null) {
8199ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    if (componentName == null) {
8209ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: still using default");
8219ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        // Still using default wallpaper.
82280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        return true;
8239ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    }
82437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                } else if (wallpaper.wallpaperComponent.equals(componentName)) {
8259ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    // Changing to same wallpaper.
8269ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    if (DEBUG) Slog.v(TAG, "same wallpaper");
82780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return true;
8284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
829f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
830f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
831f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
832f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        try {
833a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            if (componentName == null) {
834322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                String defaultComponent =
835322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    mContext.getString(com.android.internal.R.string.default_wallpaper_component);
836a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (defaultComponent != null) {
837322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // See if there is a default wallpaper component specified
838a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    componentName = ComponentName.unflattenFromString(defaultComponent);
8398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Use default component wallpaper:" + componentName);
840322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
841a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (componentName == null) {
842322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // Fall back to static image wallpaper
843bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    componentName = IMAGE_WALLPAPER;
844322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //clearWallpaperComponentLocked();
845322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //return;
8468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Using image wallpaper");
847322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
848f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
8494e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            int serviceUserId = wallpaper.userId;
8504e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            ServiceInfo si = mIPackageManager.getServiceInfo(componentName,
8514e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                    PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS, serviceUserId);
852909522048f7ce7af54e1476175c8e8d1df808a04Christopher Tate            if (si == null) {
853909522048f7ce7af54e1476175c8e8d1df808a04Christopher Tate                // The wallpaper component we're trying to use doesn't exist
854909522048f7ce7af54e1476175c8e8d1df808a04Christopher Tate                Slog.w(TAG, "Attempted wallpaper " + componentName + " is unavailable");
855909522048f7ce7af54e1476175c8e8d1df808a04Christopher Tate                return false;
856909522048f7ce7af54e1476175c8e8d1df808a04Christopher Tate            }
857f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) {
85880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                String msg = "Selected service does not require "
859f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                        + android.Manifest.permission.BIND_WALLPAPER
86080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        + ": " + componentName;
86180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                if (fromUser) {
86280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    throw new SecurityException(msg);
86380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
86480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                Slog.w(TAG, msg);
86580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return false;
866f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
867f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
868eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            WallpaperInfo wi = null;
869eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
870f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE);
871bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn            if (componentName != null && !componentName.equals(IMAGE_WALLPAPER)) {
8724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Make sure the selected service is actually a wallpaper service.
8734e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                List<ResolveInfo> ris =
8744e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                        mIPackageManager.queryIntentServices(intent,
8754e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
8764e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                                PackageManager.GET_META_DATA, serviceUserId);
8774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                for (int i=0; i<ris.size(); i++) {
8784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    ServiceInfo rsi = ris.get(i).serviceInfo;
8794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    if (rsi.name.equals(si.name) &&
8804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            rsi.packageName.equals(si.packageName)) {
881eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        try {
882eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            wi = new WallpaperInfo(mContext, ris.get(i));
883eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (XmlPullParserException e) {
88480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            if (fromUser) {
88580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                                throw new IllegalArgumentException(e);
88680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            }
88780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            Slog.w(TAG, e);
88880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            return false;
889eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (IOException e) {
89080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            if (fromUser) {
89180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                                throw new IllegalArgumentException(e);
89280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            }
89380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            Slog.w(TAG, e);
89480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            return false;
895eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        }
8964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        break;
8974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
8984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
899eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                if (wi == null) {
90080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    String msg = "Selected service is not a wallpaper: "
90180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            + componentName;
90280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    if (fromUser) {
90380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        throw new SecurityException(msg);
90480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    }
90580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    Slog.w(TAG, msg);
90680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return false;
9074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
9089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
909f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
910f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            // Bind the service!
9118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG) Slog.v(TAG, "Binding to:" + componentName);
91237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperConnection newConn = new WallpaperConnection(wi, wallpaper);
913a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            intent.setComponent(componentName);
914dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
915dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn                    com.android.internal.R.string.wallpaper_binding_label);
9164120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivityAsUser(
917eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    mContext, 0,
918eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER),
919eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            mContext.getText(com.android.internal.R.string.chooser_wallpaper)),
9204120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                    0, null, new UserHandle(serviceUserId)));
921c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn            if (!mContext.bindServiceAsUser(intent, newConn,
922c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn                    Context.BIND_AUTO_CREATE | Context.BIND_SHOWING_UI,
92327b89e6658a0d233a53f5d7ca20dc57fec82d955Amith Yamasani                    new UserHandle(serviceUserId))) {
92480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                String msg = "Unable to bind service: "
92580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        + componentName;
92680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                if (fromUser) {
92780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    throw new IllegalArgumentException(msg);
92880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
92980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                Slog.w(TAG, msg);
93080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return false;
931f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
93237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.userId == mCurrentUserId && mLastWallpaper != null) {
93337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                detachWallpaperLocked(mLastWallpaper);
93437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
93537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.wallpaperComponent = componentName;
93637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection = newConn;
93737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.lastDiedTime = SystemClock.uptimeMillis();
9385dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            newConn.mReply = reply;
939f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
94037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.userId == mCurrentUserId) {
94137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (DEBUG)
94237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        Slog.v(TAG, "Adding window token: " + newConn.mToken);
94337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mIWindowManager.addWindowToken(newConn.mToken,
94437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            WindowManager.LayoutParams.TYPE_WALLPAPER);
94537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mLastWallpaper = wallpaper;
94637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                }
947f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } catch (RemoteException e) {
948f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
9494e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani        } catch (RemoteException e) {
9504e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            String msg = "Remote exception for " + componentName + "\n" + e;
95180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            if (fromUser) {
95280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                throw new IllegalArgumentException(msg);
95380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
95480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            Slog.w(TAG, msg);
95580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            return false;
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
95780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        return true;
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
95937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
96037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void detachWallpaperLocked(WallpaperData wallpaper) {
96137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.connection != null) {
9625dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper.connection.mReply != null) {
9635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                try {
9645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    wallpaper.connection.mReply.sendResult(null);
9655dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                } catch (RemoteException e) {
9665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
9675dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                wallpaper.connection.mReply = null;
9685dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
96937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection.mEngine != null) {
9704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                try {
97137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.connection.mEngine.destroy();
9724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                } catch (RemoteException e) {
9734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
9744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
97537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mContext.unbindService(wallpaper.connection);
976e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            try {
97737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (DEBUG)
97837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    Slog.v(TAG, "Removing window token: " + wallpaper.connection.mToken);
97937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                mIWindowManager.removeWindowToken(wallpaper.connection.mToken);
980e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            } catch (RemoteException e) {
981e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
98237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection.mService = null;
98337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection.mEngine = null;
98437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection = null;
9854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
9864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
98737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
98837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void clearWallpaperComponentLocked(WallpaperData wallpaper) {
98937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperComponent = null;
99037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        detachWallpaperLocked(wallpaper);
99137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
99237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
99337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void attachServiceLocked(WallpaperConnection conn, WallpaperData wallpaper) {
9944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
9953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            conn.mService.attach(conn, conn.mToken,
9963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    WindowManager.LayoutParams.TYPE_WALLPAPER, false,
99737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.width, wallpaper.height);
9984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (RemoteException e) {
9998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed attaching wallpaper; clearing", e);
100037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!wallpaper.wallpaperUpdating) {
10015dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                bindWallpaperComponentLocked(null, false, false, wallpaper, null);
100221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
10034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
10044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
100537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
100637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void notifyCallbacksLocked(WallpaperData wallpaper) {
100737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final int n = wallpaper.callbacks.beginBroadcast();
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < n; i++) {
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
101037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.callbacks.getBroadcastItem(i).onWallpaperChanged();
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The RemoteCallbackList will take care of removing
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the dead object for us.
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
101737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.callbacks.finishBroadcast();
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED);
10195ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId));
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void checkPermission(String permission) {
10239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (PackageManager.PERMISSION_GRANTED!= mContext.checkCallingOrSelfPermission(permission)) {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", must have permission " + permission);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10289bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
102937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private static JournaledFile makeJournaledFile(int userId) {
103061f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        final String base = new File(getWallpaperDir(userId), WALLPAPER_INFO).getAbsolutePath();
10319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return new JournaledFile(new File(base), new File(base + ".tmp"));
10329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
10339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
103437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void saveSettingsLocked(WallpaperData wallpaper) {
103537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        JournaledFile journal = makeJournaledFile(wallpaper.userId);
10369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileOutputStream stream = null;
10379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
10389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileOutputStream(journal.chooseForWrite(), false);
10399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlSerializer out = new FastXmlSerializer();
10409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.setOutput(stream, "utf-8");
10419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startDocument(null, true);
10429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
10439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startTag(null, "wp");
104437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "width", Integer.toString(wallpaper.width));
104537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "height", Integer.toString(wallpaper.height));
104637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "name", wallpaper.name);
104737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.wallpaperComponent != null
1048bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    && !wallpaper.wallpaperComponent.equals(IMAGE_WALLPAPER)) {
10494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                out.attribute(null, "component",
105037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperComponent.flattenToShortString());
10514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
10529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endTag(null, "wp");
10539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
10549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endDocument();
10559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream.close();
10569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.commit();
10579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
10589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
10599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (stream != null) {
10609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    stream.close();
10619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
10629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (IOException ex) {
10639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                // Ignore
10649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
10659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.rollback();
10669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
10679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
10689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
106937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void migrateFromOld() {
107037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File oldWallpaper = new File(WallpaperBackupHelper.WALLPAPER_IMAGE_KEY);
107137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File oldInfo = new File(WallpaperBackupHelper.WALLPAPER_INFO_KEY);
107237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (oldWallpaper.exists()) {
107337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File newWallpaper = new File(getWallpaperDir(0), WALLPAPER);
107437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            oldWallpaper.renameTo(newWallpaper);
107537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
107637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (oldInfo.exists()) {
107737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File newInfo = new File(getWallpaperDir(0), WALLPAPER_INFO);
107837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            oldInfo.renameTo(newInfo);
107937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
108037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
108137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
108237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void loadSettingsLocked(int userId) {
10838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "loadSettingsLocked");
1084a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
108537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        JournaledFile journal = makeJournaledFile(userId);
10869bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileInputStream stream = null;
10879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        File file = journal.chooseForRead();
108837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (!file.exists()) {
108937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // This should only happen one time, when upgrading from a legacy system
109037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            migrateFromOld();
109137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
109237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(userId);
109337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper == null) {
109437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper = new WallpaperData(userId);
109537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperMap.put(userId, wallpaper);
109637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
10979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
10989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
10999bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileInputStream(file);
11009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlPullParser parser = Xml.newPullParser();
11019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            parser.setInput(stream, null);
11029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int type;
11049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            do {
11059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = parser.next();
11069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (type == XmlPullParser.START_TAG) {
11079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    String tag = parser.getName();
11089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if ("wp".equals(tag)) {
110937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.width = Integer.parseInt(parser.getAttributeValue(null, "width"));
111037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.height = Integer.parseInt(parser
111137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                .getAttributeValue(null, "height"));
111237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.name = parser.getAttributeValue(null, "name");
11134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        String comp = parser.getAttributeValue(null, "component");
111437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.nextWallpaperComponent = comp != null
11154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                ? ComponentName.unflattenFromString(comp)
11164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                : null;
111737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        if (wallpaper.nextWallpaperComponent == null
111837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                || "android".equals(wallpaper.nextWallpaperComponent
111937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                        .getPackageName())) {
1120bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                            wallpaper.nextWallpaperComponent = IMAGE_WALLPAPER;
11219ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        }
1122a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
1123a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        if (DEBUG) {
112437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mWidth:" + wallpaper.width);
112537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mHeight:" + wallpaper.height);
112637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mName:" + wallpaper.name);
112737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mNextWallpaperComponent:"
112837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                    + wallpaper.nextWallpaperComponent);
1129a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        }
11309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
11319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
11329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } while (type != XmlPullParser.END_DOCUMENT);
11339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            success = true;
113413579ed3305bf89b41a9fa88e1347f0e0769d279Dianne Hackborn        } catch (FileNotFoundException e) {
113513579ed3305bf89b41a9fa88e1347f0e0769d279Dianne Hackborn            Slog.w(TAG, "no current wallpaper -- first boot?");
11369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NullPointerException e) {
11378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NumberFormatException e) {
11398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (XmlPullParserException e) {
11418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
11438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IndexOutOfBoundsException e) {
11458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
11479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
11489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (stream != null) {
11499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                stream.close();
11509bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
11529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            // Ignore
11539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
11549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
115637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.width = -1;
115737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.height = -1;
115837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = "";
11599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
116044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn
116144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        // We always want to have some reasonable width hint.
11627ea91ec181b88f71390c544029d0c864f49ca92dJohn Spurlock        int baseSize = getMaximumSizeDimension();
116337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.width < baseSize) {
116437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.width = baseSize;
116544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
116637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.height < baseSize) {
116737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.height = baseSize;
116844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
11699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
11709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11717ea91ec181b88f71390c544029d0c864f49ca92dJohn Spurlock    private int getMaximumSizeDimension() {
11727ea91ec181b88f71390c544029d0c864f49ca92dJohn Spurlock        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
11737ea91ec181b88f71390c544029d0c864f49ca92dJohn Spurlock        Display d = wm.getDefaultDisplay();
11747ea91ec181b88f71390c544029d0c864f49ca92dJohn Spurlock        return d.getMaximumSizeDimension();
11757ea91ec181b88f71390c544029d0c864f49ca92dJohn Spurlock    }
11767ea91ec181b88f71390c544029d0c864f49ca92dJohn Spurlock
1177194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick    // Called by SystemBackupAgent after files are restored to disk.
11789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    void settingsRestored() {
117937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        // TODO: If necessary, make it work for secondary users as well. This currently assumes
118037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        // restores only to the primary user
11818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "settingsRestored");
118237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = null;
11839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
11849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
118537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            loadSettingsLocked(0);
118637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper = mWallpaperMap.get(0);
118737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.nextWallpaperComponent != null
1188bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    && !wallpaper.nextWallpaperComponent.equals(IMAGE_WALLPAPER)) {
118937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (!bindWallpaperComponentLocked(wallpaper.nextWallpaperComponent, false, false,
11905dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        wallpaper, null)) {
1191e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // No such live wallpaper or other failure; fall back to the default
1192e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // live wallpaper (since the profile being restored indicated that the
1193e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // user had selected a live rather than static one).
11945dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    bindWallpaperComponentLocked(null, false, false, wallpaper, null);
1195e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                }
11969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                success = true;
11979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } else {
1198a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // If there's a wallpaper name, we use that.  If that can't be loaded, then we
1199a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // use the default.
120037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if ("".equals(wallpaper.name)) {
12018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: name is empty");
1202a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    success = true;
1203a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                } else {
12048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: attempting to restore named resource");
120537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    success = restoreNamedResourceLocked(wallpaper);
1206a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
12078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG) Slog.v(TAG, "settingsRestored: success=" + success);
1208a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (success) {
120937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    bindWallpaperComponentLocked(wallpaper.nextWallpaperComponent, false, false,
12105dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            wallpaper, null);
1211a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
12129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
12149bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
121637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            Slog.e(TAG, "Failed to restore wallpaper: '" + wallpaper.name + "'");
121737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = "";
121837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            getWallpaperDir(0).delete();
12199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
1220194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick
1221194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        synchronized (mLock) {
122237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            saveSettingsLocked(wallpaper);
1223194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        }
12249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
12259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
122637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    boolean restoreNamedResourceLocked(WallpaperData wallpaper) {
122737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.name.length() > 4 && "res:".equals(wallpaper.name.substring(0, 4))) {
122837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            String resName = wallpaper.name.substring(4);
12299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String pkg = null;
12319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int colon = resName.indexOf(':');
12329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0) {
12339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                pkg = resName.substring(0, colon);
12349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12359bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String ident = null;
12379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int slash = resName.lastIndexOf('/');
12389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (slash > 0) {
12399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                ident = resName.substring(slash+1);
12409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String type = null;
12439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0 && slash > 0 && (slash-colon) > 1) {
12449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = resName.substring(colon+1, slash);
12459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (pkg != null && ident != null && type != null) {
12489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                int resId = -1;
12499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                InputStream res = null;
12509bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                FileOutputStream fos = null;
12519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                try {
12529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Context c = mContext.createPackageContext(pkg, Context.CONTEXT_RESTRICTED);
12539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Resources r = c.getResources();
12549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    resId = r.getIdentifier(resName, null, null);
12559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (resId == 0) {
12568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.e(TAG, "couldn't resolve identifier pkg=" + pkg + " type=" + type
12579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                                + " ident=" + ident);
12589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        return false;
12599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    res = r.openRawResource(resId);
126237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperFile.exists()) {
126337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperFile.delete();
12641afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    }
126537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    fos = new FileOutputStream(wallpaper.wallpaperFile);
12669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    byte[] buffer = new byte[32768];
12689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    int amt;
12699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    while ((amt=res.read(buffer)) > 0) {
12709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        fos.write(buffer, 0, amt);
12719bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    // mWallpaperObserver will notice the close and send the change broadcast
12739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Restored wallpaper: " + resName);
12759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return true;
12769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (NameNotFoundException e) {
12778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Package name " + pkg + " not found");
12789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (Resources.NotFoundException e) {
12798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Resource not found: " + resId);
12809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (IOException e) {
12818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "IOException while restoring wallpaper ", e);
12829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } finally {
12839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (res != null) {
12849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
12859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            res.close();
12869bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
12879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (fos != null) {
12898bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn                        FileUtils.sync(fos);
12909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
12919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            fos.close();
12929bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
12939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12949bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
12959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
12979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return false;
12989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
129937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
1300eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    @Override
1301eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1302eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
1303eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
1304eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
1305eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Permission Denial: can't dump wallpaper service from from pid="
1306eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + Binder.getCallingPid()
1307eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + ", uid=" + Binder.getCallingUid());
1308eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return;
1309eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1310eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
1311eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
1312eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Current Wallpaper Service state:");
131337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            for (int i = 0; i < mWallpaperMap.size(); i++) {
131437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                WallpaperData wallpaper = mWallpaperMap.valueAt(i);
131537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(" User " + wallpaper.userId + ":");
131637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mWidth=");
131737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print(wallpaper.width);
131837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print(" mHeight=");
131937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.height);
132037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mName=");
132137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.name);
132237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mWallpaperComponent=");
132337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.wallpaperComponent);
132437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.connection != null) {
132537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    WallpaperConnection conn = wallpaper.connection;
132637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("  Wallpaper connection ");
132737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print(conn);
132837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(":");
132937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (conn.mInfo != null) {
133037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        pw.print("    mInfo.component=");
133137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        pw.println(conn.mInfo.getComponent());
133237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
133337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mToken=");
133437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mToken);
133537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mService=");
133637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mService);
133737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mEngine=");
133837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mEngine);
133937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mLastDiedTime=");
134037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(wallpaper.lastDiedTime - SystemClock.uptimeMillis());
134137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                }
1342eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
1343eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1344eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1346