diff options
-rw-r--r-- | AndroidManifest.xml | 3 | ||||
-rw-r--r-- | res/layout-xlarge/live_wallpaper_entry.xml | 38 | ||||
-rw-r--r-- | res/layout-xlarge/live_wallpaper_list.xml | 41 | ||||
-rw-r--r-- | res/layout/live_wallpaper_base.xml | 20 | ||||
-rw-r--r-- | res/layout/live_wallpaper_entry.xml | 4 | ||||
-rw-r--r-- | res/layout/live_wallpaper_list.xml | 8 | ||||
-rw-r--r-- | res/layout/live_wallpaper_preview.xml | 5 | ||||
-rw-r--r-- | res/values-xlarge/dimensions.xml | 25 | ||||
-rw-r--r-- | res/values-xlarge/styles.xml | 22 | ||||
-rw-r--r-- | res/values/dimensions.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 4 | ||||
-rw-r--r-- | res/values/styles.xml | 7 | ||||
-rw-r--r-- | src/com/android/wallpaper/livepicker/LiveWallpaperListActivity.java | 100 | ||||
-rw-r--r-- | src/com/android/wallpaper/livepicker/LiveWallpaperListAdapter.java | 69 |
14 files changed, 307 insertions, 41 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b3698e5..2d8ae50 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -34,7 +34,8 @@ <activity android:name="LiveWallpaperListActivity" android:icon="@drawable/ic_launcher_live_wallpaper" android:label="@string/live_wallpaper_picker_title" - android:theme="@android:style/Theme.NoTitleBar"> + android:theme="@style/LivePickerTheme" + android:hardwareAccelerated="true"> <intent-filter> <action android:name="android.service.wallpaper.LIVE_WALLPAPER_CHOOSER" /> <action android:name="android.intent.action.SET_WALLPAPER" /> diff --git a/res/layout-xlarge/live_wallpaper_entry.xml b/res/layout-xlarge/live_wallpaper_entry.xml new file mode 100644 index 0000000..b2515a7 --- /dev/null +++ b/res/layout-xlarge/live_wallpaper_entry.xml @@ -0,0 +1,38 @@ +<?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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="@dimen/live_wallpaper_grid_item_height" + android:padding="6dip"> + <ImageView + android:id="@+id/thumbnail" + android:layout_width="@dimen/live_wallpaper_thumbnail_width" + android:layout_height="@dimen/live_wallpaper_thumbnail_height" + android:layout_gravity="center" + android:scaleType="centerCrop" /> + <TextView + android:id="@+id/title" + android:layout_width="@dimen/live_wallpaper_thumbnail_width" + android:layout_height="match_parent" + android:layout_weight="1" + android:layout_gravity="center" + android:gravity="bottom" + android:textAppearance="?android:attr/textAppearanceMedium" + android:singleLine="true" + android:ellipsize="marquee" /> +</LinearLayout> diff --git a/res/layout-xlarge/live_wallpaper_list.xml b/res/layout-xlarge/live_wallpaper_list.xml new file mode 100644 index 0000000..50d99a7 --- /dev/null +++ b/res/layout-xlarge/live_wallpaper_list.xml @@ -0,0 +1,41 @@ +<?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. +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="center"> + <GridView + android:id="@android:id/list" + android:layout_width="800dp" + android:layout_height="400dp" + android:layout_gravity="center" + android:numColumns="3" + android:stretchMode="columnWidth" + android:horizontalSpacing="15dp" + android:verticalSpacing="15dp" + android:drawSelectorOnTop="false" /> + <TextView + android:id="@android:id/empty" + android:layout_width="match_parent" + android:layout_height="match_parent" + + android:gravity="center" + android:visibility="gone" + + android:text="@string/live_wallpaper_empty" + android:textAppearance="?android:attr/textAppearanceMedium" /> +</FrameLayout>
\ No newline at end of file diff --git a/res/layout/live_wallpaper_base.xml b/res/layout/live_wallpaper_base.xml new file mode 100644 index 0000000..6803901 --- /dev/null +++ b/res/layout/live_wallpaper_base.xml @@ -0,0 +1,20 @@ +<?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. +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/live_wallpaper_base_view" + android:layout_width="match_parent" + android:layout_height="match_parent"/> diff --git a/res/layout/live_wallpaper_entry.xml b/res/layout/live_wallpaper_entry.xml index cce484f..b39cefb 100644 --- a/res/layout/live_wallpaper_entry.xml +++ b/res/layout/live_wallpaper_entry.xml @@ -29,7 +29,7 @@ android:id="@+id/thumbnail" android:layout_width="@dimen/live_wallpaper_thumbnail_width" - android:layout_height="@dimen/live_wallpaper_thumbnail_width" + android:layout_height="@dimen/live_wallpaper_thumbnail_height" android:layout_gravity="center_vertical" @@ -47,7 +47,7 @@ android:orientation="vertical"> <TextView - android:id="@+id/title_author" + android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/res/layout/live_wallpaper_list.xml b/res/layout/live_wallpaper_list.xml index 9ac8c66..a3c22bb 100644 --- a/res/layout/live_wallpaper_list.xml +++ b/res/layout/live_wallpaper_list.xml @@ -14,8 +14,9 @@ limitations under the License. --> -<merge xmlns:android="http://schemas.android.com/apk/res/android" > - +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> <ListView android:id="@android:id/list" @@ -34,5 +35,4 @@ android:text="@string/live_wallpaper_empty" android:textAppearance="?android:attr/textAppearanceMedium" /> - -</merge>
\ No newline at end of file +</FrameLayout>
\ No newline at end of file diff --git a/res/layout/live_wallpaper_preview.xml b/res/layout/live_wallpaper_preview.xml index d5da853..38cc2ac 100644 --- a/res/layout/live_wallpaper_preview.xml +++ b/res/layout/live_wallpaper_preview.xml @@ -23,7 +23,7 @@ android:paddingBottom="4dip"> <Button - android:layout_width="160dip" + android:layout_width="@dimen/live_wallpaper_preview_button_width" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -34,12 +34,11 @@ <Button android:id="@+id/configure" - android:layout_width="160dip" + android:layout_width="@dimen/live_wallpaper_preview_button_width" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/configure_wallpaper" android:onClick="configureLiveWallpaper" /> - </LinearLayout> diff --git a/res/values-xlarge/dimensions.xml b/res/values-xlarge/dimensions.xml new file mode 100644 index 0000000..f8c1966 --- /dev/null +++ b/res/values-xlarge/dimensions.xml @@ -0,0 +1,25 @@ +<?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> + <dimen name="live_wallpaper_thumbnail_width">200dip</dimen> + <dimen name="live_wallpaper_thumbnail_height">145dip</dimen> + <dimen name="live_wallpaper_grid_item_height">185dip</dimen> + <dimen name="live_wallpaper_preview_button_width">200dip</dimen> +</resources> diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml new file mode 100644 index 0000000..5338119 --- /dev/null +++ b/res/values-xlarge/styles.xml @@ -0,0 +1,22 @@ +<?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> + <style name="LivePickerTheme" parent="android:Theme.Holo.Dialog.NoFrame" /> +</resources> diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml index d0ee3a6..8f19a71 100644 --- a/res/values/dimensions.xml +++ b/res/values/dimensions.xml @@ -22,4 +22,6 @@ <dimen name="live_wallpaper_thumbnail_text_offset">12dip</dimen> <dimen name="live_wallpaper_thumbnail_width">75dip</dimen> <dimen name="live_wallpaper_thumbnail_height">75dip</dimen> + <dimen name="dialog_content_inset">15dip</dimen> + <dimen name="live_wallpaper_preview_button_width">160dip</dimen> </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index c070c61..cab49ce 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -24,7 +24,7 @@ <string name="application_name">Live Wallpaper Picker</string> <!-- Title for the screen that lets the user choose a live wallpaper to use for the system. --> - <string name="live_wallpaper_picker_title">Live wallpapers</string> + <string name="live_wallpaper_picker_title">Select live wallpaper</string> <!-- Title for the screen that lets the user preview a live wallpaper. --> <string name="live_wallpaper_preview_title">Live wallpaper preview</string> <!-- List item for configuring the current wallpaper --> @@ -39,5 +39,7 @@ <string name="wallpaper_title_and_author"><xliff:g id="title" example="Galaxy">%1$s</xliff:g> by <xliff:g id="author" example="Google">%2$s</xliff:g></string> <!-- Message, tells the user the selected live wallpaper is loading. --> <string name="live_wallpaper_loading">Loading live wallpaper…</string> + <!-- Button label, action, cancels the wallpaper picker dialog [CHAR_LIMIT=40]--> + <string name="wallpaper_cancel">Cancel</string> </resources> diff --git a/res/values/styles.xml b/res/values/styles.xml index a55fbdb..8684f16 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -28,9 +28,14 @@ <item name="android:gravity">left</item> </style> - <style name="Preview" parent="@android:style/Theme.NoTitleBar"> + <style name="Preview" parent="android:Theme.Holo"> + <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowAnimationStyle">@android:style/Animation.Activity</item> </style> + + <style name="LivePickerTheme" parent="android:style/Theme.Holo"> + <item name="android:windowNoTitle">true</item> + </style> </resources> diff --git a/src/com/android/wallpaper/livepicker/LiveWallpaperListActivity.java b/src/com/android/wallpaper/livepicker/LiveWallpaperListActivity.java index ecfbdea..c96e18c 100644 --- a/src/com/android/wallpaper/livepicker/LiveWallpaperListActivity.java +++ b/src/com/android/wallpaper/livepicker/LiveWallpaperListActivity.java @@ -16,25 +16,46 @@ package com.android.wallpaper.livepicker; -import android.app.ListActivity; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.FragmentTransaction; import android.app.WallpaperInfo; import android.os.Bundle; +import android.content.DialogInterface; import android.content.Intent; +import android.content.res.Configuration; +import android.util.Log; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.BaseAdapter; -public class LiveWallpaperListActivity extends ListActivity implements - AdapterView.OnItemClickListener { +public class LiveWallpaperListActivity extends Activity { private static final String LOG_TAG = "LiveWallpapersPicker"; private static final int REQUEST_PREVIEW = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.live_wallpaper_list); + setContentView(R.layout.live_wallpaper_base); + ViewGroup baseView = (ViewGroup) findViewById(R.id.live_wallpaper_base_view); - setListAdapter(new LiveWallpaperListAdapter(this)); - getListView().setOnItemClickListener(this); + boolean isXLarge = (getResources().getConfiguration().screenLayout + & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE; + + DialogFragment fragment = new WallpaperDialogFragment(this, baseView, !isXLarge); + if (isXLarge) { + // When the screen is XLarge + fragment.show(getFragmentManager(), "dialog"); + } else { + // When the screen is normal. i.e: a phone + FragmentTransaction ft = getFragmentManager().openTransaction(); + ft.add(R.id.live_wallpaper_base_view, fragment); + ft.commit(); + } } @Override @@ -46,11 +67,66 @@ public class LiveWallpaperListActivity extends ListActivity implements } } - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - LiveWallpaperListAdapter.LiveWallpaperInfo wallpaperInfo = - (LiveWallpaperListAdapter.LiveWallpaperInfo) getListAdapter().getItem(position); - final Intent intent = wallpaperInfo.intent; - final WallpaperInfo info = wallpaperInfo.info; - LiveWallpaperPreview.showPreview(this, REQUEST_PREVIEW, intent, info); + private class WallpaperDialogFragment extends DialogFragment implements + AdapterView.OnItemClickListener{ + private Activity mActivity; + private LiveWallpaperListAdapter mAdapter; + private ViewGroup mBaseView; + private boolean mEmbedded; + + public WallpaperDialogFragment(Activity activity, ViewGroup baseView, boolean embedded) { + mActivity = activity; + mEmbedded = embedded; + mBaseView = baseView; + setCancelable(true); + } + + @Override + public void onDismiss(DialogInterface dialog) { + mActivity.finish(); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final int contentInset = getResources().getDimensionPixelSize( + R.dimen.dialog_content_inset); + View view = generateView(getLayoutInflater(), mBaseView); + + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); + builder.setNegativeButton(R.string.wallpaper_cancel, null); + builder.setTitle(R.string.live_wallpaper_picker_title); + builder.setView(view, contentInset, contentInset, contentInset, contentInset); + return builder.create(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + if (mEmbedded) { + return generateView(inflater, container); + } + return super.onCreateView(inflater, container, savedInstanceState); + } + + @SuppressWarnings("unchecked") + private View generateView(LayoutInflater inflater, ViewGroup container) { + View layout = inflater.inflate(R.layout.live_wallpaper_list, container, false); + + mAdapter = new LiveWallpaperListAdapter(mActivity); + AdapterView<BaseAdapter> adapterView = + (AdapterView<BaseAdapter>) layout.findViewById(android.R.id.list); + adapterView.setAdapter(mAdapter); + adapterView.setOnItemClickListener(this); + adapterView.setEmptyView(layout.findViewById(android.R.id.empty)); + return layout; + } + + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + LiveWallpaperListAdapter.LiveWallpaperInfo wallpaperInfo = + (LiveWallpaperListAdapter.LiveWallpaperInfo) mAdapter.getItem(position); + final Intent intent = wallpaperInfo.intent; + final WallpaperInfo info = wallpaperInfo.info; + LiveWallpaperPreview.showPreview(mActivity, REQUEST_PREVIEW, intent, info); + } } } diff --git a/src/com/android/wallpaper/livepicker/LiveWallpaperListAdapter.java b/src/com/android/wallpaper/livepicker/LiveWallpaperListAdapter.java index 87e0384..6c07dcd 100644 --- a/src/com/android/wallpaper/livepicker/LiveWallpaperListAdapter.java +++ b/src/com/android/wallpaper/livepicker/LiveWallpaperListAdapter.java @@ -55,13 +55,29 @@ public class LiveWallpaperListAdapter extends BaseAdapter implements ListAdapter private final LayoutInflater mInflater; private final PackageManager mPackageManager; - private List<LiveWallpaperInfo> mWallpapers = new ArrayList<LiveWallpaperInfo>(); + private List<LiveWallpaperInfo> mWallpapers; + @SuppressWarnings("unchecked") public LiveWallpaperListAdapter(Context context) { mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mPackageManager = context.getPackageManager(); - new LiveWallpaperEnumerator(context).execute(); + List<ResolveInfo> list = mPackageManager.queryIntentServices( + new Intent(WallpaperService.SERVICE_INTERFACE), + PackageManager.GET_META_DATA); + + mWallpapers = generatePlaceholderViews(list.size()); + + new LiveWallpaperEnumerator(context).execute(list); + } + + private List<LiveWallpaperInfo> generatePlaceholderViews(int amount) { + ArrayList<LiveWallpaperInfo> list = new ArrayList<LiveWallpaperInfo>(amount); + for (int i = 0; i < amount; i++) { + LiveWallpaperInfo info = new LiveWallpaperInfo(); + list.add(info); + } + return list; } public int getCount() { @@ -85,7 +101,7 @@ public class LiveWallpaperListAdapter extends BaseAdapter implements ListAdapter convertView = mInflater.inflate(R.layout.live_wallpaper_entry, parent, false); holder = new ViewHolder(); - holder.title = (TextView) convertView.findViewById(R.id.title_author); + holder.title = (TextView) convertView.findViewById(R.id.title); holder.description = (TextView) convertView.findViewById(R.id.description); holder.thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail); convertView.setTag(holder); @@ -94,15 +110,28 @@ public class LiveWallpaperListAdapter extends BaseAdapter implements ListAdapter } LiveWallpaperInfo wallpaperInfo = mWallpapers.get(position); - holder.thumbnail.setImageDrawable(wallpaperInfo.thumbnail); - holder.title.setText(wallpaperInfo.info.loadLabel(mPackageManager)); - try { - holder.description.setVisibility(View.VISIBLE); - holder.description.setText(Html.fromHtml( - wallpaperInfo.info.loadDescription(mPackageManager).toString())); - } catch (Resources.NotFoundException e) { - holder.description.setVisibility(View.GONE); + if (holder.thumbnail != null) { + holder.thumbnail.setImageDrawable(wallpaperInfo.thumbnail); } + + if (holder.title != null && wallpaperInfo.info != null) { + holder.title.setText(wallpaperInfo.info.loadLabel(mPackageManager)); + if (holder.thumbnail == null) { + holder.title.setCompoundDrawablesWithIntrinsicBounds(null, wallpaperInfo.thumbnail, + null, null); + } + } + + if (holder.description != null && wallpaperInfo.info != null) { + try { + holder.description.setVisibility(View.VISIBLE); + holder.description.setText(Html.fromHtml( + wallpaperInfo.info.loadDescription(mPackageManager).toString())); + } catch (Resources.NotFoundException e) { + holder.description.setVisibility(View.GONE); + } + } + return convertView; } @@ -118,21 +147,22 @@ public class LiveWallpaperListAdapter extends BaseAdapter implements ListAdapter ImageView thumbnail; } - private class LiveWallpaperEnumerator extends AsyncTask<Void, LiveWallpaperInfo, Void> { + private class LiveWallpaperEnumerator extends + AsyncTask<List<ResolveInfo>, LiveWallpaperInfo, Void> { private Context mContext; + private int mWallpaperPosition; public LiveWallpaperEnumerator(Context context) { super(); mContext = context; + mWallpaperPosition = 0; } @Override - protected Void doInBackground(Void... params) { + protected Void doInBackground(List<ResolveInfo>... params) { final PackageManager packageManager = mContext.getPackageManager(); - List<ResolveInfo> list = packageManager.queryIntentServices( - new Intent(WallpaperService.SERVICE_INTERFACE), - PackageManager.GET_META_DATA); + List<ResolveInfo> list = params[0]; final Resources res = mContext.getResources(); BitmapDrawable galleryIcon = (BitmapDrawable) res.getDrawable( @@ -214,7 +244,12 @@ public class LiveWallpaperListAdapter extends BaseAdapter implements ListAdapter @Override protected void onProgressUpdate(LiveWallpaperInfo...infos) { for (LiveWallpaperInfo info : infos) { - mWallpapers.add(info); + if (mWallpaperPosition < mWallpapers.size()) { + mWallpapers.set(mWallpaperPosition, info); + } else { + mWallpapers.add(info); + } + mWallpaperPosition++; LiveWallpaperListAdapter.this.notifyDataSetChanged(); } } |