remove LocalService

Tuleap: #1367
Change-Id: Ib31f7211ece23f18e2dc1553d807c7eca65bd593
diff --git a/ring-android/app/src/main/AndroidManifest.xml b/ring-android/app/src/main/AndroidManifest.xml
index d795f7a..c025c49 100644
--- a/ring-android/app/src/main/AndroidManifest.xml
+++ b/ring-android/app/src/main/AndroidManifest.xml
@@ -246,13 +246,6 @@
             android:windowSoftInputMode="stateAlwaysHidden" />
 
         <service
-            android:name=".service.LocalService"
-            android:exported="false">
-            <intent-filter>
-                <action android:name=".service.LocalService" />
-            </intent-filter>
-        </service>
-        <service
             android:name=".service.DRingService"
             android:exported="false">
             <intent-filter>
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 7f766b7..0b5ef69 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
@@ -52,7 +52,7 @@
 import cx.ring.dependencyinjection.ServiceInjectionModule;
 import cx.ring.service.CallManagerCallBack;
 import cx.ring.service.ConfigurationManagerCallback;
-import cx.ring.service.LocalService;
+import cx.ring.service.DRingService;
 import cx.ring.services.AccountService;
 import cx.ring.services.CallService;
 import cx.ring.services.ConferenceService;
@@ -62,7 +62,6 @@
 import cx.ring.services.HardwareService;
 import cx.ring.services.PreferencesService;
 import cx.ring.services.PresenceService;
-import cx.ring.utils.FutureUtils;
 import cx.ring.utils.Log;
 
 public class RingApplication extends Application {
@@ -267,7 +266,7 @@
         mRingInjectionComponent.inject(this);
 
         // to bootstrap the daemon
-        Intent intent = new Intent(this, LocalService.class);
+        Intent intent = new Intent(this, DRingService.class);
         startService(intent);
         bindService(intent, mConnection, BIND_AUTO_CREATE | BIND_IMPORTANT | BIND_ABOVE_CLIENT);
     }
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 7cecf4f..4a4bccf 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
@@ -72,7 +72,6 @@
 import cx.ring.model.Settings;
 import cx.ring.navigation.RingNavigationFragment;
 import cx.ring.service.DRingService;
-import cx.ring.service.LocalService;
 import cx.ring.services.AccountService;
 import cx.ring.services.DeviceRuntimeService;
 import cx.ring.services.HardwareService;
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
index 4a71a61..67400e0 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
@@ -48,7 +48,6 @@
 import cx.ring.navigation.RingNavigationPresenter;
 import cx.ring.service.BootReceiver;
 import cx.ring.service.DRingService;
-import cx.ring.service.LocalService;
 import cx.ring.services.AccountService;
 import cx.ring.services.CallService;
 import cx.ring.services.ConferenceService;
@@ -113,8 +112,6 @@
 
     void inject(BlackListFragment fragment);
 
-    void inject(LocalService service);
-
     void inject(DRingService service);
 
     void inject(DeviceRuntimeServiceImpl service);
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
index b42eb0a..d58fa07 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
@@ -67,7 +67,6 @@
 import cx.ring.model.Uri;
 import cx.ring.mvp.BaseFragment;
 import cx.ring.service.DRingService;
-import cx.ring.service.LocalService;
 import cx.ring.utils.ActionHelper;
 import cx.ring.utils.CircleTransform;
 import cx.ring.utils.ContentUriHandler;
diff --git a/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java b/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java
index b6a66cb..36611ef 100644
--- a/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java
+++ b/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java
@@ -29,7 +29,7 @@
 
             if (isAllowRingOnStartup) {
                 Log.w(TAG, "Starting Ring on boot");
-                Intent serviceIntent = new Intent(context, LocalService.class);
+                Intent serviceIntent = new Intent(context, DRingService.class);
                 context.startService(serviceIntent);
             }
         }
