• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.packageinstaller.television;
18 
19 import android.app.Activity;
20 import android.content.pm.ApplicationInfo;
21 import android.content.pm.PackageManager;
22 import android.content.pm.UserInfo;
23 import android.os.Bundle;
24 import android.os.UserManager;
25 import android.support.v17.leanback.app.GuidedStepFragment;
26 import android.support.v17.leanback.widget.GuidanceStylist;
27 import android.support.v17.leanback.widget.GuidedAction;
28 
29 import com.android.packageinstaller.R;
30 import com.android.packageinstaller.UninstallerActivity;
31 
32 import java.util.List;
33 
34 public class UninstallAlertFragment extends GuidedStepFragment {
35     @Override
onProvideTheme()36     public int onProvideTheme() {
37         return R.style.Theme_Leanback_GuidedStep;
38     }
39 
40     @Override
onCreateGuidance(Bundle savedInstanceState)41     public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
42         final PackageManager pm = getActivity().getPackageManager();
43         final UninstallerActivity.DialogInfo dialogInfo =
44                 ((UninstallerActivity) getActivity()).getDialogInfo();
45         final CharSequence appLabel = dialogInfo.appInfo.loadSafeLabel(pm);
46 
47         StringBuilder messageBuilder = new StringBuilder();
48 
49         // If the Activity label differs from the App label, then make sure the user
50         // knows the Activity belongs to the App being uninstalled.
51         if (dialogInfo.activityInfo != null) {
52             final CharSequence activityLabel = dialogInfo.activityInfo.loadSafeLabel(pm);
53             if (!activityLabel.equals(appLabel)) {
54                 messageBuilder.append(
55                         getString(R.string.uninstall_activity_text, activityLabel));
56                 messageBuilder.append(" ").append(appLabel).append(".\n\n");
57             }
58         }
59 
60         final boolean isUpdate =
61                 ((dialogInfo.appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0);
62         UserManager userManager = UserManager.get(getActivity());
63         if (isUpdate) {
64             if (isSingleUser(userManager)) {
65                 messageBuilder.append(getString(R.string.uninstall_update_text));
66             } else {
67                 messageBuilder.append(getString(R.string.uninstall_update_text_multiuser));
68             }
69         } else {
70             if (dialogInfo.allUsers && !isSingleUser(userManager)) {
71                 messageBuilder.append(getString(R.string.uninstall_application_text_all_users));
72             } else if (!dialogInfo.user.equals(android.os.Process.myUserHandle())) {
73                 UserInfo userInfo = userManager.getUserInfo(dialogInfo.user.getIdentifier());
74                 messageBuilder.append(
75                         getString(R.string.uninstall_application_text_user, userInfo.name));
76             } else {
77                 messageBuilder.append(getString(R.string.uninstall_application_text));
78             }
79         }
80 
81         return new GuidanceStylist.Guidance(
82                 appLabel.toString(),
83                 messageBuilder.toString(),
84                 null,
85                 dialogInfo.appInfo.loadIcon(pm));
86     }
87 
88     @Override
onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState)89     public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
90         actions.add(new GuidedAction.Builder(getContext())
91                 .clickAction(GuidedAction.ACTION_ID_OK)
92                 .build());
93         actions.add(new GuidedAction.Builder(getContext())
94                 .clickAction(GuidedAction.ACTION_ID_CANCEL)
95                 .build());
96     }
97 
98     @Override
onGuidedActionClicked(GuidedAction action)99     public void onGuidedActionClicked(GuidedAction action) {
100         if (isAdded()) {
101             if (action.getId() == GuidedAction.ACTION_ID_OK) {
102                 ((UninstallerActivity) getActivity()).startUninstallProgress();
103                 getActivity().finish();
104             } else {
105                 ((UninstallerActivity) getActivity()).dispatchAborted();
106                 getActivity().setResult(Activity.RESULT_FIRST_USER);
107                 getActivity().finish();
108             }
109         }
110     }
111 
112     /**
113      * Returns whether there is only one user on this device, not including
114      * the system-only user.
115      */
isSingleUser(UserManager userManager)116     private boolean isSingleUser(UserManager userManager) {
117         final int userCount = userManager.getUserCount();
118         return userCount == 1
119                 || (UserManager.isSplitSystemUser() && userCount == 2);
120     }
121 }
122