Add the possibility to clear all infos

Bug:27905566
Change-Id: I5bf2ffa82609509e4cfd8258cd1c27a48a6183bf
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7885f18..f8ba76f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -39,7 +39,6 @@
 
         <activity
             android:name=".edit.EditInfoActivity"
-            android:label="@string/edit_emergency_info_label"
             android:theme="@style/AppTheme"
             android:launchMode="singleTask">
             <intent-filter>
diff --git a/res/layout/custom_action_bar.xml b/res/layout/custom_action_bar.xml
index 1648d43..04bebf8 100644
--- a/res/layout/custom_action_bar.xml
+++ b/res/layout/custom_action_bar.xml
@@ -16,6 +16,7 @@
 <Toolbar android:id="@+id/action_bar"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
+    android:title="@string/app_label"
     android:layout_height="wrap_content"
     android:background="?attr/colorPrimary"
     android:elevation="@dimen/tab_elevation"
diff --git a/res/menu/edit_info_menu.xml b/res/menu/edit_info_menu.xml
new file mode 100644
index 0000000..fd31f5f
--- /dev/null
+++ b/res/menu/edit_info_menu.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source 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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/action_clear_all"
+        android:title="@string/clear_all"
+        android:showAsAction="never" />
+</menu>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 023fccd..1833191 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -15,9 +15,7 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- The name of the app. [CHAR_LIMIT=30] -->
-    <string name="app_label">Emergency Information</string>
-    <!-- The title of the edit info activity. "Emergency Information" should be translated using app_label above [CHAR_LIMIT=30] -->
-    <string name="edit_emergency_info_label">Edit Emergency Information</string>
+    <string name="app_label">Emergency information</string>
     <!-- The description of the pencil icon, for talkback. [CHAR_LIMIT=NONE] -->
     <string name="edit_info">Edit emergency information</string>
     <!-- The title of the emergency info tab. [CHAR_LIMIT=15] -->
@@ -192,4 +190,10 @@
     <string name="emergency_info_continue">Continue</string>
     <!-- Message shown when no emergency information has been provided by the user [CHAR LIMIT=NONE] -->
     <string name="no_info_provided">No emergency information provided</string>
+    <!-- Label for action item on the menu of the editing screen [CHAR LIMIT=15] -->
+    <string name="clear_all">Clear all</string>
+    <!-- Label for button of dialog shown to clear all information and contacts [CHAR LIMIT=15] -->
+    <string name="clear">Clear</string>
+    <!-- Message of dialog shown to clear all information and contacts [CHAR LIMIT=NONE] -->
+    <string name="clear_all_message">Clear all information and contacts?</string>
 </resources>
diff --git a/src/com/android/emergency/EmergencyTabActivity.java b/src/com/android/emergency/EmergencyTabActivity.java
index 322949a..937ae56 100644
--- a/src/com/android/emergency/EmergencyTabActivity.java
+++ b/src/com/android/emergency/EmergencyTabActivity.java
@@ -73,7 +73,6 @@
         super.setContentView(layoutResID);
         setupTabs();
         Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar);
-        toolbar.setTitle(getActivityTitle());
         setActionBar(toolbar);
         getActionBar().setDisplayHomeAsUpEnabled(true);
     }
@@ -114,6 +113,11 @@
         return mTabLayout;
     }
 
+    /** Return the fragments. */
+    public ArrayList<Pair<String, Fragment>> getFragments() {
+        return mFragments;
+    }
+
     /** Return number of fragments to show in the tabs. */
     public int getNumberFragments() {
         return mFragments.size();
@@ -122,9 +126,6 @@
     /** Returns whether the activity is in view mode (true) or in edit mode (false). */
     public abstract boolean isInViewMode();
 
-    /** Returns the activity title. */
-    public abstract String getActivityTitle();
-
     /** Returns the fragments to show in the tabs. */
     protected abstract ArrayList<Pair<String, Fragment>> setUpFragments();
 
diff --git a/src/com/android/emergency/edit/EditEmergencyContactsFragment.java b/src/com/android/emergency/edit/EditEmergencyContactsFragment.java
index 576379e..5a557bd 100644
--- a/src/com/android/emergency/edit/EditEmergencyContactsFragment.java
+++ b/src/com/android/emergency/edit/EditEmergencyContactsFragment.java
@@ -67,7 +67,14 @@
     @Override
     public void onResume() {
         super.onResume();
-        mEmergencyContactsPreferenceCategory.reloadFromPreference();
+        reloadFromPreference();
+    }
+
+    /** Reloads the contacts by reading the value from the shared preferences. */
+    public void reloadFromPreference() {
+        if (mEmergencyContactsPreferenceCategory != null) {
+            mEmergencyContactsPreferenceCategory.reloadFromPreference();
+        }
     }
 
     @Override
diff --git a/src/com/android/emergency/edit/EditEmergencyInfoFragment.java b/src/com/android/emergency/edit/EditEmergencyInfoFragment.java
index 1965f2e..6e7775b 100644
--- a/src/com/android/emergency/edit/EditEmergencyInfoFragment.java
+++ b/src/com/android/emergency/edit/EditEmergencyInfoFragment.java
@@ -26,6 +26,7 @@
 
 import com.android.emergency.PreferenceKeys;
 import com.android.emergency.R;
+import com.android.emergency.ReloadablePreferenceInterface;
 import com.android.emergency.preferences.DatePreference;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
@@ -77,6 +78,23 @@
         return false;
     }
 
