diff --git a/src/android/org/linphone/LinphoneManager.java b/src/android/org/linphone/LinphoneManager.java index 0dbb7619d..450ec1f43 100644 --- a/src/android/org/linphone/LinphoneManager.java +++ b/src/android/org/linphone/LinphoneManager.java @@ -117,6 +117,7 @@ import org.linphone.ui.LinphoneMediaScanner; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -568,12 +569,25 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou } public synchronized final void destroyCore() { + String linphoneRcBack = mServiceContext.getFilesDir().getAbsolutePath() + "/linphonerc.back"; + String linphoneRcPath = mServiceContext.getFilesDir().getAbsolutePath() + "/.linphonerc"; sExited = true; ContactsManagerDestroy(); BluetoothManagerDestroy(); try { mTimer.cancel(); destroyLinphoneCore(); + try { + InputStream backup = new FileInputStream(linphoneRcBack); + if (backup != null) { + File rcfile = new File(linphoneRcPath); + if (rcfile.exists()) { + LinphoneUtils.copyToFile(backup, rcfile); + } + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } } catch (RuntimeException e) { Log.e(e); @@ -1120,6 +1134,27 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou } catch (CoreException e) { Log.e(e); } + } else if (state == GlobalState.Configuring && lc.getProvisioningUri() != null && !lc.getProvisioningUri().isEmpty()) { + //Obiane spec + String linphoneRcPath = mServiceContext.getFilesDir().getAbsolutePath() + "/.linphonerc"; + String linphoneRcBack = mServiceContext.getFilesDir().getAbsolutePath() + "/linphonerc.back"; + FriendList savedList = lc.getDefaultFriendList(); + if (savedList != null && savedList.getFriends() != null && savedList.getFriends().length > 0) { + try { + InputStream rc = new FileInputStream(linphoneRcPath); + File backup = new File(linphoneRcBack); + Config cfg = lc.getConfig(); + + LinphoneUtils.copyToFile(rc, backup); + + for (int i = 0 ; i < savedList.getFriends().length ; i++) { + cfg.cleanSection("friend_" + i); + } + cfg.sync(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } } } @@ -1628,14 +1663,41 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou Log.d("Remote provisioning status = " + state.toString() + " (" + message + ")"); LinphonePreferences prefs = LinphonePreferences.instance(); + final String linphoneRcBack = mServiceContext.getFilesDir().getAbsolutePath() + "/linphonerc.back"; if (state == ConfiguringState.Successful) { - if (lc.getFriendsLists() != null) lc.removeFriendList(lc.getFriendsLists()[0]); if (prefs.isProvisioningLoginViewEnabled()) { ProxyConfig proxyConfig = lc.createProxyConfig(); Address addr = proxyConfig.getIdentityAddress(); wizardLoginViewDomain = (addr != null) ? addr.getDomain() : ""; } prefs.setPushNotificationEnabled(prefs.isPushNotificationEnabled()); + File backup = new File(linphoneRcBack); + if (backup.exists()) backup.delete(); + } else if (state == ConfiguringState.Failed) { + final CoreListener listener = this; + Handler mainHandler = new Handler(mServiceContext.getMainLooper()); + Runnable thread = new Runnable() { + @Override + public void run() { + //Obiane spec + String linphoneRcPath = mServiceContext.getFilesDir().getAbsolutePath() + "/.linphonerc"; + String remoteProvisioning = mLc.getProvisioningUri(); + mLc.removeListener(listener); + destroyCore(); + Config cfg = Factory.instance().createConfig(linphoneRcPath); + cfg.setString("misc", "config-uri", ""); + cfg.sync(); + startLibLinphone(mServiceContext); + sExited = false; + mLc.setProvisioningUri(remoteProvisioning); + File backup = new File(linphoneRcBack); + if (backup.exists()) { + backup.delete(); + } + if (ContactsManager.getInstance() != null) ContactsManager.getInstance().fetchContactsAsync(); + } + }; + mainHandler.post(thread); } } diff --git a/src/android/org/linphone/LinphoneUtils.java b/src/android/org/linphone/LinphoneUtils.java index 1f1422596..c1832e108 100644 --- a/src/android/org/linphone/LinphoneUtils.java +++ b/src/android/org/linphone/LinphoneUtils.java @@ -668,7 +668,7 @@ public final class LinphoneUtils { * Copy data from a source stream to destFile. * Return true if succeed, return false if failed. */ - private static boolean copyToFile(InputStream inputStream, File destFile) { + public static boolean copyToFile(InputStream inputStream, File destFile) { if (inputStream == null || destFile == null) return false; try { OutputStream out = new FileOutputStream(destFile); diff --git a/src/android/org/linphone/assistant/RemoteProvisioningLoginActivity.java b/src/android/org/linphone/assistant/RemoteProvisioningLoginActivity.java index 62b6ebc91..435dfa678 100644 --- a/src/android/org/linphone/assistant/RemoteProvisioningLoginActivity.java +++ b/src/android/org/linphone/assistant/RemoteProvisioningLoginActivity.java @@ -254,7 +254,7 @@ public class RemoteProvisioningLoginActivity extends Activity implements OnClick public void onVideoRenderingSurfaceDestroyed(AndroidVideoWindowImpl vw) {} public void onVideoPreviewSurfaceReady(AndroidVideoWindowImpl vw, SurfaceView surface) { - LinphoneManager.getLc().setNativePreviewWindowId(androidVideoWindowImpl); + if (LinphoneManager.getLc() != null) LinphoneManager.getLc().setNativePreviewWindowId(androidVideoWindowImpl); } public void onVideoPreviewSurfaceDestroyed(AndroidVideoWindowImpl vw) {} diff --git a/src/android/org/linphone/contacts/ContactsListFragment.java b/src/android/org/linphone/contacts/ContactsListFragment.java index 1158bfaa6..8092e1e91 100644 --- a/src/android/org/linphone/contacts/ContactsListFragment.java +++ b/src/android/org/linphone/contacts/ContactsListFragment.java @@ -103,7 +103,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { - //TODO get contact + //LinphoneManager.getInstance().restartCore(); if (LinphoneManager.getLc() != null) { LinphoneManager.getLc().refreshRegisters(); } diff --git a/src/android/org/linphone/contacts/ContactsManager.java b/src/android/org/linphone/contacts/ContactsManager.java index 26f829513..32afb9379 100644 --- a/src/android/org/linphone/contacts/ContactsManager.java +++ b/src/android/org/linphone/contacts/ContactsManager.java @@ -232,8 +232,8 @@ public class ContactsManager extends ContentObserver { } public synchronized LinphoneContact findContactFromAddress(Address address) { - if (address == null) return null; Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); + if (address == null || lc == null) return null; Friend lf = lc.findFriend(address); if (lf != null) { LinphoneContact contact = (LinphoneContact)lf.getUserData(); diff --git a/src/android/org/linphone/receivers/NetworkManager.java b/src/android/org/linphone/receivers/NetworkManager.java index 989cf8425..acf8d2372 100644 --- a/src/android/org/linphone/receivers/NetworkManager.java +++ b/src/android/org/linphone/receivers/NetworkManager.java @@ -37,7 +37,7 @@ public class NetworkManager extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); Boolean lNoConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,false); - if (LinphoneManager.isInstanciated()) { + if (LinphoneManager.isInstanciated() && LinphoneManager.getLc() != null) { LinphoneManager.getInstance().connectivityChanged(cm, lNoConnectivity); } }