diff --git a/app/src/main/java/org/linphone/LinphoneService.java b/app/src/main/java/org/linphone/LinphoneService.java index 5e6535727..ee2e5caeb 100644 --- a/app/src/main/java/org/linphone/LinphoneService.java +++ b/app/src/main/java/org/linphone/LinphoneService.java @@ -413,15 +413,23 @@ public final class LinphoneService extends Service { getApplication().unregisterActivityLifecycleCallbacks(mActivityCallbacks); mActivityCallbacks = null; } - destroyOverlay(); + Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); if (lc != null) { lc.removeListener(mListener); + lc = null; // To allow the gc calls below to free the Core } sInstance = null; LinphoneManager.destroy(); + // The following are required if we want for the Core's finalize() method to be called + // before the super.onDestroy() call. + // We have to so there are no more ref on the native LinphoneCore object and thus call + // it's uninit() method which will free the AndroidPlatformHelper resources... + // Problem is both the below methods do not guaranty the finalize will be called in time... + //System.gc(); + //System.runFinalization(); // Make sure our notification is gone. mNotificationManager.destroy(); @@ -432,7 +440,9 @@ public final class LinphoneService extends Service { LinphoneActivity.instance().finish(); } - Factory.instance().getLoggingService().removeListener(mJavaLoggingService); + if (LinphonePreferences.instance().useJavaLogger()) { + Factory.instance().getLoggingService().removeListener(mJavaLoggingService); + } super.onDestroy(); } diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.java b/app/src/main/java/org/linphone/contacts/ContactsManager.java index 08956a25e..e455ab94a 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.java +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.java @@ -122,6 +122,20 @@ public class ContactsManager extends ContentObserver implements FriendListListen } public void destroy() { + if (mLoadContactTask != null) { + mLoadContactTask.cancel(true); + } + // LinphoneContact has a Friend field and Friend can have a LinphoneContact has userData + // Friend also keeps a ref on the Core, so we have to clean them + for (LinphoneContact c : mContacts) { + c.setFriend(null); + } + mContacts.clear(); + for (LinphoneContact c : mSipContacts) { + c.setFriend(null); + } + mSipContacts.clear(); + Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); if (lc != null) { for (FriendList list : lc.getFriendsLists()) { diff --git a/app/src/main/java/org/linphone/contacts/LinphoneContact.java b/app/src/main/java/org/linphone/contacts/LinphoneContact.java index 9c7eb4177..8913733c0 100644 --- a/app/src/main/java/org/linphone/contacts/LinphoneContact.java +++ b/app/src/main/java/org/linphone/contacts/LinphoneContact.java @@ -393,8 +393,13 @@ public class LinphoneContact extends AndroidContact } public void setFriend(Friend f) { + if (mFriend != null && (f == null || f != mFriend)) { + mFriend.setUserData(null); + } mFriend = f; - mFriend.setUserData(this); + if (mFriend != null) { + mFriend.setUserData(this); + } } public boolean isInFriendList() { diff --git a/app/src/main/java/org/linphone/fragments/StatusFragment.java b/app/src/main/java/org/linphone/fragments/StatusFragment.java index 519bca012..14b203e85 100644 --- a/app/src/main/java/org/linphone/fragments/StatusFragment.java +++ b/app/src/main/java/org/linphone/fragments/StatusFragment.java @@ -112,7 +112,12 @@ public class StatusFragment extends Fragment { new OnClickListener() { @Override public void onClick(View v) { - lc.refreshRegisters(); + Core core = + LinphoneManager + .getLcIfManagerNotDestroyedOrNull(); + if (core != null) { + core.refreshRegisters(); + } } }); } catch (IllegalStateException ise) {