push notifications: add global preference

Change-Id: Iafa4e3f41ba729251eebbd5772c7781c56e5c410
diff --git a/ring-android/app/src/main/java/cx/ring/application/RingApplication.java b/ring-android/app/src/main/java/cx/ring/application/RingApplication.java
index 9853e72..a2e06d0 100644
--- a/ring-android/app/src/main/java/cx/ring/application/RingApplication.java
+++ b/ring-android/app/src/main/java/cx/ring/application/RingApplication.java
@@ -159,9 +159,13 @@
                 // load accounts from Daemon
                 mAccountService.loadAccountsFromDaemon(mPreferencesService.hasNetworkConnected());
 
-                String token = FirebaseInstanceId.getInstance().getToken();
-                Log.w(TAG, "Setting Firebase push token: " + token);
-                Ringservice.setPushNotificationToken(token);
+                if (mPreferencesService.getUserSettings().isAllowPushNotifications()) {
+                    String token = FirebaseInstanceId.getInstance().getToken();
+                    Log.w(TAG, "Setting Firebase push token: " + token);
+                    Ringservice.setPushNotificationToken(token);
+                } else {
+                    Ringservice.setPushNotificationToken("");
+                }
 
                 Intent intent = new Intent(DRING_CONNECTION_CHANGED);
                 intent.putExtra("connected", mDaemonService.isStarted());
diff --git a/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java
index c3a7d49..89373d9 100644
--- a/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java
@@ -39,6 +39,7 @@
     private static final String RING_SETTINGS = "ring_settings";
     private static final String RING_REQUESTS = "ring_requests";
     private static final String RING_MOBILE_DATA = "mobile_data";
+    private static final String RING_PUSH_NOTIFICATIONS = "push_notifs";
     private static final String RING_SYSTEM_CONTACTS = "system_contacts";
     private static final String RING_PLACE_CALLS = "place_calls";
     private static final String RING_ON_STARTUP = "on_startup";
@@ -59,6 +60,7 @@
         edit.putBoolean(RING_SYSTEM_CONTACTS, settings.isAllowSystemContacts());
         edit.putBoolean(RING_PLACE_CALLS, settings.isAllowPlaceSystemCalls());
         edit.putBoolean(RING_ON_STARTUP, settings.isAllowRingOnStartup());
+        edit.putBoolean(RING_PUSH_NOTIFICATIONS, settings.isAllowPushNotifications());
 
         edit.apply();
         mUserSettings = settings;
@@ -82,6 +84,7 @@
         mUserSettings.setAllowSystemContacts(appPrefs.getBoolean(RING_SYSTEM_CONTACTS, false));
         mUserSettings.setAllowPlaceSystemCalls(appPrefs.getBoolean(RING_PLACE_CALLS, false));
         mUserSettings.setAllowRingOnStartup(appPrefs.getBoolean(RING_ON_STARTUP, true));
+        mUserSettings.setAllowPushNotifications(appPrefs.getBoolean(RING_PUSH_NOTIFICATIONS, false));
 
         return mUserSettings;
     }
diff --git a/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java b/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
index 1831c53..69f4bf2 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
@@ -50,10 +50,12 @@
 /**
  * TODO: improvements : handle multiples permissions for feature.
  */
