1fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei/*
2fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * Copyright (C) 2018 The Android Open Source Project
3fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei *
4fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * Licensed under the Apache License, Version 2.0 (the "License");
5fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * you may not use this file except in compliance with the License.
6fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * You may obtain a copy of the License at
7fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei *
8fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei *      http://www.apache.org/licenses/LICENSE-2.0
9fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei *
10fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * Unless required by applicable law or agreed to in writing, software
11fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * distributed under the License is distributed on an "AS IS" BASIS,
12fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * See the License for the specific language governing permissions and
14fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * limitations under the License.
15fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei */
16fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
17fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleipackage com.android.settings.fuelgauge.batterytip;
18fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
19fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.app.AlertDialog;
20fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.app.Dialog;
21fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.content.Context;
22fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.content.DialogInterface;
23fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.os.Bundle;
24fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.support.annotation.VisibleForTesting;
25fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.support.v7.widget.LinearLayoutManager;
26fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.support.v7.widget.RecyclerView;
27fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport android.view.LayoutInflater;
28fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
29333f794b4f5253e98b48a9833613b42beba5991fjackqdyuleiimport com.android.internal.logging.nano.MetricsProto;
30fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport com.android.settings.R;
31e682126a11780abb45d4ecc365bf9705667680f6jackqdyuleiimport com.android.settings.SettingsActivity;
32ecee6760931d9dfbf8fd002a5409a5642c6516c6jackqdyuleiimport com.android.settings.Utils;
331b472be8334120dbc54c26b569698f49ea6c606ajackqdyuleiimport com.android.settings.core.InstrumentedPreferenceFragment;
34fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport com.android.settings.core.instrumentation.InstrumentedDialogFragment;
35ede87ce19f297467217870027f970ad5fefdd9e3jackqdyuleiimport com.android.settings.fuelgauge.Estimate;
36fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController.BatteryTipListener;
37e682126a11780abb45d4ecc365bf9705667680f6jackqdyuleiimport com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
38fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
39fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleiimport com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
40ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyuleiimport com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
41ede87ce19f297467217870027f970ad5fefdd9e3jackqdyuleiimport com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
4299a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyuleiimport com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
43408dc4122883d1296bb891196e28a5d012ab6594Salvador Martinezimport com.android.settingslib.utils.StringUtil;
44ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei
45ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyuleiimport java.util.List;
46fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
47fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei/**
48fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei * Dialog Fragment to show action dialog for each anomaly
49fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei */
50fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyuleipublic class BatteryTipDialogFragment extends InstrumentedDialogFragment implements
51fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        DialogInterface.OnClickListener {
52fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
53fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    private static final String ARG_BATTERY_TIP = "battery_tip";
542b6e422ca1532a1b70772484b11524ee1b406fa4Lei Yu    private static final String ARG_METRICS_KEY = "metrics_key";
55fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
56fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    @VisibleForTesting
57fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    BatteryTip mBatteryTip;
582b6e422ca1532a1b70772484b11524ee1b406fa4Lei Yu    @VisibleForTesting
592b6e422ca1532a1b70772484b11524ee1b406fa4Lei Yu    int mMetricsKey;
60fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
612b6e422ca1532a1b70772484b11524ee1b406fa4Lei Yu    public static BatteryTipDialogFragment newInstance(BatteryTip batteryTip, int metricsKey) {
62fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        BatteryTipDialogFragment dialogFragment = new BatteryTipDialogFragment();
63fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
64fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        Bundle args = new Bundle(1);
65fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        args.putParcelable(ARG_BATTERY_TIP, batteryTip);
662b6e422ca1532a1b70772484b11524ee1b406fa4Lei Yu        args.putInt(ARG_METRICS_KEY, metricsKey);
67fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        dialogFragment.setArguments(args);
68fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
69fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        return dialogFragment;
70fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    }
71fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
72fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    @Override
73fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    public Dialog onCreateDialog(Bundle savedInstanceState) {
74fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        final Bundle bundle = getArguments();
75fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        final Context context = getContext();
76fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
77fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        mBatteryTip = bundle.getParcelable(ARG_BATTERY_TIP);
782b6e422ca1532a1b70772484b11524ee1b406fa4Lei Yu        mMetricsKey = bundle.getInt(ARG_METRICS_KEY);
79fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
80fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        switch (mBatteryTip.getType()) {
81fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei            case BatteryTip.TipType.SUMMARY:
82ede87ce19f297467217870027f970ad5fefdd9e3jackqdyulei                return new AlertDialog.Builder(context)
83adddc30c649a0e4de6ce29d156549ad43d28a619Lei Yu                        .setMessage(R.string.battery_tip_dialog_summary_message)
84ede87ce19f297467217870027f970ad5fefdd9e3jackqdyulei                        .setPositiveButton(android.R.string.ok, null)
85ede87ce19f297467217870027f970ad5fefdd9e3jackqdyulei                        .create();
86fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei            case BatteryTip.TipType.HIGH_DEVICE_USAGE:
87fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                final HighUsageTip highUsageTip = (HighUsageTip) mBatteryTip;
88fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                final RecyclerView view = (RecyclerView) LayoutInflater.from(context).inflate(
89fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                        R.layout.recycler_view,
90fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                        null);
91fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                view.setLayoutManager(new LinearLayoutManager(context));
92fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                view.setAdapter(new HighUsageAdapter(context,
93fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                        highUsageTip.getHighUsageAppList()));
94fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
95fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                return new AlertDialog.Builder(context)
96fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                        .setMessage(getString(R.string.battery_tip_dialog_message,
97bc54cedabd0092ff4ed722d24d482fb85dcdd100Lei Yu                                highUsageTip.getHighUsageAppList().size()))
98fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                        .setView(view)
99fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                        .setPositiveButton(android.R.string.ok, null)
100fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                        .create();
101ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei            case BatteryTip.TipType.APP_RESTRICTION:
102ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei                final RestrictAppTip restrictAppTip = (RestrictAppTip) mBatteryTip;
103ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei                final List<AppInfo> restrictedAppList = restrictAppTip.getRestrictAppList();
104ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei                final int num = restrictedAppList.size();
105888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                final CharSequence appLabel = Utils.getApplicationLabel(context,
106888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                        restrictedAppList.get(0).packageName);
107ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei
10899a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                final AlertDialog.Builder builder = new AlertDialog.Builder(context)
109ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei                        .setTitle(context.getResources().getQuantityString(
11099a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                                R.plurals.battery_tip_restrict_app_dialog_title, num, num))
111ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei                        .setPositiveButton(R.string.battery_tip_restrict_app_dialog_ok, this)
11299a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                        .setNegativeButton(android.R.string.cancel, null);
113888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                if (num == 1) {
114888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                    builder.setMessage(
115888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                            getString(R.string.battery_tip_restrict_app_dialog_message, appLabel));
116888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                } else if (num <= 5) {
117888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                    builder.setMessage(
118888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                            getString(
119888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                                    R.string.battery_tip_restrict_apps_less_than_5_dialog_message));
12099a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                    final RecyclerView restrictionView = (RecyclerView) LayoutInflater.from(
12199a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                            context).inflate(R.layout.recycler_view, null);
12299a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                    restrictionView.setLayoutManager(new LinearLayoutManager(context));
12399a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                    restrictionView.setAdapter(new HighUsageAdapter(context, restrictedAppList));
12499a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                    builder.setView(restrictionView);
125888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                } else {
126888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                    builder.setMessage(context.getString(
127888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                            R.string.battery_tip_restrict_apps_more_than_5_dialog_message,
128888ea9ef1ff75a877ae11d8f6b0eee9df973941bLei Yu                            restrictAppTip.getRestrictAppsString(context)));
12999a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                }
13099a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei
13199a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                return builder.create();
13299a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei            case BatteryTip.TipType.REMOVE_APP_RESTRICTION:
13399a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                final UnrestrictAppTip unrestrictAppTip = (UnrestrictAppTip) mBatteryTip;
13499a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                final CharSequence name = Utils.getApplicationLabel(context,
13599a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                        unrestrictAppTip.getPackageName());
13699a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei
13799a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                return new AlertDialog.Builder(context)
138206f406aeb8758978cbe968ecaf5c0e090228ff0Lei Yu                        .setTitle(getString(R.string.battery_tip_unrestrict_app_dialog_title))
13999a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                        .setMessage(R.string.battery_tip_unrestrict_app_dialog_message)
14099a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                        .setPositiveButton(R.string.battery_tip_unrestrict_app_dialog_ok, this)
14199a2de41ef8ff7eb4ea47413d5ad8c930c00d881jackqdyulei                        .setNegativeButton(R.string.battery_tip_unrestrict_app_dialog_cancel, null)
142ab0cde6bad5005e5c7fba3e9e17ca6b6408a09ffjackqdyulei                        .create();
143fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei            default:
144fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei                throw new IllegalArgumentException("unknown type " + mBatteryTip.getType());
145fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        }
146fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    }
147fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
148fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    @Override
149fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    public int getMetricsCategory() {
150333f794b4f5253e98b48a9833613b42beba5991fjackqdyulei        return MetricsProto.MetricsEvent.FUELGAUGE_BATTERY_TIP_DIALOG;
151fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    }
152fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
153fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    @Override
154fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    public void onClick(DialogInterface dialog, int which) {
155fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        final BatteryTipListener lsn = (BatteryTipListener) getTargetFragment();
156fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        if (lsn == null) {
157fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei            return;
158fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        }
159e682126a11780abb45d4ecc365bf9705667680f6jackqdyulei        final BatteryTipAction action = BatteryTipUtils.getActionForBatteryTip(mBatteryTip,
1601b472be8334120dbc54c26b569698f49ea6c606ajackqdyulei                (SettingsActivity) getActivity(),
1611b472be8334120dbc54c26b569698f49ea6c606ajackqdyulei                (InstrumentedPreferenceFragment) getTargetFragment());
162e682126a11780abb45d4ecc365bf9705667680f6jackqdyulei        if (action != null) {
1632b6e422ca1532a1b70772484b11524ee1b406fa4Lei Yu            action.handlePositiveAction(mMetricsKey);
164e682126a11780abb45d4ecc365bf9705667680f6jackqdyulei        }
165fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei        lsn.onBatteryTipHandled(mBatteryTip);
166fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei    }
167fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei
168fde637ff603ef3d28cacb221a749f3d4653760b8jackqdyulei}
169