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;
20104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.app.ActionBar;
21104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.app.Activity;
22998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.app.WallpaperInfo;
23998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.app.WallpaperManager;
241e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurkaimport android.content.Context;
25104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.Intent;
26eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurkaimport android.content.pm.ApplicationInfo;
27104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.pm.PackageManager;
28104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.content.res.Resources;
2942a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurkaimport android.database.Cursor;
30998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.database.DataSetObserver;
31be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurkaimport android.graphics.Bitmap;
32db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport android.graphics.BitmapFactory;
3312ca6134bf818c7c28062aefa40281449042889aMichael Jurkaimport android.graphics.Canvas;
348713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurkaimport android.graphics.Matrix;
35104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.Point;
36998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurkaimport android.graphics.PorterDuff;
37104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.Rect;
38104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.RectF;
39db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport android.graphics.drawable.BitmapDrawable;
40104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.drawable.Drawable;
41104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.graphics.drawable.LevelListDrawable;
42104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.net.Uri;
43862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurkaimport android.os.AsyncTask;
4412ca6134bf818c7c28062aefa40281449042889aMichael Jurkaimport android.os.Build;
45d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurkaimport android.os.Bundle;
4642a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurkaimport android.provider.MediaStore;
47104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.util.Log;
48eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurkaimport android.util.Pair;
49d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurkaimport android.view.ActionMode;
50104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.LayoutInflater;
51104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.Menu;
52d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurkaimport android.view.MenuInflater;
53104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.MenuItem;
54104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.View;
55104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.View.OnClickListener;
5612ca6134bf818c7c28062aefa40281449042889aMichael Jurkaimport android.view.View.OnLayoutChangeListener;
57104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.view.ViewGroup;
587ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurkaimport android.view.ViewPropertyAnimator;
59fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurkaimport android.view.ViewTreeObserver;
60fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurkaimport android.view.ViewTreeObserver.OnGlobalLayoutListener;
61ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinekimport android.view.WindowManager;
6224f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandlerimport android.view.animation.AccelerateInterpolator;
634b94060491eb14f4f1d40b86012414910325751aMichael Jurkaimport android.view.animation.DecelerateInterpolator;
64104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.BaseAdapter;
65104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.FrameLayout;
66fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurkaimport android.widget.HorizontalScrollView;
67104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.ImageView;
68104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.LinearLayout;
69104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.widget.ListAdapter;
70619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurkaimport android.widget.Toast;
71104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
72104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport com.android.photos.BitmapRegionTileSource;
73619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurkaimport com.android.photos.BitmapRegionTileSource.BitmapSource;
74104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
75db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport java.io.File;
76db84e82a0a098c821b7a4f419293770277a24a34Michael Jurkaimport java.io.FileOutputStream;
771e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurkaimport java.io.IOException;
78104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport java.util.ArrayList;
79104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
80104c45677660586026a7e74ef8c47d396403d50eMichael Jurkapublic class WallpaperPickerActivity extends WallpaperCropActivity {
81be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    static final String TAG = "Launcher.WallpaperPickerActivity";
82104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
831e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static final int IMAGE_PICK = 5;
841e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static final int PICK_WALLPAPER_THIRD_PARTY_ACTIVITY = 6;
851e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static final int PICK_LIVE_WALLPAPER = 7;
86d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    private static final String TEMP_WALLPAPER_TILES = "TEMP_WALLPAPER_TILES";
871b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi    private static final String SELECTED_INDEX = "SELECTED_INDEX";
88a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka    private static final String OLD_DEFAULT_WALLPAPER_THUMBNAIL_FILENAME = "default_thumb.jpg";
89a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka    private static final String DEFAULT_WALLPAPER_THUMBNAIL_FILENAME = "default_thumb2.jpg";
90ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private static final int FLAG_POST_DELAY_MILLIS = 200;
91104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
92619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka    private View mSelectedTile;
934b94060491eb14f4f1d40b86012414910325751aMichael Jurka    private boolean mIgnoreNextTap;
942d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    private OnClickListener mThumbnailOnClickListener;
95104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
96be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private LinearLayout mWallpapersView;
977267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka    private View mWallpaperStrip;
98d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
99d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    private ActionMode.Callback mActionModeCallback;
100d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    private ActionMode mActionMode;
101d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
102be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private View.OnLongClickListener mLongClickListener;
103be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
104be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    ArrayList<Uri> mTempWallpaperTiles = new ArrayList<Uri>();
105be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private SavedWallpaperImages mSavedImages;
106998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka    private WallpaperInfo mLiveWallpaperInfoOnPickerLaunch;
107ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private int mSelectedIndex = -1;
108ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private WallpaperInfo mLastClickedLiveWallpaperInfo;
109be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
1101e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static abstract class WallpaperTileInfo {
1116b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        protected View mView;
1126b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public void setView(View v) {
1136b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            mView = v;
1146b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
1151e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onClick(WallpaperPickerActivity a) {}
1161e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onSave(WallpaperPickerActivity a) {}
1178a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        public void onDelete(WallpaperPickerActivity a) {}
1181e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public boolean isSelectable() { return false; }
1196b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public boolean isNamelessWallpaper() { return false; }
1206b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public void onIndexUpdated(CharSequence label) {
1216b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            if (isNamelessWallpaper()) {
1226b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                mView.setContentDescription(label);
1236b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            }
1246b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
1251e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1261e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
1271e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static class PickImageInfo extends WallpaperTileInfo {
1288a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
1291e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onClick(WallpaperPickerActivity a) {
1301e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
1311e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            intent.setType("image/*");
1327ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka            a.startActivityForResultSafely(intent, IMAGE_PICK);
1331e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1341e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1351e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
1361e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static class UriWallpaperInfo extends WallpaperTileInfo {
1371e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private Uri mUri;
138619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        private boolean mFirstClick = true;
139619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        private BitmapRegionTileSource.UriBitmapSource mBitmapSource;
1401e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public UriWallpaperInfo(Uri uri) {
1411e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mUri = uri;
1421e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1438a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
144619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        public void onClick(final WallpaperPickerActivity a) {
145619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            final Runnable onLoad;
146619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            if (!mFirstClick) {
147619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                onLoad = null;
148619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            } else {
149619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                mFirstClick = false;
150ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                a.mSetWallpaperButton.setEnabled(false);
151619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                onLoad = new Runnable() {
152619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    public void run() {
153619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        if (mBitmapSource != null &&
154619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                mBitmapSource.getLoadingState() == BitmapSource.State.LOADED) {
155619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            a.selectTile(mView);
156ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            a.mSetWallpaperButton.setEnabled(true);
157619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        } else {
158619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            ViewGroup parent = (ViewGroup) mView.getParent();
159619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            if (parent != null) {
160619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                parent.removeView(mView);
161619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                Toast.makeText(a,
162619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                        a.getString(R.string.image_load_fail),
163619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                                        Toast.LENGTH_SHORT).show();
164619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            }
165619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        }
166619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    }
167619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                };
168619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            }
169619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            mBitmapSource = new BitmapRegionTileSource.UriBitmapSource(
170619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    a, mUri, BitmapRegionTileSource.MAX_PREVIEW_SIZE);
171619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            a.setCropViewTileSource(mBitmapSource, true, false, onLoad);
1721e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1738a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
1741e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onSave(final WallpaperPickerActivity a) {
1751e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            boolean finishActivityWhenDone = true;
1761e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            OnBitmapCroppedHandler h = new OnBitmapCroppedHandler() {
1771e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                public void onBitmapCropped(byte[] imageBytes) {
1781e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    Point thumbSize = getDefaultThumbnailSize(a.getResources());
1798713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    // rotation is set to 0 since imageBytes has already been correctly rotated
1808713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    Bitmap thumb = createThumbnail(
1818713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                            thumbSize, null, null, imageBytes, null, 0, 0, true);
1821e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    a.getSavedImages().writeImage(thumb, imageBytes);
1831e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                }
1841e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            };
1851e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            a.cropImageAndSetWallpaper(mUri, h, finishActivityWhenDone);
1861e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1878a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
1881e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public boolean isSelectable() {
1891e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            return true;
1901e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1916b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        @Override
1926b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public boolean isNamelessWallpaper() {
1936b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            return true;
1946b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
1951e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1961e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
1971e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static class ResourceWallpaperInfo extends WallpaperTileInfo {
1981e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private Resources mResources;
1991e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private int mResId;
2001e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private Drawable mThumb;
2011e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
2021e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public ResourceWallpaperInfo(Resources res, int resId, Drawable thumb) {
2031e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mResources = res;
2041e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mResId = resId;
2051e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mThumb = thumb;
2061e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2078a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
2081e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onClick(WallpaperPickerActivity a) {
209862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            BitmapRegionTileSource.ResourceBitmapSource bitmapSource =
21083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                    new BitmapRegionTileSource.ResourceBitmapSource(
21183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                            mResources, mResId, BitmapRegionTileSource.MAX_PREVIEW_SIZE);
212862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            bitmapSource.loadInBackground();
213862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            BitmapRegionTileSource source = new BitmapRegionTileSource(a, bitmapSource);
2141e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            CropView v = a.getCropView();
2151e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            v.setTileSource(source, null);
2161e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            Point wallpaperSize = WallpaperCropActivity.getDefaultWallpaperSize(
2171e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    a.getResources(), a.getWindowManager());
2181e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            RectF crop = WallpaperCropActivity.getMaxCropRect(
2191e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    source.getImageWidth(), source.getImageHeight(),
2201e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    wallpaperSize.x, wallpaperSize.y, false);
2211e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            v.setScale(wallpaperSize.x / crop.width());
2221e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            v.setTouchEnabled(false);
223ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            a.setSystemWallpaperVisiblity(false);
2241e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2258a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
2261e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public void onSave(WallpaperPickerActivity a) {
2271e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            boolean finishActivityWhenDone = true;
2281e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            a.cropImageAndSetWallpaper(mResources, mResId, finishActivityWhenDone);
2291e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2308a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka        @Override
2311e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public boolean isSelectable() {
2321e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            return true;
2331e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
2346b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        @Override
2356b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        public boolean isNamelessWallpaper() {
2366b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            return true;
2376b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
238104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
239104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
24012ca6134bf818c7c28062aefa40281449042889aMichael Jurka    public static class DefaultWallpaperInfo extends WallpaperTileInfo {
24112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public Drawable mThumb;
24212ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public DefaultWallpaperInfo(Drawable thumb) {
24312ca6134bf818c7c28062aefa40281449042889aMichael Jurka            mThumb = thumb;
24412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
24512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
24612ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public void onClick(WallpaperPickerActivity a) {
24783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            CropView c = a.getCropView();
24883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka
24912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Drawable defaultWallpaper = WallpaperManager.getInstance(a).getBuiltInDrawable(
25083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                    c.getWidth(), c.getHeight(), false, 0.5f, 0.5f);
25183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka
2527084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer            if (defaultWallpaper == null) {
2537084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                Log.w(TAG, "Null default wallpaper encountered.");
2547084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                c.setTileSource(null, null);
2557084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                return;
2567084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer            }
2577084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer
25883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            c.setTileSource(
25983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka                    new DrawableTileSource(a, defaultWallpaper, DrawableTileSource.MAX_PREVIEW_SIZE), null);
26083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            c.setScale(1f);
26183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka            c.setTouchEnabled(false);
262ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            a.setSystemWallpaperVisiblity(false);
26312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
26412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
26512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public void onSave(WallpaperPickerActivity a) {
26612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            try {
26712ca6134bf818c7c28062aefa40281449042889aMichael Jurka                WallpaperManager.getInstance(a).clear();
2683aa28319ceca347dfd4958ca95b94652bb8e2a3dSelim Cinek                a.setResult(RESULT_OK);
26912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            } catch (IOException e) {
27012ca6134bf818c7c28062aefa40281449042889aMichael Jurka                Log.w("Setting wallpaper to default threw exception", e);
27112ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
27212ca6134bf818c7c28062aefa40281449042889aMichael Jurka            a.finish();
27312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
27412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
27512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public boolean isSelectable() {
27612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return true;
27712ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
27812ca6134bf818c7c28062aefa40281449042889aMichael Jurka        @Override
27912ca6134bf818c7c28062aefa40281449042889aMichael Jurka        public boolean isNamelessWallpaper() {
28012ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return true;
28112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
28212ca6134bf818c7c28062aefa40281449042889aMichael Jurka    }
28312ca6134bf818c7c28062aefa40281449042889aMichael Jurka
2847267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka    public void setWallpaperStripYOffset(float offset) {
2857267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka        mWallpaperStrip.setPadding(0, 0, 0, (int) offset);
2867267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka    }
2877267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka
288ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    /**
289ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     * shows the system wallpaper behind the window and hides the {@link
290ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     * #mCropView} if visible
291ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     * @param visible should the system wallpaper be shown
292ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek     */
293ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    protected void setSystemWallpaperVisiblity(final boolean visible) {
294ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // hide our own wallpaper preview if necessary
295ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        if(!visible) {
296ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            mCropView.setVisibility(View.VISIBLE);
297ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        } else {
298ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            changeWallpaperFlags(visible);
299ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        }
300ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // the change of the flag must be delayed in order to avoid flickering,
301ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // a simple post / double post does not suffice here
302ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mCropView.postDelayed(new Runnable() {
303ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            @Override
304ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            public void run() {
305ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                if(!visible) {
306ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    changeWallpaperFlags(visible);
307ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                } else {
308ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    mCropView.setVisibility(View.INVISIBLE);
309ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                }
310ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            }
311ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        }, FLAG_POST_DELAY_MILLIS);
312ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    }
313ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
314ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    private void changeWallpaperFlags(boolean visible) {
315ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        int desiredWallpaperFlag = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0;
316ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        int currentWallpaperFlag = getWindow().getAttributes().flags
317ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
318ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        if (desiredWallpaperFlag != currentWallpaperFlag) {
319ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            getWindow().setFlags(desiredWallpaperFlag,
320ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
321ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        }
322ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    }
323ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
324ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    @Override
325ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    public void setCropViewTileSource(BitmapSource bitmapSource,
326ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                      boolean touchEnabled,
327ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                      boolean moveToLeft,
328ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                      final Runnable postExecute) {
329ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        // we also want to show our own wallpaper instead of the one in the background
330ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        Runnable showPostExecuteRunnable = new Runnable() {
331ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            @Override
332ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            public void run() {
333ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                if(postExecute != null) {
334ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    postExecute.run();
335ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                }
336ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                setSystemWallpaperVisiblity(false);
337ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            }
338ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        };
339ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        super.setCropViewTileSource(bitmapSource,
340ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                touchEnabled,
341ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                moveToLeft,
342ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                showPostExecuteRunnable);
343ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    }
344ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
3452d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    // called by onCreate; this is subclassed to overwrite WallpaperCropActivity
3462d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    protected void init() {
347104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        setContentView(R.layout.wallpaper_picker);
348104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
349104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        mCropView = (CropView) findViewById(R.id.cropView);
350ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mCropView.setVisibility(View.INVISIBLE);
351ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek
3527267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka        mWallpaperStrip = findViewById(R.id.wallpaper_strip);
3534b94060491eb14f4f1d40b86012414910325751aMichael Jurka        mCropView.setTouchCallback(new CropView.TouchCallback() {
3547ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka            ViewPropertyAnimator mAnim;
355e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            @Override
3564b94060491eb14f4f1d40b86012414910325751aMichael Jurka            public void onTouchDown() {
3574b94060491eb14f4f1d40b86012414910325751aMichael Jurka                if (mAnim != null) {
3584b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    mAnim.cancel();
3594b94060491eb14f4f1d40b86012414910325751aMichael Jurka                }
36024f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                if (mWallpaperStrip.getAlpha() == 1f) {
3614b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    mIgnoreNextTap = true;
3624b94060491eb14f4f1d40b86012414910325751aMichael Jurka                }
3637ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                mAnim = mWallpaperStrip.animate();
36424f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                mAnim.alpha(0f)
3657ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    .setDuration(150)
3667ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    .withEndAction(new Runnable() {
3677ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                        public void run() {
3687ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                            mWallpaperStrip.setVisibility(View.INVISIBLE);
3697ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                        }
3707ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    });
37124f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                mAnim.setInterpolator(new AccelerateInterpolator(0.75f));
3724b94060491eb14f4f1d40b86012414910325751aMichael Jurka                mAnim.start();
3734b94060491eb14f4f1d40b86012414910325751aMichael Jurka            }
374e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            @Override
375e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            public void onTouchUp() {
376e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka                mIgnoreNextTap = false;
377e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            }
378e8115d5664a6f72b7a2062280c1bcf5dd457ab90Michael Jurka            @Override
3794b94060491eb14f4f1d40b86012414910325751aMichael Jurka            public void onTap() {
3804b94060491eb14f4f1d40b86012414910325751aMichael Jurka                boolean ignoreTap = mIgnoreNextTap;
3814b94060491eb14f4f1d40b86012414910325751aMichael Jurka                mIgnoreNextTap = false;
3824b94060491eb14f4f1d40b86012414910325751aMichael Jurka                if (!ignoreTap) {
3834b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    if (mAnim != null) {
3844b94060491eb14f4f1d40b86012414910325751aMichael Jurka                        mAnim.cancel();
3854b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    }
38624f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                    mWallpaperStrip.setVisibility(View.VISIBLE);
3877ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka                    mAnim = mWallpaperStrip.animate();
38824f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                    mAnim.alpha(1f)
38924f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                         .setDuration(150)
39024f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler                         .setInterpolator(new DecelerateInterpolator(0.75f));
3914b94060491eb14f4f1d40b86012414910325751aMichael Jurka                    mAnim.start();
3924b94060491eb14f4f1d40b86012414910325751aMichael Jurka                }
3934b94060491eb14f4f1d40b86012414910325751aMichael Jurka            }
3944b94060491eb14f4f1d40b86012414910325751aMichael Jurka        });
395104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
3962d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        mThumbnailOnClickListener = new OnClickListener() {
3972d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            public void onClick(View v) {
398d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                if (mActionMode != null) {
399d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    // When CAB is up, clicking toggles the item instead
400d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    if (v.isLongClickable()) {
401d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        mLongClickListener.onLongClick(v);
402d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    }
403d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    return;
404d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
405ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                mSetWallpaperButton.setEnabled(true);
4061e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                WallpaperTileInfo info = (WallpaperTileInfo) v.getTag();
407619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                if (info.isSelectable() && v.getVisibility() == View.VISIBLE) {
408619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                    selectTile(v);
4092d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka                }
4101e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                info.onClick(WallpaperPickerActivity.this);
4112d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            }
4122d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        };
413d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        mLongClickListener = new View.OnLongClickListener() {
414d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the user long-clicks on someView
415d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onLongClick(View view) {
416d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                CheckableFrameLayout c = (CheckableFrameLayout) view;
417d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                c.toggle();
418d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
419d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                if (mActionMode != null) {
420d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mActionMode.invalidate();
421d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                } else {
422d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    // Start the CAB using the ActionMode.Callback defined below
423d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mActionMode = startActionMode(mActionModeCallback);
424d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    int childCount = mWallpapersView.getChildCount();
425d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    for (int i = 0; i < childCount; i++) {
426d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        mWallpapersView.getChildAt(i).setSelected(false);
427d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    }
428d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
429d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                return true;
430d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
431d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        };
4322d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
433104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Populate the built-in wallpapers
4341e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        ArrayList<ResourceWallpaperInfo> wallpapers = findBundledWallpapers();
435be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mWallpapersView = (LinearLayout) findViewById(R.id.wallpaper_list);
4361e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        BuiltInWallpapersAdapter ia = new BuiltInWallpapersAdapter(this, wallpapers);
43712ca6134bf818c7c28062aefa40281449042889aMichael Jurka        populateWallpapersFromAdapter(mWallpapersView, ia, false);
438be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
439be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        // Populate the saved wallpapers
440be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mSavedImages = new SavedWallpaperImages(this);
441be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mSavedImages.loadThumbnailsAndImageIdList();
44212ca6134bf818c7c28062aefa40281449042889aMichael Jurka        populateWallpapersFromAdapter(mWallpapersView, mSavedImages, true);
443998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka
444998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        // Populate the live wallpapers
4451e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        final LinearLayout liveWallpapersView =
4461e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                (LinearLayout) findViewById(R.id.live_wallpaper_list);
447998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        final LiveWallpaperListAdapter a = new LiveWallpaperListAdapter(this);
448998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        a.registerDataSetObserver(new DataSetObserver() {
449998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            public void onChanged() {
450998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                liveWallpapersView.removeAllViews();
45112ca6134bf818c7c28062aefa40281449042889aMichael Jurka                populateWallpapersFromAdapter(liveWallpapersView, a, false);
452fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                initializeScrollForRtl();
4536b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                updateTileIndices();
454998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            }
455998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        });
456998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka
457998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        // Populate the third-party wallpaper pickers
458998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        final LinearLayout thirdPartyWallpapersView =
459998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                (LinearLayout) findViewById(R.id.third_party_wallpaper_list);
460998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        final ThirdPartyWallpaperPickerListAdapter ta =
461998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                new ThirdPartyWallpaperPickerListAdapter(this);
46212ca6134bf818c7c28062aefa40281449042889aMichael Jurka        populateWallpapersFromAdapter(thirdPartyWallpapersView, ta, false);
463104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
464104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Add a tile for the Gallery
465998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
4666b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        FrameLayout pickImageTile = (FrameLayout) getLayoutInflater().
4675b4b6904ae4d7706ff4c523018787320bc874333Michael Jurka                inflate(R.layout.wallpaper_picker_image_picker_item, masterWallpaperList, false);
4686b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        setWallpaperItemPaddingToZero(pickImageTile);
4696b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        masterWallpaperList.addView(pickImageTile, 0);
470104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
47142a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        // Make its background the last photo taken on external storage
47242a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        Bitmap lastPhoto = getThumbnailOfLastPhoto();
47342a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        if (lastPhoto != null) {
47442a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka            ImageView galleryThumbnailBg =
4756b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    (ImageView) pickImageTile.findViewById(R.id.wallpaper_image);
47642a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka            galleryThumbnailBg.setImageBitmap(getThumbnailOfLastPhoto());
477998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            int colorOverlay = getResources().getColor(R.color.wallpaper_picker_translucent_gray);
478998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            galleryThumbnailBg.setColorFilter(colorOverlay, PorterDuff.Mode.SRC_ATOP);
479fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
48042a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        }
48142a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka
4821e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        PickImageInfo pickImageInfo = new PickImageInfo();
4836b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        pickImageTile.setTag(pickImageInfo);
4846b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        pickImageInfo.setView(pickImageTile);
4856b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        pickImageTile.setOnClickListener(mThumbnailOnClickListener);
48612ca6134bf818c7c28062aefa40281449042889aMichael Jurka
48712ca6134bf818c7c28062aefa40281449042889aMichael Jurka        // Add a tile for the default wallpaper
48812ca6134bf818c7c28062aefa40281449042889aMichael Jurka        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
48912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            DefaultWallpaperInfo defaultWallpaperInfo = getDefaultWallpaper();
4907084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer            if (defaultWallpaperInfo != null) {
4917084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                FrameLayout defaultWallpaperTile = (FrameLayout) createImageTileView(
4927084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                        getLayoutInflater(), 0, null, mWallpapersView, defaultWallpaperInfo.mThumb);
4937084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                setWallpaperItemPaddingToZero(defaultWallpaperTile);
4947084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                defaultWallpaperTile.setTag(defaultWallpaperInfo);
4957084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                mWallpapersView.addView(defaultWallpaperTile, 0);
4967084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                defaultWallpaperTile.setOnClickListener(mThumbnailOnClickListener);
4977084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer                defaultWallpaperInfo.setView(defaultWallpaperTile);
4987084c606eb1e613d2bc5681f3c54ad7912859eedChristoph Studer            }
49912ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
50012ca6134bf818c7c28062aefa40281449042889aMichael Jurka
50112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        // Select the first item; wait for a layout pass so that we initialize the dimensions of
50212ca6134bf818c7c28062aefa40281449042889aMichael Jurka        // cropView or the defaultWallpaperView first
50383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka        mCropView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
50412ca6134bf818c7c28062aefa40281449042889aMichael Jurka            @Override
50512ca6134bf818c7c28062aefa40281449042889aMichael Jurka            public void onLayoutChange(View v, int left, int top, int right, int bottom,
50612ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
50712ca6134bf818c7c28062aefa40281449042889aMichael Jurka                if ((right - left) > 0 && (bottom - top) > 0) {
5081b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                    if (mSelectedIndex >= 0 && mSelectedIndex < mWallpapersView.getChildCount()) {
5091b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                        mThumbnailOnClickListener.onClick(
5101b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                                mWallpapersView.getChildAt(mSelectedIndex));
511ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        setSystemWallpaperVisiblity(false);
51212ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    }
51312ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    v.removeOnLayoutChangeListener(this);
51412ca6134bf818c7c28062aefa40281449042889aMichael Jurka                }
51512ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
51612ca6134bf818c7c28062aefa40281449042889aMichael Jurka        });
5176b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
5186b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        updateTileIndices();
519104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
520fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        // Update the scroll for RTL
521fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        initializeScrollForRtl();
522fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
523d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        // Create smooth layout transitions for when items are deleted
524d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        final LayoutTransition transitioner = new LayoutTransition();
525d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        transitioner.setDuration(200);
526d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        transitioner.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0);
527d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        transitioner.setAnimator(LayoutTransition.DISAPPEARING, null);
528d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        mWallpapersView.setLayoutTransition(transitioner);
529d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
530104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Action bar
531104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Show the custom action bar view
532104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        final ActionBar actionBar = getActionBar();
533104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        actionBar.setCustomView(R.layout.actionbar_set_wallpaper);
534104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        actionBar.getCustomView().setOnClickListener(
535104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                new View.OnClickListener() {
536104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    @Override
537104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    public void onClick(View v) {
538619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                        if (mSelectedTile != null) {
539619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                            WallpaperTileInfo info = (WallpaperTileInfo) mSelectedTile.getTag();
540b92f43313650400b9dfadf7264a740a38bf3cb7fMichael Jurka                            info.onSave(WallpaperPickerActivity.this);
541ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        } else {
542ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            // no tile was selected, so we just finish the activity and go back
543ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            setResult(Activity.RESULT_OK);
544ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            finish();
545b92f43313650400b9dfadf7264a740a38bf3cb7fMichael Jurka                        }
546104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    }
547104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                });
548849aff7553a5daffa34b4c38d1d29dec5a87fde1Michael Jurka        mSetWallpaperButton = findViewById(R.id.set_wallpaper_button);
549104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
550d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        // CAB for deleting items
551d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        mActionModeCallback = new ActionMode.Callback() {
552d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the action mode is created; startActionMode() was called
553d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
554d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
555d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                // Inflate a menu resource providing context menu items
556d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                MenuInflater inflater = mode.getMenuInflater();
557d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                inflater.inflate(R.menu.cab_delete_wallpapers, menu);
558d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                return true;
559d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
560d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka
561d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            private int numCheckedItems() {
562d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int childCount = mWallpapersView.getChildCount();
563d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int numCheckedItems = 0;
564d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                for (int i = 0; i < childCount; i++) {
565d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    CheckableFrameLayout c = (CheckableFrameLayout) mWallpapersView.getChildAt(i);
566d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    if (c.isChecked()) {
567d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        numCheckedItems++;
568d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    }
569d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
570d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                return numCheckedItems;
571d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
5722d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
573d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called each time the action mode is shown. Always called after onCreateActionMode,
574d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // but may be called multiple times if the mode is invalidated.
575d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
576d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
577d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int numCheckedItems = numCheckedItems();
578d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                if (numCheckedItems == 0) {
579d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mode.finish();
580d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    return true;
581d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                } else {
582d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    mode.setTitle(getResources().getQuantityString(
583d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                            R.plurals.number_of_items_selected, numCheckedItems, numCheckedItems));
584d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    return true;
585d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
586d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
5872d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
588d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the user selects a contextual menu item
589d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
590d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
591c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                int itemId = item.getItemId();
592c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                if (itemId == R.id.menu_delete) {
593c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    int childCount = mWallpapersView.getChildCount();
594c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    ArrayList<View> viewsToRemove = new ArrayList<View>();
595ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    boolean selectedTileRemoved = false;
596c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    for (int i = 0; i < childCount; i++) {
597c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                        CheckableFrameLayout c =
598c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                                (CheckableFrameLayout) mWallpapersView.getChildAt(i);
599c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                        if (c.isChecked()) {
6008a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka                            WallpaperTileInfo info = (WallpaperTileInfo) c.getTag();
6018a34bdba657b5d8d1e919e89c31c81e38846b63cMichael Jurka                            info.onDelete(WallpaperPickerActivity.this);
602c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                            viewsToRemove.add(c);
603ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            if (i == mSelectedIndex) {
604ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                selectedTileRemoved = true;
605ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            }
606d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                        }
607c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    }
608c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    for (View v : viewsToRemove) {
609c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                        mWallpapersView.removeView(v);
610c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    }
611ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    if (selectedTileRemoved) {
612ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        mSelectedIndex = -1;
613ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        mSelectedTile = null;
614ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                        setSystemWallpaperVisiblity(true);
615ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    }
6166b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    updateTileIndices();
617c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    mode.finish(); // Action picked, so close the CAB
618c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    return true;
619c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                } else {
620c639f8cdab11c603e25b5ae38282dddcb939d401Bjorn Bringert                    return false;
621d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
622d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
6232d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
624d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            // Called when the user exits the action mode
625d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            @Override
626d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            public void onDestroyActionMode(ActionMode mode) {
627d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                int childCount = mWallpapersView.getChildCount();
628d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                for (int i = 0; i < childCount; i++) {
629d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    CheckableFrameLayout c = (CheckableFrameLayout) mWallpapersView.getChildAt(i);
630d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                    c.setChecked(false);
631d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                }
632ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                if (mSelectedTile != null) {
633ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    mSelectedTile.setSelected(true);
634ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                }
635d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka                mActionMode = null;
636d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka            }
637d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        };
638d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    }
639619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka
640619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka    private void selectTile(View v) {
641619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        if (mSelectedTile != null) {
642619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            mSelectedTile.setSelected(false);
643619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka            mSelectedTile = null;
644619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        }
645619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        mSelectedTile = v;
646619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        v.setSelected(true);
6471b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        mSelectedIndex = mWallpapersView.indexOfChild(v);
648619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        // TODO: Remove this once the accessibility framework and
649619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        // services have better support for selection state.
650619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        v.announceForAccessibility(
651619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka                getString(R.string.announce_selection, v.getContentDescription()));
652862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka    }
65342a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka
654fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka    private void initializeScrollForRtl() {
655fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        final HorizontalScrollView scroll =
656fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                (HorizontalScrollView) findViewById(R.id.wallpaper_scroll_container);
657fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
658fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        if (scroll.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
659fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka            final ViewTreeObserver observer = scroll.getViewTreeObserver();
660fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
661fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                public void onGlobalLayout() {
662fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                    LinearLayout masterWallpaperList =
663fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                            (LinearLayout) findViewById(R.id.master_wallpaper_list);
664fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                    scroll.scrollTo(masterWallpaperList.getWidth(), 0);
665fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                    scroll.getViewTreeObserver().removeOnGlobalLayoutListener(this);
666fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka                }
667fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka            });
668fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka        }
669fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka    }
670fe0ace3583bc57adbaaec730b1b1757032e90c41Michael Jurka
67142a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka    protected Bitmap getThumbnailOfLastPhoto() {
67242a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        Cursor cursor = MediaStore.Images.Media.query(getContentResolver(),
67342a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
67442a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                new String[] { MediaStore.Images.ImageColumns._ID,
67542a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                    MediaStore.Images.ImageColumns.DATE_TAKEN},
67642a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC LIMIT 1");
67742a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        Bitmap thumb = null;
67842a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        if (cursor.moveToNext()) {
67942a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka            int id = cursor.getInt(0);
68042a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka            thumb = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),
68142a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka                    id, MediaStore.Images.Thumbnails.MINI_KIND, null);
68242a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        }
68342a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        cursor.close();
68442a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka        return thumb;
68542a7174255b2d2e8f5896ab02f3b0611dabcc4a1Michael Jurka    }
6865664de2524be15329882bf81925d08b5de760b8cMichael Jurka
6875664de2524be15329882bf81925d08b5de760b8cMichael Jurka    protected void onStop() {
6885664de2524be15329882bf81925d08b5de760b8cMichael Jurka        super.onStop();
6897267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka        mWallpaperStrip = findViewById(R.id.wallpaper_strip);
69024f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler        if (mWallpaperStrip.getAlpha() < 1f) {
6917267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka            mWallpaperStrip.setAlpha(1f);
69224f397d94d29da95943f92d5feb4ceb014a2c54cDaniel Sandler            mWallpaperStrip.setVisibility(View.VISIBLE);
6935664de2524be15329882bf81925d08b5de760b8cMichael Jurka        }
6945664de2524be15329882bf81925d08b5de760b8cMichael Jurka    }
6955664de2524be15329882bf81925d08b5de760b8cMichael Jurka
696d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    protected void onSaveInstanceState(Bundle outState) {
697d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        outState.putParcelableArrayList(TEMP_WALLPAPER_TILES, mTempWallpaperTiles);
6981b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        outState.putInt(SELECTED_INDEX, mSelectedIndex);
699d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    }
7002d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
701d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    protected void onRestoreInstanceState(Bundle savedInstanceState) {
702d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        ArrayList<Uri> uris = savedInstanceState.getParcelableArrayList(TEMP_WALLPAPER_TILES);
703d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        for (Uri uri : uris) {
7041b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi            addTemporaryWallpaperTile(uri, true);
705d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka        }
706ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mSelectedIndex = savedInstanceState.getInt(SELECTED_INDEX, -1);
707d6dc6043ad29c84511b7cd1c60a4bb72279fb50aMichael Jurka    }
7082d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
709998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka    private void populateWallpapersFromAdapter(ViewGroup parent, BaseAdapter adapter,
71012ca6134bf818c7c28062aefa40281449042889aMichael Jurka            boolean addLongPressHandler) {
711998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        for (int i = 0; i < adapter.getCount(); i++) {
712998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            FrameLayout thumbnail = (FrameLayout) adapter.getView(i, null, parent);
713be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            parent.addView(thumbnail, i);
7146b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            WallpaperTileInfo info = (WallpaperTileInfo) adapter.getItem(i);
7156b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            thumbnail.setTag(info);
7166b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            info.setView(thumbnail);
717be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            if (addLongPressHandler) {
718be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka                addLongPressHandler(thumbnail);
719be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            }
720be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            thumbnail.setOnClickListener(mThumbnailOnClickListener);
721be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
722be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
7232d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
7246b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka    private void updateTileIndices() {
7256b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
7266b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        final int childCount = masterWallpaperList.getChildCount();
7276b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        final Resources res = getResources();
7286b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7296b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        // Do two passes; the first pass gets the total number of tiles
7306b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        int numTiles = 0;
7316b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        for (int passNum = 0; passNum < 2; passNum++) {
7326b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            int tileIndex = 0;
7336b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            for (int i = 0; i < childCount; i++) {
7346b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                View child = masterWallpaperList.getChildAt(i);
7356b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                LinearLayout subList;
7366b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7376b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                int subListStart;
7386b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                int subListEnd;
7396b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                if (child.getTag() instanceof WallpaperTileInfo) {
7406b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subList = masterWallpaperList;
7416b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListStart = i;
7426b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListEnd = i + 1;
7436b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                } else { // if (child instanceof LinearLayout) {
7446b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subList = (LinearLayout) child;
7456b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListStart = 0;
7466b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    subListEnd = subList.getChildCount();
7476b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                }
7486b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7496b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                for (int j = subListStart; j < subListEnd; j++) {
7506b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    WallpaperTileInfo info = (WallpaperTileInfo) subList.getChildAt(j).getTag();
7516b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    if (info.isNamelessWallpaper()) {
7526b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                        if (passNum == 0) {
7536b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                            numTiles++;
7546b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                        } else {
7556b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                            CharSequence label = res.getString(
7566b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                                    R.string.wallpaper_accessibility_name, ++tileIndex, numTiles);
7576b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                            info.onIndexUpdated(label);
7586b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                        }
7596b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                    }
7606b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka                }
7616b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka            }
7626b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        }
7636b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka    }
7646b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka
7651e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    private static Point getDefaultThumbnailSize(Resources res) {
7661e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return new Point(res.getDimensionPixelSize(R.dimen.wallpaperThumbnailWidth),
7671e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                res.getDimensionPixelSize(R.dimen.wallpaperThumbnailHeight));
7681e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
7691e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
7701e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
7711e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    private static Bitmap createThumbnail(Point size, Context context, Uri uri, byte[] imageBytes,
7728713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            Resources res, int resId, int rotation, boolean leftAligned) {
7731e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        int width = size.x;
7741e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        int height = size.y;
775be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
776be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        BitmapCropTask cropTask;
777be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        if (uri != null) {
7788713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            cropTask = new BitmapCropTask(
7798713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    context, uri, null, rotation, width, height, false, true, null);
7801e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        } else if (imageBytes != null) {
7818713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            cropTask = new BitmapCropTask(
7828713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    imageBytes, null, rotation, width, height, false, true, null);
7831e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }  else {
7848713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            cropTask = new BitmapCropTask(
7858713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    context, res, resId, null, rotation, width, height, false, true, null);
786be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
787be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        Point bounds = cropTask.getImageBounds();
788db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        if (bounds == null || bounds.x == 0 || bounds.y == 0) {
789be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            return null;
790be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
791be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
7928713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        Matrix rotateMatrix = new Matrix();
7938713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotateMatrix.setRotate(rotation);
7948713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        float[] rotatedBounds = new float[] { bounds.x, bounds.y };
7958713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotateMatrix.mapPoints(rotatedBounds);
7968713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotatedBounds[0] = Math.abs(rotatedBounds[0]);
7978713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        rotatedBounds[1] = Math.abs(rotatedBounds[1]);
7988713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka
799be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        RectF cropRect = WallpaperCropActivity.getMaxCropRect(
8008713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                (int) rotatedBounds[0], (int) rotatedBounds[1], width, height, leftAligned);
801be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        cropTask.setCropBounds(cropRect);
802be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
803be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        if (cropTask.cropBitmap()) {
804be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            return cropTask.getCroppedBitmap();
805be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        } else {
806be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka            return null;
807be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        }
808be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
809be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
8101b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi    private void addTemporaryWallpaperTile(final Uri uri, boolean fromRestore) {
811be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        mTempWallpaperTiles.add(uri);
812be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        // Add a tile for the image picked from Gallery
813619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        final FrameLayout pickedImageThumbnail = (FrameLayout) getLayoutInflater().
814be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka                inflate(R.layout.wallpaper_picker_item, mWallpapersView, false);
815619a180be5a67f5bcd7021d300bd35e8b5296e7fMichael Jurka        pickedImageThumbnail.setVisibility(View.GONE);
816be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        setWallpaperItemPaddingToZero(pickedImageThumbnail);
817862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        mWallpapersView.addView(pickedImageThumbnail, 0);
818be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
819be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        // Load the thumbnail
820862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        final ImageView image = (ImageView) pickedImageThumbnail.findViewById(R.id.wallpaper_image);
821862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        final Point defaultSize = getDefaultThumbnailSize(this.getResources());
822862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        final Context context = this;
823862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        new AsyncTask<Void, Bitmap, Bitmap>() {
824862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            protected Bitmap doInBackground(Void...args) {
825862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                int rotation = WallpaperCropActivity.getRotationFromExif(context, uri);
826862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                return createThumbnail(defaultSize, context, uri, null, null, 0, rotation, false);
827862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka
828862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            }
829862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            protected void onPostExecute(Bitmap thumb) {
830862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                if (thumb != null) {
831862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    image.setImageBitmap(thumb);
832862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    Drawable thumbDrawable = image.getDrawable();
833862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    thumbDrawable.setDither(true);
8341b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                    pickedImageThumbnail.setVisibility(View.VISIBLE);
835862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                } else {
836862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                    Log.e(TAG, "Error loading thumbnail for uri=" + uri);
837862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka                }
838862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka            }
839862f7e395004b00d871cbe507fd5f2a70c797ef7Michael Jurka        }.execute();
840be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
8411e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        UriWallpaperInfo info = new UriWallpaperInfo(uri);
8421e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        pickedImageThumbnail.setTag(info);
8436b783a06d2f4c169b0b6988740297e93393ec430Michael Jurka        info.setView(pickedImageThumbnail);
8448713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka        addLongPressHandler(pickedImageThumbnail);
8457b715496b01ee1f572dd1830ab69101c479bc9abMichael Jurka        updateTileIndices();
846be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        pickedImageThumbnail.setOnClickListener(mThumbnailOnClickListener);
8471b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        if (!fromRestore) {
8481b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi            mThumbnailOnClickListener.onClick(pickedImageThumbnail);
8491b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi        }
850be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
851be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
852be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
853be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        if (requestCode == IMAGE_PICK && resultCode == RESULT_OK) {
8542fe1530ce9ab8c8a48aed7df62c771e774df23a7Michael Jurka            if (data != null && data.getData() != null) {
8552fe1530ce9ab8c8a48aed7df62c771e774df23a7Michael Jurka                Uri uri = data.getData();
8561b921efc84e09e39ec5d2bd114ec919dfe2a79f0Jorim Jaggi                addTemporaryWallpaperTile(uri, false);
8572fe1530ce9ab8c8a48aed7df62c771e774df23a7Michael Jurka            }
8582d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        } else if (requestCode == PICK_WALLPAPER_THIRD_PARTY_ACTIVITY) {
8592d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            setResult(RESULT_OK);
8602d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka            finish();
861998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka        } else if (requestCode == PICK_LIVE_WALLPAPER) {
862998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            WallpaperManager wm = WallpaperManager.getInstance(this);
863998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            final WallpaperInfo oldLiveWallpaper = mLiveWallpaperInfoOnPickerLaunch;
864ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek            final WallpaperInfo clickedWallpaper = mLastClickedLiveWallpaperInfo;
865998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            WallpaperInfo newLiveWallpaper = wm.getWallpaperInfo();
866998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            // Try to figure out if a live wallpaper was set;
867998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            if (newLiveWallpaper != null &&
868ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                    (oldLiveWallpaper == null
869ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            || !oldLiveWallpaper.getComponent()
870ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                    .equals(newLiveWallpaper.getComponent())
871ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                            || clickedWallpaper.getComponent()
872ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek                                    .equals(oldLiveWallpaper.getComponent()))) {
873998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                // Return if a live wallpaper was set
874998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                setResult(RESULT_OK);
875998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka                finish();
876998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka            }
8772d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka        }
8782d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka    }
8792d8de5845be5f49d3767b8354f0d5479a0715abeMichael Jurka
880998e4ff3dca60d65e94fa2ec4a35cb258124318bMichael Jurka    static void setWallpaperItemPaddingToZero(FrameLayout frameLayout) {
881104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        frameLayout.setPadding(0, 0, 0, 0);
882104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        frameLayout.setForeground(new ZeroPaddingDrawable(frameLayout.getForeground()));
883104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
884104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
885be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    private void addLongPressHandler(View v) {
886be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka        v.setOnLongClickListener(mLongClickListener);
887be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka    }
888be2f8ddd8067d0da71e2d03e42bcad17f9430439Michael Jurka
8891e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    private ArrayList<ResourceWallpaperInfo> findBundledWallpapers() {
8901e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        ArrayList<ResourceWallpaperInfo> bundledWallpapers =
8911e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                new ArrayList<ResourceWallpaperInfo>(24);
892104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
893eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        Pair<ApplicationInfo, Integer> r = getWallpaperArrayResourceId();
894eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        if (r != null) {
895eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            try {
8961e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                Resources wallpaperRes = getPackageManager().getResourcesForApplication(r.first);
8971e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                bundledWallpapers = addWallpapers(wallpaperRes, r.first.packageName, r.second);
898eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            } catch (PackageManager.NameNotFoundException e) {
899eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            }
900eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        }
901db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka
902db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        // Add an entry for the default wallpaper (stored in system resources)
90312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
90412ca6134bf818c7c28062aefa40281449042889aMichael Jurka            ResourceWallpaperInfo defaultWallpaperInfo = getPreKKDefaultWallpaperInfo();
90512ca6134bf818c7c28062aefa40281449042889aMichael Jurka            if (defaultWallpaperInfo != null) {
90612ca6134bf818c7c28062aefa40281449042889aMichael Jurka                bundledWallpapers.add(0, defaultWallpaperInfo);
90712ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
908db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        }
9091e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return bundledWallpapers;
910eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    }
911eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka
91212ca6134bf818c7c28062aefa40281449042889aMichael Jurka    private boolean writeImageToFileAsJpeg(File f, Bitmap b) {
91312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        try {
91412ca6134bf818c7c28062aefa40281449042889aMichael Jurka            f.createNewFile();
91512ca6134bf818c7c28062aefa40281449042889aMichael Jurka            FileOutputStream thumbFileStream =
91612ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    openFileOutput(f.getName(), Context.MODE_PRIVATE);
91712ca6134bf818c7c28062aefa40281449042889aMichael Jurka            b.compress(Bitmap.CompressFormat.JPEG, 95, thumbFileStream);
91812ca6134bf818c7c28062aefa40281449042889aMichael Jurka            thumbFileStream.close();
91912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return true;
92012ca6134bf818c7c28062aefa40281449042889aMichael Jurka        } catch (IOException e) {
92112ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Log.e(TAG, "Error while writing bitmap to file " + e);
92212ca6134bf818c7c28062aefa40281449042889aMichael Jurka            f.delete();
92312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
92412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        return false;
92512ca6134bf818c7c28062aefa40281449042889aMichael Jurka    }
92612ca6134bf818c7c28062aefa40281449042889aMichael Jurka
92712ca6134bf818c7c28062aefa40281449042889aMichael Jurka    private ResourceWallpaperInfo getPreKKDefaultWallpaperInfo() {
928db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        Resources sysRes = Resources.getSystem();
929db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        int resId = sysRes.getIdentifier("default_wallpaper", "drawable", "android");
930db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka
93112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        File defaultThumbFile = new File(getFilesDir(), DEFAULT_WALLPAPER_THUMBNAIL_FILENAME);
932db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        Bitmap thumb = null;
933db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        boolean defaultWallpaperExists = false;
934db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        if (defaultThumbFile.exists()) {
935db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
936db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            defaultWallpaperExists = true;
937db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        } else {
9388713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            Resources res = getResources();
9398713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            Point defaultThumbSize = getDefaultThumbnailSize(res);
9408713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            int rotation = WallpaperCropActivity.getRotationFromExif(res, resId);
9418713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka            thumb = createThumbnail(
9428713a94562c535bd2cc7d72e767caf9468d7bbaaMichael Jurka                    defaultThumbSize, this, null, null, sysRes, resId, rotation, false);
943db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            if (thumb != null) {
94412ca6134bf818c7c28062aefa40281449042889aMichael Jurka                defaultWallpaperExists = writeImageToFileAsJpeg(defaultThumbFile, thumb);
945db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            }
946db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        }
947db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        if (defaultWallpaperExists) {
948db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka            return new ResourceWallpaperInfo(sysRes, resId, new BitmapDrawable(thumb));
949db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        }
950db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka        return null;
951db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka    }
952db84e82a0a098c821b7a4f419293770277a24a34Michael Jurka
95312ca6134bf818c7c28062aefa40281449042889aMichael Jurka    private DefaultWallpaperInfo getDefaultWallpaper() {
95412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        File defaultThumbFile = new File(getFilesDir(), DEFAULT_WALLPAPER_THUMBNAIL_FILENAME);
95512ca6134bf818c7c28062aefa40281449042889aMichael Jurka        Bitmap thumb = null;
95612ca6134bf818c7c28062aefa40281449042889aMichael Jurka        boolean defaultWallpaperExists = false;
95712ca6134bf818c7c28062aefa40281449042889aMichael Jurka        if (defaultThumbFile.exists()) {
95812ca6134bf818c7c28062aefa40281449042889aMichael Jurka            thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
95912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            defaultWallpaperExists = true;
96012ca6134bf818c7c28062aefa40281449042889aMichael Jurka        } else {
961a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka            // Delete old thumbnail file, since we had a bug where the thumbnail wasn't being drawn
962a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka            // before
963a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka            new File(getFilesDir(), OLD_DEFAULT_WALLPAPER_THUMBNAIL_FILENAME).delete();
964a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka
96512ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Resources res = getResources();
96612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Point defaultThumbSize = getDefaultThumbnailSize(res);
96712ca6134bf818c7c28062aefa40281449042889aMichael Jurka            Drawable wallpaperDrawable = WallpaperManager.getInstance(this).getBuiltInDrawable(
96812ca6134bf818c7c28062aefa40281449042889aMichael Jurka                    defaultThumbSize.x, defaultThumbSize.y, true, 0.5f, 0.5f);
96912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            if (wallpaperDrawable != null) {
97012ca6134bf818c7c28062aefa40281449042889aMichael Jurka                thumb = Bitmap.createBitmap(
97112ca6134bf818c7c28062aefa40281449042889aMichael Jurka                        defaultThumbSize.x, defaultThumbSize.y, Bitmap.Config.ARGB_8888);
97212ca6134bf818c7c28062aefa40281449042889aMichael Jurka                Canvas c = new Canvas(thumb);
973a7d82b939c334c096c547d04e16a63f49e719ba0Michael Jurka                wallpaperDrawable.setBounds(0, 0, defaultThumbSize.x, defaultThumbSize.y);
97412ca6134bf818c7c28062aefa40281449042889aMichael Jurka                wallpaperDrawable.draw(c);
97512ca6134bf818c7c28062aefa40281449042889aMichael Jurka                c.setBitmap(null);
97612ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
97712ca6134bf818c7c28062aefa40281449042889aMichael Jurka            if (thumb != null) {
97812ca6134bf818c7c28062aefa40281449042889aMichael Jurka                defaultWallpaperExists = writeImageToFileAsJpeg(defaultThumbFile, thumb);
97912ca6134bf818c7c28062aefa40281449042889aMichael Jurka            }
98012ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
98112ca6134bf818c7c28062aefa40281449042889aMichael Jurka        if (defaultWallpaperExists) {
98212ca6134bf818c7c28062aefa40281449042889aMichael Jurka            return new DefaultWallpaperInfo(new BitmapDrawable(thumb));
98312ca6134bf818c7c28062aefa40281449042889aMichael Jurka        }
98412ca6134bf818c7c28062aefa40281449042889aMichael Jurka        return null;
98512ca6134bf818c7c28062aefa40281449042889aMichael Jurka    }
98612ca6134bf818c7c28062aefa40281449042889aMichael Jurka
987eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public Pair<ApplicationInfo, Integer> getWallpaperArrayResourceId() {
988104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // Context.getPackageName() may return the "original" package name,
989104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // com.android.launcher3; Resources needs the real package name,
990104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // com.android.launcher3. So we ask Resources for what it thinks the
991104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        // package name should be.
992eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        final String packageName = getResources().getResourcePackageName(R.array.wallpapers);
993eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        try {
994eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            ApplicationInfo info = getPackageManager().getApplicationInfo(packageName, 0);
995eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            return new Pair<ApplicationInfo, Integer>(info, R.array.wallpapers);
996eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        } catch (PackageManager.NameNotFoundException e) {
997eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            return null;
998eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        }
999104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
1000104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10011e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    private ArrayList<ResourceWallpaperInfo> addWallpapers(
10021e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            Resources res, String packageName, int listResId) {
10031e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        ArrayList<ResourceWallpaperInfo> bundledWallpapers =
10041e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                new ArrayList<ResourceWallpaperInfo>(24);
10051e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        final String[] extras = res.getStringArray(listResId);
1006104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        for (String extra : extras) {
10071e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            int resId = res.getIdentifier(extra, "drawable", packageName);
10081e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            if (resId != 0) {
10091e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                final int thumbRes = res.getIdentifier(extra + "_small", "drawable", packageName);
1010104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1011104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                if (thumbRes != 0) {
10121e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    ResourceWallpaperInfo wallpaperInfo =
10131e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                            new ResourceWallpaperInfo(res, resId, res.getDrawable(thumbRes));
10141e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                    bundledWallpapers.add(wallpaperInfo);
1015104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                    // Log.d(TAG, "add: [" + packageName + "]: " + extra + " (" + res + ")");
1016104c45677660586026a7e74ef8c47d396403d50eMichael Jurka                }
10176218e5b73757c26cd4b3e4867db34350171e9ed5Michael Jurka            } else {
10186218e5b73757c26cd4b3e4867db34350171e9ed5Michael Jurka                Log.e(TAG, "Couldn't find wallpaper " + extra);
1019104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            }
1020104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
10211e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return bundledWallpapers;
10221e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
10231e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
10241e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public CropView getCropView() {
10251e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return mCropView;
10261e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
10271e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
10281e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public SavedWallpaperImages getSavedImages() {
10291e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return mSavedImages;
10301e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
10311e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
1032ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek    public void onLiveWallpaperPickerLaunch(WallpaperInfo info) {
1033ffed65886ecd83f52dc1c052897511c95a5f371aSelim Cinek        mLastClickedLiveWallpaperInfo = info;
10341e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        mLiveWallpaperInfoOnPickerLaunch = WallpaperManager.getInstance(this).getWallpaperInfo();
1035104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
1036104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1037104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    static class ZeroPaddingDrawable extends LevelListDrawable {
1038104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public ZeroPaddingDrawable(Drawable d) {
1039104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            super();
1040104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            addLevel(0, 0, d);
1041104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            setLevel(0);
1042104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1043104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1044104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        @Override
1045104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public boolean getPadding(Rect padding) {
1046104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            padding.set(0, 0, 0, 0);
1047104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            return true;
1048104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1049104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
1050104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10511e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    private static class BuiltInWallpapersAdapter extends BaseAdapter implements ListAdapter {
1052104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        private LayoutInflater mLayoutInflater;
10531e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        private ArrayList<ResourceWallpaperInfo> mWallpapers;
1054104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10551e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        BuiltInWallpapersAdapter(Activity activity, ArrayList<ResourceWallpaperInfo> wallpapers) {
1056104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            mLayoutInflater = activity.getLayoutInflater();
10571e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            mWallpapers = wallpapers;
1058104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1059104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1060104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public int getCount() {
10611e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            return mWallpapers.size();
1062104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1063104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10641e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        public ResourceWallpaperInfo getItem(int position) {
10651e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            return mWallpapers.get(position);
1066104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1067104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1068104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public long getItemId(int position) {
1069104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            return position;
1070104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
1071104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
1072104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        public View getView(int position, View convertView, ViewGroup parent) {
10731e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            Drawable thumb = mWallpapers.get(position).mThumb;
10741e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            if (thumb == null) {
10751e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka                Log.e(TAG, "Error decoding thumbnail for wallpaper #" + position);
1076104c45677660586026a7e74ef8c47d396403d50eMichael Jurka            }
10771e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            return createImageTileView(mLayoutInflater, position, convertView, parent, thumb);
10781e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
10791e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    }
1080104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10811e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka    public static View createImageTileView(LayoutInflater layoutInflater, int position,
10821e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            View convertView, ViewGroup parent, Drawable thumb) {
10831e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        View view;
1084104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10851e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        if (convertView == null) {
10861e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            view = layoutInflater.inflate(R.layout.wallpaper_picker_item, parent, false);
10871e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        } else {
10881e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            view = convertView;
10891e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        }
1090104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10911e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        setWallpaperItemPaddingToZero((FrameLayout) view);
1092104c45677660586026a7e74ef8c47d396403d50eMichael Jurka
10931e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        ImageView image = (ImageView) view.findViewById(R.id.wallpaper_image);
10941e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
10951e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        if (thumb != null) {
10961e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            image.setImageDrawable(thumb);
10971e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka            thumb.setDither(true);
1098104c45677660586026a7e74ef8c47d396403d50eMichael Jurka        }
10991e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka
11001e4e6ddb38d0b867d0564be834f3425ed53d46e1Michael Jurka        return view;
1101104c45677660586026a7e74ef8c47d396403d50eMichael Jurka    }
11027ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka
11037ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    // In Launcher3, we override this with a method that catches exceptions
11047ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    // from starting activities; didn't want to copy and paste code into here
11057ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    public void startActivityForResultSafely(Intent intent, int requestCode) {
11067ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka        startActivityForResult(intent, requestCode);
11077ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka    }
1108104c45677660586026a7e74ef8c47d396403d50eMichael Jurka}
1109