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.LinphoneCore;
|
||||
import org.linphone.core.LinphoneCoreException;
|
||||
import org.linphone.core.LinphoneCoreFactory;
|
||||
import org.linphone.core.LinphoneCoreListenerBase;
|
||||
import org.linphone.core.LinphonePlayer;
|
||||
import org.linphone.mediastream.Log;
|
||||
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
|
||||
import org.linphone.ui.Numpad;
|
||||
import org.w3c.dom.Text;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.app.FragmentTransaction;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
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.CountDownTimer;
|
||||
import android.os.Handler;
|
||||
|
@ -74,7 +76,7 @@ import android.widget.Toast;
|
|||
/**
|
||||
* @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_DENYING_CALL_UPDATE = 30000;
|
||||
|
||||
|
@ -99,7 +101,11 @@ public class CallActivity extends Activity implements OnClickListener {
|
|||
private CountDownTimer timer;
|
||||
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 LayoutInflater inflater;
|
||||
|
@ -133,6 +139,18 @@ public class CallActivity extends Activity implements OnClickListener {
|
|||
isAnimationDisabled = getApplicationContext().getResources().getBoolean(R.bool.disable_animations) || !LinphonePreferences.instance().areAnimationsEnabled();
|
||||
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(){
|
||||
|
||||
@Override
|
||||
|
@ -725,7 +743,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
|||
}
|
||||
|
||||
private void showAudioView() {
|
||||
LinphoneManager.startProximitySensorForActivity(CallActivity.this);
|
||||
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
replaceFragmentVideoByAudio();
|
||||
displayAudioCall();
|
||||
showStatusBar();
|
||||
|
@ -740,7 +758,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
|||
}
|
||||
refreshInCallActions();
|
||||
|
||||
LinphoneManager.stopProximitySensorForActivity(CallActivity.this);
|
||||
mSensorManager.unregisterListener(this);
|
||||
replaceFragmentAudioByVideo();
|
||||
hideStatusBar();
|
||||
displayVideoCall(false);
|
||||
|
@ -1357,7 +1375,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
|||
} else if(LinphoneManager.getLc().isInConference()) {
|
||||
displayConference();
|
||||
} else {
|
||||
LinphoneManager.startProximitySensorForActivity(this);
|
||||
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
removeCallbacks();
|
||||
}
|
||||
}
|
||||
|
@ -1409,7 +1427,7 @@ public class CallActivity extends Activity implements OnClickListener {
|
|||
mControls = null;
|
||||
|
||||
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(){
|
||||
mControlsLayout.setVisibility(View.VISIBLE);
|
||||
LinphoneManager.startProximitySensorForActivity(CallActivity.this);
|
||||
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
mActiveCallHeader.setVisibility(View.GONE);
|
||||
mNoCurrentCall.setVisibility(View.GONE);
|
||||
callsList.setVisibility(View.VISIBLE);
|
||||
|
@ -1687,4 +1705,37 @@ public class CallActivity extends Activity implements OnClickListener {
|
|||
}
|
||||
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