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