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