diff options
author | Adam Lesinski <adamlesinski@google.com> | 2010-12-09 21:04:15 -0800 |
---|---|---|
committer | Adam Lesinski <adamlesinski@google.com> | 2010-12-13 14:51:15 -0800 |
commit | 2a898a0ac54beab0ae56c97eeccc017b02d61453 (patch) | |
tree | 72d2baf2f6a815b3ef9024f1020843792159bb62 /src/com/android/launcher2/WallpaperChooser.java | |
parent | 4c4b20f7c356774995f117e3322e7ab5fc0f10f0 (diff) | |
download | android_packages_apps_Trebuchet-2a898a0ac54beab0ae56c97eeccc017b02d61453.tar.gz android_packages_apps_Trebuchet-2a898a0ac54beab0ae56c97eeccc017b02d61453.tar.bz2 android_packages_apps_Trebuchet-2a898a0ac54beab0ae56c97eeccc017b02d61453.zip |
Update Wallpaper picker and fix bug
-Fixed b/3271838
-On a phone, Fragment would not remember its
previous state and crash on rotation
Change-Id: Ida923fba0c7f4622b090e2838fd932328ad68c63
Diffstat (limited to 'src/com/android/launcher2/WallpaperChooser.java')
-rw-r--r-- | src/com/android/launcher2/WallpaperChooser.java | 300 |
1 files changed, 10 insertions, 290 deletions
diff --git a/src/com/android/launcher2/WallpaperChooser.java b/src/com/android/launcher2/WallpaperChooser.java index 0a8d9f417..2311d1e9a 100644 --- a/src/com/android/launcher2/WallpaperChooser.java +++ b/src/com/android/launcher2/WallpaperChooser.java @@ -16,309 +16,29 @@ package com.android.launcher2; +import com.android.launcher.R; + import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; import android.app.DialogFragment; -import android.app.FragmentTransaction; -import android.app.WallpaperManager; -import android.content.Context; -import android.content.DialogInterface; -import android.content.res.Resources; -import android.graphics.BitmapFactory; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; +import android.app.Fragment; import android.os.Bundle; -import android.os.AsyncTask; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.View.OnClickListener; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.Gallery; -import android.widget.GridView; -import android.widget.ImageView; -import android.widget.ListAdapter; -import android.widget.SpinnerAdapter; - -import java.io.IOException; -import java.util.ArrayList; - -import com.android.launcher.R; public class WallpaperChooser extends Activity { private static final String TAG = "Launcher.WallpaperChooser"; - private ViewGroup mWallpaperChooserBase; - private ImageView mImageView = null; - private Bitmap mBitmap = null; - - private ArrayList<Integer> mThumbs; - private ArrayList<Integer> mImages; - private WallpaperLoader mLoader; - @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - /* We need some container to attach to in order for the fragment to be - * considered embedded, so inflate an empty FrameLayout and use that - * as the parent view - */ setContentView(R.layout.wallpaper_chooser_base); - mWallpaperChooserBase = (ViewGroup) findViewById(R.id.wallpaper_chooser_base); - - findWallpapers(); - - DialogFragment newFragment = new WallpaperDialogFragment(this); - if (LauncherApplication.isScreenXLarge()) { - // Display a dialog instead of embedding the view in the activity - newFragment.show(getFragmentManager(), "dialog"); - } else { - // Embed the fragment in the base view - FragmentTransaction ft = getFragmentManager().openTransaction(); - ft.add(R.id.wallpaper_chooser_base, newFragment); - ft.commit(); - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - - if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) { - mLoader.cancel(true); - mLoader = null; - } - } - - private void findWallpapers() { - mThumbs = new ArrayList<Integer>(24); - mImages = new ArrayList<Integer>(24); - - final Resources resources = getResources(); - // Context.getPackageName() may return the "original" package name, - // com.android.launcher2; Resources needs the real package name, - // com.android.launcher. So we ask Resources for what it thinks the - // package name should be. - final String packageName = resources.getResourcePackageName(R.array.wallpapers); - - addWallpapers(resources, packageName, R.array.wallpapers); - addWallpapers(resources, packageName, R.array.extra_wallpapers); - } - - private void addWallpapers(Resources resources, String packageName, int list) { - final String[] extras = resources.getStringArray(list); - for (String extra : extras) { - int res = resources.getIdentifier(extra, "drawable", packageName); - if (res != 0) { - final int thumbRes = resources.getIdentifier(extra + "_small", - "drawable", packageName); - - if (thumbRes != 0) { - mThumbs.add(thumbRes); - mImages.add(res); - // Log.d(TAG, "addWallpapers: [" + packageName + "]: " + extra + " (" + res + ")"); - } - } - } - } - private void selectWallpaper(int position) { - try { - WallpaperManager wpm = (WallpaperManager)getSystemService(WALLPAPER_SERVICE); - wpm.setResource(mImages.get(position)); - setResult(RESULT_OK); - finish(); - } catch (IOException e) { - Log.e(TAG, "Failed to set wallpaper: " + e); - } - } - - private class WallpaperDialogFragment extends DialogFragment implements - AdapterView.OnItemSelectedListener, AdapterView.OnItemClickListener { - private Context mContext; - - public WallpaperDialogFragment(Context context) { - super(); - mContext = context; - setCancelable(true); - } - - @Override - public void onDismiss(DialogInterface dialog) { - WallpaperChooser.this.finish(); - } - - /* This will only be called when in XLarge mode, since this Fragment is invoked like - * a dialog in that mode - */ - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final View v = getLayoutInflater().inflate( - R.layout.wallpaper_chooser, mWallpaperChooserBase, false); - - GridView gridView = (GridView) v.findViewById(R.id.gallery); - gridView.setOnItemClickListener(this); - gridView.setAdapter(new ImageAdapter(WallpaperChooser.this)); - - final int viewInset = - getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_inset); - - AlertDialog.Builder builder = new AlertDialog.Builder(mContext); - builder.setCancelable(true); - builder.setNegativeButton(R.string.wallpaper_cancel, null); - builder.setTitle(R.string.wallpaper_dialog_title); - builder.setView(gridView, viewInset, viewInset, viewInset, viewInset); - return builder.create(); - } - - /* This will be called on both XLarge and small screens, but since the dialog - * is already created on XLarge, we want to skip this view creation - */ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - /* Only generate a custom view if this fragment is being embedded in a view, - * i.e: on a small screen + Fragment fragmentView = + getFragmentManager().findFragmentById(R.id.wallpaper_chooser_fragment); + if (fragmentView == null) { + /* When the screen is XLarge, the fragment is not included in the layout, so show it + * as a dialog */ - if (!LauncherApplication.isScreenXLarge()) { - View view = inflater.inflate(R.layout.wallpaper_chooser, container, false); - - final Gallery gallery = (Gallery) view.findViewById(R.id.gallery); - gallery.setCallbackDuringFling(false); - gallery.setOnItemSelectedListener(this); - gallery.setAdapter(new ImageAdapter(WallpaperChooser.this)); - - View setButton = view.findViewById(R.id.set); - setButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - selectWallpaper(gallery.getSelectedItemPosition()); - } - }); - mImageView = (ImageView) view.findViewById(R.id.wallpaper); - return view; - } - return super.onCreateView(inflater, container, savedInstanceState); - } - - // Click handler for the Dialog's GridView - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - selectWallpaper(position); - } - - // Selection handler for the embedded Gallery view - @Override - public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { - if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) { - mLoader.cancel(); - } - mLoader = (WallpaperLoader) new WallpaperLoader().execute(position); - } - - @Override - public void onNothingSelected(AdapterView<?> parent) { - } - } - - private class ImageAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter { - private LayoutInflater mLayoutInflater; - - ImageAdapter(WallpaperChooser context) { - mLayoutInflater = context.getLayoutInflater(); - } - - public int getCount() { - return mThumbs.size(); - } - - public Object getItem(int position) { - return position; - } - - public long getItemId(int position) { - return position; - } - - public View getView(int position, View convertView, ViewGroup parent) { - ImageView image; - - if (convertView == null) { - image = (ImageView) mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false); - } else { - image = (ImageView) convertView; - } - - int thumbRes = mThumbs.get(position); - image.setImageResource(thumbRes); - Drawable thumbDrawable = image.getDrawable(); - if (thumbDrawable != null) { - thumbDrawable.setDither(true); - } else { - Log.e(TAG, "Error decoding thumbnail resId=" + thumbRes + " for wallpaper #" - + position); - } - - return image; - } - } - - class WallpaperLoader extends AsyncTask<Integer, Void, Bitmap> { - BitmapFactory.Options mOptions; - - WallpaperLoader() { - mOptions = new BitmapFactory.Options(); - mOptions.inDither = false; - mOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; - } - - @Override - protected Bitmap doInBackground(Integer... params) { - if (isCancelled()) return null; - try { - return BitmapFactory.decodeResource(getResources(), - mImages.get(params[0]), mOptions); - } catch (OutOfMemoryError e) { - return null; - } - } - - @Override - protected void onPostExecute(Bitmap b) { - if (b == null) return; - - if (!isCancelled() && !mOptions.mCancel) { - // Help the GC - if (mBitmap != null) { - mBitmap.recycle(); - } - - // This should always be the case, but check anyways - final ImageView view = mImageView; - if (view != null) { - view.setImageBitmap(b); - - mBitmap = b; - - final Drawable drawable = view.getDrawable(); - drawable.setFilterBitmap(true); - drawable.setDither(true); - - view.postInvalidate(); - } - - mLoader = null; - } else { - b.recycle(); - } - } - - void cancel() { - mOptions.requestCancelDecode(); - super.cancel(true); + DialogFragment fragment = WallpaperChooserDialogFragment.newInstance(); + fragment.show(getFragmentManager(), "dialog"); } } } |