1104c45677660586026a7e74ef8c47d396403d50eMichael Jurka/*
2104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * Copyright (C) 2013 The Android Open Source Project
3104c45677660586026a7e74ef8c47d396403d50eMichael Jurka *
4104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * Licensed under the Apache License, Version 2.0 (the "License");
5104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * you may not use this file except in compliance with the License.
6104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * You may obtain a copy of the License at
7104c45677660586026a7e74ef8c47d396403d50eMichael Jurka *
8104c45677660586026a7e74ef8c47d396403d50eMichael Jurka *      http://www.apache.org/licenses/LICENSE-2.0
9104c45677660586026a7e74ef8c47d396403d50eMichael Jurka *
10104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * Unless required by applicable law or agreed to in writing, software
11104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * distributed under the License is distributed on an "AS IS" BASIS,
12104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * See the License for the specific language governing permissions and
14104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * limitations under the License.
15104c45677660586026a7e74ef8c47d396403d50eMichael Jurka */
16104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
17104c45677660586026a7e74ef8c47d396403d50eMichael Jurkapackage com.android.launcher3;
18104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
19be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurkaimport android.animation.LayoutTransition;
20cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyalimport android.annotation.TargetApi;
21104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.app.ActionBar;
22104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.app.Activity;
23998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.app.WallpaperInfo;
24998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.app.WallpaperManager;
251e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurkaimport android.content.Context;
26104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.Intent;
27eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurkaimport android.content.pm.ApplicationInfo;
28104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.pm.PackageManager;
29104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.res.Resources;
3042a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurkaimport android.database.Cursor;
31998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.database.DataSetObserver;
32be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurkaimport android.graphics.Bitmap;
33db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport android.graphics.BitmapFactory;
3412ca6134bf818c7c28062aefa40281449042889aMichael Jurkaimport android.graphics.Canvas;
358713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurkaimport android.graphics.Matrix;
36104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.Point;
37998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.graphics.PorterDuff;
38104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.Rect;
39104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.RectF;
40db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport android.graphics.drawable.BitmapDrawable;
41104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.drawable.Drawable;
42104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.drawable.LevelListDrawable;
43104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.net.Uri;
44862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurkaimport android.os.AsyncTask;
4512ca6134bf818c7c28062aefa40281449042889aMichael Jurkaimport android.os.Build;
46d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurkaimport android.os.Bundle;
4742a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurkaimport android.provider.MediaStore;
48104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.util.Log;
49eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurkaimport android.util.Pair;
50d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurkaimport android.view.ActionMode;
51104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.LayoutInflater;
52104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.Menu;
53d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurkaimport android.view.MenuInflater;
54104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.MenuItem;
55104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.View;
56104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.View.OnClickListener;
5712ca6134bf818c7c28062aefa40281449042889aMichael Jurkaimport android.view.View.OnLayoutChangeListener;
58104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.ViewGroup;
597ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurkaimport android.view.ViewPropertyAnimator;
60fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurkaimport android.view.ViewTreeObserver;
61fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurkaimport android.view.ViewTreeObserver.OnGlobalLayoutListener;
62ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinekimport android.view.WindowManager;
6324f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandlerimport android.view.animation.AccelerateInterpolator;
644b94060491eb14f4f1d40b86012414910325751aMichael Jurkaimport android.view.animation.DecelerateInterpolator;
65cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyalimport android.widget.ArrayAdapter;
66104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.BaseAdapter;
67104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.FrameLayout;
68fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurkaimport android.widget.HorizontalScrollView;
69104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.ImageView;
70104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.LinearLayout;
71619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurkaimport android.widget.Toast;
72104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
73104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport com.android.photos.BitmapRegionTileSource;
74619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurkaimport com.android.photos.BitmapRegionTileSource.BitmapSource;
75104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
76db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport java.io.File;
77db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport java.io.FileOutputStream;
781e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurkaimport java.io.IOException;
79104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport java.util.ArrayList;
80104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
81104c45677660586026a7e74ef8c47d396403d50eMichael Jurkapublic class WallpaperPickerActivity extends WallpaperCropActivity {
82be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    static final String TAG = "Launcher.WallpaperPickerActivity";
83104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
841e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static final int IMAGE_PICK = 5;
851e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static final int PICK_WALLPAPER_THIRD_PARTY_ACTIVITY = 6;
861e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static final int PICK_LIVE_WALLPAPER = 7;
87d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    private static final String TEMP_WALLPAPER_TILES = "TEMP_WALLPAPER_TILES";
881b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi    private static final String SELECTED_INDEX = "SELECTED_INDEX";
89ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private static final int FLAG_POST_DELAY_MILLIS = 200;
90104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
91619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka    private View mSelectedTile;
924b94060491eb14f4f1d40b86012414910325751aMichael Jurka    private boolean mIgnoreNextTap;
932d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    private OnClickListener mThumbnailOnClickListener;
94104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
95be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private LinearLayout mWallpapersView;
967267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka    private View mWallpaperStrip;
97d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
98d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    private ActionMode.Callback mActionModeCallback;
99d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    private ActionMode mActionMode;
100d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
101be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private View.OnLongClickListener mLongClickListener;
102be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
103be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    ArrayList<Uri> mTempWallpaperTiles = new ArrayList<Uri>();
104be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private SavedWallpaperImages mSavedImages;
105998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka    private WallpaperInfo mLiveWallpaperInfoOnPickerLaunch;
106ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private int mSelectedIndex = -1;
107ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private WallpaperInfo mLastClickedLiveWallpaperInfo;
108be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
1091e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static abstract class WallpaperTileInfo {
1106b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        protected View mView;
111cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        public Drawable mThumb;
112cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal
1136b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public void setView(View v) {
1146b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            mView = v;
1156b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
1161e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onClick(WallpaperPickerActivity a) {}
1171e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onSave(WallpaperPickerActivity a) {}
1188a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        public void onDelete(WallpaperPickerActivity a) {}
1191e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public boolean isSelectable() { return false; }
1206b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public boolean isNamelessWallpaper() { return false; }
1216b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public void onIndexUpdated(CharSequence label) {
1226b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            if (isNamelessWallpaper()) {
1236b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                mView.setContentDescription(label);
1246b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            }
1256b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
1261e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1271e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
1281e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static class PickImageInfo extends WallpaperTileInfo {
1298a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
1301e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onClick(WallpaperPickerActivity a) {
1311e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
1321e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            intent.setType("image/*");
1337ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka            a.startActivityForResultSafely(intent, IMAGE_PICK);
1341e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1351e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1361e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
1371e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static class UriWallpaperInfo extends WallpaperTileInfo {
1381e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private Uri mUri;
139619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        private boolean mFirstClick = true;
140619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        private BitmapRegionTileSource.UriBitmapSource mBitmapSource;
1411e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public UriWallpaperInfo(Uri uri) {
1421e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mUri = uri;
1431e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1448a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
145619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        public void onClick(final WallpaperPickerActivity a) {
146619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            final Runnable onLoad;
147619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            if (!mFirstClick) {
148619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                onLoad = null;
149619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            } else {
150619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                mFirstClick = false;
151ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                a.mSetWallpaperButton.setEnabled(false);
152619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                onLoad = new Runnable() {
153619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    public void run() {
154619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        if (mBitmapSource != null &&
155619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                mBitmapSource.getLoadingState() == BitmapSource.State.LOADED) {
156619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            a.selectTile(mView);
157ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            a.mSetWallpaperButton.setEnabled(true);
158619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        } else {
159619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            ViewGroup parent = (ViewGroup) mView.getParent();
160619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            if (parent != null) {
161619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                parent.removeView(mView);
162619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                Toast.makeText(a,
163619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                        a.getString(R.string.image_load_fail),
164619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                        Toast.LENGTH_SHORT).show();
165619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            }
166619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        }
167619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    }
168619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                };
169619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            }
170619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            mBitmapSource = new BitmapRegionTileSource.UriBitmapSource(
171619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    a, mUri, BitmapRegionTileSource.MAX_PREVIEW_SIZE);
172619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            a.setCropViewTileSource(mBitmapSource, true, false, onLoad);
1731e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1748a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
1751e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onSave(final WallpaperPickerActivity a) {
1761e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            boolean finishActivityWhenDone = true;
1771e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            OnBitmapCroppedHandler h = new OnBitmapCroppedHandler() {
1781e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                public void onBitmapCropped(byte[] imageBytes) {
1791e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    Point thumbSize = getDefaultThumbnailSize(a.getResources());
1808713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    // rotation is set to 0 since imageBytes has already been correctly rotated
1818713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    Bitmap thumb = createThumbnail(
1828713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                            thumbSize, null, null, imageBytes, null, 0, 0, true);
1831e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    a.getSavedImages().writeImage(thumb, imageBytes);
1841e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                }
1851e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            };
1861e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            a.cropImageAndSetWallpaper(mUri, h, finishActivityWhenDone);
1871e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1888a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
1891e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public boolean isSelectable() {
1901e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            return true;
1911e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1926b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        @Override
1936b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public boolean isNamelessWallpaper() {
1946b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            return true;
1956b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
1961e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1971e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
198cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    public static class FileWallpaperInfo extends WallpaperTileInfo {
199cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        private File mFile;
200cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal
201cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        public FileWallpaperInfo(File target, Drawable thumb) {
202cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            mFile = target;
203cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            mThumb = thumb;
204cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        }
205cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        @Override
206cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        public void onClick(WallpaperPickerActivity a) {
207cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            BitmapRegionTileSource.UriBitmapSource bitmapSource =
208cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    new BitmapRegionTileSource.UriBitmapSource(a, Uri.fromFile(mFile), 1024);
209cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            a.setCropViewTileSource(bitmapSource, false, true, null);
210cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        }
211cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        @Override
212cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        public void onSave(WallpaperPickerActivity a) {
213cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            a.setWallpaper(Uri.fromFile(mFile), true);
214cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        }
215cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        @Override
216cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        public boolean isSelectable() {
217cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            return true;
218cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        }
219cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        @Override
220cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        public boolean isNamelessWallpaper() {
221cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            return true;
222cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        }
223cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    }
224cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal
2251e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static class ResourceWallpaperInfo extends WallpaperTileInfo {
2261e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private Resources mResources;
2271e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private int mResId;
2281e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
2291e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public ResourceWallpaperInfo(Resources res, int resId, Drawable thumb) {
2301e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mResources = res;
2311e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mResId = resId;
2321e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mThumb = thumb;
2331e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2348a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
2351e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onClick(WallpaperPickerActivity a) {
236862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            BitmapRegionTileSource.ResourceBitmapSource bitmapSource =
23783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                    new BitmapRegionTileSource.ResourceBitmapSource(
23883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                            mResources, mResId, BitmapRegionTileSource.MAX_PREVIEW_SIZE);
239862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            bitmapSource.loadInBackground();
240862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            BitmapRegionTileSource source = new BitmapRegionTileSource(a, bitmapSource);
2411e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            CropView v = a.getCropView();
2421e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            v.setTileSource(source, null);
2431e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            Point wallpaperSize = WallpaperCropActivity.getDefaultWallpaperSize(
2441e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    a.getResources(), a.getWindowManager());
2451e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            RectF crop = WallpaperCropActivity.getMaxCropRect(
2461e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    source.getImageWidth(), source.getImageHeight(),
2471e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    wallpaperSize.x, wallpaperSize.y, false);
2481e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            v.setScale(wallpaperSize.x / crop.width());
2491e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            v.setTouchEnabled(false);
250ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            a.setSystemWallpaperVisiblity(false);
2511e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2528a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
2531e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onSave(WallpaperPickerActivity a) {
2541e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            boolean finishActivityWhenDone = true;
2551e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            a.cropImageAndSetWallpaper(mResources, mResId, finishActivityWhenDone);
2561e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2578a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
2581e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public boolean isSelectable() {
2591e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            return true;
2601e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2616b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        @Override
2626b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public boolean isNamelessWallpaper() {
2636b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            return true;
2646b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
265104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
266104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
267cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    @TargetApi(Build.VERSION_CODES.KITKAT)
26812ca6134bf818c7c28062aefa40281449042889aMichael Jurka    public static class DefaultWallpaperInfo extends WallpaperTileInfo {
26912ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public DefaultWallpaperInfo(Drawable thumb) {
27012ca6134bf818c7c28062aefa40281449042889aMichael Jurka            mThumb = thumb;
27112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
27212ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
27312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public void onClick(WallpaperPickerActivity a) {
27483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            CropView c = a.getCropView();
27583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka
27612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Drawable defaultWallpaper = WallpaperManager.getInstance(a).getBuiltInDrawable(
27783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                    c.getWidth(), c.getHeight(), false, 0.5f, 0.5f);
27883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka
2797084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer            if (defaultWallpaper == null) {
2807084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                Log.w(TAG, "Null default wallpaper encountered.");
2817084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                c.setTileSource(null, null);
2827084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                return;
2837084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer            }
2847084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer
28583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            c.setTileSource(
28683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                    new DrawableTileSource(a, defaultWallpaper, DrawableTileSource.MAX_PREVIEW_SIZE), null);
28783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            c.setScale(1f);
28883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            c.setTouchEnabled(false);
289ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            a.setSystemWallpaperVisiblity(false);
29012ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
29112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
29212ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public void onSave(WallpaperPickerActivity a) {
29312ca6134bf818c7c28062aefa40281449042889aMichael Jurka            try {
29412ca6134bf818c7c28062aefa40281449042889aMichael Jurka                WallpaperManager.getInstance(a).clear();
2953aa28319ceca347dfd4958ca95b94652bb8e2a3dSelim Cinek                a.setResult(RESULT_OK);
29612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            } catch (IOException e) {
29712ca6134bf818c7c28062aefa40281449042889aMichael Jurka                Log.w("Setting wallpaper to default threw exception", e);
29812ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
29912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            a.finish();
30012ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
30112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
30212ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public boolean isSelectable() {
30312ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return true;
30412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
30512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
30612ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public boolean isNamelessWallpaper() {
30712ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return true;
30812ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
30912ca6134bf818c7c28062aefa40281449042889aMichael Jurka    }
31012ca6134bf818c7c28062aefa40281449042889aMichael Jurka
3117267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka    public void setWallpaperStripYOffset(float offset) {
3127267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka        mWallpaperStrip.setPadding(0, 0, 0, (int) offset);
3137267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka    }
3147267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka
315ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    /**
316ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     * shows the system wallpaper behind the window and hides the {@link
317ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     * #mCropView} if visible
318ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     * @param visible should the system wallpaper be shown
319ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     */
320ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    protected void setSystemWallpaperVisiblity(final boolean visible) {
321ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // hide our own wallpaper preview if necessary
322ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        if(!visible) {
323ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            mCropView.setVisibility(View.VISIBLE);
324ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        } else {
325ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            changeWallpaperFlags(visible);
326ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        }
327ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // the change of the flag must be delayed in order to avoid flickering,
328ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // a simple post / double post does not suffice here
329ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mCropView.postDelayed(new Runnable() {
330ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            @Override
331ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            public void run() {
332ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                if(!visible) {
333ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    changeWallpaperFlags(visible);
334ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                } else {
335ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    mCropView.setVisibility(View.INVISIBLE);
336ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                }
337ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            }
338ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        }, FLAG_POST_DELAY_MILLIS);
339ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    }
340ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
341ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private void changeWallpaperFlags(boolean visible) {
342ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        int desiredWallpaperFlag = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0;
343ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        int currentWallpaperFlag = getWindow().getAttributes().flags
344ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
345ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        if (desiredWallpaperFlag != currentWallpaperFlag) {
346ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            getWindow().setFlags(desiredWallpaperFlag,
347ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
348ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        }
349ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    }
350ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
351ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    @Override
352ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    public void setCropViewTileSource(BitmapSource bitmapSource,
353ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                      boolean touchEnabled,
354ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                      boolean moveToLeft,
355ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                      final Runnable postExecute) {
356ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // we also want to show our own wallpaper instead of the one in the background
357ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        Runnable showPostExecuteRunnable = new Runnable() {
358ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            @Override
359ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            public void run() {
360ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                if(postExecute != null) {
361ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    postExecute.run();
362ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                }
363ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                setSystemWallpaperVisiblity(false);
364ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            }
365ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        };
366ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        super.setCropViewTileSource(bitmapSource,
367ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                touchEnabled,
368ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                moveToLeft,
369ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                showPostExecuteRunnable);
370ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    }
371ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
3722d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    // called by onCreate; this is subclassed to overwrite WallpaperCropActivity
3732d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    protected void init() {
374104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        setContentView(R.layout.wallpaper_picker);
375104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
376104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        mCropView = (CropView) findViewById(R.id.cropView);
377ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mCropView.setVisibility(View.INVISIBLE);
378ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
3797267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka        mWallpaperStrip = findViewById(R.id.wallpaper_strip);
3804b94060491eb14f4f1d40b86012414910325751aMichael Jurka        mCropView.setTouchCallback(new CropView.TouchCallback() {
3817ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka            ViewPropertyAnimator mAnim;
382e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            @Override
3834b94060491eb14f4f1d40b86012414910325751aMichael Jurka            public void onTouchDown() {
3844b94060491eb14f4f1d40b86012414910325751aMichael Jurka                if (mAnim != null) {
3854b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    mAnim.cancel();
3864b94060491eb14f4f1d40b86012414910325751aMichael Jurka                }
38724f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                if (mWallpaperStrip.getAlpha() == 1f) {
3884b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    mIgnoreNextTap = true;
3894b94060491eb14f4f1d40b86012414910325751aMichael Jurka                }
3907ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                mAnim = mWallpaperStrip.animate();
39124f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                mAnim.alpha(0f)
3927ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    .setDuration(150)
3937ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    .withEndAction(new Runnable() {
3947ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                        public void run() {
3957ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                            mWallpaperStrip.setVisibility(View.INVISIBLE);
3967ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                        }
3977ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    });
39824f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                mAnim.setInterpolator(new AccelerateInterpolator(0.75f));
3994b94060491eb14f4f1d40b86012414910325751aMichael Jurka                mAnim.start();
4004b94060491eb14f4f1d40b86012414910325751aMichael Jurka            }
401e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            @Override
402e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            public void onTouchUp() {
403e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka                mIgnoreNextTap = false;
404e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            }
405e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            @Override
4064b94060491eb14f4f1d40b86012414910325751aMichael Jurka            public void onTap() {
4074b94060491eb14f4f1d40b86012414910325751aMichael Jurka                boolean ignoreTap = mIgnoreNextTap;
4084b94060491eb14f4f1d40b86012414910325751aMichael Jurka                mIgnoreNextTap = false;
4094b94060491eb14f4f1d40b86012414910325751aMichael Jurka                if (!ignoreTap) {
4104b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    if (mAnim != null) {
4114b94060491eb14f4f1d40b86012414910325751aMichael Jurka                        mAnim.cancel();
4124b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    }
41324f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                    mWallpaperStrip.setVisibility(View.VISIBLE);
4147ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    mAnim = mWallpaperStrip.animate();
41524f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                    mAnim.alpha(1f)
41624f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                         .setDuration(150)
41724f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                         .setInterpolator(new DecelerateInterpolator(0.75f));
4184b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    mAnim.start();
4194b94060491eb14f4f1d40b86012414910325751aMichael Jurka                }
4204b94060491eb14f4f1d40b86012414910325751aMichael Jurka            }
4214b94060491eb14f4f1d40b86012414910325751aMichael Jurka        });
422104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
4232d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        mThumbnailOnClickListener = new OnClickListener() {
4242d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            public void onClick(View v) {
425d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                if (mActionMode != null) {
426d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    // When CAB is up, clicking toggles the item instead
427d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    if (v.isLongClickable()) {
428d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        mLongClickListener.onLongClick(v);
429d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    }
430d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    return;
431d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
432ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                mSetWallpaperButton.setEnabled(true);
4331e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                WallpaperTileInfo info = (WallpaperTileInfo) v.getTag();
434619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                if (info.isSelectable() && v.getVisibility() == View.VISIBLE) {
435619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    selectTile(v);
4362d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka                }
4371e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                info.onClick(WallpaperPickerActivity.this);
4382d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            }
4392d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        };
440d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        mLongClickListener = new View.OnLongClickListener() {
441d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the user long-clicks on someView
442d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onLongClick(View view) {
443d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                CheckableFrameLayout c = (CheckableFrameLayout) view;
444d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                c.toggle();
445d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
446d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                if (mActionMode != null) {
447d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mActionMode.invalidate();
448d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                } else {
449d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    // Start the CAB using the ActionMode.Callback defined below
450d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mActionMode = startActionMode(mActionModeCallback);
451d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    int childCount = mWallpapersView.getChildCount();
452d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    for (int i = 0; i < childCount; i++) {
453d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        mWallpapersView.getChildAt(i).setSelected(false);
454d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    }
455d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
456d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                return true;
457d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
458d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        };
4592d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
460104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Populate the built-in wallpapers
461cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        ArrayList<WallpaperTileInfo> wallpapers = findBundledWallpapers();
462be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mWallpapersView = (LinearLayout) findViewById(R.id.wallpaper_list);
463cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        SimpleWallpapersAdapter ia = new SimpleWallpapersAdapter(this, wallpapers);
46412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        populateWallpapersFromAdapter(mWallpapersView, ia, false);
465be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
466be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        // Populate the saved wallpapers
467be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mSavedImages = new SavedWallpaperImages(this);
468be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mSavedImages.loadThumbnailsAndImageIdList();
46912ca6134bf818c7c28062aefa40281449042889aMichael Jurka        populateWallpapersFromAdapter(mWallpapersView, mSavedImages, true);
470998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka
471998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        // Populate the live wallpapers
4721e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        final LinearLayout liveWallpapersView =
4731e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                (LinearLayout) findViewById(R.id.live_wallpaper_list);
474998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        final LiveWallpaperListAdapter a = new LiveWallpaperListAdapter(this);
475998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        a.registerDataSetObserver(new DataSetObserver() {
476998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            public void onChanged() {
477998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                liveWallpapersView.removeAllViews();
47812ca6134bf818c7c28062aefa40281449042889aMichael Jurka                populateWallpapersFromAdapter(liveWallpapersView, a, false);
479fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                initializeScrollForRtl();
4806b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                updateTileIndices();
481998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            }
482998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        });
483998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka
484998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        // Populate the third-party wallpaper pickers
485998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        final LinearLayout thirdPartyWallpapersView =
486998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                (LinearLayout) findViewById(R.id.third_party_wallpaper_list);
487998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        final ThirdPartyWallpaperPickerListAdapter ta =
488998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                new ThirdPartyWallpaperPickerListAdapter(this);
48912ca6134bf818c7c28062aefa40281449042889aMichael Jurka        populateWallpapersFromAdapter(thirdPartyWallpapersView, ta, false);
490104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
491104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Add a tile for the Gallery
492998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
4936b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        FrameLayout pickImageTile = (FrameLayout) getLayoutInflater().
4945b4b6904ae4d7706ff4c523018787320bc874333Michael Jurka                inflate(R.layout.wallpaper_picker_image_picker_item, masterWallpaperList, false);
4956b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        setWallpaperItemPaddingToZero(pickImageTile);
4966b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        masterWallpaperList.addView(pickImageTile, 0);
497104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
49842a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        // Make its background the last photo taken on external storage
49942a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        Bitmap lastPhoto = getThumbnailOfLastPhoto();
50042a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        if (lastPhoto != null) {
50142a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka            ImageView galleryThumbnailBg =
5026b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    (ImageView) pickImageTile.findViewById(R.id.wallpaper_image);
50342a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka            galleryThumbnailBg.setImageBitmap(getThumbnailOfLastPhoto());
504998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            int colorOverlay = getResources().getColor(R.color.wallpaper_picker_translucent_gray);
505998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            galleryThumbnailBg.setColorFilter(colorOverlay, PorterDuff.Mode.SRC_ATOP);
506fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
50742a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        }
50842a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka
5091e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        PickImageInfo pickImageInfo = new PickImageInfo();
5106b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        pickImageTile.setTag(pickImageInfo);
5116b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        pickImageInfo.setView(pickImageTile);
5126b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        pickImageTile.setOnClickListener(mThumbnailOnClickListener);
51312ca6134bf818c7c28062aefa40281449042889aMichael Jurka
51412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        // Select the first item; wait for a layout pass so that we initialize the dimensions of
51512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        // cropView or the defaultWallpaperView first
51683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka        mCropView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
51712ca6134bf818c7c28062aefa40281449042889aMichael Jurka            @Override
51812ca6134bf818c7c28062aefa40281449042889aMichael Jurka            public void onLayoutChange(View v, int left, int top, int right, int bottom,
51912ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
52012ca6134bf818c7c28062aefa40281449042889aMichael Jurka                if ((right - left) > 0 && (bottom - top) > 0) {
5211b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                    if (mSelectedIndex >= 0 && mSelectedIndex < mWallpapersView.getChildCount()) {
5221b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                        mThumbnailOnClickListener.onClick(
5231b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                                mWallpapersView.getChildAt(mSelectedIndex));
524ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        setSystemWallpaperVisiblity(false);
52512ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    }
52612ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    v.removeOnLayoutChangeListener(this);
52712ca6134bf818c7c28062aefa40281449042889aMichael Jurka                }
52812ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
52912ca6134bf818c7c28062aefa40281449042889aMichael Jurka        });
5306b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
5316b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        updateTileIndices();
532104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
533fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        // Update the scroll for RTL
534fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        initializeScrollForRtl();
535fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
536d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        // Create smooth layout transitions for when items are deleted
537d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        final LayoutTransition transitioner = new LayoutTransition();
538d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        transitioner.setDuration(200);
539d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        transitioner.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0);
540d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        transitioner.setAnimator(LayoutTransition.DISAPPEARING, null);
541d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        mWallpapersView.setLayoutTransition(transitioner);
542d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
543104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Action bar
544104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Show the custom action bar view
545104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        final ActionBar actionBar = getActionBar();
546104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        actionBar.setCustomView(R.layout.actionbar_set_wallpaper);
547104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        actionBar.getCustomView().setOnClickListener(
548104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                new View.OnClickListener() {
549104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    @Override
550104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    public void onClick(View v) {
551619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        if (mSelectedTile != null) {
552619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            WallpaperTileInfo info = (WallpaperTileInfo) mSelectedTile.getTag();
553b92f43313650400b9dfadf7264a740a38bf3cb7fMichael Jurka                            info.onSave(WallpaperPickerActivity.this);
554ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        } else {
555ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            // no tile was selected, so we just finish the activity and go back
556ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            setResult(Activity.RESULT_OK);
557ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            finish();
558b92f43313650400b9dfadf7264a740a38bf3cb7fMichael Jurka                        }
559104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    }
560104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                });
561849aff7553a5daffa34b4c38d1d29dec5a87fde1Michael Jurka        mSetWallpaperButton = findViewById(R.id.set_wallpaper_button);
562104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
563d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        // CAB for deleting items
564d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        mActionModeCallback = new ActionMode.Callback() {
565d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the action mode is created; startActionMode() was called
566d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
567d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
568d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                // Inflate a menu resource providing context menu items
569d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                MenuInflater inflater = mode.getMenuInflater();
570d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                inflater.inflate(R.menu.cab_delete_wallpapers, menu);
571d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                return true;
572d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
573d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
574d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            private int numCheckedItems() {
575d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int childCount = mWallpapersView.getChildCount();
576d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int numCheckedItems = 0;
577d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                for (int i = 0; i < childCount; i++) {
578d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    CheckableFrameLayout c = (CheckableFrameLayout) mWallpapersView.getChildAt(i);
579d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    if (c.isChecked()) {
580d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        numCheckedItems++;
581d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    }
582d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
583d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                return numCheckedItems;
584d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
5852d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
586d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called each time the action mode is shown. Always called after onCreateActionMode,
587d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // but may be called multiple times if the mode is invalidated.
588d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
589d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
590d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int numCheckedItems = numCheckedItems();
591d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                if (numCheckedItems == 0) {
592d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mode.finish();
593d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    return true;
594d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                } else {
595d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mode.setTitle(getResources().getQuantityString(
596d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                            R.plurals.number_of_items_selected, numCheckedItems, numCheckedItems));
597d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    return true;
598d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
599d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
6002d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
601d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the user selects a contextual menu item
602d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
603d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
604c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                int itemId = item.getItemId();
605c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                if (itemId == R.id.menu_delete) {
606c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    int childCount = mWallpapersView.getChildCount();
607c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    ArrayList<View> viewsToRemove = new ArrayList<View>();
608ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    boolean selectedTileRemoved = false;
609c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    for (int i = 0; i < childCount; i++) {
610c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                        CheckableFrameLayout c =
611c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                                (CheckableFrameLayout) mWallpapersView.getChildAt(i);
612c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                        if (c.isChecked()) {
6138a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka                            WallpaperTileInfo info = (WallpaperTileInfo) c.getTag();
6148a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka                            info.onDelete(WallpaperPickerActivity.this);
615c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                            viewsToRemove.add(c);
616ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            if (i == mSelectedIndex) {
617ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                selectedTileRemoved = true;
618ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            }
619d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        }
620c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    }
621c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    for (View v : viewsToRemove) {
622c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                        mWallpapersView.removeView(v);
623c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    }
624ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    if (selectedTileRemoved) {
625ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        mSelectedIndex = -1;
626ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        mSelectedTile = null;
627ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        setSystemWallpaperVisiblity(true);
628ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    }
6296b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    updateTileIndices();
630c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    mode.finish(); // Action picked, so close the CAB
631c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    return true;
632c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                } else {
633c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    return false;
634d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
635d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
6362d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
637d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the user exits the action mode
638d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
639d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public void onDestroyActionMode(ActionMode mode) {
640d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int childCount = mWallpapersView.getChildCount();
641d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                for (int i = 0; i < childCount; i++) {
642d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    CheckableFrameLayout c = (CheckableFrameLayout) mWallpapersView.getChildAt(i);
643d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    c.setChecked(false);
644d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
645ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                if (mSelectedTile != null) {
646ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    mSelectedTile.setSelected(true);
647ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                }
648d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                mActionMode = null;
649d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
650d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        };
651d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    }
652619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka
653619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka    private void selectTile(View v) {
654619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        if (mSelectedTile != null) {
655619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            mSelectedTile.setSelected(false);
656619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            mSelectedTile = null;
657619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        }
658619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        mSelectedTile = v;
659619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        v.setSelected(true);
6601b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        mSelectedIndex = mWallpapersView.indexOfChild(v);
661619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        // TODO: Remove this once the accessibility framework and
662619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        // services have better support for selection state.
663619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        v.announceForAccessibility(
664619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                getString(R.string.announce_selection, v.getContentDescription()));
665862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka    }
66642a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka
667fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka    private void initializeScrollForRtl() {
668fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        final HorizontalScrollView scroll =
669fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                (HorizontalScrollView) findViewById(R.id.wallpaper_scroll_container);
670fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
671fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        if (scroll.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
672fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka            final ViewTreeObserver observer = scroll.getViewTreeObserver();
673fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
674fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                public void onGlobalLayout() {
675fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                    LinearLayout masterWallpaperList =
676fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                            (LinearLayout) findViewById(R.id.master_wallpaper_list);
677fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                    scroll.scrollTo(masterWallpaperList.getWidth(), 0);
678fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                    scroll.getViewTreeObserver().removeOnGlobalLayoutListener(this);
679fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                }
680fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka            });
681fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        }
682fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka    }
683fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
68442a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka    protected Bitmap getThumbnailOfLastPhoto() {
68542a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        Cursor cursor = MediaStore.Images.Media.query(getContentResolver(),
68642a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
68742a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                new String[] { MediaStore.Images.ImageColumns._ID,
68842a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                    MediaStore.Images.ImageColumns.DATE_TAKEN},
68942a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC LIMIT 1");
690c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen
69142a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        Bitmap thumb = null;
692c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen        if (cursor != null) {
693c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen            if (cursor.moveToNext()) {
694c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen                int id = cursor.getInt(0);
695c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen                thumb = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),
696c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen                        id, MediaStore.Images.Thumbnails.MINI_KIND, null);
697c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen            }
698c8d31ff228511d815aa8b46d5bd24c6cc8183333Adam Cohen            cursor.close();
69942a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        }
70042a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        return thumb;
70142a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka    }
7025664de2524be15329882bf81925d08b5de760b8cMichael Jurka
7035664de2524be15329882bf81925d08b5de760b8cMichael Jurka    protected void onStop() {
7045664de2524be15329882bf81925d08b5de760b8cMichael Jurka        super.onStop();
7057267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka        mWallpaperStrip = findViewById(R.id.wallpaper_strip);
70624f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler        if (mWallpaperStrip.getAlpha() < 1f) {
7077267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka            mWallpaperStrip.setAlpha(1f);
70824f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler            mWallpaperStrip.setVisibility(View.VISIBLE);
7095664de2524be15329882bf81925d08b5de760b8cMichael Jurka        }
7105664de2524be15329882bf81925d08b5de760b8cMichael Jurka    }
7115664de2524be15329882bf81925d08b5de760b8cMichael Jurka
712d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    protected void onSaveInstanceState(Bundle outState) {
713d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        outState.putParcelableArrayList(TEMP_WALLPAPER_TILES, mTempWallpaperTiles);
7141b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        outState.putInt(SELECTED_INDEX, mSelectedIndex);
715d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    }
7162d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
717d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    protected void onRestoreInstanceState(Bundle savedInstanceState) {
718d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        ArrayList<Uri> uris = savedInstanceState.getParcelableArrayList(TEMP_WALLPAPER_TILES);
719d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        for (Uri uri : uris) {
7201b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi            addTemporaryWallpaperTile(uri, true);
721d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        }
722ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mSelectedIndex = savedInstanceState.getInt(SELECTED_INDEX, -1);
723d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    }
7242d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
725998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka    private void populateWallpapersFromAdapter(ViewGroup parent, BaseAdapter adapter,
72612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            boolean addLongPressHandler) {
727998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        for (int i = 0; i < adapter.getCount(); i++) {
728998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            FrameLayout thumbnail = (FrameLayout) adapter.getView(i, null, parent);
729be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            parent.addView(thumbnail, i);
7306b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            WallpaperTileInfo info = (WallpaperTileInfo) adapter.getItem(i);
7316b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            thumbnail.setTag(info);
7326b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            info.setView(thumbnail);
733be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            if (addLongPressHandler) {
734be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka                addLongPressHandler(thumbnail);
735be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            }
736be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            thumbnail.setOnClickListener(mThumbnailOnClickListener);
737be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
738be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
7392d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
7406b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka    private void updateTileIndices() {
7416b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
7426b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        final int childCount = masterWallpaperList.getChildCount();
7436b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        final Resources res = getResources();
7446b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7456b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        // Do two passes; the first pass gets the total number of tiles
7466b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        int numTiles = 0;
7476b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        for (int passNum = 0; passNum < 2; passNum++) {
7486b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            int tileIndex = 0;
7496b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            for (int i = 0; i < childCount; i++) {
7506b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                View child = masterWallpaperList.getChildAt(i);
7516b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                LinearLayout subList;
7526b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7536b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                int subListStart;
7546b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                int subListEnd;
7556b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                if (child.getTag() instanceof WallpaperTileInfo) {
7566b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subList = masterWallpaperList;
7576b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListStart = i;
7586b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListEnd = i + 1;
7596b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                } else { // if (child instanceof LinearLayout) {
7606b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subList = (LinearLayout) child;
7616b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListStart = 0;
7626b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListEnd = subList.getChildCount();
7636b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                }
7646b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7656b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                for (int j = subListStart; j < subListEnd; j++) {
7666b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    WallpaperTileInfo info = (WallpaperTileInfo) subList.getChildAt(j).getTag();
7676b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    if (info.isNamelessWallpaper()) {
7686b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                        if (passNum == 0) {
7696b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                            numTiles++;
7706b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                        } else {
7716b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                            CharSequence label = res.getString(
7726b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                                    R.string.wallpaper_accessibility_name, ++tileIndex, numTiles);
7736b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                            info.onIndexUpdated(label);
7746b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                        }
7756b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    }
7766b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                }
7776b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            }
7786b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
7796b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka    }
7806b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7811e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    private static Point getDefaultThumbnailSize(Resources res) {
7821e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return new Point(res.getDimensionPixelSize(R.dimen.wallpaperThumbnailWidth),
7831e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                res.getDimensionPixelSize(R.dimen.wallpaperThumbnailHeight));
7841e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
7851e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
7861e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
7871e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    private static Bitmap createThumbnail(Point size, Context context, Uri uri, byte[] imageBytes,
7888713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            Resources res, int resId, int rotation, boolean leftAligned) {
7891e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        int width = size.x;
7901e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        int height = size.y;
791be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
792be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        BitmapCropTask cropTask;
793be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        if (uri != null) {
7948713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            cropTask = new BitmapCropTask(
7958713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    context, uri, null, rotation, width, height, false, true, null);
7961e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        } else if (imageBytes != null) {
7978713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            cropTask = new BitmapCropTask(
7988713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    imageBytes, null, rotation, width, height, false, true, null);
7991e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }  else {
8008713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            cropTask = new BitmapCropTask(
8018713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    context, res, resId, null, rotation, width, height, false, true, null);
802be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
803be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        Point bounds = cropTask.getImageBounds();
804db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        if (bounds == null || bounds.x == 0 || bounds.y == 0) {
805be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            return null;
806be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
807be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
8088713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        Matrix rotateMatrix = new Matrix();
8098713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotateMatrix.setRotate(rotation);
8108713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        float[] rotatedBounds = new float[] { bounds.x, bounds.y };
8118713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotateMatrix.mapPoints(rotatedBounds);
8128713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotatedBounds[0] = Math.abs(rotatedBounds[0]);
8138713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotatedBounds[1] = Math.abs(rotatedBounds[1]);
8148713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka
815be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        RectF cropRect = WallpaperCropActivity.getMaxCropRect(
8168713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                (int) rotatedBounds[0], (int) rotatedBounds[1], width, height, leftAligned);
817be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        cropTask.setCropBounds(cropRect);
818be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
819be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        if (cropTask.cropBitmap()) {
820be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            return cropTask.getCroppedBitmap();
821be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        } else {
822be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            return null;
823be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
824be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
825be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
8261b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi    private void addTemporaryWallpaperTile(final Uri uri, boolean fromRestore) {
827be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mTempWallpaperTiles.add(uri);
828be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        // Add a tile for the image picked from Gallery
829619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        final FrameLayout pickedImageThumbnail = (FrameLayout) getLayoutInflater().
830be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka                inflate(R.layout.wallpaper_picker_item, mWallpapersView, false);
831619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        pickedImageThumbnail.setVisibility(View.GONE);
832be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        setWallpaperItemPaddingToZero(pickedImageThumbnail);
833862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        mWallpapersView.addView(pickedImageThumbnail, 0);
834be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
835be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        // Load the thumbnail
836862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        final ImageView image = (ImageView) pickedImageThumbnail.findViewById(R.id.wallpaper_image);
837862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        final Point defaultSize = getDefaultThumbnailSize(this.getResources());
838862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        final Context context = this;
839862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        new AsyncTask<Void, Bitmap, Bitmap>() {
840862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            protected Bitmap doInBackground(Void...args) {
8418dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                try {
8428dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                    int rotation = WallpaperCropActivity.getRotationFromExif(context, uri);
8438dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                    return createThumbnail(defaultSize, context, uri, null, null, 0, rotation, false);
8448dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                } catch (SecurityException securityException) {
8458dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                    if (isDestroyed()) {
8468dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        // Temporarily granted permissions are revoked when the activity
8478dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        // finishes, potentially resulting in a SecurityException here.
8488dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        // Even though {@link #isDestroyed} might also return true in different
8498dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        // situations where the configuration changes, we are fine with
8508dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        // catching these cases here as well.
8518dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        cancel(false);
8528dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                    } else {
8538dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        // otherwise it had a different cause and we throw it further
8548dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                        throw securityException;
8558dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                    }
8568dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                    return null;
8578dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                }
858862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            }
859862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            protected void onPostExecute(Bitmap thumb) {
8608dc6e1bfa20d48babd6dd0f41bfc6de1a09cd67bAdam Cohen                if (!isCancelled() && thumb != null) {
861862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    image.setImageBitmap(thumb);
862862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    Drawable thumbDrawable = image.getDrawable();
863862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    thumbDrawable.setDither(true);
8641b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                    pickedImageThumbnail.setVisibility(View.VISIBLE);
865862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                } else {
866862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    Log.e(TAG, "Error loading thumbnail for uri=" + uri);
867862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                }
868862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            }
869862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        }.execute();
870be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
8711e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        UriWallpaperInfo info = new UriWallpaperInfo(uri);
8721e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        pickedImageThumbnail.setTag(info);
8736b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        info.setView(pickedImageThumbnail);
8748713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        addLongPressHandler(pickedImageThumbnail);
8757b715496b01ee1f572dd1830ab69101c479bc9abMichael Jurka        updateTileIndices();
876be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        pickedImageThumbnail.setOnClickListener(mThumbnailOnClickListener);
8771b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        if (!fromRestore) {
8781b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi            mThumbnailOnClickListener.onClick(pickedImageThumbnail);
8791b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        }
880be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
881be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
882be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
883be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        if (requestCode == IMAGE_PICK && resultCode == RESULT_OK) {
8842fe1530ce9ab8c8a48aed7df62c771e774df23a7Michael Jurka            if (data != null && data.getData() != null) {
8852fe1530ce9ab8c8a48aed7df62c771e774df23a7Michael Jurka                Uri uri = data.getData();
8861b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                addTemporaryWallpaperTile(uri, false);
8872fe1530ce9ab8c8a48aed7df62c771e774df23a7Michael Jurka            }
8882d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        } else if (requestCode == PICK_WALLPAPER_THIRD_PARTY_ACTIVITY) {
8892d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            setResult(RESULT_OK);
8902d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            finish();
891998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        } else if (requestCode == PICK_LIVE_WALLPAPER) {
892998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            WallpaperManager wm = WallpaperManager.getInstance(this);
893998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            final WallpaperInfo oldLiveWallpaper = mLiveWallpaperInfoOnPickerLaunch;
894ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            final WallpaperInfo clickedWallpaper = mLastClickedLiveWallpaperInfo;
895998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            WallpaperInfo newLiveWallpaper = wm.getWallpaperInfo();
896998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            // Try to figure out if a live wallpaper was set;
897998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            if (newLiveWallpaper != null &&
898ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    (oldLiveWallpaper == null
899ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            || !oldLiveWallpaper.getComponent()
900ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                    .equals(newLiveWallpaper.getComponent())
901ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            || clickedWallpaper.getComponent()
902ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                    .equals(oldLiveWallpaper.getComponent()))) {
903998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                // Return if a live wallpaper was set
904998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                setResult(RESULT_OK);
905998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                finish();
906998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            }
9072d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        }
9082d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    }
9092d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
910998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka    static void setWallpaperItemPaddingToZero(FrameLayout frameLayout) {
911104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        frameLayout.setPadding(0, 0, 0, 0);
912104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        frameLayout.setForeground(new ZeroPaddingDrawable(frameLayout.getForeground()));
913104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
914104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
915be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private void addLongPressHandler(View v) {
916be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        v.setOnLongClickListener(mLongClickListener);
917be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
918be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
919cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    private ArrayList<WallpaperTileInfo> findBundledWallpapers() {
9205aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey        final PackageManager pm = getPackageManager();
921cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        final ArrayList<WallpaperTileInfo> bundled = new ArrayList<WallpaperTileInfo>(24);
9225aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey
9235aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey        Partner partner = Partner.get(pm);
9245aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey        if (partner != null) {
9255aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey            final Resources partnerRes = partner.getResources();
9264ae96ce92df7aad3c767c68b8795b80734e01829Adam Cohen            final int resId = partnerRes.getIdentifier(Partner.RES_WALLPAPERS, "array",
9275aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey                    partner.getPackageName());
9285aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey            if (resId != 0) {
9295aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey                addWallpapers(bundled, partnerRes, partner.getPackageName(), resId);
9305aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey            }
931cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal
932cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            // Add system wallpapers
933cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            File systemDir = partner.getWallpaperDirectory();
934cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            if (systemDir != null && systemDir.isDirectory()) {
935cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                for (File file : systemDir.listFiles()) {
936cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    if (!file.isFile()) {
937cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                        continue;
938cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    }
939cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    String name = file.getName();
940cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    int dotPos = name.lastIndexOf('.');
941cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    String extension = "";
942cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    if (dotPos >= -1) {
943cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                        extension = name.substring(dotPos);
944cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                        name = name.substring(0, dotPos);
945cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    }
946cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal
947cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    if (name.endsWith("_small")) {
948cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                        // it is a thumbnail
949cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                        continue;
950cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    }
951cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal
952cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    File thumbnail = new File(systemDir, name + "_small" + extension);
953cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    Bitmap thumb = BitmapFactory.decodeFile(thumbnail.getAbsolutePath());
954cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    if (thumb != null) {
955cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                        bundled.add(new FileWallpaperInfo(file, new BitmapDrawable(thumb)));
956cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    }
957cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                }
958cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            }
9595aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey        }
960104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
961eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        Pair<ApplicationInfo, Integer> r = getWallpaperArrayResourceId();
962eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        if (r != null) {
963eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            try {
9641e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                Resources wallpaperRes = getPackageManager().getResourcesForApplication(r.first);
9655aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey                addWallpapers(bundled, wallpaperRes, r.first.packageName, r.second);
966eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            } catch (PackageManager.NameNotFoundException e) {
967eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            }
968eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        }
969db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka
970cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        if (partner == null || !partner.hideDefaultWallpaper()) {
971cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            // Add an entry for the default wallpaper (stored in system resources)
972cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            WallpaperTileInfo defaultWallpaperInfo =
973cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
974cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    ? getPreKKDefaultWallpaperInfo()
975cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal                    : getDefaultWallpaper();
97612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            if (defaultWallpaperInfo != null) {
9775aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey                bundled.add(0, defaultWallpaperInfo);
97812ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
979db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        }
9805aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey        return bundled;
981eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    }
982eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka
98312ca6134bf818c7c28062aefa40281449042889aMichael Jurka    private boolean writeImageToFileAsJpeg(File f, Bitmap b) {
98412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        try {
98512ca6134bf818c7c28062aefa40281449042889aMichael Jurka            f.createNewFile();
98612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            FileOutputStream thumbFileStream =
98712ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    openFileOutput(f.getName(), Context.MODE_PRIVATE);
98812ca6134bf818c7c28062aefa40281449042889aMichael Jurka            b.compress(Bitmap.CompressFormat.JPEG, 95, thumbFileStream);
98912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            thumbFileStream.close();
99012ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return true;
99112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        } catch (IOException e) {
99212ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Log.e(TAG, "Error while writing bitmap to file " + e);
99312ca6134bf818c7c28062aefa40281449042889aMichael Jurka            f.delete();
99412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
99512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        return false;
99612ca6134bf818c7c28062aefa40281449042889aMichael Jurka    }
99712ca6134bf818c7c28062aefa40281449042889aMichael Jurka
9980af0d8422b1496dc3c60245264949debfa862057Sunny Goyal    private File getDefaultThumbFile() {
9990af0d8422b1496dc3c60245264949debfa862057Sunny Goyal        return new File(getFilesDir(), Build.VERSION.SDK_INT
100028db280b7af14614f2b168ea8c5d496cda650321Helena Josol                + "_" + LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL);
10010af0d8422b1496dc3c60245264949debfa862057Sunny Goyal    }
10020af0d8422b1496dc3c60245264949debfa862057Sunny Goyal
10030af0d8422b1496dc3c60245264949debfa862057Sunny Goyal    private boolean saveDefaultWallpaperThumb(Bitmap b) {
10040af0d8422b1496dc3c60245264949debfa862057Sunny Goyal        // Delete old thumbnails.
100528db280b7af14614f2b168ea8c5d496cda650321Helena Josol        new File(getFilesDir(), LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL_OLD).delete();
100628db280b7af14614f2b168ea8c5d496cda650321Helena Josol        new File(getFilesDir(), LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL).delete();
10070af0d8422b1496dc3c60245264949debfa862057Sunny Goyal
10080af0d8422b1496dc3c60245264949debfa862057Sunny Goyal        for (int i = Build.VERSION_CODES.JELLY_BEAN; i < Build.VERSION.SDK_INT; i++) {
100928db280b7af14614f2b168ea8c5d496cda650321Helena Josol            new File(getFilesDir(), i + "_" + LauncherFiles.DEFAULT_WALLPAPER_THUMBNAIL).delete();
10100af0d8422b1496dc3c60245264949debfa862057Sunny Goyal        }
10110af0d8422b1496dc3c60245264949debfa862057Sunny Goyal        return writeImageToFileAsJpeg(getDefaultThumbFile(), b);
10120af0d8422b1496dc3c60245264949debfa862057Sunny Goyal    }
10130af0d8422b1496dc3c60245264949debfa862057Sunny Goyal
101412ca6134bf818c7c28062aefa40281449042889aMichael Jurka    private ResourceWallpaperInfo getPreKKDefaultWallpaperInfo() {
1015db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        Resources sysRes = Resources.getSystem();
1016db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        int resId = sysRes.getIdentifier("default_wallpaper", "drawable", "android");
1017db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka
10180af0d8422b1496dc3c60245264949debfa862057Sunny Goyal        File defaultThumbFile = getDefaultThumbFile();
1019db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        Bitmap thumb = null;
1020db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        boolean defaultWallpaperExists = false;
1021db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        if (defaultThumbFile.exists()) {
1022db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
1023db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            defaultWallpaperExists = true;
1024db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        } else {
10258713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            Resources res = getResources();
10268713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            Point defaultThumbSize = getDefaultThumbnailSize(res);
10278713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            int rotation = WallpaperCropActivity.getRotationFromExif(res, resId);
10288713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            thumb = createThumbnail(
10298713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    defaultThumbSize, this, null, null, sysRes, resId, rotation, false);
1030db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            if (thumb != null) {
10310af0d8422b1496dc3c60245264949debfa862057Sunny Goyal                defaultWallpaperExists = saveDefaultWallpaperThumb(thumb);
1032db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            }
1033db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        }
1034db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        if (defaultWallpaperExists) {
1035db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            return new ResourceWallpaperInfo(sysRes, resId, new BitmapDrawable(thumb));
1036db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        }
1037db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        return null;
1038db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka    }
1039db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka
1040cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    @TargetApi(Build.VERSION_CODES.KITKAT)
104112ca6134bf818c7c28062aefa40281449042889aMichael Jurka    private DefaultWallpaperInfo getDefaultWallpaper() {
10420af0d8422b1496dc3c60245264949debfa862057Sunny Goyal        File defaultThumbFile = getDefaultThumbFile();
104312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        Bitmap thumb = null;
104412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        boolean defaultWallpaperExists = false;
104512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        if (defaultThumbFile.exists()) {
104612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
104712ca6134bf818c7c28062aefa40281449042889aMichael Jurka            defaultWallpaperExists = true;
104812ca6134bf818c7c28062aefa40281449042889aMichael Jurka        } else {
104912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Resources res = getResources();
105012ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Point defaultThumbSize = getDefaultThumbnailSize(res);
105112ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Drawable wallpaperDrawable = WallpaperManager.getInstance(this).getBuiltInDrawable(
105212ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    defaultThumbSize.x, defaultThumbSize.y, true, 0.5f, 0.5f);
105312ca6134bf818c7c28062aefa40281449042889aMichael Jurka            if (wallpaperDrawable != null) {
105412ca6134bf818c7c28062aefa40281449042889aMichael Jurka                thumb = Bitmap.createBitmap(
105512ca6134bf818c7c28062aefa40281449042889aMichael Jurka                        defaultThumbSize.x, defaultThumbSize.y, Bitmap.Config.ARGB_8888);
105612ca6134bf818c7c28062aefa40281449042889aMichael Jurka                Canvas c = new Canvas(thumb);
1057a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka                wallpaperDrawable.setBounds(0, 0, defaultThumbSize.x, defaultThumbSize.y);
105812ca6134bf818c7c28062aefa40281449042889aMichael Jurka                wallpaperDrawable.draw(c);
105912ca6134bf818c7c28062aefa40281449042889aMichael Jurka                c.setBitmap(null);
106012ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
106112ca6134bf818c7c28062aefa40281449042889aMichael Jurka            if (thumb != null) {
10620af0d8422b1496dc3c60245264949debfa862057Sunny Goyal                defaultWallpaperExists = saveDefaultWallpaperThumb(thumb);
106312ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
106412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
106512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        if (defaultWallpaperExists) {
106612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return new DefaultWallpaperInfo(new BitmapDrawable(thumb));
106712ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
106812ca6134bf818c7c28062aefa40281449042889aMichael Jurka        return null;
106912ca6134bf818c7c28062aefa40281449042889aMichael Jurka    }
107012ca6134bf818c7c28062aefa40281449042889aMichael Jurka
1071eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public Pair<ApplicationInfo, Integer> getWallpaperArrayResourceId() {
1072104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Context.getPackageName() may return the "original" package name,
1073104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // com.android.launcher3; Resources needs the real package name,
1074104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // com.android.launcher3. So we ask Resources for what it thinks the
1075104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // package name should be.
1076eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        final String packageName = getResources().getResourcePackageName(R.array.wallpapers);
1077eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        try {
1078eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            ApplicationInfo info = getPackageManager().getApplicationInfo(packageName, 0);
1079eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            return new Pair<ApplicationInfo, Integer>(info, R.array.wallpapers);
1080eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        } catch (PackageManager.NameNotFoundException e) {
1081eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            return null;
1082eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        }
1083104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
1084104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1085cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    private void addWallpapers(ArrayList<WallpaperTileInfo> known, Resources res,
10865aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey            String packageName, int listResId) {
10871e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        final String[] extras = res.getStringArray(listResId);
1088104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        for (String extra : extras) {
10891e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            int resId = res.getIdentifier(extra, "drawable", packageName);
10901e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            if (resId != 0) {
10911e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                final int thumbRes = res.getIdentifier(extra + "_small", "drawable", packageName);
1092104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1093104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                if (thumbRes != 0) {
10941e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    ResourceWallpaperInfo wallpaperInfo =
10951e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                            new ResourceWallpaperInfo(res, resId, res.getDrawable(thumbRes));
10965aeef58131e1c330d1d9c1dfcacf2e6eea6ced4bJeff Sharkey                    known.add(wallpaperInfo);
1097104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    // Log.d(TAG, "add: [" + packageName + "]: " + extra + " (" + res + ")");
1098104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                }
10996218e5b73757c26cd4b3e4867db34350171e9ed5Michael Jurka            } else {
11006218e5b73757c26cd4b3e4867db34350171e9ed5Michael Jurka                Log.e(TAG, "Couldn't find wallpaper " + extra);
1101104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            }
1102104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
11031e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
11041e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
11051e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public CropView getCropView() {
11061e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return mCropView;
11071e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
11081e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
11091e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public SavedWallpaperImages getSavedImages() {
11101e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return mSavedImages;
11111e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
11121e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
1113ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    public void onLiveWallpaperPickerLaunch(WallpaperInfo info) {
1114ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mLastClickedLiveWallpaperInfo = info;
11151e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        mLiveWallpaperInfoOnPickerLaunch = WallpaperManager.getInstance(this).getWallpaperInfo();
1116104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
1117104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1118104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    static class ZeroPaddingDrawable extends LevelListDrawable {
1119104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public ZeroPaddingDrawable(Drawable d) {
1120104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            super();
1121104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            addLevel(0, 0, d);
1122104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            setLevel(0);
1123104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1124104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1125104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        @Override
1126104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public boolean getPadding(Rect padding) {
1127104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            padding.set(0, 0, 0, 0);
1128104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            return true;
1129104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1130104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
1131104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1132cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    private static class SimpleWallpapersAdapter extends ArrayAdapter<WallpaperTileInfo> {
1133cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        private final LayoutInflater mLayoutInflater;
1134104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1135cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal        SimpleWallpapersAdapter(Activity activity, ArrayList<WallpaperTileInfo> wallpapers) {
1136cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            super(activity, R.layout.wallpaper_picker_item, wallpapers);
1137104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            mLayoutInflater = activity.getLayoutInflater();
1138104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1139104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1140104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public View getView(int position, View convertView, ViewGroup parent) {
1141cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            Drawable thumb = getItem(position).mThumb;
11421e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            if (thumb == null) {
11431e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                Log.e(TAG, "Error decoding thumbnail for wallpaper #" + position);
1144104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            }
1145cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal            return createImageTileView(mLayoutInflater, convertView, parent, thumb);
11461e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
11471e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1148104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1149cdc4dbd878a1f45d21c2881127cd5194e4e48cedSunny Goyal    public static View createImageTileView(LayoutInflater layoutInflater,
11501e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            View convertView, ViewGroup parent, Drawable thumb) {
11511e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        View view;
1152104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
11531e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        if (convertView == null) {
11541e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            view = layoutInflater.inflate(R.layout.wallpaper_picker_item, parent, false);
11551e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        } else {
11561e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            view = convertView;
11571e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1158104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
11591e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        setWallpaperItemPaddingToZero((FrameLayout) view);
1160104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
11611e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        ImageView image = (ImageView) view.findViewById(R.id.wallpaper_image);
11621e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
11631e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        if (thumb != null) {
11641e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            image.setImageDrawable(thumb);
11651e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            thumb.setDither(true);
1166104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
11671e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
11681e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return view;
1169104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
11707ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka
11717ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    // In Launcher3, we override this with a method that catches exceptions
11727ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    // from starting activities; didn't want to copy and paste code into here
11737ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    public void startActivityForResultSafely(Intent intent, int requestCode) {
11747ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka        startActivityForResult(intent, requestCode);
11757ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    }
1176104c45677660586026a7e74ef8c47d396403d50eMichael Jurka}
1177