12f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy/* 22f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * Copyright (C) 2009 The Android Open Source Project 32f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * 42f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 52f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * you may not use this file except in compliance with the License. 62f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * You may obtain a copy of the License at 72f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * 82f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 92f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * 102f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * Unless required by applicable law or agreed to in writing, software 112f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 122f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * See the License for the specific language governing permissions and 142f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy * limitations under the License. 152f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy */ 162f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 172f26cced2d4257c4fb106939447d901ae971b4d1Romain Guypackage com.android.wallpaper.livepicker; 182f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 192f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.app.Activity; 202f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.app.WallpaperManager; 212f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.app.WallpaperInfo; 2290e5569f45c3acda115ac5128248e0911ceaabcfRomain Guyimport android.app.Dialog; 2306f5f007e4fe40834c6f9fcc52f2e050d37d231fDianne Hackbornimport android.graphics.Rect; 242f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.service.wallpaper.IWallpaperConnection; 252f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.service.wallpaper.IWallpaperService; 262f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.service.wallpaper.IWallpaperEngine; 272f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.service.wallpaper.WallpaperSettingsActivity; 282f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.content.ServiceConnection; 292f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.content.Intent; 302f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.content.Context; 312f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.content.ComponentName; 322f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.os.RemoteException; 332f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.os.IBinder; 342f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.os.ParcelFileDescriptor; 352f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.os.Bundle; 36d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackbornimport android.view.MotionEvent; 372f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.view.View; 382f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.view.WindowManager; 3990e5569f45c3acda115ac5128248e0911ceaabcfRomain Guyimport android.view.ViewGroup; 4090e5569f45c3acda115ac5128248e0911ceaabcfRomain Guyimport android.view.Window; 4190e5569f45c3acda115ac5128248e0911ceaabcfRomain Guyimport android.view.LayoutInflater; 422f26cced2d4257c4fb106939447d901ae971b4d1Romain Guyimport android.util.Log; 4390e5569f45c3acda115ac5128248e0911ceaabcfRomain Guyimport android.widget.TextView; 442f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 452f26cced2d4257c4fb106939447d901ae971b4d1Romain Guypublic class LiveWallpaperPreview extends Activity { 462f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy static final String EXTRA_LIVE_WALLPAPER_INTENT = "android.live_wallpaper.intent"; 472f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy static final String EXTRA_LIVE_WALLPAPER_SETTINGS = "android.live_wallpaper.settings"; 482f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy static final String EXTRA_LIVE_WALLPAPER_PACKAGE = "android.live_wallpaper.package"; 492f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 502f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy private static final String LOG_TAG = "LiveWallpaperPreview"; 512f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 522f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy private WallpaperManager mWallpaperManager; 532f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy private WallpaperConnection mWallpaperConnection; 542f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 552f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy private String mSettings; 562f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy private String mPackageName; 572f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy private Intent mWallpaperIntent; 58860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy private View mView; 5990e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy private Dialog mDialog; 602f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 612f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy static void showPreview(Activity activity, int code, Intent intent, WallpaperInfo info) { 626d4c3dba36c58d5a872b745dccb5f13e76c9b15fMichael Jurka if (info == null) { 636d4c3dba36c58d5a872b745dccb5f13e76c9b15fMichael Jurka Log.w(LOG_TAG, "Failure showing preview", new Throwable()); 646d4c3dba36c58d5a872b745dccb5f13e76c9b15fMichael Jurka return; 656d4c3dba36c58d5a872b745dccb5f13e76c9b15fMichael Jurka } 662f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy Intent preview = new Intent(activity, LiveWallpaperPreview.class); 672f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy preview.putExtra(EXTRA_LIVE_WALLPAPER_INTENT, intent); 682f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy preview.putExtra(EXTRA_LIVE_WALLPAPER_SETTINGS, info.getSettingsActivity()); 692f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy preview.putExtra(EXTRA_LIVE_WALLPAPER_PACKAGE, info.getPackageName()); 702f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy activity.startActivityForResult(preview, code); 712f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 722f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 732f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy @Override 742f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy protected void onCreate(Bundle savedInstanceState) { 752f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy super.onCreate(savedInstanceState); 762f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 772f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy Bundle extras = getIntent().getExtras(); 782f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperIntent = (Intent) extras.get(EXTRA_LIVE_WALLPAPER_INTENT); 792f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mWallpaperIntent == null) { 802f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy setResult(RESULT_CANCELED); 812f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy finish(); 822f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 832f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 842f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy setContentView(R.layout.live_wallpaper_preview); 85860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy mView = findViewById(R.id.configure); 862f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 872f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mSettings = extras.getString(EXTRA_LIVE_WALLPAPER_SETTINGS); 882f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mPackageName = extras.getString(EXTRA_LIVE_WALLPAPER_PACKAGE); 892f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mSettings == null) { 90860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy mView.setVisibility(View.GONE); 912f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 922f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 932f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperManager = WallpaperManager.getInstance(this); 942f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 95860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy mWallpaperConnection = new WallpaperConnection(mWallpaperIntent); 962f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 972f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 982f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void setLiveWallpaper(View v) { 992f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy try { 1002f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperManager.getIWallpaperManager().setWallpaperComponent( 1012f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperIntent.getComponent()); 102c1664042a632eb25f68487eb54ca8310be90da65Marco Nelissen mWallpaperManager.setWallpaperOffsetSteps(0.5f, 0.0f); 1032f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperManager.setWallpaperOffsets(v.getRootView().getWindowToken(), 0.5f, 0.0f); 1042f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy setResult(RESULT_OK); 1052f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RemoteException e) { 1062f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy // do nothing 1072f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RuntimeException e) { 1082f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy Log.w(LOG_TAG, "Failure setting wallpaper", e); 1092f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1102f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy finish(); 1112f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1122f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 1132f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy @SuppressWarnings({"UnusedDeclaration"}) 1142f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void configureLiveWallpaper(View v) { 1152f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy Intent intent = new Intent(); 1162f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy intent.setComponent(new ComponentName(mPackageName, mSettings)); 1172f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy intent.putExtra(WallpaperSettingsActivity.EXTRA_PREVIEW_MODE, true); 1182f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy startActivity(intent); 1192f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1202f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 1212f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy @Override 1222f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void onResume() { 1232f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy super.onResume(); 1242f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mWallpaperConnection != null && mWallpaperConnection.mEngine != null) { 1252f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy try { 1262f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperConnection.mEngine.setVisibility(true); 1272f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RemoteException e) { 1282f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy // Ignore 1292f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1302f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1312f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1322f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 1332f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy @Override 1342f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void onPause() { 1352f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy super.onPause(); 1362f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mWallpaperConnection != null && mWallpaperConnection.mEngine != null) { 1372f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy try { 1382f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperConnection.mEngine.setVisibility(false); 1392f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RemoteException e) { 1402f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy // Ignore 1412f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1422f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1432f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 144860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy 145860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy @Override 146860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy public void onAttachedToWindow() { 147860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy super.onAttachedToWindow(); 14890e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 14990e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy showLoading(); 15090e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 15190e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy mView.post(new Runnable() { 15290e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy public void run() { 15390e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy if (!mWallpaperConnection.connect()) { 15490e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy mWallpaperConnection = null; 15590e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy } 15690e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy } 15790e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy }); 15890e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy } 15990e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 16090e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy private void showLoading() { 16190e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy LayoutInflater inflater = LayoutInflater.from(this); 16290e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy TextView content = (TextView) inflater.inflate(R.layout.live_wallpaper_loading, null); 16390e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 16490e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy mDialog = new Dialog(this, android.R.style.Theme_Black); 16590e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 16690e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy Window window = mDialog.getWindow(); 16790e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy WindowManager.LayoutParams lp = window.getAttributes(); 16890e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 169a7c785cf1150588ed531da4b81fb6f9a50c8ac26Romain Guy lp.width = WindowManager.LayoutParams.MATCH_PARENT; 170a7c785cf1150588ed531da4b81fb6f9a50c8ac26Romain Guy lp.height = WindowManager.LayoutParams.MATCH_PARENT; 17190e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA); 17290e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 17390e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy mDialog.setContentView(content, new ViewGroup.LayoutParams( 174a7c785cf1150588ed531da4b81fb6f9a50c8ac26Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT 17590e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy )); 17690e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy mDialog.show(); 177860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy } 178860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy 1792f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy @Override 1802f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void onDetachedFromWindow() { 1812f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy super.onDetachedFromWindow(); 18290e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 18390e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy if (mDialog != null) mDialog.dismiss(); 18490e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy 1852f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mWallpaperConnection != null) { 1862f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperConnection.disconnect(); 1872f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1882f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mWallpaperConnection = null; 1892f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 1902f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 191d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn @Override 192d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn public boolean dispatchTouchEvent(MotionEvent ev) { 193d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn if (mWallpaperConnection != null && mWallpaperConnection.mEngine != null) { 194d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn MotionEvent dup = MotionEvent.obtainNoHistory(ev); 195d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn try { 196d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn mWallpaperConnection.mEngine.dispatchPointer(dup); 197d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn } catch (RemoteException e) { 198d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn } 199d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn } 200d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn 201d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn if (ev.getAction() == MotionEvent.ACTION_DOWN) { 202d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn onUserInteraction(); 203d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn } 20461b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown boolean handled = getWindow().superDispatchTouchEvent(ev); 20561b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown if (!handled) { 20661b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown handled = onTouchEvent(ev); 207d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn } 20861b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown 20961b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown if (!handled && mWallpaperConnection != null && mWallpaperConnection.mEngine != null) { 21061b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown int action = ev.getActionMasked(); 21161b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown try { 21261b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown if (action == MotionEvent.ACTION_UP) { 21361b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown mWallpaperConnection.mEngine.dispatchWallpaperCommand( 21461b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown WallpaperManager.COMMAND_TAP, 21561b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown (int) ev.getX(), (int) ev.getY(), 0, null); 21661b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown } else if (action == MotionEvent.ACTION_POINTER_UP) { 21761b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown int pointerIndex = ev.getActionIndex(); 21861b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown mWallpaperConnection.mEngine.dispatchWallpaperCommand( 21961b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown WallpaperManager.COMMAND_SECONDARY_TAP, 22061b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown (int) ev.getX(pointerIndex), (int) ev.getY(pointerIndex), 0, null); 22161b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown } 22261b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown } catch (RemoteException e) { 22361b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown } 22461b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown } 22561b18eb2569e3d2cec85a414f83d036c17e9029fJeff Brown return handled; 226d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn } 227d4e57d4cb45c0c7db605420dccd9fd4db854e998Dianne Hackborn 2282f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy class WallpaperConnection extends IWallpaperConnection.Stub implements ServiceConnection { 2292f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy final Intent mIntent; 2302f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy IWallpaperService mService; 2312f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy IWallpaperEngine mEngine; 2322f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy boolean mConnected; 2332f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 2342f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy WallpaperConnection(Intent intent) { 2352f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mIntent = intent; 2362f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2372f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 2382f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public boolean connect() { 2392f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy synchronized (this) { 2402f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (!bindService(mIntent, this, Context.BIND_AUTO_CREATE)) { 2412f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy return false; 2422f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2432f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 2442f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mConnected = true; 2452f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy return true; 2462f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2472f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2482f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 2492f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void disconnect() { 2502f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy synchronized (this) { 2512f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mConnected = false; 2522f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mEngine != null) { 2532f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy try { 2542f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mEngine.destroy(); 2552f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RemoteException e) { 2562f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy // Ignore 2572f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2582f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mEngine = null; 2592f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2602f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy unbindService(this); 2612f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mService = null; 2622f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2632f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2642f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 2652f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void onServiceConnected(ComponentName name, IBinder service) { 2662f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mWallpaperConnection == this) { 2672f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mService = IWallpaperService.Stub.asInterface(service); 2682f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy try { 269860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy final View view = mView; 270860eccdfd57bc0bc762f3e45147dafc1dfdbb915Romain Guy final View root = view.getRootView(); 2712f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mService.attach(this, view.getWindowToken(), 27290e5569f45c3acda115ac5128248e0911ceaabcfRomain Guy WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY, 27306f5f007e4fe40834c6f9fcc52f2e050d37d231fDianne Hackborn true, root.getWidth(), root.getHeight(), 27406f5f007e4fe40834c6f9fcc52f2e050d37d231fDianne Hackborn new Rect(0, 0, 0, 0)); 2752f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RemoteException e) { 2762f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy Log.w(LOG_TAG, "Failed attaching wallpaper; clearing", e); 2772f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2782f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2792f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2802f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 2812f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void onServiceDisconnected(ComponentName name) { 2822f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mService = null; 2832f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mEngine = null; 2842f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mWallpaperConnection == this) { 2852f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy Log.w(LOG_TAG, "Wallpaper service gone: " + name); 2862f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2872f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2882f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 2892f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public void attachEngine(IWallpaperEngine engine) { 2902f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy synchronized (this) { 2912f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy if (mConnected) { 2922f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy mEngine = engine; 2932f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy try { 2942f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy engine.setVisibility(true); 2952f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RemoteException e) { 2962f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy // Ignore 2972f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 2982f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } else { 2992f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy try { 3002f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy engine.destroy(); 3012f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } catch (RemoteException e) { 3022f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy // Ignore 3032f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 3042f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 3052f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 3062f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 3072f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy 3082f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy public ParcelFileDescriptor setWallpaper(String name) { 3092f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy return null; 3102f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 311f14b1d2e17ee862b84c9acb88f299984c6e969d9Dianne Hackborn 312f14b1d2e17ee862b84c9acb88f299984c6e969d9Dianne Hackborn @Override 313f14b1d2e17ee862b84c9acb88f299984c6e969d9Dianne Hackborn public void engineShown(IWallpaperEngine engine) throws RemoteException { 314f14b1d2e17ee862b84c9acb88f299984c6e969d9Dianne Hackborn } 3152f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy } 3162f26cced2d4257c4fb106939447d901ae971b4d1Romain Guy} 317