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