diff --git a/res/drawable-hdpi/conference_default.png b/res/drawable-hdpi/conference_default.png new file mode 100644 index 000000000..ca03a9940 Binary files /dev/null and b/res/drawable-hdpi/conference_default.png differ diff --git a/res/drawable-hdpi/conference_over.png b/res/drawable-hdpi/conference_over.png new file mode 100644 index 000000000..6446f9dea Binary files /dev/null and b/res/drawable-hdpi/conference_over.png differ diff --git a/res/drawable-xlarge-land-hdpi/chat_default.png b/res/drawable-xlarge-land-hdpi/chat_default.png index fb29a8a91..475f1dd86 100644 Binary files a/res/drawable-xlarge-land-hdpi/chat_default.png and b/res/drawable-xlarge-land-hdpi/chat_default.png differ diff --git a/res/drawable-xlarge-land-hdpi/chat_over.png b/res/drawable-xlarge-land-hdpi/chat_over.png index 9d7207b67..37cb1c9c8 100644 Binary files a/res/drawable-xlarge-land-hdpi/chat_over.png and b/res/drawable-xlarge-land-hdpi/chat_over.png differ diff --git a/res/drawable-xlarge-land-hdpi/chat_selected.png b/res/drawable-xlarge-land-hdpi/chat_selected.png index ab0ba9f7b..9a589d142 100644 Binary files a/res/drawable-xlarge-land-hdpi/chat_selected.png and b/res/drawable-xlarge-land-hdpi/chat_selected.png differ diff --git a/res/drawable-xlarge-land-hdpi/contacts_default.png b/res/drawable-xlarge-land-hdpi/contacts_default.png index 7365a633f..4ce5291c5 100644 Binary files a/res/drawable-xlarge-land-hdpi/contacts_default.png and b/res/drawable-xlarge-land-hdpi/contacts_default.png differ diff --git a/res/drawable-xlarge-land-hdpi/contacts_over.png b/res/drawable-xlarge-land-hdpi/contacts_over.png index c5d34039c..eb6f805fa 100644 Binary files a/res/drawable-xlarge-land-hdpi/contacts_over.png and b/res/drawable-xlarge-land-hdpi/contacts_over.png differ diff --git a/res/drawable-xlarge-land-hdpi/contacts_selected.png b/res/drawable-xlarge-land-hdpi/contacts_selected.png index 9f4ecd54c..cf49531e0 100644 Binary files a/res/drawable-xlarge-land-hdpi/contacts_selected.png and b/res/drawable-xlarge-land-hdpi/contacts_selected.png differ diff --git a/res/drawable-xlarge-land-hdpi/dialer_default.png b/res/drawable-xlarge-land-hdpi/dialer_default.png index 95908970f..643d65dd0 100644 Binary files a/res/drawable-xlarge-land-hdpi/dialer_default.png and b/res/drawable-xlarge-land-hdpi/dialer_default.png differ diff --git a/res/drawable-xlarge-land-hdpi/dialer_over.png b/res/drawable-xlarge-land-hdpi/dialer_over.png index 08bdc4c82..bd369513e 100644 Binary files a/res/drawable-xlarge-land-hdpi/dialer_over.png and b/res/drawable-xlarge-land-hdpi/dialer_over.png differ diff --git a/res/drawable-xlarge-land-hdpi/dialer_selected.png b/res/drawable-xlarge-land-hdpi/dialer_selected.png index 76a53f4a8..7bc91e28b 100644 Binary files a/res/drawable-xlarge-land-hdpi/dialer_selected.png and b/res/drawable-xlarge-land-hdpi/dialer_selected.png differ diff --git a/res/drawable-xlarge-land-hdpi/history_default.png b/res/drawable-xlarge-land-hdpi/history_default.png index 346c404d5..0d0af3db1 100644 Binary files a/res/drawable-xlarge-land-hdpi/history_default.png and b/res/drawable-xlarge-land-hdpi/history_default.png differ diff --git a/res/drawable-xlarge-land-hdpi/history_over.png b/res/drawable-xlarge-land-hdpi/history_over.png index 737ee9d9e..e34562050 100644 Binary files a/res/drawable-xlarge-land-hdpi/history_over.png and b/res/drawable-xlarge-land-hdpi/history_over.png differ diff --git a/res/drawable-xlarge-land-hdpi/history_selected.png b/res/drawable-xlarge-land-hdpi/history_selected.png index 7dfdf7e75..9c2d82238 100644 Binary files a/res/drawable-xlarge-land-hdpi/history_selected.png and b/res/drawable-xlarge-land-hdpi/history_selected.png differ diff --git a/res/drawable-xlarge-land-hdpi/mark.png b/res/drawable-xlarge-land-hdpi/mark.png index 032e5fb0a..ecd22c300 100644 Binary files a/res/drawable-xlarge-land-hdpi/mark.png and b/res/drawable-xlarge-land-hdpi/mark.png differ diff --git a/res/drawable-xlarge-land-hdpi/settings_default.png b/res/drawable-xlarge-land-hdpi/settings_default.png index be6c5f59b..009be5e48 100644 Binary files a/res/drawable-xlarge-land-hdpi/settings_default.png and b/res/drawable-xlarge-land-hdpi/settings_default.png differ diff --git a/res/drawable-xlarge-land-hdpi/settings_over.png b/res/drawable-xlarge-land-hdpi/settings_over.png index 2ce1df179..7822e5565 100644 Binary files a/res/drawable-xlarge-land-hdpi/settings_over.png and b/res/drawable-xlarge-land-hdpi/settings_over.png differ diff --git a/res/drawable-xlarge-land-hdpi/settings_selected.png b/res/drawable-xlarge-land-hdpi/settings_selected.png index ec467b107..af02b6683 100644 Binary files a/res/drawable-xlarge-land-hdpi/settings_selected.png and b/res/drawable-xlarge-land-hdpi/settings_selected.png differ diff --git a/res/drawable/conference.xml b/res/drawable/conference.xml new file mode 100644 index 000000000..6fff0737a --- /dev/null +++ b/res/drawable/conference.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/res/layout-land/incall.xml b/res/layout-land/incall.xml index de29df1d7..9075fcbfe 100644 --- a/res/layout-land/incall.xml +++ b/res/layout-land/incall.xml @@ -172,6 +172,16 @@ android:contentDescription="@string/content_description_pause" android:scaleType="fitXY" android:src="@drawable/pause_off" /> + + @@ -27,8 +27,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.2" - android:adjustViewBounds="true" - android:scaleType="fitXY" + android:scaleType="fitEnd" android:src="@drawable/mark" android:visibility="invisible" /> @@ -37,18 +36,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.24" - android:adjustViewBounds="true" android:scaleType="fitEnd" - android:src="@drawable/dialer" - android:visibility="invisible" /> - - @@ -57,8 +45,16 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.2" - android:adjustViewBounds="true" - android:scaleType="fitXY" + android:scaleType="fitEnd" + android:src="@drawable/mark" + android:visibility="invisible" /> + + @@ -75,7 +71,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" - android:paddingTop="20dp"> + android:paddingTop="40dp"> + + android:paddingBottom="10dp" /> \ No newline at end of file diff --git a/res/layout/incall.xml b/res/layout/incall.xml index 5e5e9bdb1..9306c5a33 100644 --- a/res/layout/incall.xml +++ b/res/layout/incall.xml @@ -179,6 +179,16 @@ android:contentDescription="@string/content_description_pause" android:scaleType="fitXY" android:src="@drawable/pause_off" /> + + + Account Setup Assistant diff --git a/src/org/linphone/AudioCallFragment.java b/src/org/linphone/AudioCallFragment.java index 614b66690..7bb40d5b5 100644 --- a/src/org/linphone/AudioCallFragment.java +++ b/src/org/linphone/AudioCallFragment.java @@ -21,6 +21,7 @@ import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCoreFactory; +import org.linphone.core.Log; import org.linphone.ui.AvatarWithShadow; import android.app.Activity; @@ -31,6 +32,7 @@ import android.os.SystemClock; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Chronometer; import android.widget.ImageView; @@ -41,16 +43,20 @@ import android.widget.TextView; /** * @author Sylvain Berfini */ -public class AudioCallFragment extends Fragment { +public class AudioCallFragment extends Fragment implements OnClickListener { private static final int rowHeight = 75; // Value set in active_call.xml -// private static final int rowImageHeight = 100; // Value set in active_call.xml + private static final int rowImageHeight = 75; // Value set in avatar.xml + private static final int botMarginIfImage = 25; private static final int rowThickRatio = 85; // Ratio dependent from the image private static final int topMargin = (int) ((rowHeight * rowThickRatio) / 100); -// private static final int topMarginWithImage = topMargin + rowImageHeight; + private static final int topMarginWithImage = topMargin + rowImageHeight + botMarginIfImage; private RelativeLayout callsList; private LayoutInflater inflater; private ViewGroup container; + private boolean previousCallIsActive = false; + + private InCallActivity incallActvityInstance; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -75,6 +81,7 @@ public class AudioCallFragment extends Fragment { displayOrHideContactPicture(callView, pictureUri, hide); setRowBackgroundAndPadding(callView, resources, index); registerCallDurationTimer(callView, call); + previousCallIsActive = !hide; } private void setContactName(LinearLayout callView, LinphoneAddress lAddress, String sipUri, Resources resources) { @@ -93,6 +100,9 @@ public class AudioCallFragment extends Fragment { private boolean displayCallStatusIconAndReturnCallPaused(LinearLayout callView, LinphoneCall call) { boolean isCallPaused; ImageView callState = (ImageView) callView.findViewById(R.id.callStatus); + callState.setTag(call); + callState.setOnClickListener(this); + if (call.getState() == State.Paused || call.getState() == State.PausedByRemote || call.getState() == State.Pausing) { callState.setImageResource(R.drawable.pause_default); isCallPaused = true; @@ -103,6 +113,7 @@ public class AudioCallFragment extends Fragment { callState.setImageResource(R.drawable.play_default); isCallPaused = false; } + return isCallPaused; } @@ -121,7 +132,11 @@ public class AudioCallFragment extends Fragment { callView.findViewById(R.id.row).setBackgroundResource(R.drawable.sel_call_first); } else { callView.findViewById(R.id.row).setBackgroundResource(R.drawable.sel_call); - callView.setPadding(0, LinphoneUtils.pixelsToDpi(resources, topMargin * index), 0, 0); + if (previousCallIsActive) { + callView.setPadding(0, LinphoneUtils.pixelsToDpi(resources, topMarginWithImage * index), 0, 0); + } else { + callView.setPadding(0, LinphoneUtils.pixelsToDpi(resources, topMargin * index), 0, 0); + } } } @@ -140,12 +155,27 @@ public class AudioCallFragment extends Fragment { timer.start(); } + @Override + public void onClick(View v) { + int id = v.getId(); + switch (id) { + case R.id.callStatus: + LinphoneCall call = (LinphoneCall) v.getTag(); + if (incallActvityInstance != null) { + Log.e("InCallActivity instanciated"); + incallActvityInstance.pauseOrResumeCall(call); + } + break; + } + } + @Override public void onAttach(Activity activity) { super.onAttach(activity); + incallActvityInstance = (InCallActivity) activity; - if (InCallActivity.isInstanciated()) { - InCallActivity.instance().bindAudioFragment(this); + if (incallActvityInstance != null) { + incallActvityInstance.bindAudioFragment(this); } } diff --git a/src/org/linphone/InCallActivity.java b/src/org/linphone/InCallActivity.java index c8c79396f..18b560af8 100644 --- a/src/org/linphone/InCallActivity.java +++ b/src/org/linphone/InCallActivity.java @@ -26,6 +26,7 @@ import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCallParams; import org.linphone.core.LinphoneCore; +import org.linphone.core.Log; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; import org.linphone.ui.Numpad; @@ -63,7 +64,7 @@ public class InCallActivity extends FragmentActivity implements private Handler mHandler = new Handler(); private Handler mControlsHandler = new Handler(); private Runnable mControls; - private ImageView video, micro, speaker, addCall, pause, hangUp, dialer, switchCamera, options, transfer; + private ImageView video, micro, speaker, addCall, pause, hangUp, dialer, switchCamera, options, transfer, conference; private StatusFragment status; private AudioCallFragment audioCallFragment; private VideoCallFragment videoCallFragment; @@ -153,6 +154,8 @@ public class InCallActivity extends FragmentActivity implements pause.setEnabled(false); hangUp = (ImageView) findViewById(R.id.hangUp); hangUp.setOnClickListener(this); + conference = (ImageView) findViewById(R.id.conference); + conference.setOnClickListener(this); dialer = (ImageView) findViewById(R.id.dialer); dialer.setOnClickListener(this); dialer.setEnabled(false); @@ -177,19 +180,10 @@ public class InCallActivity extends FragmentActivity implements } } - private void enableAndRefreshInCallActions() { + private void refreshInCallActions() { mHandler.post(new Runnable() { @Override public void run() { - options.setEnabled(true); - video.setEnabled(true); - micro.setEnabled(true); - speaker.setEnabled(true); - addCall.setEnabled(true); - transfer.setEnabled(true); - pause.setEnabled(true); - dialer.setEnabled(true); - if (!isVideoActivatedInSettings()) { video.setEnabled(false); } else { @@ -211,6 +205,40 @@ public class InCallActivity extends FragmentActivity implements } else { micro.setImageResource(R.drawable.micro_on); } + + if (LinphoneManager.getLc().getCallsNb() > 1) { + conference.setVisibility(View.VISIBLE); + pause.setVisibility(View.GONE); + } else { + conference.setVisibility(View.GONE); + pause.setVisibility(View.VISIBLE); + + List pausedCalls = LinphoneUtils.getCallsInState(LinphoneManager.getLc(), Arrays.asList(State.Paused)); + if (pausedCalls.size() == 1) { + pause.setImageResource(R.drawable.pause_on); + } else { + pause.setImageResource(R.drawable.pause_off); + } + } + } + }); + } + + private void enableAndRefreshInCallActions() { + mHandler.post(new Runnable() { + @Override + public void run() { + options.setEnabled(true); + video.setEnabled(true); + micro.setEnabled(true); + speaker.setEnabled(true); + addCall.setEnabled(true); + transfer.setEnabled(true); + pause.setEnabled(true); + dialer.setEnabled(true); + conference.setEnabled(true); + + refreshInCallActions(); } }); } @@ -247,7 +275,7 @@ public class InCallActivity extends FragmentActivity implements goBackToDialer(); } else if (id == R.id.pause) { - pause(); + pauseOrResumeCall(); } else if (id == R.id.hangUp) { hangUp(); @@ -255,6 +283,9 @@ public class InCallActivity extends FragmentActivity implements else if (id == R.id.dialer) { hideOrDisplayNumpad(); } + else if (id == R.id.conference) { + enterConference(); + } else if (id == R.id.switchCamera) { if (videoCallFragment != null) { videoCallFragment.switchCamera(); @@ -351,18 +382,29 @@ public class InCallActivity extends FragmentActivity implements LinphoneManager.getLc().enableSpeaker(isSpeakerEnabled); } - private void pause() { + private void pauseOrResumeCall() { LinphoneCore lc = LinphoneManager.getLc(); LinphoneCall call = lc.getCurrentCall(); + pauseOrResumeCall(call); + } + + public void pauseOrResumeCall(LinphoneCall call) { + Log.e("Call = " + call); + LinphoneCore lc = LinphoneManager.getLc(); if (call != null && LinphoneUtils.isCallRunning(call)) { + Log.e("Pausing call " + call); lc.pauseCall(call); pause.setImageResource(R.drawable.pause_on); } else { List pausedCalls = LinphoneUtils.getCallsInState(lc, Arrays.asList(State.Paused)); if (pausedCalls.size() == 1) { LinphoneCall callToResume = pausedCalls.get(0); - lc.resumeCall(callToResume); - pause.setImageResource(R.drawable.pause_off); + Log.e("CallToResume " + callToResume); + if ((call != null && callToResume.equals(call)) || call == null) { + Log.e("Resuming call " + callToResume); + lc.resumeCall(callToResume); + pause.setImageResource(R.drawable.pause_off); + } } } } @@ -380,6 +422,10 @@ public class InCallActivity extends FragmentActivity implements } } + private void enterConference() { + //TODO + } + public void displayVideoCallControlsIfHidden() { if (mControlsLayout != null) { if (mControlsLayout.getVisibility() != View.VISIBLE) { @@ -661,6 +707,7 @@ public class InCallActivity extends FragmentActivity implements }); } } + refreshInCallActions(); if (audioCallFragment != null) { mHandler.post(new Runnable() { @@ -688,6 +735,7 @@ public class InCallActivity extends FragmentActivity implements @Override protected void onResume() { + instance = this; LinphoneManager.addListener(this); LinphoneManager.startProximitySensorForActivity(this); diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 63b971ea1..59d849a88 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -795,7 +795,11 @@ public final class LinphoneManager implements LinphoneCoreListener { mTimer.cancel(); mLc.destroy(); mServiceContext.unregisterReceiver(instance.mKeepAliveReceiver); - } finally { + } + catch (RuntimeException e) { + e.printStackTrace(); + } + finally { mLc = null; instance = null; }