summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2010-11-19 15:06:46 -0800
committerAdam Lesinski <adamlesinski@google.com>2010-11-24 13:37:03 -0800
commitcd5d807f53d9bca006dfc9f46d83497c27e89227 (patch)
tree5f4b0b287460a7104e97b0308caf107e1770b089
parent59fbda815e7b1c38f7aaf5d7eb87601f78e88c5b (diff)
downloadandroid_packages_apps_Trebuchet-cd5d807f53d9bca006dfc9f46d83497c27e89227.tar.gz
android_packages_apps_Trebuchet-cd5d807f53d9bca006dfc9f46d83497c27e89227.tar.bz2
android_packages_apps_Trebuchet-cd5d807f53d9bca006dfc9f46d83497c27e89227.zip
Updating the Static Wallpaper picker for Tablet
- Updated WallpaperChooser to use FragmentDialogs - Backwards compatible with old WallpaperChooser UI on non XLarge screens - There is a known bug with AlertDialogs (b/3225529) that prevents an AlertDialog to expand to fit its content. The squishing of the GridView is caused by that bug. Change-Id: I49381aab4aa24362e8c92da284797fce0e63823c
-rw-r--r--AndroidManifest.xml1
-rw-r--r--res/layout-xlarge/wallpaper_chooser.xml27
-rw-r--r--res/layout-xlarge/wallpaper_item.xml23
-rw-r--r--res/layout/wallpaper_chooser_base.xml25
-rw-r--r--res/values-xlarge/dimens.xml3
-rw-r--r--res/values-xlarge/strings.xml24
-rw-r--r--res/values-xlarge/styles.xml3
-rw-r--r--res/values/dimens.xml4
-rw-r--r--res/values/styles.xml4
-rw-r--r--src/com/android/launcher2/WallpaperChooser.java209
10 files changed, 255 insertions, 68 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4aa5d68b6..905b8b690 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -88,6 +88,7 @@
android:name="com.android.launcher2.WallpaperChooser"
android:label="@string/pick_wallpaper"
android:icon="@drawable/ic_launcher_wallpaper"
+ android:theme="@style/Theme.WallpaperPicker"
android:screenOrientation="nosensor"
android:finishOnCloseSystemDialogs="true">
<intent-filter>
diff --git a/res/layout-xlarge/wallpaper_chooser.xml b/res/layout-xlarge/wallpaper_chooser.xml
new file mode 100644
index 000000000..9649e88f9
--- /dev/null
+++ b/res/layout-xlarge/wallpaper_chooser.xml
@@ -0,0 +1,27 @@
+<?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.
+*/
+-->
+
+<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
diff --git a/res/layout-xlarge/wallpaper_item.xml b/res/layout-xlarge/wallpaper_item.xml
new file mode 100644
index 000000000..4246b9ab5
--- /dev/null
+++ b/res/layout-xlarge/wallpaper_item.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<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:scaleType="fitXY"
+ android:adjustViewBounds="false"
+ android:focusable="false" />
diff --git a/res/layout/wallpaper_chooser_base.xml b/res/layout/wallpaper_chooser_base.xml
new file mode 100644
index 000000000..8447027c1
--- /dev/null
+++ b/res/layout/wallpaper_chooser_base.xml
@@ -0,0 +1,25 @@
+<?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:id="@+id/wallpaper_chooser_base"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+</FrameLayout>
diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml
index d98674f6c..7033553a2 100644
--- a/res/values-xlarge/dimens.xml
+++ b/res/values-xlarge/dimens.xml
@@ -50,4 +50,7 @@
<dimen name="delete_zone_size">50dip</dimen>
<dimen name="delete_zone_min_padding">10dip</dimen>
<dimen name="delete_zone_max_padding">20dip</dimen>
+
+ <!-- dimensions for the wallpaper picker wallpaper thumbnail width -->
+ <dimen name="wallpaper_small_width">170dp</dimen>
</resources>
diff --git a/res/values-xlarge/strings.xml b/res/values-xlarge/strings.xml
new file mode 100644
index 000000000..738baf5cf
--- /dev/null
+++ b/res/values-xlarge/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Option in "Select wallpaper from" dialog box -->
+ <string name="pick_wallpaper">Select wallpaper</string>
+ <string name="wallpaper_cancel">Cancel</string>
+</resources> \ No newline at end of file
diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml
index fcbd9695d..5198d3048 100644
--- a/res/values-xlarge/styles.xml
+++ b/res/values-xlarge/styles.xml
@@ -18,6 +18,9 @@
-->
<resources>
+ <style name="Theme.WallpaperPicker" parent="android:Theme.Holo.Dialog.NoFrame">
+ </style>
+
<style name="Theme" parent="android:Theme.Holo">
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionModeOverlay">true</item>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d6cd3eeb0..39739c28b 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -44,4 +44,8 @@
<!-- the area at the edge of the screen that makes the workspace go left
or right while you're dragging. -->
<dimen name="scroll_zone">20dp</dimen>
+
+ <!-- How much the content view of an alert dialog should be inset (currently used
+ for the WallpaperChooser in XLarge mode) -->
+ <dimen name="alert_dialog_content_inset">15dp</dimen>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index a97b3c50b..c867d3854 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -18,6 +18,10 @@
-->
<resources>
+ <style name="Theme.WallpaperPicker" parent="android:Theme">
+ <item name="android:windowNoTitle">true</item>
+ </style>
+
<style name="Theme.Base" parent="android:Theme.Wallpaper">
</style>
diff --git a/src/com/android/launcher2/WallpaperChooser.java b/src/com/android/launcher2/WallpaperChooser.java
index bf8ba2e8d..113a8e663 100644
--- a/src/com/android/launcher2/WallpaperChooser.java
+++ b/src/com/android/launcher2/WallpaperChooser.java
@@ -17,7 +17,13 @@
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;
@@ -28,27 +34,26 @@ import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.Window;
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 implements AdapterView.OnItemSelectedListener,
- OnClickListener {
+public class WallpaperChooser extends Activity {
private static final String TAG = "Launcher.WallpaperChooser";
- private Gallery mGallery;
- private ImageView mImageView;
- private boolean mIsWallpaperSet;
-
- private Bitmap mBitmap;
+ private ViewGroup mWallpaperChooserBase;
+ private ImageView mImageView = null;
+ private Bitmap mBitmap = null;
private ArrayList<Integer> mThumbs;
private ArrayList<Integer> mImages;
@@ -57,20 +62,35 @@ public class WallpaperChooser extends Activity implements AdapterView.OnItemSele
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
+ /* 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();
- setContentView(R.layout.wallpaper_chooser);
-
- mGallery = (Gallery) findViewById(R.id.gallery);
- mGallery.setAdapter(new ImageAdapter(this));
- mGallery.setOnItemSelectedListener(this);
- mGallery.setCallbackDuringFling(false);
+ 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();
+ }
+ }
- findViewById(R.id.set).setOnClickListener(this);
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
- mImageView = (ImageView) findViewById(R.id.wallpaper);
+ if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
+ mLoader.cancel(true);
+ mLoader = null;
+ }
}
private void findWallpapers() {
@@ -105,40 +125,7 @@ public class WallpaperChooser extends Activity implements AdapterView.OnItemSele
}
}
- @Override
- protected void onResume() {
- super.onResume();
- mIsWallpaperSet = false;
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
- mLoader.cancel(true);
- mLoader = null;
- }
- }
-
- public void onItemSelected(AdapterView parent, View v, int position, long id) {
- if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
- mLoader.cancel();
- }
- mLoader = (WallpaperLoader) new WallpaperLoader().execute(position);
- }
-
- /*
- * When using touch if you tap an image it triggers both the onItemClick and
- * the onTouchEvent causing the wallpaper to be set twice. Ensure we only
- * set the wallpaper once.
- */
private void selectWallpaper(int position) {
- if (mIsWallpaperSet) {
- return;
- }
-
- mIsWallpaperSet = true;
try {
WallpaperManager wpm = (WallpaperManager)getSystemService(WALLPAPER_SERVICE);
wpm.setResource(mImages.get(position));
@@ -149,10 +136,95 @@ public class WallpaperChooser extends Activity implements AdapterView.OnItemSele
}
}
- public void onNothingSelected(AdapterView parent) {
+ 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.pick_wallpaper);
+ 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
+ */
+ 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 {
+ private class ImageAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter {
private LayoutInflater mLayoutInflater;
ImageAdapter(WallpaperChooser context) {
@@ -179,7 +251,7 @@ public class WallpaperChooser extends Activity implements AdapterView.OnItemSele
} else {
image = (ImageView) convertView;
}
-
+
int thumbRes = mThumbs.get(position);
image.setImageResource(thumbRes);
Drawable thumbDrawable = image.getDrawable();
@@ -189,14 +261,11 @@ public class WallpaperChooser extends Activity implements AdapterView.OnItemSele
Log.e(TAG, "Error decoding thumbnail resId=" + thumbRes + " for wallpaper #"
+ position);
}
+
return image;
}
}
- public void onClick(View v) {
- selectWallpaper(mGallery.getSelectedItemPosition());
- }
-
class WallpaperLoader extends AsyncTask<Integer, Void, Bitmap> {
BitmapFactory.Options mOptions;
@@ -205,7 +274,8 @@ public class WallpaperChooser extends Activity implements AdapterView.OnItemSele
mOptions.inDither = false;
mOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
}
-
+
+ @Override
protected Bitmap doInBackground(Integer... params) {
if (isCancelled()) return null;
try {
@@ -225,17 +295,20 @@ public class WallpaperChooser extends Activity implements AdapterView.OnItemSele
if (mBitmap != null) {
mBitmap.recycle();
}
-
+
+ // This should always be the case, but check anyways
final ImageView view = mImageView;
- view.setImageBitmap(b);
-
- mBitmap = b;
-
- final Drawable drawable = view.getDrawable();
- drawable.setFilterBitmap(true);
- drawable.setDither(true);
-
- view.postInvalidate();
+ if (view != null) {
+ view.setImageBitmap(b);
+
+ mBitmap = b;
+
+ final Drawable drawable = view.getDrawable();
+ drawable.setFilterBitmap(true);
+ drawable.setDither(true);
+
+ view.postInvalidate();
+ }
mLoader = null;
} else {