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