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