diff --git a/ring-android/app/src/main/java/cx/ring/service/DRingService.java b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
index 4394219..bd3c322 100644
--- a/ring-android/app/src/main/java/cx/ring/service/DRingService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
@@ -1,27 +1,27 @@
-/**
- * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
- * Copyright (C) 2004-2016 Savoir-faire Linux Inc.
- * <p>
- * Author: Regis Montoya <r3gis.3R@gmail.com>
- * Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
- * Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- * Adrien Béraud <adrien.beraud@savoirfairelinux.com>
- * <p>
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * If you own a pjsip commercial license you can also redistribute it
- * and/or modify it under the terms of the GNU Lesser General Public License
- * as an android library.
- * <p>
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * <p>
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+/*
+  Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
+  Copyright (C) 2004-2016 Savoir-faire Linux Inc.
+  <p>
+  Author: Regis Montoya <r3gis.3R@gmail.com>
+  Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
+  Alexandre Lision <alexandre.lision@savoirfairelinux.com>
+  Adrien Béraud <adrien.beraud@savoirfairelinux.com>
+  <p>
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+  If you own a pjsip commercial license you can also redistribute it
+  and/or modify it under the terms of the GNU Lesser General Public License
+  as an android library.
+  <p>
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+  <p>
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 package cx.ring.service;
 
@@ -30,11 +30,13 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.database.ContentObserver;
 import android.net.ConnectivityManager;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.preference.PreferenceManager;
 import android.provider.ContactsContract;
 import android.util.Log;
 
@@ -54,6 +56,7 @@
 import cx.ring.facades.ConversationFacade;
 import cx.ring.model.Codec;
 import cx.ring.model.Conversation;
+import cx.ring.model.ServiceEvent;
 import cx.ring.services.AccountService;
 import cx.ring.services.CallService;
 import cx.ring.services.ConferenceService;
@@ -64,9 +67,10 @@
 import cx.ring.services.NotificationService;
 import cx.ring.services.NotificationServiceImpl;
 import cx.ring.services.PreferencesService;
+import cx.ring.utils.Observable;
+import cx.ring.utils.Observer;
 
-
-public class DRingService extends Service {
+public class DRingService extends Service implements Observer<ServiceEvent> {
 
     public static final String ACTION_TRUST_REQUEST_ACCEPT = BuildConfig.APPLICATION_ID + ".action.TRUST_REQUEST_ACCEPT";
     public static final String ACTION_TRUST_REQUEST_REFUSE = BuildConfig.APPLICATION_ID + ".action.TRUST_REQUEST_REFUSE";
@@ -127,6 +131,11 @@
         ((RingApplication) getApplication()).getRingInjectionComponent().inject(this);
 
         getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactContentObserver);
+
+        mPreferencesService.addObserver(this);
+        mAccountService.addObserver(this);
+        mContactService.addObserver(this);
+        mConversationFacade.addObserver(this);
     }
 
     @Override
@@ -134,6 +143,11 @@
         super.onDestroy();
         unregisterReceiver(receiver);
         getContentResolver().unregisterContentObserver(contactContentObserver);
+
+        mPreferencesService.removeObserver(this);
+        mAccountService.removeObserver(this);
+        mContactService.removeObserver(this);
+        mConversationFacade.removeObserver(this);
     }
 
     @Override
@@ -665,4 +679,43 @@
             mContactService.loadContacts(mAccountService.hasRingAccount(), mAccountService.hasSipAccount(), mAccountService.getCurrentAccount().getAccountID());
         }
     }
+
+    public void refreshContacts() {
+        Log.d(TAG, "refreshContacts");
+        mContactService.loadContacts(mAccountService.hasRingAccount(), mAccountService.hasSipAccount(), mAccountService.getCurrentAccount().getAccountID());
+    }
+
+    @Override
+    public void update(Observable observable, ServiceEvent arg) {
+        if (observable instanceof PreferencesService) {
+            refreshContacts();
+            updateConnectivityState();
+        }
+
+        if (observable instanceof AccountService && arg != null) {
+            switch (arg.getEventType()) {
+                case ACCOUNTS_CHANGED:
+
+                    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(DRingService.this);
+                    sharedPreferences.edit()
+                            .putBoolean(OutgoingCallHandler.KEY_CACHE_HAVE_RINGACCOUNT, mAccountService.hasRingAccount())
+                            .putBoolean(OutgoingCallHandler.KEY_CACHE_HAVE_SIPACCOUNT, mAccountService.hasSipAccount()).apply();
+
+                    refreshContacts();
+                    return;
+            }
+        }
+
+        if (observable instanceof ContactService && arg != null) {
+            switch (arg.getEventType()) {
+                case CONTACTS_CHANGED:
+                    mConversationFacade.refreshConversations();
+                    return;
+                case CONTACT_ADDED:
+                case CONTACT_REMOVED:
+                    refreshContacts();
+                    break;
+            }
+        }
+    }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/service/LocalService.java b/ring-android/app/src/main/java/cx/ring/service/LocalService.java
deleted file mode 100644
index 2cadceb..0000000
--- a/ring-android/app/src/main/java/cx/ring/service/LocalService.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
- *
- *  Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package cx.ring.service;
-
-import android.app.Service;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.SharedPreferences;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.preference.PreferenceManager;
-import android.util.Log;
-
-import javax.inject.Inject;
-
-import cx.ring.application.RingApplication;
-import cx.ring.facades.ConversationFacade;
-import cx.ring.model.ServiceEvent;
-import cx.ring.services.AccountService;
-import cx.ring.services.ContactService;
-import cx.ring.services.DeviceRuntimeService;
-import cx.ring.services.NotificationService;
-import cx.ring.services.PreferencesService;
-import cx.ring.utils.Observable;
-import cx.ring.utils.Observer;
-
-public class LocalService extends Service implements Observer<ServiceEvent> {
-    static final String TAG = LocalService.class.getSimpleName();
-
-    @Inject
-    PreferencesService mPreferencesService;
-
-    @Inject
-    AccountService mAccountService;
-
-    @Inject
-    ContactService mContactService;
-
-    @Inject
-    NotificationService mNotificationService;
-
-    @Inject
-    ConversationFacade mConversationFacade;
-
-    @Inject
-    DeviceRuntimeService mDeviceRuntimeService;
-
-    private IDRingService mService = null;
-
-    // Binder given to clients
-    private final IBinder mBinder = new LocalBinder();
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        Log.d(TAG, "onCreate");
-
-        // dependency injection
-        ((RingApplication) getApplication()).getRingInjectionComponent().inject(this);
-
-        // todo 
-        // temporary listen for history modifications
-        // When MVP/DI injection will be done, only the concerned presenters should listen
-        // for model modifications
-        mPreferencesService.addObserver(this);
-        mAccountService.addObserver(this);
-        mContactService.addObserver(this);
-        mConversationFacade.addObserver(this);
-
-        // Clear any notifications from a previous app instance
-        mNotificationService.cancelAll();
-
-        startDRingService();
-    }
-
-    private void startDRingService() {
-        Intent intent = new Intent(this, DRingService.class);
-        startService(intent);
-        bindService(intent, mConnection, BIND_AUTO_CREATE | BIND_IMPORTANT | BIND_ABOVE_CLIENT);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        Log.e(TAG, "onDestroy");
-        mPreferencesService.removeObserver(this);
-        mAccountService.removeObserver(this);
-        mContactService.removeObserver(this);
-        mConversationFacade.removeObserver(this);
-    }
-
-    private ServiceConnection mConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName className, IBinder service) {
-            Log.w(TAG, "onServiceConnected " + className.getClassName());
-            mService = IDRingService.Stub.asInterface(service);
-            mConversationFacade.refreshConversations();
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName arg0) {
-            Log.d(TAG, "onServiceDisconnected " + arg0.getClassName());
-
-            mService = null;
-        }
-    };
-
-    /**
-     * Class used for the client Binder.  Because we know this service always
-     * runs in the same process as its clients, we don't need to deal with IPC.
-     */
-    public class LocalBinder extends Binder {
-        public LocalService getService() {
-            // Return this instance of LocalService so clients can call public methods
-            return LocalService.this;
-        }
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mBinder;
-    }
-
-    @Override
-    public boolean onUnbind(Intent intent) {
-        Log.d(TAG, "onUnbind");
-        if (mConnection != null) {
-            unbindService(mConnection);
-            mConnection = null;
-        }
-        return super.onUnbind(intent);
-    }
-
-    private void updateConnectivityState() {
-        if (mService == null) {
-            return;
-        }
-        try {
-            mService.setAccountsActive(mPreferencesService.isConnectedWifiAndMobile());
-            mService.connectivityChanged();
-        } catch (RemoteException e) {
-            Log.e(TAG, "updateConnectivityState", e);
-        }
-    }
-
-    public void refreshContacts() {
-        Log.d(TAG, "refreshContacts");
-        mContactService.loadContacts(mAccountService.hasRingAccount(), mAccountService.hasSipAccount(), mAccountService.getCurrentAccount().getAccountID());
-    }
-
-    @Override
-    public void update(Observable observable, ServiceEvent arg) {
-        if (observable instanceof PreferencesService) {
-            refreshContacts();
-            updateConnectivityState();
-        }
-
-        if (observable instanceof AccountService && arg != null) {
-            switch (arg.getEventType()) {
-                case ACCOUNTS_CHANGED:
-
-                    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(LocalService.this);
-                    sharedPreferences.edit()
-                            .putBoolean(OutgoingCallHandler.KEY_CACHE_HAVE_RINGACCOUNT, mAccountService.hasRingAccount())
-                            .putBoolean(OutgoingCallHandler.KEY_CACHE_HAVE_SIPACCOUNT, mAccountService.hasSipAccount()).apply();
-
-                    refreshContacts();
-                    return;
-            }
-        }
-
-        if (observable instanceof ContactService && arg != null) {
-            switch (arg.getEventType()) {
-                case CONTACTS_CHANGED:
-                    mConversationFacade.refreshConversations();
-                    return;
-                case CONTACT_ADDED:
-                case CONTACT_REMOVED:
-                    refreshContacts();
-                    return;
-            }
-        }
-    }
-}
\ No newline at end of file