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