diff --git a/src/org/linphone/ConferenceActivity.java b/src/org/linphone/ConferenceActivity.java index f975a1904..042a61dbf 100644 --- a/src/org/linphone/ConferenceActivity.java +++ b/src/org/linphone/ConferenceActivity.java @@ -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(); } diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index 2ba3437f7..3c8dd2a9c 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -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 diff --git a/src/org/linphone/IncallActivity.java b/src/org/linphone/IncallActivity.java index 6874387b3..d8faa0899 100644 --- a/src/org/linphone/IncallActivity.java +++ b/src/org/linphone/IncallActivity.java @@ -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(); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index b88e16aa5..298108788 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -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); @@ -140,10 +130,7 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener 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()) { //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 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) { @@ -360,20 +320,6 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener previousRotation = -1; 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) { @@ -538,6 +484,8 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener } } + + interface ContactPicked { void setAddressAndGoToDialer(String number, String name, Uri photo); } \ No newline at end of file diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 4ada1ec1c..fe1e14262 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -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 sProximityDependentActivities = new HashSet(); + 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 diff --git a/src/org/linphone/UriPickerActivity.java b/src/org/linphone/UriPickerActivity.java index 1edda8289..dad28f6b3 100644 --- a/src/org/linphone/UriPickerActivity.java +++ b/src/org/linphone/UriPickerActivity.java @@ -154,6 +154,17 @@ public class UriPickerActivity extends TabActivity implements ContactPicked { dialer.setContactAddress(number, name, photo); gotToDialer(); } + + @Override + protected void onPause() { + LinphoneManager.stopProximitySensorForActivity(this); + super.onPause(); + } + @Override + protected void onResume() { + LinphoneManager.startProximitySensorForActivity(this); + super.onResume(); + } } diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java index 102fce001..9e10b615f 100755 --- a/src/org/linphone/VideoCallActivity.java +++ b/src/org/linphone/VideoCallActivity.java @@ -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; /**