-public class SettingsFragment extends BaseFragment<SettingsPresenter> implements GenericView<SettingsViewModel> {
+public class SettingsFragment extends BaseFragment<SettingsPresenter> implements GenericView<Settings> {
 
     @BindView(R.id.settings_mobile_data)
     Switch mViewMobileData;
+    @BindView(R.id.settings_push_notifications)
+    Switch mViewPushNotifications;
     @BindView(R.id.settings_contacts)
     Switch mViewContacts;
     @BindView(R.id.settings_place_call)
@@ -97,7 +99,7 @@
         menu.clear();
     }
 
-    @OnCheckedChanged({R.id.settings_mobile_data, R.id.settings_contacts, R.id.settings_place_call, R.id.settings_startup})
+    @OnCheckedChanged({R.id.settings_mobile_data, R.id.settings_push_notifications, R.id.settings_contacts, R.id.settings_place_call, R.id.settings_startup})
     public void onSettingsCheckedChanged(CompoundButton button, boolean isChecked) {
 
         String neededPermission = null;
@@ -145,6 +147,7 @@
         newSettings.setAllowSystemContacts(mViewContacts.isChecked());
         newSettings.setAllowPlaceSystemCalls(mViewPlaceCall.isChecked());
         newSettings.setAllowRingOnStartup(mViewStartup.isChecked());
+        newSettings.setAllowPushNotifications(mViewPushNotifications.isChecked());
 
         // save settings according to UI inputs
         presenter.saveSettings(newSettings);
@@ -221,9 +224,10 @@
 
     //region View Methods Implementation
     @Override
-    public void showViewModel(SettingsViewModel viewModel) {
+    public void showViewModel(Settings viewModel) {
         mIsRefreshingViewFromPresenter = true;
         mViewMobileData.setChecked(viewModel.isAllowMobileData());
+        mViewPushNotifications.setChecked(viewModel.isAllowPushNotifications());
         mViewContacts.setChecked(viewModel.isAllowSystemContacts());
         mViewPlaceCall.setChecked(viewModel.isAllowPlaceSystemCalls());
         mViewStartup.setChecked(viewModel.isAllowRingOnStartup());
diff --git a/ring-android/app/src/main/res/drawable/ic_priority_high_black_24dp.xml b/ring-android/app/src/main/res/drawable/ic_priority_high_black_24dp.xml
new file mode 100644
index 0000000..9fb7265
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable/ic_priority_high_black_24dp.xml
@@ -0,0 +1,8 @@
+<!-- drawable/priority_high.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="24dp"
+    android:width="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path android:fillColor="#000" android:pathData="M14,19H22V17H14V19M14,13.5H22V11.5H14V13.5M14,8H22V6H14V8M2,12.5C2,8.92 4.92,6 8.5,6H9V4L12,7L9,10V8H8.5C6,8 4,10 4,12.5C4,15 6,17 8.5,17H12V19H8.5C4.92,19 2,16.08 2,12.5Z" />
+</vector>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/layout/frag_settings.xml b/ring-android/app/src/main/res/layout/frag_settings.xml
index 62b4fca..8f07455 100644
--- a/ring-android/app/src/main/res/layout/frag_settings.xml
+++ b/ring-android/app/src/main/res/layout/frag_settings.xml
@@ -31,7 +31,7 @@
             android:layout_centerInParent="true"
             app:bounded_width="600dp">
 
-            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+            <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:orientation="vertical"
@@ -53,21 +53,17 @@
                     android:orientation="horizontal"
                     android:padding="8dp">
 
-                    <LinearLayout
+
+                    <ImageView
                         android:id="@+id/network_image"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_alignParentStart="true"
-                        android:layout_centerVertical="true">
+                        android:layout_centerVertical="true"
+                        android:layout_gravity="start"
+                        android:contentDescription="@string/pref_mobileData_summary"
+                        app:srcCompat="@drawable/ic_perm_data_setting_black_24dp" />
 
-                        <ImageView
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:layout_gravity="start"
-                            android:contentDescription="@string/pref_mobileData_summary"
-                            app:srcCompat="@drawable/ic_perm_data_setting_black_24dp" />
-
-                    </LinearLayout>
 
                     <LinearLayout
                         android:layout_width="wrap_content"
@@ -102,6 +98,57 @@
 
                 </RelativeLayout>
 
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal"
+                    android:padding="8dp">
+
+                    <ImageView
+                        android:id="@+id/push_image"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentStart="true"
+                        android:layout_centerVertical="true"
+                        android:layout_gravity="start"
+                        android:contentDescription="@string/pref_pushNotifications_summary"
+                        app:srcCompat="@drawable/ic_priority_high_black_24dp" />
+
+                    <LinearLayout
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_toEndOf="@+id/push_image"
+                        android:layout_toStartOf="@+id/settings_push_notifications"
+                        android:orientation="vertical"
+                        android:paddingLeft="16dp"
+                        android:paddingRight="16dp">
+
+                        <TextView
+                            style="@style/ListPrimary"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:lines="1"
+                            android:text="@string/pref_pushNotifications_title" />
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:text="@string/pref_pushNotifications_summary" />
+
+                    </LinearLayout>
+
+                    <Switch
+                        android:id="@+id/settings_push_notifications"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentEnd="true"
+                        android:checked="false" />
+
+                </RelativeLayout>
+
+
                 <!-- Contacts settings -->
 
                 <TextView
diff --git a/ring-android/app/src/main/res/values/strings_preferences.xml b/ring-android/app/src/main/res/values/strings_preferences.xml
index 1b79c5f..40d6064 100644
--- a/ring-android/app/src/main/res/values/strings_preferences.xml
+++ b/ring-android/app/src/main/res/values/strings_preferences.xml
@@ -8,6 +8,9 @@
     <string name="pref_mobileData_title">Mobile data</string>
     <string name="pref_mobileData_summary">Allow Ring on 3G/LTE networks additionally to Wi-Fi</string>
 
+    <string name="pref_pushNotifications_title">Push notifications</string>
+    <string name="pref_pushNotifications_summary">Use Google servers to allow receiving calls/messages in the background</string>
+
     <string name="pref_systemContacts_key" translatable="false">pref_systemContacts</string>
     <string name="pref_systemContacts_title">Use system contacts</string>
     <string name="pref_systemContacts_summary">Use system contacts to show caller details.</string>