Fix proximity sensor (conference, uri picker, incall).

This commit is contained in:
Guillaume Beraudo 2011-10-10 14:56:02 +02:00
parent 2981c17eb0
commit 01674c3b1a
7 changed files with 113 additions and 68 deletions

View file

@ -146,6 +146,7 @@ public class ConferenceActivity extends ListActivity implements
CalleeListAdapter adapter = (CalleeListAdapter) getListAdapter(); CalleeListAdapter adapter = (CalleeListAdapter) getListAdapter();
adapter.notifyDataSetInvalidated(); adapter.notifyDataSetInvalidated();
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
LinphoneManager.startProximitySensorForActivity(this);
} }
@Override @Override
@ -173,6 +174,7 @@ public class ConferenceActivity extends ListActivity implements
protected void onPause() { protected void onPause() {
active=false; active=false;
registerLinphoneListener(false); registerLinphoneListener(false);
LinphoneManager.stopProximitySensorForActivity(this);
super.onPause(); super.onPause();
} }

View file

@ -237,7 +237,7 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin
// setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); // setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
LinphoneActivity.instance().startProxymitySensor(); LinphoneManager.startProximitySensorForActivity(LinphoneActivity.instance());
if (!mWakeLock.isHeld()) mWakeLock.acquire(); if (!mWakeLock.isHeld()) mWakeLock.acquire();
if (useIncallActivity) { if (useIncallActivity) {
@ -319,7 +319,7 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin
} }
if (mWakeLock.isHeld()) mWakeLock.release(); if (mWakeLock.isHeld()) mWakeLock.release();
LinphoneActivity.instance().stopProxymitySensor(); LinphoneManager.stopProximitySensorForActivity(LinphoneActivity.instance());
setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE); setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
mCall.setEnabled(true); 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. // Note1: We wait as long as possible before setting the last message.
// Note2: Linphone service is in charge of instantiating LinphoneManager // Note2: Linphone service is in charge of instantiating LinphoneManager
mStatus.setText(LinphoneManager.getInstance().getLastLcStatusMessage()); mStatus.setText(LinphoneManager.getInstance().getLastLcStatusMessage());
if (LinphoneManager.getLc().getCallsNb() > 0) {
LinphoneManager.startProximitySensorForActivity(LinphoneActivity.instance());
// removing is done directly in LinphoneActivity.onPause()
}
} }
@Override @Override

View file

@ -102,7 +102,7 @@ public class IncallActivity extends Activity implements OnClickListener {
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
LinphoneManager.startProximitySensorForActivity(this);
task = new TimerTask() { task = new TimerTask() {
@Override @Override
public void run() { public void run() {
@ -125,6 +125,7 @@ public class IncallActivity extends Activity implements OnClickListener {
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
LinphoneManager.stopProximitySensorForActivity(this);
if (task != null) { if (task != null) {
task.cancel(); task.cancel();

View file

@ -21,8 +21,6 @@ package org.linphone;
import static android.content.Intent.ACTION_MAIN; import static android.content.Intent.ACTION_MAIN;
import java.util.List;
import org.linphone.LinphoneManager.EcCalibrationListener; import org.linphone.LinphoneManager.EcCalibrationListener;
import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore;
@ -52,8 +50,6 @@ import android.text.Html;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.TabWidget; import android.widget.TabWidget;
import android.widget.TextView; import android.widget.TextView;
@ -77,7 +73,6 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
private SensorManager mSensorManager; private SensorManager mSensorManager;
private Sensor mAccelerometer; private Sensor mAccelerometer;
private int previousRotation = -1; private int previousRotation = -1;
private static SensorEventListener mSensorEventListener;
private static final String SCREEN_IS_HIDDEN = "screen_is_hidden"; private static final String SCREEN_IS_HIDDEN = "screen_is_hidden";
private Handler mHandler = new Handler(); private Handler mHandler = new Handler();
@ -100,14 +95,9 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
throw new RuntimeException("LinphoneActivity not instantiated yet"); 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) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this; instance = this;
super.onCreate(savedInstanceState);
setContentView(R.layout.main); setContentView(R.layout.main);
LinphonePreferenceManager.getInstance(this); LinphonePreferenceManager.getInstance(this);
@ -140,10 +130,7 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
checkAccount = false; checkAccount = false;
} }
} }
if (savedInstanceState !=null && savedInstanceState.getBoolean(SCREEN_IS_HIDDEN,false)) {
hideScreen(true);
}
} }
@ -271,7 +258,7 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
if (isFinishing()) { if (isFinishing()) {
//restore audio settings //restore audio settings
LinphoneManager.getInstance().routeAudioToReceiver(); LinphoneManager.getInstance().routeAudioToReceiver();
stopProxymitySensor();//just in case LinphoneManager.stopProximitySensorForActivity(this);
instance = null; instance = null;
} }
} }
@ -316,39 +303,12 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
} }
public synchronized void stopOrientationSensor() {
void hideScreen(boolean isHidden) { if (mSensorManager!=null)
WindowManager.LayoutParams lAttrs =getWindow().getAttributes(); mSensorManager.unregisterListener(this, mAccelerometer);
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);
} }
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() { public synchronized void startOrientationSensor() {
if (mSensorManager!=null) { if (mSensorManager!=null) {
@ -360,20 +320,6 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
previousRotation = -1; previousRotation = -1;
onSensorChanged(null); 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) { void showPreferenceErrorDialog(String message) {
if (!useMenuSettings) { if (!useMenuSettings) {
@ -538,6 +484,8 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener
} }
} }
interface ContactPicked { interface ContactPicked {
void setAddressAndGoToDialer(String number, String name, Uri photo); void setAddressAndGoToDialer(String number, String name, Uri photo);
} }

View file

@ -40,7 +40,9 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; 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.Hacks;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration.AndroidCamera; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration.AndroidCamera;
import android.app.Activity;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
@ -77,7 +80,10 @@ import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.Editor;
import android.content.res.Resources; import android.content.res.Resources;
import android.hardware.Sensor;
import android.hardware.SensorEvent; import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@ -89,6 +95,10 @@ import android.os.PowerManager.WakeLock;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.provider.Settings; import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException; 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; 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() { public static synchronized LinphoneCore getLcIfManagerNotDestroyedOrNull() {
if (sExited) { if (sExited) {
// Can occur if the UI thread play a posted event but in the meantime the LinphoneManager was destroyed // Can occur if the UI thread play a posted event but in the meantime the LinphoneManager was destroyed

View file

@ -154,6 +154,17 @@ public class UriPickerActivity extends TabActivity implements ContactPicked {
dialer.setContactAddress(number, name, photo); dialer.setContactAddress(number, name, photo);
gotToDialer(); gotToDialer();
} }
@Override
protected void onPause() {
LinphoneManager.stopProximitySensorForActivity(this);
super.onPause();
}
@Override
protected void onResume() {
LinphoneManager.startProximitySensorForActivity(this);
super.onResume();
}
} }

View file

@ -23,13 +23,10 @@ package org.linphone;
import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCall;
import org.linphone.core.Log; import org.linphone.core.Log;
import org.linphone.mediastream.video.AndroidVideoWindowImpl; import org.linphone.mediastream.video.AndroidVideoWindowImpl;
import org.linphone.mediastream.video.capture.AndroidVideoApi5JniWrapper;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -42,7 +39,6 @@ import android.view.MenuItem;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; import android.view.SurfaceView;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView; import android.widget.ImageView;
/** /**