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