1cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan/* 2cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * Copyright (C) 2016 The Android Open Source Project 3cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * 4cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * Licensed under the Apache License, Version 2.0 (the "License"); 5cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * you may not use this file except in compliance with the License. 6cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * You may obtain a copy of the License at 7cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * 8cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * http://www.apache.org/licenses/LICENSE-2.0 9cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * 10cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * Unless required by applicable law or agreed to in writing, software 11cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * distributed under the License is distributed on an "AS IS" BASIS, 12cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * See the License for the specific language governing permissions and 14cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * limitations under the License. 15cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan */ 165874835f1edc1cac42eb4b3aa5fe437e8fd53c78mariagpuyolpackage com.android.emergency.edit; 17cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan 188ab27ec8dd566cb0d4215439bdf5773ba2c239b1mariagpuyolimport static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; 198ab27ec8dd566cb0d4215439bdf5773ba2c239b1mariagpuyol 20432ad365542a71f22c81c341592a16cde9e6be6fJuan Langimport android.app.Activity; 21de7a405217ad397057dfcc8c386330c73339b31dmariagpuyolimport android.app.AlertDialog; 22de7a405217ad397057dfcc8c386330c73339b31dmariagpuyolimport android.app.Dialog; 23de7a405217ad397057dfcc8c386330c73339b31dmariagpuyolimport android.app.DialogFragment; 24de7a405217ad397057dfcc8c386330c73339b31dmariagpuyolimport android.app.Fragment; 25b101808f242719aea123c138883a0854cd0a8ad1mariagpuyolimport android.content.ComponentName; 26de7a405217ad397057dfcc8c386330c73339b31dmariagpuyolimport android.content.DialogInterface; 270556d6c6abe3add19e72d52ed58d39c087720527mariagpuyolimport android.content.SharedPreferences; 28b101808f242719aea123c138883a0854cd0a8ad1mariagpuyolimport android.content.pm.PackageManager; 29cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannanimport android.os.Bundle; 302c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Langimport android.support.v14.preference.PreferenceFragment; 312c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Langimport android.support.v7.preference.PreferenceManager; 32c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyolimport android.util.Pair; 3388757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyolimport android.view.Menu; 3488757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyolimport android.view.MenuInflater; 3588757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyolimport android.view.MenuItem; 36cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan 370556d6c6abe3add19e72d52ed58d39c087720527mariagpuyolimport com.android.emergency.PreferenceKeys; 38232daafc102052b458a3d3847ff9290f73915395mariagpuyolimport com.android.emergency.R; 391113c27438c8affdb1c852c6f7c9ff52416e874aJuan Langimport com.android.emergency.overlay.FeatureFactory; 40d6bbac5f7c1dca2e9b961863c079296dbf5f08a6Juan Langimport com.android.emergency.util.PreferenceUtils; 41b101808f242719aea123c138883a0854cd0a8ad1mariagpuyolimport com.android.emergency.view.ViewInfoActivity; 42432ad365542a71f22c81c341592a16cde9e6be6fJuan Langimport com.android.internal.annotations.VisibleForTesting; 434ca9a496b859f603103d7cdedcb51607ab9d36c5mariagpuyolimport com.android.internal.logging.MetricsLogger; 442fdeb9a7dd9b460c621a7a9eb4f04687a6da158dTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 45de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol 46c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyolimport java.util.ArrayList; 47c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 48cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan/** 49cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan * Activity for editing emergency information. 50cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan */ 51432ad365542a71f22c81c341592a16cde9e6be6fJuan Langpublic class EditInfoActivity extends Activity { 52124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol static final String TAG_CLEAR_ALL_DIALOG = "clear_all_dialog"; 53de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol 54432ad365542a71f22c81c341592a16cde9e6be6fJuan Lang private EditInfoFragment mEditInfoFragment; 55432ad365542a71f22c81c341592a16cde9e6be6fJuan Lang 56cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan @Override 57cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan protected void onCreate(Bundle savedInstanceState) { 58cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan super.onCreate(savedInstanceState); 59b101808f242719aea123c138883a0854cd0a8ad1mariagpuyol // Protect against b/28401242 by enabling ViewInfoActivity. 60b101808f242719aea123c138883a0854cd0a8ad1mariagpuyol // We used to have code that disabled/enabled it and it could have been left in disabled 61b101808f242719aea123c138883a0854cd0a8ad1mariagpuyol // state. 62b101808f242719aea123c138883a0854cd0a8ad1mariagpuyol PackageManager pm = getPackageManager(); 63b101808f242719aea123c138883a0854cd0a8ad1mariagpuyol pm.setComponentEnabledSetting(new ComponentName(this, ViewInfoActivity.class), 64b101808f242719aea123c138883a0854cd0a8ad1mariagpuyol PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP); 65232daafc102052b458a3d3847ff9290f73915395mariagpuyol 66733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang getActionBar().setDisplayHomeAsUpEnabled(true); 67733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang 682c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang // We only add a new EditInfoFragment if no fragment is restored. 692c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content); 702c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang if (fragment == null) { 712c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang mEditInfoFragment = new EditInfoFragment(); 722c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang getFragmentManager().beginTransaction() 732c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang .add(android.R.id.content, mEditInfoFragment) 742c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang .commit(); 752c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang } else { 762c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang mEditInfoFragment = (EditInfoFragment) fragment; 772c0518a7dfd5b7cd36e88d9f2df064b1e756bd83Juan Lang } 787ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol 79d6bbac5f7c1dca2e9b961863c079296dbf5f08a6Juan Lang // Show or hide the settings suggestion, depending on whether any emergency settings exist. 80d6bbac5f7c1dca2e9b961863c079296dbf5f08a6Juan Lang PreferenceUtils.updateSettingsSuggestionState(this); 81d6bbac5f7c1dca2e9b961863c079296dbf5f08a6Juan Lang 828ab27ec8dd566cb0d4215439bdf5773ba2c239b1mariagpuyol getWindow().addFlags(FLAG_DISMISS_KEYGUARD); 83ea078ed952308c070012a96218a800939986cf90mariagpuyol MetricsLogger.visible(this, MetricsEvent.ACTION_EDIT_EMERGENCY_INFO); 84ea078ed952308c070012a96218a800939986cf90mariagpuyol } 85cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan 86ea078ed952308c070012a96218a800939986cf90mariagpuyol @Override 8788757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol public boolean onCreateOptionsMenu(Menu menu) { 8888757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol MenuInflater inflater = getMenuInflater(); 8988757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol inflater.inflate(R.menu.edit_info_menu, menu); 9088757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol return true; 91ea078ed952308c070012a96218a800939986cf90mariagpuyol } 929be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol 939be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol @Override 9488757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol public boolean onOptionsItemSelected(MenuItem item) { 9588757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol switch (item.getItemId()) { 96733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang case android.R.id.home: 97733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang // The user asked to navigate up, which, in this case, can easily be accomplished 98733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang // by finishing the activity. 99733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang finish(); 100733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang return true; 101733755a13ab3eb4e1ea3799ff633c4ce5e5a3014Juan Lang 10288757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol case R.id.action_clear_all: 10388757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol showClearAllDialog(); 10488757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol return true; 10588757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 10688757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol return super.onOptionsItemSelected(item); 10788757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 10888757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol 109432ad365542a71f22c81c341592a16cde9e6be6fJuan Lang /** @return The single fragment managed by this activity. */ 110432ad365542a71f22c81c341592a16cde9e6be6fJuan Lang @VisibleForTesting 111432ad365542a71f22c81c341592a16cde9e6be6fJuan Lang public PreferenceFragment getFragment() { 112432ad365542a71f22c81c341592a16cde9e6be6fJuan Lang return mEditInfoFragment; 113c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol } 114c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 11588757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol private void showClearAllDialog() { 116124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol final ClearAllDialogFragment previousFragment = 117124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol (ClearAllDialogFragment) getFragmentManager() 118124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol .findFragmentByTag(EditInfoActivity.TAG_CLEAR_ALL_DIALOG); 119124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol if (previousFragment == null) { 120124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol DialogFragment newFragment = ClearAllDialogFragment.newInstance(); 121124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol newFragment.show(getFragmentManager(), TAG_CLEAR_ALL_DIALOG); 12288757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 12388757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 124f0e8818031c5e1ceb40e4f22bd3bc27a2b6771camariagpuyol 125124a8fdf53a4815c0f57b6178e97322dc86d40a6mariagpuyol private void onClearAllPreferences() { 1260556d6c6abe3add19e72d52ed58d39c087720527mariagpuyol SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 1270556d6c6abe3add19e72d52ed58d39c087720527mariagpuyol for (String key : PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO) { 1280556d6c6abe3add19e72d52ed58d39c087720527mariagpuyol sharedPreferences.edit().remove(key).commit(); 1290556d6c6abe3add19e72d52ed58d39c087720527mariagpuyol } 1300556d6c6abe3add19e72d52ed58d39c087720527mariagpuyol sharedPreferences.edit().remove(PreferenceKeys.KEY_EMERGENCY_CONTACTS).commit(); 131d6bbac5f7c1dca2e9b961863c079296dbf5f08a6Juan Lang // Show the settings suggestion again, since no emergency info is set. 132d6bbac5f7c1dca2e9b961863c079296dbf5f08a6Juan Lang PreferenceUtils.enableSettingsSuggestion(this); 13388757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol 1340556d6c6abe3add19e72d52ed58d39c087720527mariagpuyol // Refresh the UI. 135432ad365542a71f22c81c341592a16cde9e6be6fJuan Lang mEditInfoFragment.reloadFromPreference(); 13688757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 13788757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol 138de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol /** 13988757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol * Dialog shown to the user when they tap on the CLEAR ALL menu item. Using a {@link 14088757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol * DialogFragment} takes care of screen rotation issues. 14188757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol */ 14288757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol public static class ClearAllDialogFragment extends DialogFragment { 14388757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol 14488757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol @Override 14588757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol public Dialog onCreateDialog(Bundle savedInstanceState) { 14688757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol Dialog dialog = new AlertDialog.Builder(getActivity()) 14788757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol .setMessage(R.string.clear_all_message) 14888757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol .setPositiveButton(R.string.clear, new DialogInterface.OnClickListener() { 14988757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol @Override 15088757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol public void onClick(DialogInterface dialog, int which) { 15188757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol ((EditInfoActivity) getActivity()).onClearAllPreferences(); 15288757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 15388757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol }) 15488757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol .setNegativeButton(android.R.string.cancel, null) 15588757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol .create(); 15688757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol return dialog; 15788757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 15888757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol 15988757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol public static DialogFragment newInstance() { 16088757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol return new ClearAllDialogFragment(); 16188757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 16288757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 163cdb6c148d185e06be10288e7dd7896ab13278e5fAkshay Kannan} 164