Loading core/java/com/android/internal/app/UnlaunchableAppActivity.java 0 → 100644 +158 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.app; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.app.Activity; import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import com.android.internal.R; /** * A dialog shown to the user when they try to launch an app from a quiet profile * ({@link UserManager#isQuietModeEnabled(UserHandle)}, or when the app is suspended by the * profile owner or device owner. */ public class UnlaunchableAppActivity extends Activity implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { private static final String TAG = "UnlaunchableAppActivity"; private static final int UNLAUNCHABLE_REASON_QUIET_MODE = 1; private static final int UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE = 2; private static final String EXTRA_UNLAUNCHABLE_REASON = "unlaunchable_reason"; private int mUserId; private int mReason; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); mReason = intent.getIntExtra(EXTRA_UNLAUNCHABLE_REASON, -1); mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); if (mUserId == UserHandle.USER_NULL) { Log.wtf(TAG, "Invalid user id: " + mUserId + ". Stopping."); finish(); return; } String dialogTitle; String dialogMessage; if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) { dialogTitle = getResources().getString(R.string.work_mode_off_title); dialogMessage = getResources().getString(R.string.work_mode_off_message); } else if (mReason == UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE) { PackageManager pm = getPackageManager(); DevicePolicyManager dpm = (DevicePolicyManager) getSystemService( Context.DEVICE_POLICY_SERVICE); String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME); String packageLabel = packageName; try { Context userContext = createPackageContextAsUser(packageName, 0, UserHandle.of(mUserId)); ApplicationInfo appInfo = userContext.getApplicationInfo(); if (appInfo != null) { packageLabel = userContext.getPackageManager().getApplicationLabel(appInfo) .toString(); } } catch (NameNotFoundException e) { } dialogTitle = String.format(getResources().getString(R.string.suspended_package_title), packageLabel); dialogMessage = dpm.getShortSupportMessageForUser(dpm.getProfileOwnerAsUser(mUserId), mUserId); if (dialogMessage == null) { dialogMessage = String.format( getResources().getString(R.string.suspended_package_message), dpm.getProfileOwnerNameAsUser(mUserId)); } } else { Log.wtf(TAG, "Invalid unlaunchable type: " + mReason); finish(); return; } View rootView = LayoutInflater.from(this).inflate(R.layout.unlaunchable_app_activity, null); TextView titleView = (TextView)rootView.findViewById(R.id.unlaunchable_app_title); TextView messageView = (TextView)rootView.findViewById(R.id.unlaunchable_app_message); titleView.setText(dialogTitle); messageView.setText(dialogMessage); AlertDialog.Builder builder = new AlertDialog.Builder(this) .setView(rootView) .setOnDismissListener(this); if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) { builder.setPositiveButton(R.string.work_mode_turn_on, this) .setNegativeButton(R.string.cancel, null); } else { builder.setPositiveButton(R.string.ok, null); } builder.show(); } @Override public void onDismiss(DialogInterface dialog) { finish(); } @Override public void onClick(DialogInterface dialog, int which) { if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE && which == DialogInterface.BUTTON_POSITIVE) { UserManager.get(this).setQuietModeEnabled(mUserId, false); } } private static final Intent createBaseIntent() { Intent intent = new Intent(); intent.setComponent(new ComponentName("android", UnlaunchableAppActivity.class.getName())); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); return intent; } public static Intent createInQuietModeDialogIntent(int userId) { Intent intent = createBaseIntent(); intent.putExtra(EXTRA_UNLAUNCHABLE_REASON, UNLAUNCHABLE_REASON_QUIET_MODE); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); return intent; } public static Intent createPackageSuspendedDialogIntent(String packageName, int userId) { Intent intent = createBaseIntent(); intent.putExtra(EXTRA_UNLAUNCHABLE_REASON, UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); return intent; } } core/res/AndroidManifest.xml +6 −0 Original line number Diff line number Diff line Loading @@ -3019,6 +3019,12 @@ </intent-filter> </activity> <activity android:name="com.android.internal.app.UnlaunchableAppActivity" android:theme="@style/Theme.Material.DayNight.Dialog.Alert" android:excludeFromRecents="true" android:process=":ui"> </activity> <receiver android:name="com.android.server.BootReceiver" android:systemUserOnly="true"> <intent-filter android:priority="1000"> Loading core/res/res/layout/unlaunchable_app_activity.xml 0 → 100644 +35 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2016 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/dialog_padding" android:orientation="vertical"> <TextView android:id="@+id/unlaunchable_app_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="@dimen/dialog_padding" android:paddingBottom="@dimen/dialog_padding" android:textAppearance="@android:style/TextAppearance.Material.Title" /> <TextView android:id="@+id/unlaunchable_app_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="@dimen/dialog_padding" android:textAppearance="@android:style/TextAppearance.Material.Subhead" android:textColor="?android:attr/textColorSecondary" /> </LinearLayout> core/res/res/values/strings.xml +10 −0 Original line number Diff line number Diff line Loading @@ -4164,4 +4164,14 @@ <!-- Menu item in the locale menu [CHAR LIMIT=30] --> <string name="locale_search_menu">Search</string> <!-- Title for dialog displayed when work profile is turned off. [CHAR LIMIT=30] --> <string name="work_mode_off_title">Work mode is OFF</string> <!-- Message displayed in dialog when work profile is turned off. [CHAR LIMIT=NONE] --> <string name="work_mode_off_message">Allow work profile to function, including apps, background sync, and related features.</string> <!-- Title for button to turn on work profile. [CHAR LIMIT=NONE] --> <string name="work_mode_turn_on">Turn on</string> <!-- Title for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=30] --> <string name="suspended_package_title">%1$s disabled</string> <!-- Message for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=NONE] --> <string name="suspended_package_message">Disabled by %1$s administrator. Contact them to learn more.</string> </resources> core/res/res/values/symbols.xml +8 −0 Original line number Diff line number Diff line Loading @@ -2485,4 +2485,12 @@ <java-symbol type="string" name="language_selection_title" /> <java-symbol type="string" name="search_language_hint" /> <java-symbol type="layout" name="unlaunchable_app_activity" /> <java-symbol type="id" name="unlaunchable_app_title" /> <java-symbol type="id" name="unlaunchable_app_message" /> <java-symbol type="string" name="work_mode_off_title" /> <java-symbol type="string" name="work_mode_off_message" /> <java-symbol type="string" name="work_mode_turn_on" /> <java-symbol type="string" name="suspended_package_title" /> <java-symbol type="string" name="suspended_package_message" /> </resources> Loading
core/java/com/android/internal/app/UnlaunchableAppActivity.java 0 → 100644 +158 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.app; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.app.Activity; import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import com.android.internal.R; /** * A dialog shown to the user when they try to launch an app from a quiet profile * ({@link UserManager#isQuietModeEnabled(UserHandle)}, or when the app is suspended by the * profile owner or device owner. */ public class UnlaunchableAppActivity extends Activity implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { private static final String TAG = "UnlaunchableAppActivity"; private static final int UNLAUNCHABLE_REASON_QUIET_MODE = 1; private static final int UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE = 2; private static final String EXTRA_UNLAUNCHABLE_REASON = "unlaunchable_reason"; private int mUserId; private int mReason; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); mReason = intent.getIntExtra(EXTRA_UNLAUNCHABLE_REASON, -1); mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); if (mUserId == UserHandle.USER_NULL) { Log.wtf(TAG, "Invalid user id: " + mUserId + ". Stopping."); finish(); return; } String dialogTitle; String dialogMessage; if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) { dialogTitle = getResources().getString(R.string.work_mode_off_title); dialogMessage = getResources().getString(R.string.work_mode_off_message); } else if (mReason == UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE) { PackageManager pm = getPackageManager(); DevicePolicyManager dpm = (DevicePolicyManager) getSystemService( Context.DEVICE_POLICY_SERVICE); String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME); String packageLabel = packageName; try { Context userContext = createPackageContextAsUser(packageName, 0, UserHandle.of(mUserId)); ApplicationInfo appInfo = userContext.getApplicationInfo(); if (appInfo != null) { packageLabel = userContext.getPackageManager().getApplicationLabel(appInfo) .toString(); } } catch (NameNotFoundException e) { } dialogTitle = String.format(getResources().getString(R.string.suspended_package_title), packageLabel); dialogMessage = dpm.getShortSupportMessageForUser(dpm.getProfileOwnerAsUser(mUserId), mUserId); if (dialogMessage == null) { dialogMessage = String.format( getResources().getString(R.string.suspended_package_message), dpm.getProfileOwnerNameAsUser(mUserId)); } } else { Log.wtf(TAG, "Invalid unlaunchable type: " + mReason); finish(); return; } View rootView = LayoutInflater.from(this).inflate(R.layout.unlaunchable_app_activity, null); TextView titleView = (TextView)rootView.findViewById(R.id.unlaunchable_app_title); TextView messageView = (TextView)rootView.findViewById(R.id.unlaunchable_app_message); titleView.setText(dialogTitle); messageView.setText(dialogMessage); AlertDialog.Builder builder = new AlertDialog.Builder(this) .setView(rootView) .setOnDismissListener(this); if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) { builder.setPositiveButton(R.string.work_mode_turn_on, this) .setNegativeButton(R.string.cancel, null); } else { builder.setPositiveButton(R.string.ok, null); } builder.show(); } @Override public void onDismiss(DialogInterface dialog) { finish(); } @Override public void onClick(DialogInterface dialog, int which) { if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE && which == DialogInterface.BUTTON_POSITIVE) { UserManager.get(this).setQuietModeEnabled(mUserId, false); } } private static final Intent createBaseIntent() { Intent intent = new Intent(); intent.setComponent(new ComponentName("android", UnlaunchableAppActivity.class.getName())); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); return intent; } public static Intent createInQuietModeDialogIntent(int userId) { Intent intent = createBaseIntent(); intent.putExtra(EXTRA_UNLAUNCHABLE_REASON, UNLAUNCHABLE_REASON_QUIET_MODE); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); return intent; } public static Intent createPackageSuspendedDialogIntent(String packageName, int userId) { Intent intent = createBaseIntent(); intent.putExtra(EXTRA_UNLAUNCHABLE_REASON, UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); return intent; } }
core/res/AndroidManifest.xml +6 −0 Original line number Diff line number Diff line Loading @@ -3019,6 +3019,12 @@ </intent-filter> </activity> <activity android:name="com.android.internal.app.UnlaunchableAppActivity" android:theme="@style/Theme.Material.DayNight.Dialog.Alert" android:excludeFromRecents="true" android:process=":ui"> </activity> <receiver android:name="com.android.server.BootReceiver" android:systemUserOnly="true"> <intent-filter android:priority="1000"> Loading
core/res/res/layout/unlaunchable_app_activity.xml 0 → 100644 +35 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2016 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/dialog_padding" android:orientation="vertical"> <TextView android:id="@+id/unlaunchable_app_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="@dimen/dialog_padding" android:paddingBottom="@dimen/dialog_padding" android:textAppearance="@android:style/TextAppearance.Material.Title" /> <TextView android:id="@+id/unlaunchable_app_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="@dimen/dialog_padding" android:textAppearance="@android:style/TextAppearance.Material.Subhead" android:textColor="?android:attr/textColorSecondary" /> </LinearLayout>
core/res/res/values/strings.xml +10 −0 Original line number Diff line number Diff line Loading @@ -4164,4 +4164,14 @@ <!-- Menu item in the locale menu [CHAR LIMIT=30] --> <string name="locale_search_menu">Search</string> <!-- Title for dialog displayed when work profile is turned off. [CHAR LIMIT=30] --> <string name="work_mode_off_title">Work mode is OFF</string> <!-- Message displayed in dialog when work profile is turned off. [CHAR LIMIT=NONE] --> <string name="work_mode_off_message">Allow work profile to function, including apps, background sync, and related features.</string> <!-- Title for button to turn on work profile. [CHAR LIMIT=NONE] --> <string name="work_mode_turn_on">Turn on</string> <!-- Title for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=30] --> <string name="suspended_package_title">%1$s disabled</string> <!-- Message for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=NONE] --> <string name="suspended_package_message">Disabled by %1$s administrator. Contact them to learn more.</string> </resources>
core/res/res/values/symbols.xml +8 −0 Original line number Diff line number Diff line Loading @@ -2485,4 +2485,12 @@ <java-symbol type="string" name="language_selection_title" /> <java-symbol type="string" name="search_language_hint" /> <java-symbol type="layout" name="unlaunchable_app_activity" /> <java-symbol type="id" name="unlaunchable_app_title" /> <java-symbol type="id" name="unlaunchable_app_message" /> <java-symbol type="string" name="work_mode_off_title" /> <java-symbol type="string" name="work_mode_off_message" /> <java-symbol type="string" name="work_mode_turn_on" /> <java-symbol type="string" name="suspended_package_title" /> <java-symbol type="string" name="suspended_package_message" /> </resources>