lifecycle: improve crash handling

We override the general exception handler in the client, but the result
is not quite satisfying, causing the application to freeze.
We now quit the app properly

Change-Id: I7551e7f7d1fb7a7aca5b0e16540352b198b06f63
Reviewed-by: Thibault Wittemberg <thibault.wittemberg@savoirfairelinux.com>
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 ca76d69..0a4ea79 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
@@ -44,10 +44,27 @@
     @Inject
     LogService mLogService;
 
+    private void setDefaultUncaughtExceptionHandler() {
+        try {
+            Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+                @Override
+                public void uncaughtException(Thread t, Throwable e) {
+                    android.util.Log.e(TAG, "Uncaught Exception detected in thread ", e);
+                    android.os.Process.killProcess(android.os.Process.myPid());
+                    System.exit(2);
+                }
+            });
+        } catch (SecurityException e) {
+            android.util.Log.e(TAG, "Could not set the Default Uncaught Exception Handler", e);
+        }
+    }
+
     @Override
     public void onCreate() {
         super.onCreate();
 
+        setDefaultUncaughtExceptionHandler();
+
         mPermissionsBeingAsked = new HashMap<>();
 
         // building injection dependency tree
@@ -70,11 +87,11 @@
         return mRingInjectionComponent;
     }
 
-    public boolean canAskForPermission (String permission) {
+    public boolean canAskForPermission(String permission) {
 
         Boolean isBeingAsked = mPermissionsBeingAsked.get(permission);
 
-        if (isBeingAsked!=null && isBeingAsked) {
+        if (isBeingAsked != null && isBeingAsked) {
             return false;
         }
 
@@ -83,7 +100,7 @@
         return true;
     }
 
-    public void permissionHasBeenAsked (String permission) {
+    public void permissionHasBeenAsked(String permission) {
         mPermissionsBeingAsked.remove(permission);
     }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index ef1ab9e..839535d 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -135,19 +135,6 @@
         void refresh();
     }
 
-    private static void setDefaultUncaughtExceptionHandler() {
-        try {
-            Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
-                @Override
-                public void uncaughtException(Thread t, Throwable e) {
-                    Log.e(TAG, "Uncaught Exception detected in thread ", e);
-                }
-            });
-        } catch (SecurityException e) {
-            Log.e(TAG, "Could not set the Default Uncaught Exception Handler");
-        }
-    }
-
     /* called before activity is killed, e.g. rotation */
     @Override
     protected void onSaveInstanceState(Bundle bundle) {
@@ -156,7 +143,6 @@
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        setDefaultUncaughtExceptionHandler();
 
         mToolbarSize = getResources().getDimension(R.dimen.abc_action_bar_default_height_material);
 
@@ -199,8 +185,8 @@
         String[] toRequest = LocalService.checkRequiredPermissions(this);
         ArrayList<String> permissionsWeCanAsk = new ArrayList<>();
 
-        for (String permission: toRequest) {
-            if (((RingApplication)getApplication()).canAskForPermission(permission)) {
+        for (String permission : toRequest) {
+            if (((RingApplication) getApplication()).canAskForPermission(permission)) {
                 permissionsWeCanAsk.add(permission);
             }
         }
@@ -319,7 +305,7 @@
                 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
                 for (int i = 0, n = permissions.length; i < n; i++) {
                     String permission = permissions[i];
-                    ((RingApplication)getApplication()).permissionHasBeenAsked(permission);
+                    ((RingApplication) getApplication()).permissionHasBeenAsked(permission);
                     switch (permission) {
                         case Manifest.permission.RECORD_AUDIO:
                             if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
@@ -507,13 +493,13 @@
 
     // TODO: Remove this when low level services are ready
     public void onNavigationViewReady() {
-            if (fNavigation != null) {
-                if (service != null) {
-                    fNavigation.updateAccounts(service.getAccounts());
-                }
-                fNavigation.setCallback(service);
-                fNavigation.setNavigationSectionSelectedListener(HomeActivity.this);
+        if (fNavigation != null) {
+            if (service != null) {
+                fNavigation.updateAccounts(service.getAccounts());
             }
+            fNavigation.setCallback(service);
+            fNavigation.setNavigationSectionSelectedListener(HomeActivity.this);
+        }
     }
 
     @Override