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
19c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.app.AlertDialog;
20c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.app.PendingIntent;
21c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.Context;
22c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.DialogInterface;
23c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.Intent;
24c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.pm.ApplicationInfo;
25c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.content.pm.PackageManager;
26c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.MediaProjectionManager;
27c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.IMediaProjectionManager;
28c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.IMediaProjection;
29c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.Bundle;
30c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.IBinder;
31c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.RemoteException;
32c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.os.ServiceManager;
33c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.util.Log;
34c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.view.LayoutInflater;
35c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.widget.CheckBox;
36c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.widget.CompoundButton;
37c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.widget.TextView;
38c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
39c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport com.android.internal.app.AlertActivity;
40c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport com.android.internal.app.AlertController;
41c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport com.android.systemui.R;
42c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
43c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightpublic class MediaProjectionPermissionActivity extends AlertActivity
44c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener {
45c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private static final String TAG = "MediaProjectionPermissionActivity";
46c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
47c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private boolean mPermanentGrant;
48c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private String mPackageName;
49c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private int mUid;
50c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private IMediaProjectionManager mService;
51c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
52c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    @Override
53c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public void onCreate(Bundle icicle) {
54c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        super.onCreate(icicle);
55c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
56c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        Intent intent = getIntent();
57c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        mPackageName = getCallingPackage();
58c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE);
59c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        mService = IMediaProjectionManager.Stub.asInterface(b);
60c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
61c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        if (mPackageName == null) {
62c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
63c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            return;
64c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
65c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
66c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        PackageManager packageManager = getPackageManager();
67c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ApplicationInfo aInfo;
68c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        try {
69c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            aInfo = packageManager.getApplicationInfo(mPackageName, 0);
70c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            mUid = aInfo.uid;
71c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } catch (PackageManager.NameNotFoundException e) {
72c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            Log.e(TAG, "unable to look up package name", e);
73c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
74c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            return;
75c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
76c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
77c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        try {
78c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            if (mService.hasProjectionPermission(mUid, mPackageName)) {
79c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName,
80c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                        false /*permanentGrant*/));
81c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                finish();
82c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                return;
83c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            }
84c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } catch (RemoteException e) {
85c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            Log.e(TAG, "Error checking projection permissions", e);
86c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
87c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            return;
88c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
89c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
90c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        String appName = aInfo.loadLabel(packageManager).toString();
91c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
92c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        final AlertController.AlertParams ap = mAlertParams;
93c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ap.mIcon = aInfo.loadIcon(packageManager);
94c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ap.mMessage = getString(R.string.media_projection_dialog_text, appName);
95c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ap.mPositiveButtonText = getString(R.string.media_projection_action_text);
96c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ap.mNegativeButtonText = getString(android.R.string.cancel);
97c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ap.mPositiveButtonListener = this;
98c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ap.mNegativeButtonListener = this;
99c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
100c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        // add "always use" checkbox
101c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
102c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        ap.mView = inflater.inflate(R.layout.remember_permission_checkbox, null);
103c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        CheckBox rememberPermissionCheckbox =
104c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                (CheckBox)ap.mView.findViewById(R.id.remember);
105c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        rememberPermissionCheckbox.setOnCheckedChangeListener(this);
106c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
107c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        setupAlert();
108c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
109c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
110c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    @Override
111c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public void onClick(DialogInterface dialog, int which) {
112c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        try {
113c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            if (which == AlertDialog.BUTTON_POSITIVE) {
114c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                setResult(RESULT_OK, getMediaProjectionIntent(
115c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                        mUid, mPackageName, mPermanentGrant));
116c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            }
117c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } catch (RemoteException e) {
118c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            Log.e(TAG, "Error granting projection permission", e);
119c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            setResult(RESULT_CANCELED);
120c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        } finally {
121c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            finish();
122c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        }
123c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
124c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
125c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    @Override
126c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
127c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        mPermanentGrant = isChecked;
128c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
129c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright
130c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    private Intent getMediaProjectionIntent(int uid, String packageName, boolean permanentGrant)
131c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            throws RemoteException {
132c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        IMediaProjection projection = mService.createProjection(uid, packageName,
133c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                 MediaProjectionManager.TYPE_SCREEN_CAPTURE, permanentGrant);
134c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        Intent intent = new Intent();
135c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        intent.putExtra(MediaProjectionManager.EXTRA_MEDIA_PROJECTION, projection.asBinder());
136c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright        return intent;
137c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright    }
138c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright}
139