Fixed leaks

This commit is contained in:
Sylvain Berfini 2019-07-17 15:54:04 +02:00
parent 6e8d2cf7dd
commit 7f8b231437
9 changed files with 100 additions and 55 deletions

View file

@ -32,7 +32,6 @@ import android.hardware.SensorManager;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.PowerManager.WakeLock; import android.os.PowerManager.WakeLock;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
@ -97,7 +96,6 @@ public class LinphoneManager implements SensorEventListener {
private final Sensor mProximity; private final Sensor mProximity;
private final MediaScanner mMediaScanner; private final MediaScanner mMediaScanner;
private Timer mTimer, mAutoAnswerTimer; private Timer mTimer, mAutoAnswerTimer;
private final Handler mHandler = new Handler();
private final LinphonePreferences mPrefs; private final LinphonePreferences mPrefs;
private Core mCore; private Core mCore;
@ -109,6 +107,7 @@ public class LinphoneManager implements SensorEventListener {
private boolean mCallGsmON; private boolean mCallGsmON;
private boolean mProximitySensingEnabled; private boolean mProximitySensingEnabled;
private boolean mHasLastCallSasBeenRejected; private boolean mHasLastCallSasBeenRejected;
private Runnable mIterateRunnable;
public LinphoneManager(Context c) { public LinphoneManager(Context c) {
mExited = false; mExited = false;
@ -263,7 +262,7 @@ public class LinphoneManager implements SensorEventListener {
if (result == VersionUpdateCheckResult.NewVersionAvailable) { if (result == VersionUpdateCheckResult.NewVersionAvailable) {
final String urlToUse = url; final String urlToUse = url;
final String versionAv = version; final String versionAv = version;
mHandler.postDelayed( LinphoneUtils.dispatchOnUIThreadAfter(
new Runnable() { new Runnable() {
@Override @Override
public void run() { public void run() {
@ -450,19 +449,21 @@ public class LinphoneManager implements SensorEventListener {
} }
mCore.start(); mCore.start();
mIterateRunnable =
new Runnable() {
@Override
public void run() {
if (mCore != null) {
mCore.iterate();
}
}
};
TimerTask lTask = TimerTask lTask =
new TimerTask() { new TimerTask() {
@Override @Override
public void run() { public void run() {
LinphoneUtils.dispatchOnUIThread( LinphoneUtils.dispatchOnUIThread(mIterateRunnable);
new Runnable() {
@Override
public void run() {
if (mCore != null) {
mCore.iterate();
}
}
});
} }
}; };
/*use schedule instead of scheduleAtFixedRate to avoid iterate from being call in burst after cpu wake up*/ /*use schedule instead of scheduleAtFixedRate to avoid iterate from being call in burst after cpu wake up*/

View file

@ -23,7 +23,6 @@ import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphoneService; import org.linphone.LinphoneService;
import org.linphone.R; import org.linphone.R;
@ -31,11 +30,10 @@ import org.linphone.assistant.MenuAssistantActivity;
import org.linphone.chat.ChatActivity; import org.linphone.chat.ChatActivity;
import org.linphone.history.HistoryActivity; import org.linphone.history.HistoryActivity;
import org.linphone.settings.LinphonePreferences; import org.linphone.settings.LinphonePreferences;
import org.linphone.utils.LinphoneUtils;
/** Creates LinphoneService and wait until Core is ready to start main Activity */ /** Creates LinphoneService and wait until Core is ready to start main Activity */
public class LinphoneLauncherActivity extends Activity { public class LinphoneLauncherActivity extends Activity {
private Handler mHandler;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -47,8 +45,6 @@ public class LinphoneLauncherActivity extends Activity {
if (!getResources().getBoolean(R.bool.use_full_screen_image_splashscreen)) { if (!getResources().getBoolean(R.bool.use_full_screen_image_splashscreen)) {
setContentView(R.layout.launch_screen); setContentView(R.layout.launch_screen);
} // Otherwise use drawable/launch_screen layer list up until first activity starts } // Otherwise use drawable/launch_screen layer list up until first activity starts
mHandler = new Handler();
} }
@Override @Override
@ -90,7 +86,7 @@ public class LinphoneLauncherActivity extends Activity {
LinphoneManager.getInstance().checkForUpdate(); LinphoneManager.getInstance().checkForUpdate();
} }
mHandler.postDelayed( LinphoneUtils.dispatchOnUIThreadAfter(
new Runnable() { new Runnable() {
@Override @Override
public void run() { public void run() {
@ -118,7 +114,7 @@ public class LinphoneLauncherActivity extends Activity {
throw new RuntimeException("waiting thread sleep() has been interrupted"); throw new RuntimeException("waiting thread sleep() has been interrupted");
} }
} }
mHandler.post( LinphoneUtils.dispatchOnUIThread(
new Runnable() { new Runnable() {
@Override @Override
public void run() { public void run() {

View file

@ -29,7 +29,6 @@ import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.CountDownTimer; import android.os.CountDownTimer;
import android.os.Handler;
import android.os.SystemClock; import android.os.SystemClock;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -49,6 +48,7 @@ import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.drawerlayout.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
import java.lang.ref.WeakReference;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.LinphoneService; import org.linphone.LinphoneService;
import org.linphone.R; import org.linphone.R;
@ -84,18 +84,25 @@ public class CallActivity extends LinphoneGenericActivity
private static final int WRITE_EXTERNAL_STORAGE_FOR_RECORDING = 2; private static final int WRITE_EXTERNAL_STORAGE_FOR_RECORDING = 2;
private static final int CAMERA_TO_ACCEPT_UPDATE = 3; private static final int CAMERA_TO_ACCEPT_UPDATE = 3;
private Handler mHandler = new Handler(); private static class HideControlsRunnable implements Runnable {
private Runnable mHideControlsRunnable = private WeakReference<CallActivity> mWeakCallActivity;
new Runnable() {
@Override public HideControlsRunnable(CallActivity activity) {
public void run() { mWeakCallActivity = new WeakReference<>(activity);
// Make sure that at the time this is executed this is still required }
Call call = mCore.getCurrentCall();
if (call != null && call.getCurrentParams().videoEnabled()) { @Override
updateButtonsVisibility(false); public void run() {
} // Make sure that at the time this is executed this is still required
} Call call = LinphoneManager.getCore().getCurrentCall();
}; if (call != null && call.getCurrentParams().videoEnabled()) {
CallActivity activity = mWeakCallActivity.get();
if (activity != null) activity.updateButtonsVisibility(false);
}
}
}
private final HideControlsRunnable mHideControlsRunnable = new HideControlsRunnable(this);
private int mPreviewX, mPreviewY; private int mPreviewX, mPreviewY;
private TextureView mLocalPreview, mRemoteVideo; private TextureView mLocalPreview, mRemoteVideo;
@ -485,9 +492,49 @@ public class CallActivity extends LinphoneGenericActivity
core.setNativeVideoWindowId(null); core.setNativeVideoWindowId(null);
core.setNativePreviewWindowId(null); core.setNativePreviewWindowId(null);
} }
if (mZoomHelper != null) { if (mZoomHelper != null) {
mZoomHelper.destroy(); mZoomHelper.destroy();
mZoomHelper = null;
} }
if (mCallUpdateCountDownTimer != null) {
mCallUpdateCountDownTimer.cancel();
mCallUpdateCountDownTimer = null;
}
mCallTimer.stop();
mCallTimer = null;
mLocalPreview = null;
mRemoteVideo = null;
mStatsFragment = null;
mButtons = null;
mActiveCalls = null;
mContactAvatar = null;
mActiveCallHeader = null;
mConferenceHeader = null;
mCallsList = null;
mCallPausedByRemote = null;
mConferenceList = null;
mMicro = null;
mSpeaker = null;
mVideo = null;
mPause = null;
mSwitchCamera = null;
mRecordingInProgress = null;
mExtrasButtons = null;
mAddCall = null;
mTransferCall = null;
mRecordCall = null;
mConference = null;
mAudioRoute = null;
mRouteEarpiece = null;
mRouteSpeaker = null;
mRouteBluetooth = null;
mContactName = null;
mMissedMessages = null;
mVideoInviteInProgress = null;
mCallUpdateDialog = null;
super.onDestroy(); super.onDestroy();
} }
@ -588,8 +635,9 @@ public class CallActivity extends LinphoneGenericActivity
@Override @Override
public void resetCallControlsHidingTimer() { public void resetCallControlsHidingTimer() {
mHandler.removeCallbacks(mHideControlsRunnable); LinphoneUtils.removeFromUIThreadDispatcher(mHideControlsRunnable);
mHandler.postDelayed(mHideControlsRunnable, SECONDS_BEFORE_HIDING_CONTROLS); LinphoneUtils.dispatchOnUIThreadAfter(
mHideControlsRunnable, SECONDS_BEFORE_HIDING_CONTROLS);
} }
// BUTTONS // BUTTONS
@ -742,7 +790,7 @@ public class CallActivity extends LinphoneGenericActivity
LinphoneManager.getInstance().enableProximitySensing(!videoEnabled); LinphoneManager.getInstance().enableProximitySensing(!videoEnabled);
if (!videoEnabled) { if (!videoEnabled) {
mHandler.removeCallbacks(mHideControlsRunnable); LinphoneUtils.removeFromUIThreadDispatcher(mHideControlsRunnable);
} }
} }

View file

@ -20,7 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
import android.content.Context; import android.content.Context;
import android.os.Handler;
import android.text.Html; import android.text.Html;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
@ -37,11 +36,11 @@ import org.linphone.core.CallParams;
import org.linphone.core.CallStats; import org.linphone.core.CallStats;
import org.linphone.core.PayloadType; import org.linphone.core.PayloadType;
import org.linphone.core.StreamType; import org.linphone.core.StreamType;
import org.linphone.utils.LinphoneUtils;
public class CallStatsChildViewHolder { public class CallStatsChildViewHolder {
private Timer mTimer; private Timer mTimer;
private Call mCall; private Call mCall;
private final Handler mHandler = new Handler();
private CallListenerStub mListener; private CallListenerStub mListener;
private HashMap<String, String> mEncoderTexts; private HashMap<String, String> mEncoderTexts;
private HashMap<String, String> mDecoderTexts; private HashMap<String, String> mDecoderTexts;
@ -170,7 +169,7 @@ public class CallStatsChildViewHolder {
return; return;
} }
mHandler.post( LinphoneUtils.dispatchOnUIThread(
new Runnable() { new Runnable() {
@Override @Override
public void run() { public void run() {

View file

@ -25,7 +25,6 @@ import android.content.Context;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -46,9 +45,9 @@ import org.linphone.core.ProxyConfig;
import org.linphone.core.RegistrationState; import org.linphone.core.RegistrationState;
import org.linphone.core.tools.Log; import org.linphone.core.tools.Log;
import org.linphone.settings.LinphonePreferences; import org.linphone.settings.LinphonePreferences;
import org.linphone.utils.LinphoneUtils;
public class CallStatusBarFragment extends Fragment { public class CallStatusBarFragment extends Fragment {
private final Handler mRefreshHandler = new Handler();
private TextView mStatusText; private TextView mStatusText;
private ImageView mStatusLed, mCallQuality, mEncryption; private ImageView mStatusLed, mCallQuality, mEncryption;
private Runnable mCallQualityUpdater; private Runnable mCallQualityUpdater;
@ -191,7 +190,7 @@ public class CallStatusBarFragment extends Fragment {
} }
if (mCallQualityUpdater != null) { if (mCallQualityUpdater != null) {
mRefreshHandler.removeCallbacks(mCallQualityUpdater); LinphoneUtils.removeFromUIThreadDispatcher(mCallQualityUpdater);
mCallQualityUpdater = null; mCallQualityUpdater = null;
} }
} }
@ -245,7 +244,7 @@ public class CallStatusBarFragment extends Fragment {
} }
private void startCallQuality() { private void startCallQuality() {
mRefreshHandler.postDelayed( LinphoneUtils.dispatchOnUIThreadAfter(
mCallQualityUpdater = mCallQualityUpdater =
new Runnable() { new Runnable() {
final Call mCurrentCall = LinphoneManager.getCore().getCurrentCall(); final Call mCurrentCall = LinphoneManager.getCore().getCurrentCall();
@ -258,7 +257,7 @@ public class CallStatusBarFragment extends Fragment {
float newQuality = mCurrentCall.getCurrentQuality(); float newQuality = mCurrentCall.getCurrentQuality();
updateQualityOfSignalIcon(newQuality); updateQualityOfSignalIcon(newQuality);
mRefreshHandler.postDelayed(this, 1000); LinphoneUtils.dispatchOnUIThreadAfter(this, 1000);
} }
}, },
1000); 1000);

View file

@ -32,8 +32,6 @@ import android.content.Intent;
import android.graphics.Rect; import android.graphics.Rect;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Parcelable; import android.os.Parcelable;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.text.Editable; import android.text.Editable;
@ -102,7 +100,6 @@ public class ChatMessagesFragment extends Fragment
private static final String INPUT_CONTENT_INFO_KEY = "COMMIT_CONTENT_INPUT_CONTENT_INFO"; private static final String INPUT_CONTENT_INFO_KEY = "COMMIT_CONTENT_INPUT_CONTENT_INFO";
private static final String COMMIT_CONTENT_FLAGS_KEY = "COMMIT_CONTENT_FLAGS"; private static final String COMMIT_CONTENT_FLAGS_KEY = "COMMIT_CONTENT_FLAGS";
private final Handler mHandler = new Handler(Looper.getMainLooper());
private ImageView mCallButton; private ImageView mCallButton;
private ImageView mBackToCallButton; private ImageView mBackToCallButton;
private ImageView mGroupInfosButton; private ImageView mGroupInfosButton;
@ -607,7 +604,7 @@ public class ChatMessagesFragment extends Fragment
} }
private void loadMoreData(final int totalItemsCount) { private void loadMoreData(final int totalItemsCount) {
mHandler.post( LinphoneUtils.dispatchOnUIThread(
new Runnable() { new Runnable() {
@Override @Override
public void run() { public void run() {

View file

@ -21,7 +21,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.os.Handler;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -32,6 +31,7 @@ import org.linphone.LinphoneManager;
import org.linphone.core.Player; import org.linphone.core.Player;
import org.linphone.core.PlayerListener; import org.linphone.core.PlayerListener;
import org.linphone.core.tools.Log; import org.linphone.core.tools.Log;
import org.linphone.utils.LinphoneUtils;
class Recording implements PlayerListener, Comparable<Recording> { class Recording implements PlayerListener, Comparable<Recording> {
public static final Pattern RECORD_PATTERN = public static final Pattern RECORD_PATTERN =
@ -42,7 +42,6 @@ class Recording implements PlayerListener, Comparable<Recording> {
private Date mRecordDate; private Date mRecordDate;
private final Player mPlayer; private final Player mPlayer;
private RecordingListener mListener; private RecordingListener mListener;
private final Handler mHandler;
private Runnable mUpdateCurrentPositionTimer; private Runnable mUpdateCurrentPositionTimer;
@SuppressLint("SimpleDateFormat") @SuppressLint("SimpleDateFormat")
@ -60,14 +59,14 @@ class Recording implements PlayerListener, Comparable<Recording> {
} }
} }
mHandler = new Handler(context.getMainLooper());
mUpdateCurrentPositionTimer = mUpdateCurrentPositionTimer =
new Runnable() { new Runnable() {
@Override @Override
public void run() { public void run() {
if (mListener != null) if (mListener != null)
mListener.currentPositionChanged(getCurrentPosition()); mListener.currentPositionChanged(getCurrentPosition());
if (isPlaying()) mHandler.postDelayed(mUpdateCurrentPositionTimer, 20); if (isPlaying())
LinphoneUtils.dispatchOnUIThreadAfter(mUpdateCurrentPositionTimer, 20);
} }
}; };
@ -97,7 +96,7 @@ class Recording implements PlayerListener, Comparable<Recording> {
} }
mPlayer.start(); mPlayer.start();
mHandler.post(mUpdateCurrentPositionTimer); LinphoneUtils.dispatchOnUIThread(mUpdateCurrentPositionTimer);
} }
public boolean isPlaying() { public boolean isPlaying() {

View file

@ -84,9 +84,7 @@ public class ActivityMonitor implements Application.ActivityLifecycleCallbacks {
void startInactivityChecker() { void startInactivityChecker() {
if (mLastChecker != null) mLastChecker.cancel(); if (mLastChecker != null) mLastChecker.cancel();
LinphoneService.instance() LinphoneUtils.dispatchOnUIThreadAfter((mLastChecker = new InactivityChecker()), 2000);
.handler
.postDelayed((mLastChecker = new InactivityChecker()), 2000);
} }
void checkActivity() { void checkActivity() {

View file

@ -90,6 +90,14 @@ public final class LinphoneUtils {
sHandler.post(r); sHandler.post(r);
} }
public static void dispatchOnUIThreadAfter(Runnable r, long after) {
sHandler.postDelayed(r, after);
}
public static void removeFromUIThreadDispatcher(Runnable r) {
sHandler.removeCallbacks(r);
}
private static boolean isSipAddress(String numberOrAddress) { private static boolean isSipAddress(String numberOrAddress) {
Factory.instance().createAddress(numberOrAddress); Factory.instance().createAddress(numberOrAddress);
return true; return true;