Turn off screen with proximity sensor
This commit is contained in:
parent
253a699837
commit
c122e5d2bc
1 changed files with 61 additions and 10 deletions
|
@ -26,23 +26,25 @@ import org.linphone.core.LinphoneCall.State;
|
||||||
import org.linphone.core.LinphoneCallParams;
|
import org.linphone.core.LinphoneCallParams;
|
||||||
import org.linphone.core.LinphoneCore;
|
import org.linphone.core.LinphoneCore;
|
||||||
import org.linphone.core.LinphoneCoreException;
|
import org.linphone.core.LinphoneCoreException;
|
||||||
import org.linphone.core.LinphoneCoreFactory;
|
|
||||||
import org.linphone.core.LinphoneCoreListenerBase;
|
import org.linphone.core.LinphoneCoreListenerBase;
|
||||||
import org.linphone.core.LinphonePlayer;
|
import org.linphone.core.LinphonePlayer;
|
||||||
import org.linphone.mediastream.Log;
|
import org.linphone.mediastream.Log;
|
||||||
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
|
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
|
||||||
import org.linphone.ui.Numpad;
|
import org.linphone.ui.Numpad;
|
||||||
import org.w3c.dom.Text;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.FragmentTransaction;
|
import android.app.FragmentTransaction;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.graphics.drawable.ColorDrawable;
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.hardware.Sensor;
|
||||||
|
import android.hardware.SensorEvent;
|
||||||
|
import android.hardware.SensorEventListener;
|
||||||
|
import android.hardware.SensorManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.CountDownTimer;
|
import android.os.CountDownTimer;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
@ -74,7 +76,7 @@ import android.widget.Toast;
|
||||||
/**
|
/**
|
||||||
* @author Sylvain Berfini
|
* @author Sylvain Berfini
|
||||||
*/
|
*/
|
||||||
public class CallActivity extends Activity implements OnClickListener {
|
public class CallActivity extends Activity implements OnClickListener, SensorEventListener {
|
||||||
private final static int SECONDS_BEFORE_HIDING_CONTROLS = 4000;
|
private final static int SECONDS_BEFORE_HIDING_CONTROLS = 4000;
|
||||||
private final static int SECONDS_BEFORE_DENYING_CALL_UPDATE = 30000;
|
private final static int SECONDS_BEFORE_DENYING_CALL_UPDATE = 30000;
|
||||||
|
|
||||||
|
@ -99,7 +101,11 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
private CountDownTimer timer;
|
private CountDownTimer timer;
|
||||||
private boolean isVideoCallPaused = false;
|
private boolean isVideoCallPaused = false;
|
||||||
|
|
||||||
|
private static PowerManager powerManager;
|
||||||
|
private static PowerManager.WakeLock wakeLock;
|
||||||
|
private static int field = 0x00000020;
|
||||||
|
private SensorManager mSensorManager;
|
||||||
|
private Sensor mProximity;
|
||||||
|
|
||||||
private LinearLayout callsList, conferenceList;
|
private LinearLayout callsList, conferenceList;
|
||||||
private LayoutInflater inflater;
|
private LayoutInflater inflater;
|
||||||
|
@ -133,6 +139,18 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
isAnimationDisabled = getApplicationContext().getResources().getBoolean(R.bool.disable_animations) || !LinphonePreferences.instance().areAnimationsEnabled();
|
isAnimationDisabled = getApplicationContext().getResources().getBoolean(R.bool.disable_animations) || !LinphonePreferences.instance().areAnimationsEnabled();
|
||||||
cameraNumber = AndroidCameraConfiguration.retrieveCameras().length;
|
cameraNumber = AndroidCameraConfiguration.retrieveCameras().length;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Yeah, this is hidden field.
|
||||||
|
field = PowerManager.class.getClass().getField("PROXIMITY_SCREEN_OFF_WAKE_LOCK").getInt(null);
|
||||||
|
} catch (Throwable ignored) {
|
||||||
|
}
|
||||||
|
|
||||||
|
powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
||||||
|
wakeLock = powerManager.newWakeLock(field, getLocalClassName());
|
||||||
|
|
||||||
|
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
|
||||||
|
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
||||||
|
|
||||||
mListener = new LinphoneCoreListenerBase(){
|
mListener = new LinphoneCoreListenerBase(){
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -725,7 +743,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showAudioView() {
|
private void showAudioView() {
|
||||||
LinphoneManager.startProximitySensorForActivity(CallActivity.this);
|
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
|
||||||
replaceFragmentVideoByAudio();
|
replaceFragmentVideoByAudio();
|
||||||
displayAudioCall();
|
displayAudioCall();
|
||||||
showStatusBar();
|
showStatusBar();
|
||||||
|
@ -740,7 +758,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
}
|
}
|
||||||
refreshInCallActions();
|
refreshInCallActions();
|
||||||
|
|
||||||
LinphoneManager.stopProximitySensorForActivity(CallActivity.this);
|
mSensorManager.unregisterListener(this);
|
||||||
replaceFragmentAudioByVideo();
|
replaceFragmentAudioByVideo();
|
||||||
hideStatusBar();
|
hideStatusBar();
|
||||||
displayVideoCall(false);
|
displayVideoCall(false);
|
||||||
|
@ -1357,7 +1375,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
} else if(LinphoneManager.getLc().isInConference()) {
|
} else if(LinphoneManager.getLc().isInConference()) {
|
||||||
displayConference();
|
displayConference();
|
||||||
} else {
|
} else {
|
||||||
LinphoneManager.startProximitySensorForActivity(this);
|
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
|
||||||
removeCallbacks();
|
removeCallbacks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1409,7 +1427,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
mControls = null;
|
mControls = null;
|
||||||
|
|
||||||
if (!isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) {
|
if (!isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) {
|
||||||
LinphoneManager.stopProximitySensorForActivity(this);
|
mSensorManager.unregisterListener(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1668,7 +1686,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
|
|
||||||
private void displayConference(){
|
private void displayConference(){
|
||||||
mControlsLayout.setVisibility(View.VISIBLE);
|
mControlsLayout.setVisibility(View.VISIBLE);
|
||||||
LinphoneManager.startProximitySensorForActivity(CallActivity.this);
|
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
|
||||||
mActiveCallHeader.setVisibility(View.GONE);
|
mActiveCallHeader.setVisibility(View.GONE);
|
||||||
mNoCurrentCall.setVisibility(View.GONE);
|
mNoCurrentCall.setVisibility(View.GONE);
|
||||||
callsList.setVisibility(View.VISIBLE);
|
callsList.setVisibility(View.VISIBLE);
|
||||||
|
@ -1687,4 +1705,37 @@ public class CallActivity extends Activity implements OnClickListener {
|
||||||
}
|
}
|
||||||
conferenceList.setVisibility(View.VISIBLE);
|
conferenceList.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Boolean isProximitySensorNearby(final SensorEvent event) {
|
||||||
|
float threshold = 4.001f; // <= 4 cm is near
|
||||||
|
|
||||||
|
final float distanceInCm = event.values[0];
|
||||||
|
final float maxDistance = event.sensor.getMaximumRange();
|
||||||
|
Log.d("Proximity sensor report [",distanceInCm,"] , for max range [",maxDistance,"]");
|
||||||
|
|
||||||
|
if (maxDistance <= threshold) {
|
||||||
|
// Case binary 0/1 and short sensors
|
||||||
|
threshold = maxDistance;
|
||||||
|
}
|
||||||
|
return distanceInCm < threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSensorChanged(SensorEvent event) {
|
||||||
|
if (event.timestamp == 0) return;
|
||||||
|
if(isProximitySensorNearby(event)){
|
||||||
|
if(!wakeLock.isHeld()) {
|
||||||
|
wakeLock.acquire();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(wakeLock.isHeld()) {
|
||||||
|
wakeLock.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue