1c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright/*
2c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * Copyright (C) 2014 The Android Open Source Project
3c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright *
4c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * Licensed under the Apache License, Version 2.0 (the "License");
5c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * you may not use this file except in compliance with the License.
6c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * You may obtain a copy of the License at
7c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright *
8c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright *      http://www.apache.org/licenses/LICENSE-2.0
9c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright *
10c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * Unless required by applicable law or agreed to in writing, software
11c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * distributed under the License is distributed on an "AS IS" BASIS,
12c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * See the License for the specific language governing permissions and
14c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright * limitations under the License.
15c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright */
16c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
17c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightpackage com.android.systemui.media;
18c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
19752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roosimport android.app.Activity;
20c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.app.AlertDialog;
21c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.app.PendingIntent;
22c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.Context;
23c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.DialogInterface;
24c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.Intent;
25c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.pm.ApplicationInfo;
26c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.pm.PackageManager;
27c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.MediaProjectionManager;
28c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.IMediaProjectionManager;
29c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.IMediaProjection;
30c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.Bundle;
31c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.IBinder;
32c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.RemoteException;
33c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.ServiceManager;
34c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.util.Log;
35c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.view.LayoutInflater;
36752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roosimport android.view.WindowManager;
37c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.widget.CheckBox;
38c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.widget.CompoundButton;
39c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.widget.TextView;
40c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
41c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport com.android.internal.app.AlertActivity;
42c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport com.android.internal.app.AlertController;
43c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport com.android.systemui.R;
44752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roosimport com.android.systemui.statusbar.phone.SystemUIDialog;
45c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
46752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roospublic class MediaProjectionPermissionActivity extends Activity
47752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener,
48752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        DialogInterface.OnCancelListener {
49c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private static final String TAG = "MediaProjectionPermissionActivity";
50c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
51c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private boolean mPermanentGrant;
52c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private String mPackageName;
53c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private int mUid;
54c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private IMediaProjectionManager mService;
55c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
56752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos    private AlertDialog mDialog;
57752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos
58c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    @Override
59c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public void onCreate(Bundle icicle) {
60c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        super.onCreate(icicle);
61c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
62c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        mPackageName = getCallingPackage();
63c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE);
64c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        mService = IMediaProjectionManager.Stub.asInterface(b);
65c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
66c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        if (mPackageName == null) {
67c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
68c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            return;
69c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
70c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
71c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        PackageManager packageManager = getPackageManager();
72c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ApplicationInfo aInfo;
73c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        try {
74c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            aInfo = packageManager.getApplicationInfo(mPackageName, 0);
75c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            mUid = aInfo.uid;
76c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } catch (PackageManager.NameNotFoundException e) {
77c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            Log.e(TAG, "unable to look up package name", e);
78c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
79c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            return;
80c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
81c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
82c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        try {
83c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            if (mService.hasProjectionPermission(mUid, mPackageName)) {
84c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName,
85c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                        false /*permanentGrant*/));
86c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                finish();
87c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                return;
88c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            }
89c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } catch (RemoteException e) {
90c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            Log.e(TAG, "Error checking projection permissions", e);
91c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
92c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            return;
93c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
94c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
95c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        String appName = aInfo.loadLabel(packageManager).toString();
96c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
97752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        mDialog = new AlertDialog.Builder(this)
98752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos                .setIcon(aInfo.loadIcon(packageManager))
99752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos                .setMessage(getString(R.string.media_projection_dialog_text, appName))
100752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos                .setPositiveButton(R.string.media_projection_action_text, this)
101752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos                .setNegativeButton(android.R.string.cancel, this)
102752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos                .setView(R.layout.remember_permission_checkbox)
103752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos                .setOnCancelListener(this)
104752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos                .create();
105752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos
106752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        mDialog.create();
107752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos
108752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        ((CheckBox) mDialog.findViewById(R.id.remember)).setOnCheckedChangeListener(this);
109752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
110752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos
111752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        mDialog.show();
112752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos    }
113752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos
114752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos    @Override
115752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos    protected void onDestroy() {
116752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        super.onDestroy();
117752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        mDialog.dismiss();
118c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
119c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
120c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    @Override
121c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public void onClick(DialogInterface dialog, int which) {
122c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        try {
123c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            if (which == AlertDialog.BUTTON_POSITIVE) {
124c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                setResult(RESULT_OK, getMediaProjectionIntent(
125c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                        mUid, mPackageName, mPermanentGrant));
126c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            }
127c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } catch (RemoteException e) {
128c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            Log.e(TAG, "Error granting projection permission", e);
129c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            setResult(RESULT_CANCELED);
130c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } finally {
131752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos            mDialog.dismiss();
132c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
133c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
134c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
135c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
136c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    @Override
137c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
138c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        mPermanentGrant = isChecked;
139c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
140c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
141c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private Intent getMediaProjectionIntent(int uid, String packageName, boolean permanentGrant)
142c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            throws RemoteException {
143c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        IMediaProjection projection = mService.createProjection(uid, packageName,
144c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                 MediaProjectionManager.TYPE_SCREEN_CAPTURE, permanentGrant);
145c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        Intent intent = new Intent();
146c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        intent.putExtra(MediaProjectionManager.EXTRA_MEDIA_PROJECTION, projection.asBinder());
147c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        return intent;
148c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
149752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos
150752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos    @Override
151752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos    public void onCancel(DialogInterface dialog) {
152752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos        finish();
153752aee8a6f868011dea1d1bb4f582a2531d76d47Adrian Roos    }
154c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright}
155