+    @Override
+    public void onResume() {
+        super.onResume();
+        reloadFromPreference();
+    }
+
+    /** Reloads all the preferences by reading the value from the shared preferences. */
+    public void reloadFromPreference() {
+        for (String preferenceKey : PreferenceKeys.KEYS_EDIT_EMERGENCY_INFO) {
+            ReloadablePreferenceInterface preference = (ReloadablePreferenceInterface)
+                    findPreference(preferenceKey);
+            if (preference != null) {
+                preference.reloadFromPreference();
+            }
+        }
+    }
+
     public static Fragment newInstance() {
         return new EditEmergencyInfoFragment();
     }
diff --git a/src/com/android/emergency/edit/EditInfoActivity.java b/src/com/android/emergency/edit/EditInfoActivity.java
index e26a56d..53b2f54 100644
--- a/src/com/android/emergency/edit/EditInfoActivity.java
+++ b/src/com/android/emergency/edit/EditInfoActivity.java
@@ -27,7 +27,11 @@
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
+import android.support.annotation.Nullable;
 import android.util.Pair;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 
 import com.android.emergency.EmergencyTabActivity;
 import com.android.emergency.R;
@@ -43,6 +47,7 @@
  */
 public class EditInfoActivity extends EmergencyTabActivity {
     private static final String TAG_WARNING_DIALOG = "warning_dialog";
+    private static final String TAG_CLEAR_ALL_DIALOG = "clear_all_dialog";
     private static final String KEY_LAST_CONSENT_TIME_MS = "last_consent_time_ms";
     private static final long ONE_DAY_MS = 24 * 60 * 60 * 1000;
     private static final String ACTION_EDIT_EMERGENCY_CONTACTS =
@@ -94,13 +99,25 @@
     }
 
     @Override
-    public boolean isInViewMode() {
-        return false;
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.edit_info_menu, menu);
+        return true;
     }
 
     @Override
-    public String getActivityTitle() {
-        return getString(R.string.edit_emergency_info_label);
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.action_clear_all:
+                showClearAllDialog();
+                return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public boolean isInViewMode() {
+        return false;
     }
 
     @Override
@@ -130,6 +147,33 @@
         newFragment.show(ft, TAG_WARNING_DIALOG);
     }
 
+    private void showClearAllDialog() {
+        // DialogFragment.show() will take care of adding the fragment
+        // in a transaction.  We also want to remove any currently showing
+        // dialog, so make our own transaction and take care of that here.
+        FragmentTransaction ft = getFragmentManager().beginTransaction();
+        Fragment previousDialog = getFragmentManager().findFragmentByTag(TAG_CLEAR_ALL_DIALOG);
+        if (previousDialog != null) {
+            ft.remove(previousDialog);
+        }
+        ft.addToBackStack(null);
+
+        DialogFragment newFragment = ClearAllDialogFragment.newInstance();
+        newFragment.show(ft, TAG_CLEAR_ALL_DIALOG);
+    }
+    
+    private void onClearAllPreferences() {
+        PreferenceManager.getDefaultSharedPreferences(this).edit().clear().apply();
+
+        ArrayList<Pair<String, Fragment>> fragments = getFragments();
+        EditEmergencyInfoFragment editEmergencyInfoFragment =
+                (EditEmergencyInfoFragment) fragments.get(0).second;
+        editEmergencyInfoFragment.reloadFromPreference();
+        EditEmergencyContactsFragment editEmergencyContactsFragment =
+                (EditEmergencyContactsFragment) fragments.get(1).second;
+        editEmergencyContactsFragment.reloadFromPreference();
+    }
+
     /**
      * Warning dialog shown to the user each time they go in to the edit info view. Using a {@link
      * DialogFragment} takes care of screen rotation issues.
@@ -166,4 +210,30 @@
             return new WarningDialogFragment();
         }
     }
+
+    /**
+     * Dialog shown to the user when they tap on the CLEAR ALL menu item. Using a {@link
+     * DialogFragment} takes care of screen rotation issues.
+     */
+    public static class ClearAllDialogFragment extends DialogFragment {
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            Dialog dialog = new AlertDialog.Builder(getActivity())
+                    .setMessage(R.string.clear_all_message)
+                    .setPositiveButton(R.string.clear, new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            ((EditInfoActivity) getActivity()).onClearAllPreferences();
+                        }
+                    })
+                    .setNegativeButton(android.R.string.cancel, null)
+                    .create();
+            return dialog;
+        }
+
+        public static DialogFragment newInstance() {
+            return new ClearAllDialogFragment();
+        }
+    }
 }
diff --git a/src/com/android/emergency/view/ViewInfoActivity.java b/src/com/android/emergency/view/ViewInfoActivity.java
index 2376677..ec08256 100644
--- a/src/com/android/emergency/view/ViewInfoActivity.java
+++ b/src/com/android/emergency/view/ViewInfoActivity.java
@@ -179,11 +179,6 @@
     }
 
     @Override
-    public String getActivityTitle() {
-        return getString(R.string.app_label);
-    }
-
-    @Override
     protected ArrayList<Pair<String, Fragment>> setUpFragments() {
         // Return only the fragments that have at least one piece of information set:
         ArrayList<Pair<String, Fragment>> fragments = new ArrayList<>(2);