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
This commit is contained in:
parent
4c4b20f7c3
commit
2a898a0ac5
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
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" />
|
||||
|
|
|
@ -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" />
|
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -16,309 +16,29 @@
|
|||
|
||||
package com.android.launcher2;
|
||||
|
||||
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.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;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.DialogFragment;
|
||||
import android.app.Fragment;
|
||||
import android.os.Bundle;
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue