Fix proximity sensor (conference, uri picker, incall).
This commit is contained in:
parent
2981c17eb0
commit
01674c3b1a
7 changed files with 113 additions and 68 deletions
|
@ -146,6 +146,7 @@ public class ConferenceActivity extends ListActivity implements
|
|||
CalleeListAdapter adapter = (CalleeListAdapter) getListAdapter();
|
||||
adapter.notifyDataSetInvalidated();
|
||||
adapter.notifyDataSetChanged();
|
||||
LinphoneManager.startProximitySensorForActivity(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -173,6 +174,7 @@ public class ConferenceActivity extends ListActivity implements
|
|||
protected void onPause() {
|
||||
active=false;
|
||||
registerLinphoneListener(false);
|
||||
LinphoneManager.stopProximitySensorForActivity(this);
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
|
|
|
@ -237,7 +237,7 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin
|
|||
|
||||
// setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
|
||||
|
||||
LinphoneActivity.instance().startProxymitySensor();
|
||||
LinphoneManager.startProximitySensorForActivity(LinphoneActivity.instance());
|
||||
if (!mWakeLock.isHeld()) mWakeLock.acquire();
|
||||
|
||||
if (useIncallActivity) {
|
||||
|
@ -319,7 +319,7 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin
|
|||
}
|
||||
|
||||
if (mWakeLock.isHeld()) mWakeLock.release();
|
||||
LinphoneActivity.instance().stopProxymitySensor();
|
||||
LinphoneManager.stopProximitySensorForActivity(LinphoneActivity.instance());
|
||||
|
||||
setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
|
||||
mCall.setEnabled(true);
|
||||
|
@ -520,6 +520,10 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin
|
|||
// Note1: We wait as long as possible before setting the last message.
|
||||
// Note2: Linphone service is in charge of instantiating LinphoneManager
|
||||
mStatus.setText(LinphoneManager.getInstance().getLastLcStatusMessage());
|
||||
if (LinphoneManager.getLc().getCallsNb() > 0) {
|
||||
LinphoneManager.startProximitySensorForActivity(LinphoneActivity.instance());
|
||||
// removing is done directly in LinphoneActivity.onPause()
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -102,7 +102,7 @@ public class IncallActivity extends Activity implements OnClickListener {
|
|||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
LinphoneManager.startProximitySensorForActivity(this);
|
||||
task = new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
@ -125,6 +125,7 @@ public class IncallActivity extends Activity implements OnClickListener {
|
|||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
LinphoneManager.stopProximitySensorForActivity(this);
|
||||
|
||||
if (task != null) {
|
||||
task.cancel();
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.linphone;
|
|||
|
||||
import static android.content.Intent.ACTION_MAIN;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.linphone.LinphoneManager.EcCalibrationListener;
|
||||
import org.linphone.core.LinphoneAddress;
|
||||
import org.linphone.core.LinphoneCore;
|
||||
|
@ -52,8 +50,6 @@ import android.text.Html;
|
|||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TabWidget;
|
||||
import android.widget.TextView;
|
||||
|
@ -77,7 +73,6 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
|
|||
private SensorManager mSensorManager;
|
||||
private Sensor mAccelerometer;
|
||||
private int previousRotation = -1;
|
||||
private static SensorEventListener mSensorEventListener;
|
||||
|
||||
private static final String SCREEN_IS_HIDDEN = "screen_is_hidden";
|
||||
private Handler mHandler = new Handler();
|
||||
|
@ -100,14 +95,9 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
|
|||
throw new RuntimeException("LinphoneActivity not instantiated yet");
|
||||
}
|
||||
|
||||
protected void onSaveInstanceState (Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putBoolean(SCREEN_IS_HIDDEN, mMainFrame.getVisibility() == View.INVISIBLE);
|
||||
}
|
||||
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
instance = this;
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.main);
|
||||
|
||||
LinphonePreferenceManager.getInstance(this);
|
||||
|
@ -141,9 +131,6 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
|
|||
}
|
||||
}
|
||||
|
||||
if (savedInstanceState !=null && savedInstanceState.getBoolean(SCREEN_IS_HIDDEN,false)) {
|
||||
hideScreen(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -271,7 +258,7 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
|
|||
if (isFinishing()) {
|
||||
//restore audio settings
|
||||
LinphoneManager.getInstance().routeAudioToReceiver();
|
||||
stopProxymitySensor();//just in case
|
||||
LinphoneManager.stopProximitySensorForActivity(this);
|
||||
instance = null;
|
||||
}
|
||||
}
|
||||
|
@ -316,39 +303,12 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
|
|||
}
|
||||
|
||||
|
||||
|
||||
void hideScreen(boolean isHidden) {
|
||||
WindowManager.LayoutParams lAttrs =getWindow().getAttributes();
|
||||
if (isHidden) {
|
||||
lAttrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
||||
mMainFrame.setVisibility(View.INVISIBLE);
|
||||
} else {
|
||||
lAttrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
mMainFrame.setVisibility(View.VISIBLE);
|
||||
}
|
||||
getWindow().setAttributes(lAttrs);
|
||||
public synchronized void stopOrientationSensor() {
|
||||
if (mSensorManager!=null)
|
||||
mSensorManager.unregisterListener(this, mAccelerometer);
|
||||
}
|
||||
|
||||
synchronized void startProxymitySensor() {
|
||||
if (mSensorEventListener != null) {
|
||||
Log.i("proximity sensor already active");
|
||||
return;
|
||||
}
|
||||
List<Sensor> lSensorList = mSensorManager.getSensorList(Sensor.TYPE_PROXIMITY);
|
||||
mSensorEventListener = new SensorEventListener() {
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
//just ignoring for nexus 1
|
||||
if (event.timestamp == 0) return;
|
||||
instance().hideScreen(LinphoneManager.isProximitySensorNearby(event));
|
||||
}
|
||||
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
};
|
||||
if (lSensorList.size() >0) {
|
||||
mSensorManager.registerListener(mSensorEventListener,lSensorList.get(0),SensorManager.SENSOR_DELAY_UI);
|
||||
Log.i("Proximity sensor detected, registering");
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void startOrientationSensor() {
|
||||
if (mSensorManager!=null) {
|
||||
|
@ -361,20 +321,6 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
|
|||
onSensorChanged(null);
|
||||
}
|
||||
|
||||
public synchronized void stopOrientationSensor() {
|
||||
if (mSensorManager!=null)
|
||||
mSensorManager.unregisterListener(this, mAccelerometer);
|
||||
}
|
||||
|
||||
protected synchronized void stopProxymitySensor() {
|
||||
if (mSensorManager!=null) {
|
||||
mSensorManager.unregisterListener(mSensorEventListener);
|
||||
mSensorEventListener=null;
|
||||
}
|
||||
hideScreen(false);
|
||||
}
|
||||
|
||||
|
||||
void showPreferenceErrorDialog(String message) {
|
||||
if (!useMenuSettings) {
|
||||
Toast.makeText(this, message, Toast.LENGTH_LONG);
|
||||
|
@ -538,6 +484,8 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
interface ContactPicked {
|
||||
void setAddressAndGoToDialer(String number, String name, Uri photo);
|
||||
}
|
|
@ -40,7 +40,9 @@ import java.io.FileOutputStream;
|
|||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
|
@ -69,6 +71,7 @@ import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
|
|||
import org.linphone.mediastream.video.capture.hwconf.Hacks;
|
||||
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration.AndroidCamera;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
|
@ -77,7 +80,10 @@ import android.content.IntentFilter;
|
|||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.Editor;
|
||||
import android.content.res.Resources;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.ConnectivityManager;
|
||||
|
@ -89,6 +95,10 @@ import android.os.PowerManager.WakeLock;
|
|||
import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
import android.provider.Settings.SettingNotFoundException;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -947,6 +957,79 @@ public final class LinphoneManager implements LinphoneCoreListener {
|
|||
|
||||
return distanceInCm < threshold;
|
||||
}
|
||||
|
||||
|
||||
private static boolean sLastProximitySensorValueNearby;
|
||||
private static Set<Activity> sProximityDependentActivities = new HashSet<Activity>();
|
||||
private static SensorEventListener sProximitySensorListener = new SensorEventListener() {
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
if (event.timestamp == 0) return; //just ignoring for nexus 1
|
||||
sLastProximitySensorValueNearby = isProximitySensorNearby(event);
|
||||
proximityNearbyChanged();
|
||||
}
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
};
|
||||
|
||||
|
||||
private static void hideActivityViewAsIfProximitySensorNearby(Activity activity) {
|
||||
final Window window = activity.getWindow();
|
||||
View view = ((ViewGroup) window.getDecorView().findViewById(android.R.id.content)).getChildAt(0);
|
||||
WindowManager.LayoutParams lAttrs = activity.getWindow().getAttributes();
|
||||
lAttrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
||||
view.setVisibility(View.INVISIBLE);
|
||||
window.setAttributes(lAttrs);
|
||||
}
|
||||
|
||||
private static void proximityNearbyChanged() {
|
||||
boolean nearby = sLastProximitySensorValueNearby;
|
||||
for (Activity activity : sProximityDependentActivities) {
|
||||
final Window window = activity.getWindow();
|
||||
WindowManager.LayoutParams lAttrs = activity.getWindow().getAttributes();
|
||||
View view = ((ViewGroup) window.getDecorView().findViewById(android.R.id.content)).getChildAt(0);
|
||||
if (nearby) {
|
||||
lAttrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
||||
view.setVisibility(View.INVISIBLE);
|
||||
} else {
|
||||
lAttrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
view.setVisibility(View.VISIBLE);
|
||||
}
|
||||
window.setAttributes(lAttrs);
|
||||
}
|
||||
}
|
||||
|
||||
public static synchronized void startProximitySensorForActivity(Activity activity) {
|
||||
if (sProximityDependentActivities.contains(activity)) {
|
||||
Log.i("proximity sensor already active for " + activity.getLocalClassName());
|
||||
return;
|
||||
}
|
||||
|
||||
if (sProximityDependentActivities.isEmpty()) {
|
||||
SensorManager sm = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
|
||||
Sensor s = sm.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
||||
if (s != null) {
|
||||
sm.registerListener(sProximitySensorListener,s,SensorManager.SENSOR_DELAY_UI);
|
||||
Log.i("Proximity sensor detected, registering");
|
||||
}
|
||||
} else if (sLastProximitySensorValueNearby){
|
||||
hideActivityViewAsIfProximitySensorNearby(activity);
|
||||
}
|
||||
|
||||
sProximityDependentActivities.add(activity);
|
||||
}
|
||||
|
||||
public static synchronized void stopProximitySensorForActivity(Activity activity) {
|
||||
sProximityDependentActivities.remove(activity);
|
||||
if (sProximityDependentActivities.isEmpty()) {
|
||||
SensorManager sm = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
|
||||
sm.unregisterListener(sProximitySensorListener);
|
||||
sLastProximitySensorValueNearby = false;
|
||||
proximityNearbyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static synchronized LinphoneCore getLcIfManagerNotDestroyedOrNull() {
|
||||
if (sExited) {
|
||||
// Can occur if the UI thread play a posted event but in the meantime the LinphoneManager was destroyed
|
||||
|
|
|
@ -155,5 +155,16 @@ public class UriPickerActivity extends TabActivity implements ContactPicked {
|
|||
gotToDialer();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
LinphoneManager.stopProximitySensorForActivity(this);
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
LinphoneManager.startProximitySensorForActivity(this);
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -23,13 +23,10 @@ package org.linphone;
|
|||
import org.linphone.core.LinphoneCall;
|
||||
import org.linphone.core.Log;
|
||||
import org.linphone.mediastream.video.AndroidVideoWindowImpl;
|
||||
import org.linphone.mediastream.video.capture.AndroidVideoApi5JniWrapper;
|
||||
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.hardware.Camera;
|
||||
import android.hardware.Camera.CameraInfo;
|
||||
import android.opengl.GLSurfaceView;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
|
@ -42,7 +39,6 @@ import android.view.MenuItem;
|
|||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.ImageView;
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue