account: add ring account status in settings

The account status and toggle should be in the setting screen.
It makes more sense for the user to go in the account to disable it.

Change-Id: I4633eb1a96f9aae6bc03335897e6ef4e5f2fa30a
Tuleap: #1218
diff --git a/ring-android/app/src/main/java/cx/ring/client/AccountEditionActivity.java b/ring-android/app/src/main/java/cx/ring/client/AccountEditionActivity.java
index 38e4857..68d214d 100644
--- a/ring-android/app/src/main/java/cx/ring/client/AccountEditionActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/AccountEditionActivity.java
@@ -26,10 +26,12 @@
 import android.app.AlertDialog;
 import android.app.Fragment;
 import android.app.FragmentManager;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -51,8 +53,6 @@
 import com.astuetz.PagerSlidingTabStrip;
 
 import java.util.ArrayList;
-import java.util.Observable;
-import java.util.Observer;
 
 import cx.ring.R;
 import cx.ring.fragments.AdvancedAccountFragment;
@@ -110,12 +110,13 @@
     private ViewPager mViewPager = null;
     private PagerSlidingTabStrip mSlidingTabLayout = null;
 
-    private final Observer mAccountObserver = new Observer() {
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
-        public void update(Observable observable, Object data) {
-            Log.i(TAG, "Observer: account changed !");
-            for (AccountChangedListener l : listeners) {
-                l.accountChanged(mAccSelected);
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().contentEquals(LocalService.ACTION_ACCOUNT_UPDATE)) {
+                for (AccountChangedListener l : listeners) {
+                    l.accountChanged(mAccSelected);
+                }
             }
         }
     };
@@ -135,7 +136,7 @@
                 finish();
             }
 
-            mAccSelected.addObserver(mAccountObserver);
+            registerReceiver(mReceiver, new IntentFilter(LocalService.ACTION_ACCOUNT_UPDATE));
 
             ActionBar actionBar = getSupportActionBar();
             if (actionBar != null) {
@@ -189,7 +190,7 @@
         @Override
         public void onServiceDisconnected(ComponentName arg0) {
             // Called in case of service crashing or getting killed
-            mAccSelected.deleteObserver(mAccountObserver);
+            unregisterReceiver(mReceiver);
             mBound = false;
         }
     };
@@ -235,12 +236,9 @@
     @Override
     protected void onDestroy() {
         super.onDestroy();
-
+        unregisterReceiver(mReceiver);
         if (mBound) {
             unbindService(mConnection);
-            if (mAccSelected != null) {
-                mAccSelected.deleteObserver(mAccountObserver);
-            }
             mBound = false;
         }
     }
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/DeviceAccountFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/DeviceAccountFragment.java
index 701b0c5..32cb101 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/DeviceAccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/DeviceAccountFragment.java
@@ -25,11 +25,15 @@
 import android.app.ProgressDialog;
 import android.content.Context;
 import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.support.annotation.Nullable;
 import android.support.design.widget.TextInputLayout;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.support.v7.widget.SwitchCompat;
 import android.text.Layout;
 import android.text.Spannable;
 import android.text.SpannableString;
@@ -117,6 +121,13 @@
 
     @BindView(R.id.password_layout)
     TextInputLayout mPasswordLayout;
+
+    @BindView(R.id.account_switch)
+    SwitchCompat mAccountSwitch;
+
+    @BindView(R.id.account_status)
+    TextView mAccountStatus;
+
     /*
     Declarations
     */
@@ -151,6 +162,7 @@
         mDeviceAdapter = new DeviceAdapter(getActivity(), account.getDevices());
         mDeviceList.setAdapter(mDeviceAdapter);
 
+        mAccountSwitch.setChecked(account.isEnabled());
         mAccountNameTxt.setText(account.getAlias());
         mAccountIdTxt.setText(account.getUsername());
         String username = account.getRegisteredName();
@@ -162,6 +174,35 @@
         if (hasRegisteredName) {
             mAccountUsernameTxt.setText(username);
         }
+
+        int color = ContextCompat.getColor(getActivity(), R.color.holo_red_light);
+        String status;
+
+
+        if (account.isEnabled()) {
+            if (account.isTrying()) {
+                status = getString(R.string.account_status_connecting);
+            } else if (account.needsMigration()) {
+                status = getString(R.string.account_update_needed);
+            } else if (account.isInError()) {
+                status = getString(R.string.account_status_connection_error);
+            } else if (account.isRegistered()) {
+                status = getString(R.string.account_status_online);
+                color = ContextCompat.getColor(getActivity(), R.color.holo_green_dark);
+            } else {
+                status = getString(R.string.account_status_unknown);
+            }
+        } else {
+            color = ContextCompat.getColor(getActivity(), R.color.darker_gray);
+            status = getString(R.string.account_status_offline);
+        }
+
+        mAccountStatus.setText(status);
+        Drawable drawable = ContextCompat.getDrawable(getActivity(), R.drawable.static_rounded_background);
+        Drawable wrapped = DrawableCompat.wrap(drawable);
+        DrawableCompat.setTint(wrapped, color);
+        mAccountStatus.setBackground(wrapped);
+
         account.devicesListener = new Account.OnDevicesChangedListener() {
             @Override
             public void devicesChanged(Map<String, String> devices) {
@@ -270,6 +311,16 @@
         }
     }
 
