WallpaperChooser.java revision 8c724f568c92f2a60c28fdbed8fa72715d270ad9
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;
20107f839cdf5f159703017319ee231da9118df91eDianne Hackbornimport android.app.WallpaperManager;
211b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.content.res.Resources;
221b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.graphics.BitmapFactory;
231b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.graphics.Bitmap;
241b12645748c88076e2a124d5bc5550c65bf11cd0Joe Onoratoimport android.graphics.drawable.Drawable;
2531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.os.Bundle;
268c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guyimport android.os.AsyncTask;
2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.Log;
2831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.LayoutInflater;
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View;
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.ViewGroup;
3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.Window;
3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View.OnClickListener;
3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.AdapterView;
3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.BaseAdapter;
3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.Gallery;
3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.ImageView;
3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.io.IOException;
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.ArrayList;
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectpublic class WallpaperChooser extends Activity implements AdapterView.OnItemSelectedListener,
4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        OnClickListener {
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private Gallery mGallery;
4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private ImageView mImageView;
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private boolean mIsWallpaperSet;
4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private BitmapFactory.Options mOptions;
4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private Bitmap mBitmap;
5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private ArrayList<Integer> mThumbs;
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private ArrayList<Integer> mImages;
538c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy    private AsyncTask<Integer,Void,Bitmap> mLoader;
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
5631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onCreate(Bundle icicle) {
5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super.onCreate(icicle);
5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        requestWindowFeature(Window.FEATURE_NO_TITLE);
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        findWallpapers();
6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        setContentView(R.layout.wallpaper_chooser);
6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mGallery = (Gallery) findViewById(R.id.gallery);
6531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mGallery.setAdapter(new ImageAdapter(this));
6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mGallery.setOnItemSelectedListener(this);
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mGallery.setCallbackDuringFling(false);
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
698c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        findViewById(R.id.set).setOnClickListener(this);
7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mImageView = (ImageView) findViewById(R.id.wallpaper);
7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private void findWallpapers() {
758eb509596bb011ca058f811fbc16602b7846c441Romain Guy        mThumbs = new ArrayList<Integer>(24);
768eb509596bb011ca058f811fbc16602b7846c441Romain Guy        mImages = new ArrayList<Integer>(24);
7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        final Resources resources = getResources();
7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        final String packageName = getApplication().getPackageName();
8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
818eb509596bb011ca058f811fbc16602b7846c441Romain Guy        addWallpapers(resources, packageName, R.array.wallpapers);
828eb509596bb011ca058f811fbc16602b7846c441Romain Guy        addWallpapers(resources, packageName, R.array.extra_wallpapers);
838eb509596bb011ca058f811fbc16602b7846c441Romain Guy    }
848eb509596bb011ca058f811fbc16602b7846c441Romain Guy
858eb509596bb011ca058f811fbc16602b7846c441Romain Guy    private void addWallpapers(Resources resources, String packageName, int list) {
868eb509596bb011ca058f811fbc16602b7846c441Romain Guy        final String[] extras = resources.getStringArray(list);
8731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        for (String extra : extras) {
8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            int res = resources.getIdentifier(extra, "drawable", packageName);
8931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (res != 0) {
9031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                final int thumbRes = resources.getIdentifier(extra + "_small",
9131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                        "drawable", packageName);
9231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
9331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                if (thumbRes != 0) {
9431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    mThumbs.add(thumbRes);
9531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    mImages.add(res);
9631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                }
9731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
9831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
9931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
10031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
10131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
10231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected void onResume() {
10331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super.onResume();
10431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mIsWallpaperSet = false;
10531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
10631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
10731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onItemSelected(AdapterView parent, View v, int position, long id) {
1088c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
1098c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy            mLoader.cancel(true);
11031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
1118c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        mLoader = new WallpaperLoader().execute(position);
11231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /*
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * When using touch if you tap an image it triggers both the onItemClick and
11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * the onTouchEvent causing the wallpaper to be set twice. Ensure we only
11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * set the wallpaper once.
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private void selectWallpaper(int position) {
12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (mIsWallpaperSet) {
12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return;
12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
12431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mIsWallpaperSet = true;
12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        try {
1268eb509596bb011ca058f811fbc16602b7846c441Romain Guy            WallpaperManager wpm = (WallpaperManager)getSystemService(WALLPAPER_SERVICE);
127642718023708403590838f4dc540e9b7971fd0b3Dianne Hackborn            wpm.setResource(mImages.get(position));
12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            setResult(RESULT_OK);
12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            finish();
13031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        } catch (IOException e) {
13131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            Log.e(Launcher.LOG_TAG, "Failed to set wallpaper: " + e);
13231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
13331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
13431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onNothingSelected(AdapterView parent) {
13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
13831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private class ImageAdapter extends BaseAdapter {
13931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        private LayoutInflater mLayoutInflater;
14031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
14131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        ImageAdapter(WallpaperChooser context) {
14231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            mLayoutInflater = context.getLayoutInflater();
14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
14431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
14531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        public int getCount() {
14631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return mThumbs.size();
14731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
14831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
14931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        public Object getItem(int position) {
15031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return position;
15131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
15231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
15331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        public long getItemId(int position) {
15431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return position;
15531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
15631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
15731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
15831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            ImageView image;
15931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
16031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            if (convertView == null) {
16131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                image = (ImageView) mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false);
16231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            } else {
16331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                image = (ImageView) convertView;
16431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
16531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
16631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            image.setImageResource(mThumbs.get(position));
16731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            image.getDrawable().setDither(true);
16831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return image;
16931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
17031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
17131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onClick(View v) {
17331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        selectWallpaper(mGallery.getSelectedItemPosition());
17431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
1758c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy
1768c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy    class WallpaperLoader extends AsyncTask<Integer, Void, Bitmap> {
1778c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        protected Bitmap doInBackground(Integer... params) {
1788c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy            if (isCancelled()) return null;
1798c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy            return BitmapFactory.decodeResource(getResources(), mImages.get(params[0]), null);
1808c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        }
1818c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy
1828c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        @Override
1838c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        protected void onPostExecute(Bitmap b) {
1848c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy            if (b == null) return;
1858c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy
1868c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy            if (!isCancelled()) {
1878c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                // Help the GC
1888c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                if (mBitmap != null) {
1898c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                    mBitmap.recycle();
1908c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                }
1918c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy
1928c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                final ImageView view = mImageView;
1938c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                view.setImageBitmap(b);
1948c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy
1958c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                mBitmap = b;
1968c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy
1978c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                final Drawable drawable = view.getDrawable();
1988c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                drawable.setFilterBitmap(true);
1998c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                drawable.setDither(true);
2008c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy
2018c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy                view.postInvalidate();
2028c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy            }
2038c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy        }
2048c724f568c92f2a60c28fdbed8fa72715d270ad9Romain Guy    }
20531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
206