From c122e5d2bc3bc420f877f396089b2583029ccfcd Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Fri, 15 Jan 2016 14:17:21 +0100 Subject: [PATCH] Turn off screen with proximity sensor --- src/org/linphone/CallActivity.java | 71 +++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/src/org/linphone/CallActivity.java b/src/org/linphone/CallActivity.java index a320d975c..79dbb4074 100644 --- a/src/org/linphone/CallActivity.java +++ b/src/org/linphone/CallActivity.java @@ -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) { + + } }