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