/* * Copyright (C) 2014 The Nitrogen Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.nitrogen.settings.fragments; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.os.Bundle; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceViewHolder; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.nitrogen.settings.preferences.PackageListAdapter; import com.nitrogen.settings.preferences.PackageListAdapter.PackageItem; import android.provider.Settings; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class HeadsUpSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener { private static final int DIALOG_WHITELIST_APPS = 0; private static final String PREF_HEADS_UP_TIME_OUT = "heads_up_time_out"; private static final String PREF_HEADS_UP_SNOOZE_TIME = "heads_up_snooze_time"; private PackageListAdapter mPackageAdapter; private PackageManager mPackageManager; private PreferenceGroup mWhitelistPrefList; private Preference mAddWhitelistPref; private ListPreference mHeadsUpTimeOut; private ListPreference mHeadsUpSnoozeTime; private String mWhitelistPackageList; private Map<String, Package> mWhitelistPackages; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get launch-able applications addPreferencesFromResource(R.xml.heads_up_settings); mPackageManager = getPackageManager(); mPackageAdapter = new PackageListAdapter(getActivity()); mWhitelistPrefList = (PreferenceGroup) findPreference("whitelist_applications"); mWhitelistPrefList.setOrderingAsAdded(false); mWhitelistPackages = new HashMap<String, Package>(); mAddWhitelistPref = findPreference("add_whitelist_packages"); mAddWhitelistPref.setOnPreferenceClickListener(this); Resources systemUiResources; try { systemUiResources = getPackageManager().getResourcesForApplication("com.android.systemui"); } catch (Exception e) { return; } int defaultTimeOut = systemUiResources.getInteger(systemUiResources.getIdentifier( "com.android.systemui:integer/heads_up_notification_decay", null, null)); mHeadsUpTimeOut = (ListPreference) findPreference(PREF_HEADS_UP_TIME_OUT); mHeadsUpTimeOut.setOnPreferenceChangeListener(this); int headsUpTimeOut = Settings.System.getInt(getContentResolver(), Settings.System.HEADS_UP_TIMEOUT, defaultTimeOut); mHeadsUpTimeOut.setValue(String.valueOf(headsUpTimeOut)); updateHeadsUpTimeOutSummary(headsUpTimeOut); int defaultSnooze = systemUiResources.getInteger(systemUiResources.getIdentifier( "com.android.systemui:integer/heads_up_default_snooze_length_ms", null, null)); mHeadsUpSnoozeTime = (ListPreference) findPreference(PREF_HEADS_UP_SNOOZE_TIME); mHeadsUpSnoozeTime.setOnPreferenceChangeListener(this); int headsUpSnooze = Settings.System.getInt(getContentResolver(), Settings.System.HEADS_UP_NOTIFICATION_SNOOZE, defaultSnooze); mHeadsUpSnoozeTime.setValue(String.valueOf(headsUpSnooze)); updateHeadsUpSnoozeTimeSummary(headsUpSnooze); } @Override public void onResume() { super.onResume(); refreshCustomApplicationPrefs(); } @Override protected int getMetricsCategory() { return MetricsEvent.NITROGEN_SETTINGS; } /** * Utility classes and supporting methods */ @Override public Dialog onCreateDialog(int id) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final Dialog dialog; switch (id) { case DIALOG_WHITELIST_APPS: final ListView list = new ListView(getActivity()); list.setAdapter(mPackageAdapter); builder.setTitle(R.string.profile_choose_app); builder.setView(list); dialog = builder.create(); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Add empty application definition, the user will be able to edit it later PackageItem info = (PackageItem) parent.getItemAtPosition(position); addCustomApplicationPref(info.packageName); dialog.cancel(); } }); break; default: dialog = null; } return dialog; } /** * Application class */ private static class Package { public String name; /** * Stores all the application values in one call * @param name */ public Package(String name) { this.name = name; } public String toString() { StringBuilder builder = new StringBuilder(); builder.append(name); return builder.toString(); } public static Package fromString(String value) { if (TextUtils.isEmpty(value)) { return null; } try { Package item = new Package(value); return item; } catch (NumberFormatException e) { return null; } } }; private void refreshCustomApplicationPrefs() { if (!parsePackageList()) { return; } // Add the Application Preferences if (mWhitelistPrefList != null) { mWhitelistPrefList.removeAll(); for (Package pkg : mWhitelistPackages.values()) { try { Preference pref = createPreferenceFromInfo(pkg); mWhitelistPrefList.addPreference(pref); } catch (PackageManager.NameNotFoundException e) { // Do nothing } } } // Keep these at the top mAddWhitelistPref.setOrder(0); // Add 'add' options mWhitelistPrefList.addPreference(mAddWhitelistPref); } @Override public boolean onPreferenceClick(Preference preference) { if (preference == mAddWhitelistPref) { showDialog(DIALOG_WHITELIST_APPS); } else { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) .setTitle(R.string.dialog_delete_title) .setMessage(R.string.dialog_delete_message) .setIconAttribute(android.R.attr.alertDialogIcon) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { removeCustomApplicationPref(preference.getKey()); } }) .setNegativeButton(android.R.string.cancel, null); builder.show(); } return true; } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference == mHeadsUpTimeOut) { int headsUpTimeOut = Integer.valueOf((String) newValue); Settings.System.putInt(getContentResolver(), Settings.System.HEADS_UP_TIMEOUT, headsUpTimeOut); updateHeadsUpTimeOutSummary(headsUpTimeOut); return true; } else if (preference == mHeadsUpSnoozeTime) { int headsUpSnooze = Integer.valueOf((String) newValue); Settings.System.putInt(getContentResolver(), Settings.System.HEADS_UP_NOTIFICATION_SNOOZE, headsUpSnooze); updateHeadsUpSnoozeTimeSummary(headsUpSnooze); return true; } return false; } private void updateHeadsUpTimeOutSummary(int value) { String summary = getResources().getString(R.string.heads_up_time_out_summary, value / 1000); mHeadsUpTimeOut.setSummary(summary); } private void updateHeadsUpSnoozeTimeSummary(int value) { if (value == 0) { mHeadsUpSnoozeTime.setSummary(getResources().getString(R.string.heads_up_snooze_disabled_summary)); } else if (value == 60000) { mHeadsUpSnoozeTime.setSummary(getResources().getString(R.string.heads_up_snooze_summary_one_minute)); } else { String summary = getResources().getString(R.string.heads_up_snooze_summary, value / 60 / 1000); mHeadsUpSnoozeTime.setSummary(summary); } } private void addCustomApplicationPref(String packageName) { Package pkg = mWhitelistPackages.get(packageName); if (pkg == null) { pkg = new Package(packageName); mWhitelistPackages.put(packageName, pkg); savePackageList(false); refreshCustomApplicationPrefs(); } } private Preference createPreferenceFromInfo(Package pkg) throws PackageManager.NameNotFoundException { PackageInfo info = mPackageManager.getPackageInfo(pkg.name, PackageManager.GET_META_DATA); Preference pref = new Preference(getActivity()); pref.setKey(pkg.name); pref.setTitle(info.applicationInfo.loadLabel(mPackageManager)); pref.setIcon(info.applicationInfo.loadIcon(mPackageManager)); pref.setPersistent(false); pref.setOnPreferenceClickListener(this); return pref; } private void removeCustomApplicationPref(String packageName) { if (mWhitelistPackages.remove(packageName) != null) { savePackageList(false); refreshCustomApplicationPrefs(); } } private boolean parsePackageList() { final String whitelistString = Settings.System.getString(getContentResolver(), Settings.System.HEADS_UP_WHITELIST_VALUES); if (TextUtils.equals(mWhitelistPackageList, whitelistString)) { return false; } mWhitelistPackageList = whitelistString; mWhitelistPackages.clear(); if (whitelistString != null) { final String[] array = TextUtils.split(whitelistString, "\\|"); for (String item : array) { if (TextUtils.isEmpty(item)) { continue; } Package pkg = Package.fromString(item); if (pkg != null) { mWhitelistPackages.put(pkg.name, pkg); } } } return true; } private void savePackageList(boolean preferencesUpdated) { List<String> settings = new ArrayList<String>(); for (Package app : mWhitelistPackages.values()) { settings.add(app.toString()); } final String value = TextUtils.join("|", settings); if (preferencesUpdated) { mWhitelistPackageList = value; } Settings.System.putString(getContentResolver(), Settings.System.HEADS_UP_WHITELIST_VALUES, value); } }