WallpaperChooser.java revision cd5d807f53d9bca006dfc9f46d83497c27e89227
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/* 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License. 631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at 731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and 1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License. 1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2; 1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.app.Activity; 20cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.app.AlertDialog; 21cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.app.Dialog; 22cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.app.DialogFragment; 23cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.app.FragmentTransaction; 24107f839cdf5f159703017319ee231da9118df91eDianne Hackbornimport android.app.WallpaperManager; 25cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.content.Context; 26cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.content.DialogInterface; 271b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.content.res.Resources; 281b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.graphics.BitmapFactory; 291b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.graphics.Bitmap; 301b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.graphics.drawable.Drawable; 3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.os.Bundle; 328c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guyimport android.os.AsyncTask; 3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.Log; 3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.LayoutInflater; 3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View; 3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.ViewGroup; 3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View.OnClickListener; 3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.AdapterView; 3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.BaseAdapter; 4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.Gallery; 41cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.widget.GridView; 4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.ImageView; 43cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.widget.ListAdapter; 44cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskiimport android.widget.SpinnerAdapter; 4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.io.IOException; 4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.ArrayList; 4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 49edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guyimport com.android.launcher.R; 50edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy 51cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinskipublic class WallpaperChooser extends Activity { 52a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato private static final String TAG = "Launcher.WallpaperChooser"; 5331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 54cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski private ViewGroup mWallpaperChooserBase; 55cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski private ImageView mImageView = null; 56cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski private Bitmap mBitmap = null; 5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private ArrayList<Integer> mThumbs; 5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private ArrayList<Integer> mImages; 60e82140fe200513ea820f0f95463c6230868ded9dRomain Guy private WallpaperLoader mLoader; 6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onCreate(Bundle icicle) { 6431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onCreate(icicle); 65cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski /* We need some container to attach to in order for the fragment to be 66cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski * considered embedded, so inflate an empty FrameLayout and use that 67cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski * as the parent view 68cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski */ 69cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski setContentView(R.layout.wallpaper_chooser_base); 70cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mWallpaperChooserBase = (ViewGroup) findViewById(R.id.wallpaper_chooser_base); 7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project findWallpapers(); 7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 74cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski DialogFragment newFragment = new WallpaperDialogFragment(this); 75cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski if (LauncherApplication.isScreenXLarge()) { 76cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski // Display a dialog instead of embedding the view in the activity 77cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski newFragment.show(getFragmentManager(), "dialog"); 78cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } else { 79cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski // Embed the fragment in the base view 80cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski FragmentTransaction ft = getFragmentManager().openTransaction(); 81cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski ft.add(R.id.wallpaper_chooser_base, newFragment); 82cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski ft.commit(); 83cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 84cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 8531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 86cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 87cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski protected void onDestroy() { 88cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski super.onDestroy(); 8931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 90cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) { 91cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mLoader.cancel(true); 92cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mLoader = null; 93cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 9431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 9531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 9631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private void findWallpapers() { 978eb509596bb011ca058f811fbc16602b7846c441Romain Guy mThumbs = new ArrayList<Integer>(24); 988eb509596bb011ca058f811fbc16602b7846c441Romain Guy mImages = new ArrayList<Integer>(24); 9931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 10031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final Resources resources = getResources(); 10176c0e1408b059a8f7f2e76327f4943c3e1b11f41Daniel Sandler // Context.getPackageName() may return the "original" package name, 10276c0e1408b059a8f7f2e76327f4943c3e1b11f41Daniel Sandler // com.android.launcher2; Resources needs the real package name, 10376c0e1408b059a8f7f2e76327f4943c3e1b11f41Daniel Sandler // com.android.launcher. So we ask Resources for what it thinks the 10476c0e1408b059a8f7f2e76327f4943c3e1b11f41Daniel Sandler // package name should be. 10576c0e1408b059a8f7f2e76327f4943c3e1b11f41Daniel Sandler final String packageName = resources.getResourcePackageName(R.array.wallpapers); 10631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1078eb509596bb011ca058f811fbc16602b7846c441Romain Guy addWallpapers(resources, packageName, R.array.wallpapers); 1088eb509596bb011ca058f811fbc16602b7846c441Romain Guy addWallpapers(resources, packageName, R.array.extra_wallpapers); 1098eb509596bb011ca058f811fbc16602b7846c441Romain Guy } 1108eb509596bb011ca058f811fbc16602b7846c441Romain Guy 1118eb509596bb011ca058f811fbc16602b7846c441Romain Guy private void addWallpapers(Resources resources, String packageName, int list) { 1128eb509596bb011ca058f811fbc16602b7846c441Romain Guy final String[] extras = resources.getStringArray(list); 11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (String extra : extras) { 11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int res = resources.getIdentifier(extra, "drawable", packageName); 11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (res != 0) { 11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int thumbRes = resources.getIdentifier(extra + "_small", 11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project "drawable", packageName); 11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (thumbRes != 0) { 12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mThumbs.add(thumbRes); 12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mImages.add(res); 12276c0e1408b059a8f7f2e76327f4943c3e1b11f41Daniel Sandler // Log.d(TAG, "addWallpapers: [" + packageName + "]: " + extra + " (" + res + ")"); 12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 12431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 12631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 12731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private void selectWallpaper(int position) { 12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project try { 1308eb509596bb011ca058f811fbc16602b7846c441Romain Guy WallpaperManager wpm = (WallpaperManager)getSystemService(WALLPAPER_SERVICE); 131642718023708403590838f4dc540e9b7971fd0b3Dianne Hackborn wpm.setResource(mImages.get(position)); 13231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project setResult(RESULT_OK); 13331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project finish(); 13431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } catch (IOException e) { 135a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato Log.e(TAG, "Failed to set wallpaper: " + e); 13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 13831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 139cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski private class WallpaperDialogFragment extends DialogFragment implements 140cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski AdapterView.OnItemSelectedListener, AdapterView.OnItemClickListener { 141cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski private Context mContext; 142cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 143cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public WallpaperDialogFragment(Context context) { 144cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski super(); 145cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mContext = context; 146cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski setCancelable(true); 147cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 148cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 149cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 150cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public void onDismiss(DialogInterface dialog) { 151cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski WallpaperChooser.this.finish(); 152cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 153cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 154cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski /* This will only be called when in XLarge mode, since this Fragment is invoked like 155cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski * a dialog in that mode 156cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski */ 157cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 158cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public Dialog onCreateDialog(Bundle savedInstanceState) { 159cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski final View v = getLayoutInflater().inflate( 160cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski R.layout.wallpaper_chooser, mWallpaperChooserBase, false); 161cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 162cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski GridView gridView = (GridView) v.findViewById(R.id.gallery); 163cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski gridView.setOnItemClickListener(this); 164cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski gridView.setAdapter(new ImageAdapter(WallpaperChooser.this)); 165cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 166cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski final int viewInset = 167cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_inset); 168cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 169cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 170cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski builder.setCancelable(true); 171cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski builder.setNegativeButton(R.string.wallpaper_cancel, null); 172cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski builder.setTitle(R.string.pick_wallpaper); 173cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski builder.setView(gridView, viewInset, viewInset, viewInset, viewInset); 174cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski return builder.create(); 175cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 176cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 177cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski /* This will be called on both XLarge and small screens, but since the dialog 178cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski * is already created on XLarge, we want to skip this view creation 179cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski */ 180cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 181cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public View onCreateView(LayoutInflater inflater, ViewGroup container, 182cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski Bundle savedInstanceState) { 183cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski /* Only generate a custom view if this fragment is being embedded in a view, 184cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski * i.e: on a small screen 185cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski */ 186cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski if (!LauncherApplication.isScreenXLarge()) { 187cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski View view = inflater.inflate(R.layout.wallpaper_chooser, container, false); 188cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 189cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski final Gallery gallery = (Gallery) view.findViewById(R.id.gallery); 190cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski gallery.setCallbackDuringFling(false); 191cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski gallery.setOnItemSelectedListener(this); 192cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski gallery.setAdapter(new ImageAdapter(WallpaperChooser.this)); 193cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 194cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski View setButton = view.findViewById(R.id.set); 195cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski setButton.setOnClickListener(new OnClickListener() { 196cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 197cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public void onClick(View v) { 198cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski selectWallpaper(gallery.getSelectedItemPosition()); 199cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 200cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski }); 201cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mImageView = (ImageView) view.findViewById(R.id.wallpaper); 202cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski return view; 203cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 204cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski return super.onCreateView(inflater, container, savedInstanceState); 205cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 206cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 207cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski // Click handler for the Dialog's GridView 208cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 209cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 210cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski selectWallpaper(position); 211cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 212cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 213cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski // Selection handler for the embedded Gallery view 214cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 215cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 216cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) { 217cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mLoader.cancel(); 218cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 219cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mLoader = (WallpaperLoader) new WallpaperLoader().execute(position); 220cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 221cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 222cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 223cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski public void onNothingSelected(AdapterView<?> parent) { 224cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 22531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 22631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 227cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski private class ImageAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter { 22831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private LayoutInflater mLayoutInflater; 22931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 23031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ImageAdapter(WallpaperChooser context) { 23131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mLayoutInflater = context.getLayoutInflater(); 23231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 23331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 23431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public int getCount() { 23531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return mThumbs.size(); 23631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 23731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 23831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public Object getItem(int position) { 23931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return position; 24031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 24131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 24231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public long getItemId(int position) { 24331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return position; 24431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 24531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 24631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 24731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ImageView image; 24831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 24931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (convertView == null) { 25031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project image = (ImageView) mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false); 25131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 25231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project image = (ImageView) convertView; 25331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 254cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 2551325f557bb2646cbaf00ed7d1de42b47cf59b895Daniel Sandler int thumbRes = mThumbs.get(position); 2561325f557bb2646cbaf00ed7d1de42b47cf59b895Daniel Sandler image.setImageResource(thumbRes); 2571325f557bb2646cbaf00ed7d1de42b47cf59b895Daniel Sandler Drawable thumbDrawable = image.getDrawable(); 2581325f557bb2646cbaf00ed7d1de42b47cf59b895Daniel Sandler if (thumbDrawable != null) { 2591325f557bb2646cbaf00ed7d1de42b47cf59b895Daniel Sandler thumbDrawable.setDither(true); 2601325f557bb2646cbaf00ed7d1de42b47cf59b895Daniel Sandler } else { 261a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato Log.e(TAG, "Error decoding thumbnail resId=" + thumbRes + " for wallpaper #" 262a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato + position); 2631325f557bb2646cbaf00ed7d1de42b47cf59b895Daniel Sandler } 264cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 26531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return image; 26631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 26731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 26831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2698c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy class WallpaperLoader extends AsyncTask<Integer, Void, Bitmap> { 270e82140fe200513ea820f0f95463c6230868ded9dRomain Guy BitmapFactory.Options mOptions; 271e82140fe200513ea820f0f95463c6230868ded9dRomain Guy 272e82140fe200513ea820f0f95463c6230868ded9dRomain Guy WallpaperLoader() { 273e82140fe200513ea820f0f95463c6230868ded9dRomain Guy mOptions = new BitmapFactory.Options(); 274e82140fe200513ea820f0f95463c6230868ded9dRomain Guy mOptions.inDither = false; 275e82140fe200513ea820f0f95463c6230868ded9dRomain Guy mOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; 276e82140fe200513ea820f0f95463c6230868ded9dRomain Guy } 277cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 278cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski @Override 2798c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy protected Bitmap doInBackground(Integer... params) { 2808c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy if (isCancelled()) return null; 281e82140fe200513ea820f0f95463c6230868ded9dRomain Guy try { 282e82140fe200513ea820f0f95463c6230868ded9dRomain Guy return BitmapFactory.decodeResource(getResources(), 283e82140fe200513ea820f0f95463c6230868ded9dRomain Guy mImages.get(params[0]), mOptions); 284e82140fe200513ea820f0f95463c6230868ded9dRomain Guy } catch (OutOfMemoryError e) { 285e82140fe200513ea820f0f95463c6230868ded9dRomain Guy return null; 286e82140fe200513ea820f0f95463c6230868ded9dRomain Guy } 2878c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy } 2888c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy 2898c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy @Override 2908c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy protected void onPostExecute(Bitmap b) { 2918c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy if (b == null) return; 2928c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy 293e82140fe200513ea820f0f95463c6230868ded9dRomain Guy if (!isCancelled() && !mOptions.mCancel) { 2948c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy // Help the GC 2958c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy if (mBitmap != null) { 2968c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy mBitmap.recycle(); 2978c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy } 298cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 299cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski // This should always be the case, but check anyways 3008c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy final ImageView view = mImageView; 301cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski if (view != null) { 302cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski view.setImageBitmap(b); 303cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 304cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski mBitmap = b; 305cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 306cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski final Drawable drawable = view.getDrawable(); 307cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski drawable.setFilterBitmap(true); 308cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski drawable.setDither(true); 309cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski 310cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski view.postInvalidate(); 311cd5d807f53d9bca006dfc9f46d83497c27e89227Adam Lesinski } 3124e55c778463c11d1c9bbdaa70714d4e4b5de662cRomain Guy 3134e55c778463c11d1c9bbdaa70714d4e4b5de662cRomain Guy mLoader = null; 3144e55c778463c11d1c9bbdaa70714d4e4b5de662cRomain Guy } else { 3154e55c778463c11d1c9bbdaa70714d4e4b5de662cRomain Guy b.recycle(); 3168c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy } 3178c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy } 318e82140fe200513ea820f0f95463c6230868ded9dRomain Guy 319e82140fe200513ea820f0f95463c6230868ded9dRomain Guy void cancel() { 320e82140fe200513ea820f0f95463c6230868ded9dRomain Guy mOptions.requestCancelDecode(); 321e82140fe200513ea820f0f95463c6230868ded9dRomain Guy super.cancel(true); 322e82140fe200513ea820f0f95463c6230868ded9dRomain Guy } 3238c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy } 32431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 325