+    @OnClick(R.id.account_switch)
+    public void onToggleAccount() {
+        if (mCallbacks == null) {
+            Log.w(TAG, "Can't toggle account state, callback is null");
+            return;
+        }
+        mCallbacks.getAccount().setEnabled(mAccountSwitch.isChecked());
+        mCallbacks.saveAccount();
+    }
+
     @OnClick(R.id.register_name_btn)
     public void showUsernameRegistrationPopup() {
         RegisterNameDialog registrationDialog = new RegisterNameDialog();
@@ -293,6 +344,7 @@
                 Log.w(TAG, "Account wizard, onError " + name);
             }
         });
+        accountChanged(account);
     }
 
     class DeviceAdapter extends BaseAdapter {
@@ -356,9 +408,9 @@
                     getString(R.string.export_account_wait_message));
 
             account.exportListener = new Account.OnExportEndedListener() {
-                final static int PIN_GENERATION_SUCCESS = 0;
-                final static int PIN_GENERATION_WRONG_PASSWORD = 1;
-                final static int PIN_GENERATION_NETWORK_ERROR = 2;
+                static final int PIN_GENERATION_SUCCESS = 0;
+                static final int PIN_GENERATION_WRONG_PASSWORD = 1;
+                static final int PIN_GENERATION_NETWORK_ERROR = 2;
 
                 @Override
                 public void exportEnded(int code, String pin) {
@@ -405,7 +457,9 @@
     @Nullable
     @Override
     public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        if (container == null) return null;
+        if (container == null) {
+            return null;
+        }
         ViewGroup devLayout = (ViewGroup) inflater.inflate(R.layout.frag_device_list, container, false);
 
         ButterKnife.bind(this, devLayout);
diff --git a/ring-android/app/src/main/res/drawable/static_rounded_background.xml b/ring-android/app/src/main/res/drawable/static_rounded_background.xml
new file mode 100644
index 0000000..82bbb14
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable/static_rounded_background.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <stroke
+        android:width="0dp"
+        android:color="@android:color/transparent" />
+
+    <padding
+        android:bottom="5dp"
+        android:left="5dp"
+        android:right="5dp"
+        android:top="5dp" />
+
+    <corners android:radius="5dp" />
+
+</shape>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/layout/frag_device_list.xml b/ring-android/app/src/main/res/layout/frag_device_list.xml
index 3417505..43473ed 100644
--- a/ring-android/app/src/main/res/layout/frag_device_list.xml
+++ b/ring-android/app/src/main/res/layout/frag_device_list.xml
@@ -16,41 +16,75 @@
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -->
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-
     <cx.ring.views.BoundedScrollView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_gravity="center_horizontal"
-        app:bounded_width="360dp">
+        android:layout_marginBottom="50dp"
+        android:layout_gravity="center_horizontal">
 
-        <android.support.v7.widget.CardView
+        <RelativeLayout
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="16dp"
-            android:layout_marginEnd="8dp"
-            android:layout_marginStart="8dp"
-            android:layout_marginTop="16dp">
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+            <RelativeLayout
+                android:id="@+id/ring_account_status_container"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="8dp"
+                android:paddingEnd="16dp"
+                android:paddingStart="16dp"
+                android:paddingTop="24dp">
+
+                <TextView
+                    android:id="@+id/account_alias_txt"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_toLeftOf="@+id/account_switch"
+                    android:layout_toStartOf="@+id/account_switch"
+                    android:paddingBottom="8dp"
+                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
+                    tools:text="@string/ring_account" />
+
+                <TextView
+                    android:id="@+id/account_status"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@id/account_alias_txt"
+                    android:textStyle="bold"
+                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Small.Inverse"
+                    android:textColor="@color/white"
+                    tools:text="Registered" />
+
+
+                <android.support.v7.widget.SwitchCompat
+                    android:id="@+id/account_switch"
+                    android:layout_width="50dp"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentEnd="true"
+                    android:layout_alignParentRight="true" />
+
+            </RelativeLayout>
 
             <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:orientation="vertical">
+                android:layout_below="@+id/ring_account_status_container"
+                android:orientation="vertical"
+                android:paddingBottom="8dp"
+                android:paddingEnd="16dp"
+                android:paddingStart="16dp"
+                android:paddingTop="24dp">
 
                 <TextView
-                    android:id="@+id/account_alias_txt"
+                    android:id="@+id/account_identity_label"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:paddingBottom="8dp"
-                    android:paddingEnd="16dp"
-                    android:paddingStart="16dp"
-                    android:paddingTop="24dp"
-                    android:text="@string/ring_account"
+                    android:text="@string/ring_account_identity"
                     android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />
 
                 <TextView
@@ -58,13 +92,14 @@
                     style="@style/Subheader"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:ellipsize="middle"
+                    android:ellipsize="end"
                     android:gravity="center_vertical"
                     android:lines="1"
                     android:paddingBottom="8dp"
                     android:paddingLeft="16dp"
                     android:paddingRight="16dp"
-                    android:paddingTop="4dp"
+                    android:paddingTop="8dp"
+                    android:textStyle="bold"
                     android:textIsSelectable="false"
                     tools:text="ring:8F29045378ACA68F2ACA2346078ACA68F2ACA290" />
 
@@ -84,7 +119,8 @@
                         android:gravity="center_vertical"
                         android:paddingBottom="8dp"
                         android:paddingTop="8dp"
-                        android:text="@string/no_registered_name_for_account" />
+                        android:text="@string/no_registered_name_for_account"
+                        android:textAlignment="center" />
 
                     <Button
                         android:id="@+id/register_name_btn"
@@ -154,6 +190,7 @@
                         android:paddingTop="4dp"
                         android:textAlignment="viewStart"
                         tools:text="blockchain_name" />
+
                 </LinearLayout>
 
                 <TextView
@@ -200,7 +237,7 @@
                 </FrameLayout>
 
             </LinearLayout>
-        </android.support.v7.widget.CardView>
+        </RelativeLayout>
     </cx.ring.views.BoundedScrollView>
 
     <include
diff --git a/ring-android/app/src/main/res/values/colors.xml b/ring-android/app/src/main/res/values/colors.xml
index 34bfb4d..ccaaf7a 100644
--- a/ring-android/app/src/main/res/values/colors.xml
+++ b/ring-android/app/src/main/res/values/colors.xml
@@ -22,16 +22,25 @@
     <color name="transparent_light">#AAFFFFFF</color>
 
     <!-- A light Holo shade of blue -->
+    <color name="holo_blue_light">#ff33b5e5</color>
     <!-- A light Holo shade of green -->
+    <color name="holo_green_light">#ff99cc00</color>
     <!-- A light Holo shade of red -->
     <color name="holo_red_light">#ffff4444</color>
     <!-- A dark Holo shade of blue -->
+    <color name="holo_blue_dark">#ff0099cc</color>
     <!-- A dark Holo shade of green -->
+    <color name="holo_green_dark">#ff669900</color>
     <!-- A dark Holo shade of red -->
+    <color name="holo_red_dark">#ffcc0000</color>
     <!-- A Holo shade of purple -->
+    <color name="holo_purple">#ffaa66cc</color>
     <!-- A light Holo shade of orange -->
+    <color name="holo_orange_light">#ffffbb33</color>
     <!-- A dark Holo shade of orange -->
+    <color name="holo_orange_dark">#ffff8800</color>
     <!-- A really bright Holo shade of blue -->
+    <color name="holo_blue_bright">#ff00ddff</color>
 
     <color name="transparent_grey">#AACCCCCC</color>
 
diff --git a/ring-android/app/src/main/res/values/strings_account.xml b/ring-android/app/src/main/res/values/strings_account.xml
index 2f05858..0f5ac8d 100644
--- a/ring-android/app/src/main/res/values/strings_account.xml
+++ b/ring-android/app/src/main/res/values/strings_account.xml
@@ -156,6 +156,7 @@
     <string name="update_account">Update account</string>
     <string name="account_migration">Your Ring account can now be shared between all your devices. All you need to do is provide a password.</string>
     <string name="ring_account">Ring account</string>
+    <string name="ring_account_identity">Identity</string>
     <string name="account_migration_title_dialog">Account migration</string>
     <string name="account_migration_message_dialog">In order to be usable on multiple devices, your accounts need to be updated. Do you want to go the Account management screen to perform this operation ?</string>
     <string name="account_update_needed">Update needed</string>
@@ -194,5 +195,10 @@
     <string name="username_already_taken">Username already taken</string>
     <string name="invalid_username">Invalid username</string>
     <string name="looking_for_username_availability">Looking for username availability ...</string>
+    <string name="account_status_connecting">Connecting</string>
+    <string name="account_status_connection_error">Connection error</string>
+    <string name="account_status_online">Online</string>
+    <string name="account_status_unknown">Unknown</string>
+    <string name="account_status_offline">Offline</string>
 
 </resources>