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 | |
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
-rw-r--r-- | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | res/layout-xlarge/wallpaper_chooser.xml | 13 | ||||
-rw-r--r-- | res/layout-xlarge/wallpaper_chooser_base.xml | 23 | ||||
-rw-r--r-- | res/layout-xlarge/wallpaper_item.xml | 6 | ||||
-rw-r--r-- | res/layout/wallpaper_chooser_base.xml | 5 | ||||
-rw-r--r-- | res/values-xlarge/config.xml | 4 | ||||
-rw-r--r-- | res/values-xlarge/dimens.xml | 3 | ||||
-rw-r--r-- | res/values/config.xml | 4 | ||||
-rw-r--r-- | src/com/android/launcher2/WallpaperChooser.java | 300 | ||||
-rw-r--r-- | src/com/android/launcher2/WallpaperChooserDialogFragment.java | 321 |
10 files changed, 380 insertions, 301 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 247f5b766..6cdf205d2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -86,10 +86,10 @@ <activity android:name="com.android.launcher2.WallpaperChooser" + style="@style/config_orientation" android:label="@string/pick_wallpaper" android:icon="@drawable/ic_launcher_wallpaper" android:theme="@style/Theme.WallpaperPicker" - android:screenOrientation="nosensor" android:finishOnCloseSystemDialogs="true"> <intent-filter> <action android:name="android.intent.action.SET_WALLPAPER" /> diff --git a/res/layout-xlarge/wallpaper_chooser.xml b/res/layout-xlarge/wallpaper_chooser.xml index 9649e88f9..76a896d67 100644 --- a/res/layout-xlarge/wallpaper_chooser.xml +++ b/res/layout-xlarge/wallpaper_chooser.xml @@ -20,8 +20,11 @@ <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gallery" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:numColumns="4" - android:columnWidth="@dimen/wallpaper_small_width" - android:stretchMode="columnWidth" />
\ No newline at end of file + android:layout_width="match_parent" + android:layout_height="400dp" + android:layout_gravity="center" + android:numColumns="3" + android:stretchMode="spacingWidth" + android:columnWidth="@dimen/wallpaper_chooser_grid_width" + android:verticalSpacing="15dp" + android:drawSelectorOnTop="false" /> diff --git a/res/layout-xlarge/wallpaper_chooser_base.xml b/res/layout-xlarge/wallpaper_chooser_base.xml new file mode 100644 index 000000000..16888ecf0 --- /dev/null +++ b/res/layout-xlarge/wallpaper_chooser_base.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2010, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" /> diff --git a/res/layout-xlarge/wallpaper_item.xml b/res/layout-xlarge/wallpaper_item.xml index 4246b9ab5..e17c046da 100644 --- a/res/layout-xlarge/wallpaper_item.xml +++ b/res/layout-xlarge/wallpaper_item.xml @@ -15,9 +15,9 @@ --> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="@dimen/wallpaper_small_width" - android:layout_height="wrap_content" - android:padding="5dp" + android:layout_width="match_parent" + android:layout_height="@dimen/wallpaper_chooser_grid_height" + android:padding="6dp" android:scaleType="fitXY" android:adjustViewBounds="false" android:focusable="false" /> diff --git a/res/layout/wallpaper_chooser_base.xml b/res/layout/wallpaper_chooser_base.xml index 8447027c1..fa8ea9372 100644 --- a/res/layout/wallpaper_chooser_base.xml +++ b/res/layout/wallpaper_chooser_base.xml @@ -19,7 +19,10 @@ --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/wallpaper_chooser_base" android:layout_width="match_parent" android:layout_height="match_parent"> + <fragment class="com.android.launcher2.WallpaperChooserDialogFragment" + android:id="@+id/wallpaper_chooser_fragment" + android:layout_width="match_parent" + android:layout_height="match_parent" /> </FrameLayout> diff --git a/res/values-xlarge/config.xml b/res/values-xlarge/config.xml index 55a96f6e9..c254eb396 100644 --- a/res/values-xlarge/config.xml +++ b/res/values-xlarge/config.xml @@ -51,4 +51,8 @@ <!-- The slope, in percent, of the drag movement needed to drag an item out of the customization drawer (y / x * 100%) --> <integer name="config_customizationDrawerDragSlopeThreshold">150</integer> + + <style name="config_orientation"> + <item name="@android:screenOrientation">unspecified</item> + </style> </resources> diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml index a9ba1d512..89722e466 100644 --- a/res/values-xlarge/dimens.xml +++ b/res/values-xlarge/dimens.xml @@ -51,5 +51,6 @@ <dimen name="delete_zone_padding">20dip</dimen> <!-- dimensions for the wallpaper picker wallpaper thumbnail width --> - <dimen name="wallpaper_small_width">170dp</dimen> + <dimen name="wallpaper_chooser_grid_width">230dp</dimen> + <dimen name="wallpaper_chooser_grid_height">185dp</dimen> </resources> diff --git a/res/values/config.xml b/res/values/config.xml index 9350ad115..473ed58e3 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -32,4 +32,8 @@ <!-- The distance at which the animation should take the max duration --> <integer name="config_dropAnimMaxDist">800</integer> + + <style name="config_orientation"> + <item name="@android:screenOrientation">nosensor</item> + </style> </resources> 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"); } } } diff --git a/src/com/android/launcher2/WallpaperChooserDialogFragment.java b/src/com/android/launcher2/WallpaperChooserDialogFragment.java new file mode 100644 index 000000000..10bfc56bc --- /dev/null +++ b/src/com/android/launcher2/WallpaperChooserDialogFragment.java @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +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.WallpaperManager; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +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; + +public class WallpaperChooserDialogFragment extends DialogFragment implements + AdapterView.OnItemSelectedListener, AdapterView.OnItemClickListener { + + private static final String TAG = "Launcher.WallpaperChooserDialogFragment"; + private static final String EMBEDDED_KEY = "com.android.launcher2." + + "WallpaperChooserDialogFragment.EMBEDDED_KEY"; + + private boolean mEmbedded; + private ImageView mImageView = null; + private Bitmap mBitmap = null; + + private ArrayList<Integer> mThumbs; + private ArrayList<Integer> mImages; + private WallpaperLoader mLoader; + + public static WallpaperChooserDialogFragment newInstance() { + WallpaperChooserDialogFragment fragment = new WallpaperChooserDialogFragment(); + fragment.setCancelable(true); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (savedInstanceState != null && savedInstanceState.containsKey(EMBEDDED_KEY)) { + mEmbedded = savedInstanceState.getBoolean(EMBEDDED_KEY); + } else { + mEmbedded = isInLayout(); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putBoolean(EMBEDDED_KEY, mEmbedded); + } + + @Override + public void onDestroy() { + super.onDestroy(); + + if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) { + mLoader.cancel(true); + mLoader = null; + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + /* On orientation changes, the dialog is effectively "dismissed" so this is called + * when the activity is no longer associated with this dying dialog fragment. We + * should just safely ignore this case by checking if getActivity() returns null + */ + Activity activity = getActivity(); + if (activity != null) { + activity.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 = getActivity().getLayoutInflater().inflate( + R.layout.wallpaper_chooser, null, false); + + GridView gridView = (GridView) v.findViewById(R.id.gallery); + gridView.setOnItemClickListener(this); + gridView.setAdapter(new ImageAdapter(getActivity())); + + final int viewInset = + getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_inset); + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setNegativeButton(R.string.wallpaper_cancel, null); + builder.setTitle(R.string.wallpaper_dialog_title); + builder.setView(gridView, viewInset, viewInset, viewInset, viewInset); + return builder.create(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + findWallpapers(); + + /* If this fragment is embedded in the layout of this activity, then we should + * generate a view to display. Otherwise, a dialog will be created in + * onCreateDialog() + */ + if (mEmbedded) { + 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(getActivity())); + + 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 null; + } + + private void selectWallpaper(int position) { + try { + WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService( + Context.WALLPAPER_SERVICE); + wpm.setResource(mImages.get(position)); + Activity activity = getActivity(); + activity.setResult(Activity.RESULT_OK); + activity.finish(); + } catch (IOException e) { + Log.e(TAG, "Failed to set wallpaper: " + e); + } + } + + // 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 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, "add: [" + packageName + "]: " + extra + " (" + res + ")"); + } + } + } + } + + private class ImageAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter { + private LayoutInflater mLayoutInflater; + + ImageAdapter(Activity activity) { + mLayoutInflater = activity.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); + } + } +}
\ No newline at end of file |