157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler/* 257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * Copyright (C) 2016 The Android Open Source Project 357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * 457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * you may not use this file except in compliance with the License. 657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * You may obtain a copy of the License at 757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * 857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * http://www.apache.org/licenses/LICENSE-2.0 957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * 1057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * Unless required by applicable law or agreed to in writing, software 1157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 1257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * See the License for the specific language governing permissions and 1457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * limitations under the License 1557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler */ 1657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 1757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerpackage com.android.packageinstaller.television; 1857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 1957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.app.Activity; 2057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.content.pm.ApplicationInfo; 2157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.content.pm.PackageManager; 2257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.content.pm.UserInfo; 2357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.os.Bundle; 2457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.os.UserManager; 2557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.support.v17.leanback.app.GuidedStepFragment; 2657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.support.v17.leanback.widget.GuidanceStylist; 2757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport android.support.v17.leanback.widget.GuidedAction; 2857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 2957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport com.android.packageinstaller.R; 3057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport com.android.packageinstaller.UninstallerActivity; 3157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 3257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerimport java.util.List; 3357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 3457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantlerpublic class UninstallAlertFragment extends GuidedStepFragment { 3557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler @Override 3657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler public int onProvideTheme() { 3757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler return R.style.Theme_Leanback_GuidedStep; 3857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 3957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 4057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler @Override 4157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 4257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler final PackageManager pm = getActivity().getPackageManager(); 4357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler final UninstallerActivity.DialogInfo dialogInfo = 4457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler ((UninstallerActivity) getActivity()).getDialogInfo(); 4557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler final CharSequence appLabel = dialogInfo.appInfo.loadLabel(pm); 4657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 4757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler StringBuilder messageBuilder = new StringBuilder(); 4857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 4957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler // If the Activity label differs from the App label, then make sure the user 5057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler // knows the Activity belongs to the App being uninstalled. 5157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler if (dialogInfo.activityInfo != null) { 5257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler final CharSequence activityLabel = dialogInfo.activityInfo.loadLabel(pm); 5357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler if (!activityLabel.equals(appLabel)) { 5457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.append( 5557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler getString(R.string.uninstall_activity_text, activityLabel)); 5657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.append(" ").append(appLabel).append(".\n\n"); 5757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 5857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 5957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 6057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler final boolean isUpdate = 6157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler ((dialogInfo.appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0); 6257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler UserManager userManager = UserManager.get(getActivity()); 6357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler if (isUpdate) { 6457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler if (isSingleUser(userManager)) { 6557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.append(getString(R.string.uninstall_update_text)); 6657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } else { 6757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.append(getString(R.string.uninstall_update_text_multiuser)); 6857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 6957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } else { 7057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler if (dialogInfo.allUsers && !isSingleUser(userManager)) { 7157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.append(getString(R.string.uninstall_application_text_all_users)); 7257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } else if (!dialogInfo.user.equals(android.os.Process.myUserHandle())) { 7357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler UserInfo userInfo = userManager.getUserInfo(dialogInfo.user.getIdentifier()); 7457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.append( 7557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler getString(R.string.uninstall_application_text_user, userInfo.name)); 7657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } else { 7757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.append(getString(R.string.uninstall_application_text)); 7857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 7957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 8057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 8157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler return new GuidanceStylist.Guidance( 8257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler appLabel.toString(), 8357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler messageBuilder.toString(), 8457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler null, 8557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler dialogInfo.appInfo.loadIcon(pm)); 8657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 8757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 8857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler @Override 8957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 9057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler actions.add(new GuidedAction.Builder(getContext()) 9157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler .clickAction(GuidedAction.ACTION_ID_OK) 9257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler .build()); 9357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler actions.add(new GuidedAction.Builder(getContext()) 9457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler .clickAction(GuidedAction.ACTION_ID_CANCEL) 9557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler .build()); 9657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 9757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 9857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler @Override 9957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler public void onGuidedActionClicked(GuidedAction action) { 10057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler if (isAdded()) { 10157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler if (action.getId() == GuidedAction.ACTION_ID_OK) { 10257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler ((UninstallerActivity) getActivity()).startUninstallProgress(); 10357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler getActivity().finish(); 10457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } else { 10557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler ((UninstallerActivity) getActivity()).dispatchAborted(); 10657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler getActivity().setResult(Activity.RESULT_FIRST_USER); 10757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler getActivity().finish(); 10857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 10957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 11057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 11157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler 11257cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler /** 11357cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * Returns whether there is only one user on this device, not including 11457cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler * the system-only user. 11557cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler */ 11657cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler private boolean isSingleUser(UserManager userManager) { 11757cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler final int userCount = userManager.getUserCount(); 11857cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler return userCount == 1 11957cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler || (UserManager.isSplitSystemUser() && userCount == 2); 12057cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler } 12157cc87cfda341ea0d64eb2e46815ca9817b626f6Tony Mantler} 122