Multiple Video orientation fixes and cleaning
- 0000083 : Video orientation not updated outside video call activity; - 0000082 : Video started landscape sent portrait; - use of accelerometer sensor in spite of orientation sensor.
This commit is contained in:
parent
1cca9a7b84
commit
c906073ea8
2 changed files with 51 additions and 83 deletions
|
@ -28,7 +28,6 @@ import org.linphone.core.Log;
|
|||
import org.linphone.core.LinphoneCall.State;
|
||||
import org.linphone.core.LinphoneCore.RegistrationState;
|
||||
import org.linphone.mediastream.Version;
|
||||
import org.linphone.mediastream.video.AndroidVideoWindowImpl;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.TabActivity;
|
||||
|
@ -37,10 +36,6 @@ import android.content.DialogInterface;
|
|||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.media.AudioManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
@ -50,31 +45,26 @@ import android.text.Html;
|
|||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.OrientationEventListener;
|
||||
import android.widget.TabWidget;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
import android.widget.TabHost.TabSpec;
|
||||
|
||||
public class LinphoneActivity extends TabActivity implements
|
||||
SensorEventListener
|
||||
, ContactPicked
|
||||
public class LinphoneActivity extends TabActivity implements ContactPicked
|
||||
, LinphoneOnCallStateChangedListener
|
||||
{
|
||||
public static final String DIALER_TAB = "dialer";
|
||||
public static final String PREF_FIRST_LAUNCH = "pref_first_launch";
|
||||
private static final int video_activity = 100;
|
||||
static final int FIRST_LOGIN_ACTIVITY = 101;
|
||||
static final int INCOMING_CALL_ACTIVITY = 103;
|
||||
private static final int FIRST_LOGIN_ACTIVITY = 101;
|
||||
private static final int INCOMING_CALL_ACTIVITY = 103;
|
||||
private static final int incall_activity = 104;
|
||||
private static final int conferenceDetailsActivity = 105;
|
||||
private static final String PREF_CHECK_CONFIG = "pref_check_config";
|
||||
|
||||
private static LinphoneActivity instance;
|
||||
|
||||
private SensorManager mSensorManager;
|
||||
private Sensor mAccelerometer;
|
||||
private int previousRotation = -1;
|
||||
|
||||
private OrientationEventListener mOrientationHelper;
|
||||
private Handler mHandler = new Handler();
|
||||
|
||||
// Customization
|
||||
|
@ -111,7 +101,6 @@ public class LinphoneActivity extends TabActivity implements
|
|||
useMenuAbout = getResources().getBoolean(R.bool.useMenuAbout);
|
||||
checkAccount = !useFirstLoginActivity;
|
||||
|
||||
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
|
||||
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
|
||||
if (!useFirstLoginActivity || pref.getBoolean(getString(R.string.first_launch_suceeded_once_key), false)) {
|
||||
|
@ -214,26 +203,6 @@ public class LinphoneActivity extends TabActivity implements
|
|||
}
|
||||
}
|
||||
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
|
||||
}
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
if (event==null || event.sensor == mAccelerometer) {
|
||||
int rot;
|
||||
|
||||
rot = AndroidVideoWindowImpl.rotationToAngle(getWindowManager().getDefaultDisplay().getOrientation());
|
||||
|
||||
if (rot != previousRotation) {
|
||||
Log.d("New device rotation: ", rot);
|
||||
// Returning rotation FROM ITS NATURAL ORIENTATION
|
||||
LinphoneCore lc=LinphoneManager.getLcIfManagerNotDestroyedOrNull();
|
||||
if (lc!=null) lc.setDeviceRotation(rot);
|
||||
//else ignore, we are probably exiting.
|
||||
previousRotation = rot;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
@ -296,24 +265,6 @@ public class LinphoneActivity extends TabActivity implements
|
|||
}
|
||||
|
||||
|
||||
public synchronized void stopOrientationSensor() {
|
||||
if (mSensorManager!=null)
|
||||
mSensorManager.unregisterListener(this, mAccelerometer);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public synchronized void startOrientationSensor() {
|
||||
if (mSensorManager!=null) {
|
||||
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
|
||||
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
|
||||
/* init LC orientation value on orientation sensor startup */
|
||||
previousRotation = -1;
|
||||
onSensorChanged(null);
|
||||
}
|
||||
|
||||
void showPreferenceErrorDialog(String message) {
|
||||
if (!useMenuSettings) {
|
||||
Toast.makeText(this, message, Toast.LENGTH_LONG);
|
||||
|
@ -437,6 +388,7 @@ public class LinphoneActivity extends TabActivity implements
|
|||
mHandler.postDelayed(new Runnable() {
|
||||
public void run() {
|
||||
if (VideoCallActivity.launched) return;
|
||||
startOrientationSensor();
|
||||
LinphoneManager.getInstance().enableCamera(call, true);
|
||||
startActivityForResult(new Intent().setClass(
|
||||
LinphoneActivity.this,
|
||||
|
@ -462,6 +414,42 @@ public class LinphoneActivity extends TabActivity implements
|
|||
startActivityForResult(intent, INCOMING_CALL_ACTIVITY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a sensor to track phoneOrientation changes
|
||||
*/
|
||||
private synchronized void startOrientationSensor() {
|
||||
if (mOrientationHelper == null) {
|
||||
mOrientationHelper = new LocalOrientationEventListener(this);
|
||||
}
|
||||
mOrientationHelper.enable();
|
||||
}
|
||||
|
||||
private int mAlwaysChangingPhoneAngle = -1;
|
||||
private class LocalOrientationEventListener extends OrientationEventListener {
|
||||
public LocalOrientationEventListener(Context context) {
|
||||
super(context);
|
||||
}
|
||||
@Override
|
||||
public void onOrientationChanged(final int o) {
|
||||
if (o == OrientationEventListener.ORIENTATION_UNKNOWN) return;
|
||||
|
||||
int degrees=270;
|
||||
if (o < 45 || o >315) degrees=0;
|
||||
else if (o<135) degrees=90;
|
||||
else if (o<225) degrees=180;
|
||||
|
||||
if (mAlwaysChangingPhoneAngle == degrees) return;
|
||||
mAlwaysChangingPhoneAngle = degrees;
|
||||
|
||||
Log.d("Phone orientation changed to ", degrees);
|
||||
int rotation = (360 - degrees) % 360;
|
||||
LinphoneManager.getLc().setDeviceRotation(rotation);
|
||||
LinphoneCall currentCall = LinphoneManager.getLc().getCurrentCall();
|
||||
if (currentCall != null && currentCall.cameraEnabled() && currentCall.getCurrentParamsCopy().getVideoEnabled()) {
|
||||
LinphoneManager.getLc().updateCall(currentCall, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCallStateChanged(LinphoneCall call, State state,
|
||||
|
@ -473,17 +461,14 @@ public class LinphoneActivity extends TabActivity implements
|
|||
}
|
||||
|
||||
if (state==State.IncomingReceived) {
|
||||
if (call.getCurrentParamsCopy().getVideoEnabled()) startOrientationSensor();
|
||||
startIncomingCallActivity();
|
||||
}
|
||||
if (state == State.OutgoingInit) {
|
||||
if (call.getCurrentParamsCopy().getVideoEnabled()) startOrientationSensor();
|
||||
startIncallActivity();
|
||||
}
|
||||
if (state==State.OutgoingInit || state==State.IncomingReceived) {
|
||||
startOrientationSensor();
|
||||
} else if (state==State.Error || state==State.CallEnd){
|
||||
stopOrientationSensor();
|
||||
finishActivity(INCOMING_CALL_ACTIVITY);
|
||||
}
|
||||
|
||||
if (state == LinphoneCall.State.StreamsRunning && Version.isVideoCapable() && !call.isInConference()) {
|
||||
// call.cameraEnabled() contains the wish of the user
|
||||
// set in LinphoneManager#onCallStateChanged(OutgoingInit||IncomingReceived)
|
||||
|
@ -505,8 +490,11 @@ public class LinphoneActivity extends TabActivity implements
|
|||
showToast(R.string.call_error, message);
|
||||
}
|
||||
if (state==State.Error || state==State.CallEnd) {
|
||||
finishActivity(INCOMING_CALL_ACTIVITY);
|
||||
if (lc.getCallsNb() == 0){
|
||||
exitIncallActivity();
|
||||
// Might be possible to optimize by disabling it before
|
||||
if (mOrientationHelper != null) mOrientationHelper.disable();
|
||||
}
|
||||
if (ConferenceDetailsActivity.active && lc.getConferenceSize() == 0) {
|
||||
finishActivity(conferenceDetailsActivity);
|
||||
|
@ -530,12 +518,6 @@ public class LinphoneActivity extends TabActivity implements
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
|
|
@ -62,7 +62,7 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
|
|||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (!LinphoneManager.isInstanciated() || LinphoneManager.getLc().getCallsNb() == 0) {
|
||||
Log.e("No service running: avoid crash by finishing ", this.getClass().getName());
|
||||
Log.e("No service running: avoid crash by finishing ", getClass().getName());
|
||||
// super.onCreate called earlier
|
||||
finish();
|
||||
return;
|
||||
|
@ -78,9 +78,7 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
|
|||
captureView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
|
||||
|
||||
/* force surfaces Z ordering */
|
||||
if (org.linphone.mediastream.Version.sdkAboveOrEqual(5)) {
|
||||
fixZOrder(videoView, captureView);
|
||||
}
|
||||
|
||||
androidVideoWindowImpl = new AndroidVideoWindowImpl(videoView, captureView);
|
||||
androidVideoWindowImpl.setListener(new AndroidVideoWindowImpl.VideoWindowListener() {
|
||||
|
@ -107,13 +105,6 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
|
|||
|
||||
androidVideoWindowImpl.init();
|
||||
|
||||
// When changing phone orientation _DURING_ a call, VideoCallActivity is destroyed then recreated
|
||||
// In this case, the following sequence happen:
|
||||
// * onDestroy -> sendStaticImage(true) => destroy video graph
|
||||
// * onCreate -> sendStaticImage(false) => recreate the video graph.
|
||||
// Before creating the graph, the orientation must be known to LC => this is done here
|
||||
LinphoneManager.getLc().setDeviceRotation(AndroidVideoWindowImpl.rotationToAngle(getWindowManager().getDefaultDisplay().getOrientation()));
|
||||
|
||||
videoCall = LinphoneManager.getLc().getCurrentCall();
|
||||
if (videoCall != null) {
|
||||
updatePreview(videoCall.cameraEnabled());
|
||||
|
@ -287,7 +278,7 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
|
|||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
Log.d("onPause VideoCallActivity (isFinishing:", isFinishing(), ", inCall:", LinphoneManager.getLc().isIncall(), ", changingConf:", getChangingConfigurations());
|
||||
Log.d("onPause VideoCallActivity (isFinishing:", isFinishing(), ", inCall:", LinphoneManager.getLc().isIncall(),")");
|
||||
LinphoneManager.removeListener(this);
|
||||
if (isFinishing()) {
|
||||
videoCall = null; // release reference
|
||||
|
@ -302,11 +293,6 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
|
|||
|
||||
LinphoneManager.getLc().setPreviewWindow(null);
|
||||
|
||||
final LinphoneCall currentCall = LinphoneManager.getLc().getCurrentCall();
|
||||
if (currentCall != null && getChangingConfigurations() != 0) {
|
||||
LinphoneManager.getLc().setDeviceRotation(AndroidVideoWindowImpl.rotationToAngle(getWindowManager().getDefaultDisplay().getOrientation()));
|
||||
LinphoneManager.getLc().updateCall(currentCall, null);
|
||||
}
|
||||
if (mCallQualityUpdater!=null){
|
||||
refreshHandler.removeCallbacks(mCallQualityUpdater);
|
||||
mCallQualityUpdater=null;
|
||||
|
|
Loading…
Reference in a new issue