diff options
Diffstat (limited to 'src/com/android/launcher2/LiveWallpaperPickActivity.java')
-rw-r--r-- | src/com/android/launcher2/LiveWallpaperPickActivity.java | 197 |
1 files changed, 147 insertions, 50 deletions
diff --git a/src/com/android/launcher2/LiveWallpaperPickActivity.java b/src/com/android/launcher2/LiveWallpaperPickActivity.java index 6119a8af0..cfafda004 100644 --- a/src/com/android/launcher2/LiveWallpaperPickActivity.java +++ b/src/com/android/launcher2/LiveWallpaperPickActivity.java @@ -16,17 +16,32 @@ package com.android.launcher2; +import android.app.LauncherActivity; +import android.app.ListActivity; import android.app.WallpaperManager; +import android.content.ComponentName; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.graphics.drawable.Drawable; +import android.os.Binder; import android.os.Bundle; +import android.os.IBinder; +import android.os.ParcelFileDescriptor; import android.os.RemoteException; +import android.os.SystemClock; +import android.service.wallpaper.IWallpaperConnection; +import android.service.wallpaper.IWallpaperEngine; +import android.service.wallpaper.IWallpaperService; import android.service.wallpaper.WallpaperService; import android.util.Log; +import android.view.View; +import android.view.WindowManager; +import android.widget.ListView; import java.text.Collator; import java.util.List; @@ -38,12 +53,96 @@ import java.util.Comparator; * Displays a list of live wallpapers, allowing the user to select one * and make it the system global wallpaper. */ -public class LiveWallpaperPickActivity extends ActivityPicker { +public class LiveWallpaperPickActivity extends LauncherActivity + implements View.OnClickListener { private static final String TAG = "LiveWallpaperPickActivity"; private PackageManager mPackageManager; private WallpaperManager mWallpaperManager; + Intent mSelectedIntent; + WallpaperConnection mWallpaperConnection; + + class WallpaperConnection extends IWallpaperConnection.Stub + implements ServiceConnection { + final Intent mIntent; + IWallpaperService mService; + IWallpaperEngine mEngine; + boolean mConnected; + + public WallpaperConnection(Intent intent) { + mIntent = intent; + } + + public boolean connect() { + synchronized (this) { + if (!bindService(mIntent, this, Context.BIND_AUTO_CREATE)) { + return false; + } + + mConnected = true; + return true; + } + } + + public void disconnect() { + synchronized (this) { + mConnected = false; + if (mEngine != null) { + try { + mEngine.destroy(); + } catch (RemoteException e) { + } + mEngine = null; + } + unbindService(this); + mService = null; + } + } + + public void onServiceConnected(ComponentName name, IBinder service) { + if (mWallpaperConnection == this) { + mService = IWallpaperService.Stub.asInterface(service); + try { + View button = findViewById(R.id.set); + mService.attach(this, button.getWindowToken(), + WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA, + true, + button.getRootView().getWidth(), + button.getRootView().getHeight()); + } catch (RemoteException e) { + Log.w(TAG, "Failed attaching wallpaper; clearing", e); + } + } + } + + public void onServiceDisconnected(ComponentName name) { + mService = null; + mEngine = null; + if (mWallpaperConnection == this) { + Log.w(TAG, "Wallpaper service gone: " + name); + } + } + + public void attachEngine(IWallpaperEngine engine) { + synchronized (this) { + if (mConnected) { + mEngine = engine; + } else { + try { + engine.destroy(); + } catch (RemoteException e) { + } + } + } + } + + public ParcelFileDescriptor setWallpaper(String name) { + return null; + } + } + + @Override public void onCreate(Bundle icicle) { mPackageManager = getPackageManager(); @@ -51,66 +150,64 @@ public class LiveWallpaperPickActivity extends ActivityPicker { super.onCreate(icicle); + View button = findViewById(R.id.set); + button.setEnabled(false); + button.setOnClickListener(this); + // Set default return data setResult(RESULT_CANCELED); } - /** - * {@inheritDoc} - */ @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = getIntentForPosition(which); - try { - mWallpaperManager.getIWallpaperManager().setWallpaperComponent( - intent.getComponent()); - this.setResult(RESULT_OK); - } catch (RemoteException e) { - // do nothing - } catch (RuntimeException e) { - Log.w(TAG, "Failure setting wallpaper", e); + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mWallpaperConnection != null) { + mWallpaperConnection.disconnect(); } - finish(); + mWallpaperConnection = null; } - - void putLiveWallpaperItems(List<ResolveInfo> ris, - List<PickAdapter.Item> items) { - final int size = ris.size(); - for (int i = 0; i < size; i++) { - ServiceInfo si = ris.get(i).serviceInfo; - - CharSequence label = si.loadLabel(mPackageManager); - Drawable icon = si.loadIcon(mPackageManager); - - PickAdapter.Item item = new PickAdapter.Item(this, label, icon); - - item.packageName = si.packageName; - item.className = si.name; - - items.add(item); - } + + @Override + protected void onSetContentView() { + setContentView(R.layout.live_wallpaper_content); } @Override - protected List<PickAdapter.Item> getItems() { - List<PickAdapter.Item> items = new ArrayList<PickAdapter.Item>(); - - putInstalledLiveWallpapers(items); + protected Intent getTargetIntent() { + return new Intent(WallpaperService.SERVICE_INTERFACE); + } + + @Override + protected List<ResolveInfo> onQueryPackageManager(Intent queryIntent) { + return mPackageManager.queryIntentServices(queryIntent, /* no flags */ 0); + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + mSelectedIntent = intentForPosition(position); + findViewById(R.id.set).setEnabled(true); - // Sort all items together by label - Collections.sort(items, new Comparator<PickAdapter.Item>() { - Collator mCollator = Collator.getInstance(); - public int compare(PickAdapter.Item lhs, PickAdapter.Item rhs) { - return mCollator.compare(lhs.label, rhs.label); - } - }); - - return items; + WallpaperConnection conn = new WallpaperConnection(mSelectedIntent); + if (conn.connect()) { + if (mWallpaperConnection != null) { + mWallpaperConnection.disconnect(); + } + mWallpaperConnection = conn; + } } - - void putInstalledLiveWallpapers(List<PickAdapter.Item> items) { - List<ResolveInfo> ris = mPackageManager.queryIntentServices( - new Intent(WallpaperService.SERVICE_INTERFACE), 0); - putLiveWallpaperItems(ris, items); + + public void onClick(View v) { + if (mSelectedIntent != null) { + try { + mWallpaperManager.getIWallpaperManager().setWallpaperComponent( + mSelectedIntent.getComponent()); + this.setResult(RESULT_OK); + } catch (RemoteException e) { + // do nothing + } catch (RuntimeException e) { + Log.w(TAG, "Failure setting wallpaper", e); + } + finish(); + } } } |