/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.linkbubble.ui; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.ComponentName; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; import com.linkbubble.R; import com.linkbubble.Settings; import com.linkbubble.util.ActionItem; import com.linkbubble.util.CrashTracking; import com.linkbubble.util.Util; import java.util.TreeMap; /* * This class exists solely because Android's PreferenceScreen implementation doesn't do anything * when the Up button is touched, and we need to go back in that case given our use of the Up button. */ public class SettingsDefaultAppsActivity extends AppCompatPreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings_default_apps); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle(R.string.preference_default_apps_title); setSupportActionBar(toolbar); toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } @Override public void finish() { super.finish(); overridePendingTransition(R.anim.activity_close_enter, R.anim.activity_close_exit); } static public class SettingsDefaultAppsFragment extends SettingsBaseFragment implements SharedPreferences.OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences_default_apps); PreferenceScreen rootPreferenceScreen = (PreferenceScreen) findPreference("preference_default_apps_root"); Preference defaultBrowserPreference = findPreference(Settings.PREFERENCE_DEFAULT_BROWSER); defaultBrowserPreference.setSummary(Settings.get().getDefaultBrowserLabel()); Drawable defaultBrowserIcon = Settings.get().getDefaultBrowserIcon(getActivity()); if (defaultBrowserIcon != null) { setPreferenceIcon(defaultBrowserPreference, defaultBrowserIcon); } defaultBrowserPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { AlertDialog alertDialog = ActionItem.getDefaultBrowserAlert(getActivity(), new ActionItem.OnActionItemSelectedListener() { @Override public void onSelected(ActionItem actionItem) { Settings.get().setDefaultBrowser(actionItem.getLabel(), actionItem.mPackageName); preference.setSummary(Settings.get().getDefaultBrowserLabel()); Drawable defaultBrowserIcon = Settings.get().getDefaultBrowserIcon(getActivity()); if (defaultBrowserIcon != null) { setPreferenceIcon(preference, defaultBrowserIcon); } } }); Util.showThemedDialog(alertDialog); return true; } }); configureDefaultAppsList(); } private void configureDefaultAppsList() { PreferenceCategory preferenceCategory = (PreferenceCategory)findPreference("preference_category_other_apps"); preferenceCategory.removeAll(); Preference noticePreference = new Preference(getActivity()); PackageManager packageManager = getActivity().getPackageManager(); TreeMap<String, ComponentName> defaultAppsMap = Settings.get().getDefaultAppsMap(); if (defaultAppsMap != null && defaultAppsMap.size() > 0) { noticePreference.setSummary(R.string.preference_default_apps_notice_summary); preferenceCategory.addPreference(noticePreference); for (String key : defaultAppsMap.keySet()) { ComponentName componentName = defaultAppsMap.get(key); try { ActivityInfo info = packageManager.getActivityInfo(componentName, 0); final CharSequence label = info.loadLabel(packageManager); final String host = key; Preference preference = new Preference(getActivity()); preference.setTitle(label); setPreferenceIcon(preference, info.loadIcon(packageManager)); preference.setSummary(key); preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @SuppressLint("StringFormatMatches") // Lint incorrectly flags this because 2 items are the same. @Override public boolean onPreferenceClick(Preference preference) { Resources resources = getActivity().getResources(); AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create(); alertDialog.setIcon(Util.getAlertIcon(getActivity())); alertDialog.setTitle(R.string.remove_default_title); alertDialog.setMessage(String.format(resources.getString(R.string.remove_default_message), label, host, host)); alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, resources.getString(R.string.action_remove), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Settings.get().removeDefaultApp(host); configureDefaultAppsList(); } }); alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, resources.getString(R.string.action_cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); Util.showThemedDialog(alertDialog); return true; } }); preferenceCategory.addPreference(preference); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } } else { noticePreference.setSummary(R.string.preference_default_apps_notice_no_defaults_summary); preferenceCategory.addPreference(noticePreference); } } @Override public void onResume() { super.onResume(); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); configureDefaultAppsList(); } @Override public void onPause() { super.onPause(); getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Preference preference = findPreference(key); if (preference instanceof ListPreference) { ListPreference listPref = (ListPreference) preference; preference.setSummary(listPref.getEntry()); } } } }