1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.internal.app;
18 
19 import android.content.Intent;
20 import android.content.pm.ActivityInfo;
21 import android.os.Bundle;
22 import android.text.TextUtils;
23 import android.util.Slog;
24 
25 import com.android.internal.R;
26 
27 /**
28  * A dialog shown to the user when they try to launch an app that is not allowed on a virtual
29  * device. The intent to start this activity must be created with the static factory method provided
30  * below.
31  */
32 public class BlockedAppStreamingActivity extends AlertActivity {
33 
34     private static final String TAG = "BlockedAppStreamingActivity";
35     private static final String PACKAGE_NAME = "com.android.internal.app";
36     private static final String EXTRA_BLOCKED_ACTIVITY_INFO =
37             PACKAGE_NAME + ".extra.BLOCKED_ACTIVITY_INFO";
38     private static final String EXTRA_STREAMED_DEVICE = PACKAGE_NAME + ".extra.STREAMED_DEVICE";
39     private static final String BLOCKED_COMPONENT_PLAYSTORE = "com.android.vending";
40     private static final String BLOCKED_COMPONENT_SETTINGS = "com.android.settings";
41 
42     @Override
onCreate(Bundle savedInstanceState)43     protected void onCreate(Bundle savedInstanceState) {
44         super.onCreate(savedInstanceState);
45 
46         Intent intent = getIntent();
47         CharSequence appLabel = null;
48         ActivityInfo activityInfo = intent.getParcelableExtra(EXTRA_BLOCKED_ACTIVITY_INFO, android.content.pm.ActivityInfo.class);
49         if (activityInfo != null) {
50             appLabel = activityInfo.loadLabel(getPackageManager());
51         }
52 
53         if (TextUtils.isEmpty(appLabel)) {
54             Slog.wtf(TAG, "Invalid activity info: " + activityInfo);
55             finish();
56             return;
57         }
58 
59         CharSequence streamedDeviceName = intent.getCharSequenceExtra(EXTRA_STREAMED_DEVICE);
60         if (!TextUtils.isEmpty(streamedDeviceName)) {
61             if (TextUtils.equals(activityInfo.packageName,
62                         getPackageManager().getPermissionControllerPackageName())) {
63                 mAlertParams.mTitle =
64                         getString(R.string.app_streaming_blocked_title_for_permission_dialog);
65                 mAlertParams.mMessage =
66                         getString(R.string.app_streaming_blocked_message_for_permission_request);
67             } else if (TextUtils.equals(activityInfo.packageName, BLOCKED_COMPONENT_PLAYSTORE)) {
68                 mAlertParams.mTitle =
69                         getString(R.string.app_streaming_blocked_title_for_playstore_dialog);
70                 mAlertParams.mMessage =
71                         getString(R.string.app_streaming_blocked_message, streamedDeviceName);
72             } else if (TextUtils.equals(activityInfo.packageName, BLOCKED_COMPONENT_SETTINGS)) {
73                 mAlertParams.mTitle =
74                         getString(R.string.app_streaming_blocked_title_for_settings_dialog);
75                 mAlertParams.mMessage =
76                         getString(R.string.app_streaming_blocked_message_for_settings_dialog,
77                                 streamedDeviceName);
78             } else {
79                 // No title required
80                 mAlertParams.mMessage =
81                         getString(R.string.app_streaming_blocked_message, streamedDeviceName);
82             }
83         } else {
84             // No title required
85             mAlertParams.mMessage = getString(R.string.app_blocked_message, appLabel);
86         }
87         mAlertParams.mPositiveButtonText = getString(android.R.string.ok);
88         setupAlert();
89     }
90 
91     /**
92      * Creates an intent that launches {@link BlockedAppStreamingActivity} when app streaming is
93      * blocked.
94      */
createIntent(ActivityInfo activityInfo, CharSequence streamedDeviceName)95     public static Intent createIntent(ActivityInfo activityInfo, CharSequence streamedDeviceName) {
96         return new Intent()
97                 .setClassName("android", BlockedAppStreamingActivity.class.getName())
98                 .putExtra(EXTRA_BLOCKED_ACTIVITY_INFO, activityInfo)
99                 .putExtra(EXTRA_STREAMED_DEVICE, streamedDeviceName);
100     }
101 }
102