From 3aae0ef4c3370318f9194f1b4caaa6a45bb9ef08 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Mon, 26 Oct 2015 19:48:37 +0100 Subject: [PATCH] Rework incall view --- res/layout/call.xml | 830 +++++++++++---------- res/layout/call_inactive_row.xml | 29 +- res/layout/call_incoming.xml | 71 +- res/layout/call_outgoing.xml | 2 +- res/values/strings.xml | 45 +- src/org/linphone/CallActivity.java | 320 +++++--- src/org/linphone/CallIncomingActivity.java | 131 +++- src/org/linphone/LinphoneService.java | 10 +- src/org/linphone/StatusFragment.java | 75 +- 9 files changed, 908 insertions(+), 605 deletions(-) diff --git a/res/layout/call.xml b/res/layout/call.xml index f9e332a7c..dce208b02 100644 --- a/res/layout/call.xml +++ b/res/layout/call.xml @@ -14,419 +14,447 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:background="@color/colorH" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="left"> - - - + diff --git a/res/layout/call_inactive_row.xml b/res/layout/call_inactive_row.xml index 8a0eeac3b..46aaff9af 100644 --- a/res/layout/call_inactive_row.xml +++ b/res/layout/call_inactive_row.xml @@ -1,22 +1,22 @@ + android:padding="5dp"> + android:layout_height="40dp"/> + android:contentDescription="@string/content_description_pause" + android:layout_width="40dp" + android:layout_height="40dp" + android:gravity="center_vertical"/> \ No newline at end of file diff --git a/res/layout/call_incoming.xml b/res/layout/call_incoming.xml index e4d3c3273..50998f542 100644 --- a/res/layout/call_incoming.xml +++ b/res/layout/call_incoming.xml @@ -34,9 +34,9 @@ android:id="@+id/contact_detail" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_above="@id/menu" android:layout_below="@id/top_bar" - android:paddingTop="10dp"> + android:paddingTop="10dp" + android:layout_above="@+id/menu"> + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/call_outgoing.xml b/res/layout/call_outgoing.xml index 4e3ba3eb5..0716bc839 100644 --- a/res/layout/call_outgoing.xml +++ b/res/layout/call_outgoing.xml @@ -74,7 +74,7 @@ android:adjustViewBounds="true"/> Username Display name Password - Confirm password + Password confirmation Domain Provisioning url Email @@ -17,6 +17,8 @@ Cancel Accept About + Deny + No account configured free SIP VOIP client @@ -44,26 +46,47 @@ Enter a number or an address + No call in your history + No missed call in your history + Do you want to delete selected log? + No contact in your address book. + No SIP contact in your address book. + Do you want to delete selected contact? + Do you want to delete selected this contact? + + + No conversations + Do you want to delete selected conversation? + Do you want to delete selected message? - Settings Assistant + Settings About - Quit incoming call outgoing call - Call update requested\nYour correspondent would like to add video to the current call. + Your correspondent would like to turn on the video + No active call + Your correspondent paused the call + ZRTP token is %s\nYou should only accept if you have the same token as your correspondent + Toggle micro + Toggle speaker + Decline + Hang up + Accept + + Edit button Valid button Valid button @@ -90,11 +113,9 @@ All calls Missed calls Switch video - Toggle speaker - Toggle micro + Add call Pause - Hang up Numpad Settings button Dialer @@ -339,11 +360,6 @@ Conference Draft Enter a SIP address to chat with… - No call in your history. - No missed call in your history. - No contact in your address book. - No SIP contact in your address book. - No chat history. Audio Video Codec: @@ -412,8 +428,6 @@ Sharing server Remote provisioning - Delete - This contact will be deleted. SIP address Phone number First name @@ -460,9 +474,6 @@ The configuration you downloaded doesn\'t include your account. Please fill it in. Your username will be %s.\r\n\r\nIt may differ from what you entered to match some requirements.\r\nDo you accept ? - Accept - Deny - You should only accept if you have the same code (see above) as your correspondent Remote is writing... %i unread messages Failed to download or apply remote provisioning profile... diff --git a/src/org/linphone/CallActivity.java b/src/org/linphone/CallActivity.java index afc3619b0..4aadd313f 100644 --- a/src/org/linphone/CallActivity.java +++ b/src/org/linphone/CallActivity.java @@ -73,7 +73,7 @@ import android.widget.Toast; * @author Sylvain Berfini */ public class CallActivity extends Activity implements OnClickListener { - private final static int SECONDS_BEFORE_HIDING_CONTROLS = 10000; + private final static int SECONDS_BEFORE_HIDING_CONTROLS = 5000; private final static int SECONDS_BEFORE_DENYING_CALL_UPDATE = 30000; private static CallActivity instance; @@ -84,7 +84,7 @@ public class CallActivity extends Activity implements OnClickListener { private RelativeLayout mActiveCallHeader, sideMenuContent, avatar_layout; private ImageView pause, hangUp, dialer, video, micro, speaker, options, addCall, transfer, conference, conferenceStatus, contactPicture; private ImageView audioRoute, routeSpeaker, routeEarpiece, routeBluetooth, menu; - private LinearLayout routeLayout, mNoCurrentCall, callInfo; + private LinearLayout mNoCurrentCall, callInfo, mCallPaused; private ProgressBar videoProgress; private StatusFragment status; private CallAudioFragment audioCallFragment; @@ -143,8 +143,9 @@ public class CallActivity extends Activity implements OnClickListener { } if (state == State.Paused || state == State.PausedByRemote || state == State.Pausing) { - if(LinphoneManager.getLc().getCurrentCall() != null) + if(LinphoneManager.getLc().getCurrentCall() != null) { enabledVideoButton(false); + } if(isVideoEnabled(call)){ showAudioView(); } @@ -157,7 +158,16 @@ public class CallActivity extends Activity implements OnClickListener { showVideoView(); } } - enabledVideoButton(true); + if(LinphoneManager.getLc().getCurrentCall() != null) { + enabledVideoButton(true); + } + } + + if (state == State.Connected) { + if(call.getCurrentParamsCopy().getMediaEncryption().equals(LinphoneCore.MediaEncryption.ZRTP) && !call.isAuthenticationTokenVerified()){ + //TODO AFFICHER DIALOG ZRTP + status.showZRTPDialog(call); + } } if (state == State.StreamsRunning) { @@ -165,13 +175,14 @@ public class CallActivity extends Activity implements OnClickListener { //Check media in progress if(LinphonePreferences.instance().isVideoEnabled() && !call.mediaInProgress()){ enabledVideoButton(true); + enabledPauseButton(true); } - LinphoneManager.getLc().enableSpeaker(isSpeakerEnabled); - - isMicMuted = LinphoneManager.getLc().isMicMuted(); enableAndRefreshInCallActions(); + LinphoneManager.getLc().enableSpeaker(isSpeakerEnabled); + isMicMuted = LinphoneManager.getLc().isMicMuted(); + if (status != null) { videoProgress.setVisibility(View.GONE); status.refreshStatusItems(call, isVideoEnabled(call)); @@ -239,7 +250,7 @@ public class CallActivity extends Activity implements OnClickListener { isSpeakerEnabled = savedInstanceState.getBoolean("Speaker"); isMicMuted = savedInstanceState.getBoolean("Mic"); isVideoCallPaused = savedInstanceState.getBoolean("VideoCallPaused"); - //refreshInCallActions(); + refreshInCallActions(); return; } @@ -247,15 +258,11 @@ public class CallActivity extends Activity implements OnClickListener { if (isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { callFragment = new CallVideoFragment(); videoCallFragment = (CallVideoFragment) callFragment; + displayVideoCall(false); isSpeakerEnabled = true; - - if (cameraNumber > 1) { - switchCamera.setVisibility(View.VISIBLE); - } } else { callFragment = new CallAudioFragment(); audioCallFragment = (CallAudioFragment) callFragment; - switchCamera.setVisibility(View.INVISIBLE); } if(BluetoothManager.getInstance().isBluetoothHeadsetAvailable()){ @@ -291,15 +298,15 @@ public class CallActivity extends Activity implements OnClickListener { private void initUI() { inflater = LayoutInflater.from(this); container = (ViewGroup) findViewById(R.id.topLayout); - callsList = (LinearLayout) findViewById(R.id.calls); - conferenceList = (LinearLayout) findViewById(R.id.conferenceCalls); + callsList = (LinearLayout) findViewById(R.id.calls_list); + conferenceList = (LinearLayout) findViewById(R.id.conference_list); //TopBar video = (ImageView) findViewById(R.id.video); video.setOnClickListener(this); enabledVideoButton(false); - videoProgress = (ProgressBar) findViewById(R.id.videoInProgress); + videoProgress = (ProgressBar) findViewById(R.id.video_in_progress); videoProgress.setVisibility(View.GONE); micro = (ImageView) findViewById(R.id.micro); @@ -313,7 +320,7 @@ public class CallActivity extends Activity implements OnClickListener { options.setEnabled(false); //BottonBar - hangUp = (ImageView) findViewById(R.id.hangUp); + hangUp = (ImageView) findViewById(R.id.hang_up); hangUp.setOnClickListener(this); dialer = (ImageView) findViewById(R.id.dialer); @@ -325,14 +332,15 @@ public class CallActivity extends Activity implements OnClickListener { //Others //Active Call - callInfo = (LinearLayout) findViewById(R.id.call_header_description); + callInfo = (LinearLayout) findViewById(R.id.active_call_info); pause = (ImageView) findViewById(R.id.pause); pause.setOnClickListener(this); - pause.setEnabled(false); + enabledPauseButton(false); - mActiveCallHeader = (RelativeLayout) findViewById(R.id.activeCallHeader); - mNoCurrentCall = (LinearLayout) findViewById(R.id.noCurrentCall); + mActiveCallHeader = (RelativeLayout) findViewById(R.id.active_call); + mNoCurrentCall = (LinearLayout) findViewById(R.id.no_current_call); + mCallPaused = (LinearLayout) findViewById(R.id.remote_pause); contactPicture = (ImageView) findViewById(R.id.contact_picture); avatar_layout = (RelativeLayout) findViewById(R.id.avatar_layout); @@ -345,7 +353,7 @@ public class CallActivity extends Activity implements OnClickListener { //Options - addCall = (ImageView) findViewById(R.id.addCall); + addCall = (ImageView) findViewById(R.id.add_call); addCall.setOnClickListener(this); addCall.setEnabled(false); @@ -358,14 +366,13 @@ public class CallActivity extends Activity implements OnClickListener { conference.setOnClickListener(this); try { - //routeLayout = (LinearLayout) findViewById(R.id.routesLayout); - audioRoute = (ImageView) findViewById(R.id.audioRoute); + audioRoute = (ImageView) findViewById(R.id.audio_route); audioRoute.setOnClickListener(this); - routeSpeaker = (ImageView) findViewById(R.id.routeSpeaker); + routeSpeaker = (ImageView) findViewById(R.id.route_speaker); routeSpeaker.setOnClickListener(this); - routeEarpiece = (ImageView) findViewById(R.id.routeEarpiece); + routeEarpiece = (ImageView) findViewById(R.id.route_earpiece); routeEarpiece.setOnClickListener(this); - routeBluetooth = (ImageView) findViewById(R.id.routeBluetooth); + routeBluetooth = (ImageView) findViewById(R.id.route_bluetooth); routeBluetooth.setOnClickListener(this); } catch (NullPointerException npe) { Log.e("Bluetooth: Audio routes menu disabled on tablets for now (1)"); @@ -391,15 +398,11 @@ public class CallActivity extends Activity implements OnClickListener { if (BluetoothManager.getInstance().isBluetoothHeadsetAvailable()) { try { - if (routeLayout != null) - routeLayout.setVisibility(View.VISIBLE); audioRoute.setVisibility(View.VISIBLE); speaker.setVisibility(View.GONE); } catch (NullPointerException npe) { Log.e("Bluetooth: Audio routes menu disabled on tablets for now (2)"); } } else { try { - if (routeLayout != null) - routeLayout.setVisibility(View.GONE); audioRoute.setVisibility(View.GONE); speaker.setVisibility(View.VISIBLE); } catch (NullPointerException npe) { Log.e("Bluetooth: Audio routes menu disabled on tablets for now (3)"); } @@ -410,7 +413,7 @@ public class CallActivity extends Activity implements OnClickListener { } public void createInCallStats() { - sideMenu = (DrawerLayout) findViewById(R.id.call_stats); + sideMenu = (DrawerLayout) findViewById(R.id.side_menu); menu = (ImageView) findViewById(R.id.call_quality); sideMenuContent = (RelativeLayout) findViewById(R.id.side_menu_content); @@ -418,7 +421,7 @@ public class CallActivity extends Activity implements OnClickListener { menu.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - if(sideMenu.isDrawerVisible(Gravity.LEFT)){ + if (sideMenu.isDrawerVisible(Gravity.LEFT)) { sideMenu.closeDrawer(sideMenuContent); } else { sideMenu.openDrawer(sideMenuContent); @@ -431,8 +434,44 @@ public class CallActivity extends Activity implements OnClickListener { } private void refreshIncallUi(){ + List pausedCalls = LinphoneUtils.getCallsInState(LinphoneManager.getLc(), Arrays.asList(State.PausedByRemote)); + if (pausedCalls.size() == 1) { + displayCallPaused(true); + } else { + displayCallPaused(false); + } + + if(LinphoneManager.getLc().getCurrentCall() != null){ + if(isTransferAllowed) + enabledTransferButton(true); + if(!isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) + callInfo.setVisibility(View.VISIBLE); + } + + if(LinphoneManager.getLc().getCallsNb() > 1){ + callsList.setVisibility(View.VISIBLE); + enabledConferenceButton(true); + } else { + if(LinphoneManager.getLc().getCallsNb() == 1 && LinphoneManager.getLc().getCurrentCall() == null){ + callsList.setVisibility(View.VISIBLE); + if(isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { + avatar_layout.setVisibility(View.GONE); + } else { + avatar_layout.setVisibility(View.VISIBLE); + } + if(isTransferAllowed) + enabledTransferButton(false); + } else { + callsList.setVisibility(View.GONE); + } + enabledConferenceButton(false); + + } + refreshInCallActions(); refreshCallList(getResources()); + + } private void refreshInCallActions() { @@ -463,37 +502,22 @@ public class CallActivity extends Activity implements OnClickListener { try { if (isSpeakerEnabled) { - routeSpeaker.setBackgroundResource(R.drawable.route_speaker_selected); - routeEarpiece.setBackgroundResource(R.drawable.route_earpiece); - routeBluetooth.setBackgroundResource(R.drawable.route_bluetooth); + routeSpeaker.setImageResource(R.drawable.route_speaker_selected); + routeEarpiece.setImageResource(R.drawable.route_earpiece); + routeBluetooth.setImageResource(R.drawable.route_bluetooth); } - routeSpeaker.setBackgroundResource(R.drawable.route_speaker); + routeSpeaker.setImageResource(R.drawable.route_speaker); if (BluetoothManager.getInstance().isUsingBluetoothAudioRoute()) { - routeEarpiece.setBackgroundResource(R.drawable.route_earpiece); - routeBluetooth.setBackgroundResource(R.drawable.route_bluetooth_selected); + routeEarpiece.setImageResource(R.drawable.route_earpiece); + routeBluetooth.setImageResource(R.drawable.route_bluetooth_selected); } else { - routeEarpiece.setBackgroundResource(R.drawable.route_earpiece_selected); - routeBluetooth.setBackgroundResource(R.drawable.route_bluetooth); + routeEarpiece.setImageResource(R.drawable.route_earpiece_selected); + routeBluetooth.setImageResource(R.drawable.route_bluetooth); } } catch (NullPointerException npe) { Log.e("Bluetooth: Audio routes menu disabled on tablets for now (4)"); } - - - - if (LinphoneManager.getLc().getCallsNb() > 1) { - //pause.setVisibility(View.GONE); - } else { - //pause.setVisibility(View.VISIBLE); - - List pausedCalls = LinphoneUtils.getCallsInState(LinphoneManager.getLc(), Arrays.asList(State.Paused)); - if (pausedCalls.size() == 1) { - //pause.setBackgroundResource(R.drawable.pa); - } else { - //pause.setBackgroundResource(R.drawable.pause_off); - } - } } private void enableAndRefreshInCallActions() { @@ -511,8 +535,7 @@ public class CallActivity extends Activity implements OnClickListener { transfer.setEnabled(true); pause.setEnabled(true); dialer.setEnabled(true); - conference.setEnabled(true); - refreshInCallActions(); + enabledConferenceButton(true); } public void updateStatusFragment(StatusFragment statusFragment) { @@ -524,7 +547,7 @@ public class CallActivity extends Activity implements OnClickListener { int id = v.getId(); if (isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { - displayVideoCallControlsIfHidden(); + //displayVideoCallControlsIfHidden(); } if (id == R.id.video) { @@ -536,13 +559,13 @@ public class CallActivity extends Activity implements OnClickListener { else if (id == R.id.speaker) { toggleSpeaker(); } - else if (id == R.id.addCall) { + else if (id == R.id.add_call) { goBackToDialer(); } else if (id == R.id.pause) { pauseOrResumeCall(LinphoneManager.getLc().getCurrentCall()); } - else if (id == R.id.hangUp) { + else if (id == R.id.hang_up) { hangUp(); } else if (id == R.id.dialer) { @@ -563,36 +586,36 @@ public class CallActivity extends Activity implements OnClickListener { else if (id == R.id.options) { hideOrDisplayCallOptions(); } - else if (id == R.id.audioRoute) { + else if (id == R.id.audio_route) { hideOrDisplayAudioRoutes(); } - else if (id == R.id.routeBluetooth) { + else if (id == R.id.route_bluetooth) { if (BluetoothManager.getInstance().routeAudioToBluetooth()) { isSpeakerEnabled = false; - /*routeBluetooth.setBackgroundResource(R.drawable.route_bluetooth_on); - routeReceiver.setBackgroundResource(R.drawable.route_receiver_off); - routeSpeaker.setBackgroundResource(R.drawable.route_speaker_off);*/ + routeBluetooth.setImageResource(R.drawable.route_bluetooth_selected); + routeSpeaker.setImageResource(R.drawable.route_speaker); + routeEarpiece.setImageResource(R.drawable.route_earpiece); } hideOrDisplayAudioRoutes(); } - else if (id == R.id.routeEarpiece) { + else if (id == R.id.route_earpiece) { LinphoneManager.getInstance().routeAudioToReceiver(); isSpeakerEnabled = false; - /*routeBluetooth.setBackgroundResource(R.drawable.route_bluetooth_off); - routeReceiver.setBackgroundResource(R.drawable.route_receiver_on); - routeSpeaker.setBackgroundResource(R.drawable.route_speaker_off);*/ + routeBluetooth.setImageResource(R.drawable.route_bluetooth); + routeSpeaker.setImageResource(R.drawable.route_speaker); + routeEarpiece.setImageResource(R.drawable.route_earpiece_selected); hideOrDisplayAudioRoutes(); } - else if (id == R.id.routeSpeaker) { + else if (id == R.id.route_speaker) { LinphoneManager.getInstance().routeAudioToSpeaker(); isSpeakerEnabled = true; - /*routeBluetooth.setBackgroundResource(R.drawable.route_bluetooth_off); - routeReceiver.setBackgroundResource(R.drawable.route_receiver_off); - routeSpeaker.setBackgroundResource(R.drawable.route_speaker_on);*/ + routeBluetooth.setImageResource(R.drawable.route_bluetooth); + routeSpeaker.setImageResource(R.drawable.route_speaker_selected); + routeEarpiece.setImageResource(R.drawable.route_earpiece); hideOrDisplayAudioRoutes(); } - else if (id == R.id.callStatus) { + else if (id == R.id.call_pause) { LinphoneCall call = (LinphoneCall) v.getTag(); pauseOrResumeCall(call); } @@ -604,10 +627,40 @@ public class CallActivity extends Activity implements OnClickListener { private void enabledVideoButton(boolean enabled){ if(enabled) { video.setEnabled(true); - video.setImageResource(R.drawable.camera_default); + video.setAlpha(1f); } else { video.setEnabled(false); - video.setImageResource(R.drawable.camera_disabled); + video.setAlpha(0.2f); + } + } + + private void enabledPauseButton(boolean enabled){ + if(enabled) { + pause.setEnabled(true); + pause.setImageResource(R.drawable.pause_big_default); + } else { + pause.setEnabled(false); + pause.setImageResource(R.drawable.pause_big_disabled); + } + } + + private void enabledTransferButton(boolean enabled){ + if(enabled) { + transfer.setEnabled(true); + transfer.setImageAlpha(250); + } else { + transfer.setEnabled(false); + transfer.setImageAlpha(50); + } + } + + private void enabledConferenceButton(boolean enabled){ + if(enabled) { + conference.setEnabled(true); + conference.setImageAlpha(250); + } else { + conference.setEnabled(false); + conference.setImageAlpha(50); } } @@ -671,6 +724,7 @@ public class CallActivity extends Activity implements OnClickListener { LinphoneManager.startProximitySensorForActivity(CallActivity.this); replaceFragmentVideoByAudio(); displayAudioCall(); + showStatusBar(); removeCallbacks(); } @@ -684,8 +738,8 @@ public class CallActivity extends Activity implements OnClickListener { LinphoneManager.stopProximitySensorForActivity(CallActivity.this); replaceFragmentAudioByVideo(); + hideStatusBar(); displayVideoCall(false); - displayVideoCallControlsIfHidden(); } private void displayNoCurrentCall(boolean display){ @@ -698,6 +752,14 @@ public class CallActivity extends Activity implements OnClickListener { } } + private void displayCallPaused(boolean display){ + if(display){ + mCallPaused.setVisibility(View.VISIBLE); + } else { + mCallPaused.setVisibility(View.GONE); + } + } + private void displayAudioCall(){ mActiveCallHeader.setVisibility(View.VISIBLE); callInfo.setVisibility(View.VISIBLE); @@ -707,28 +769,6 @@ public class CallActivity extends Activity implements OnClickListener { switchCamera.setVisibility(View.GONE); } - private void displayVideoCall(boolean display){ - if(display) { - LinphoneActivity.instance().showStatusBar(); - mControlsLayout.setVisibility(View.VISIBLE); - mActiveCallHeader.setVisibility(View.VISIBLE); - callInfo.setVisibility(View.VISIBLE); - avatar_layout.setVisibility(View.GONE); - mNoCurrentCall.setVisibility(View.GONE); - callsList.setVisibility(View.VISIBLE); - if (cameraNumber > 1) { - switchCamera.setVisibility(View.VISIBLE); - } - } else { - LinphoneActivity.instance().hideStatusBar(); - mControlsLayout.setVisibility(View.GONE); - mActiveCallHeader.setVisibility(View.GONE); - switchCamera.setVisibility(View.GONE); - mNoCurrentCall.setVisibility(View.GONE); - callsList.setVisibility(View.GONE); - } - } - private void replaceFragmentVideoByAudio() { audioCallFragment = new CallAudioFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); @@ -775,17 +815,9 @@ public class CallActivity extends Activity implements OnClickListener { } } - private void pauseOrResumeCall() { - LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); - if (lc != null && lc.getCallsNb() >= 1) { - LinphoneCall call = lc.getCalls()[0]; - pauseOrResumeCall(call); - } - } - public void pauseOrResumeCall(LinphoneCall call) { LinphoneCore lc = LinphoneManager.getLc(); - if (call != null && LinphoneUtils.isCallRunning(call)) { + if (call != null && LinphoneManager.getLc().getCurrentCall() == call) { lc.pauseCall(call); if (isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { isVideoCallPaused = true; @@ -815,6 +847,30 @@ public class CallActivity extends Activity implements OnClickListener { } } + public void displayVideoCall(boolean display){ + if(display) { + showStatusBar(); + mControlsLayout.setVisibility(View.VISIBLE); + mActiveCallHeader.setVisibility(View.VISIBLE); + callInfo.setVisibility(View.VISIBLE); + avatar_layout.setVisibility(View.GONE); + mNoCurrentCall.setVisibility(View.GONE); + callsList.setVisibility(View.VISIBLE); + if (cameraNumber > 1) { + switchCamera.setVisibility(View.VISIBLE); + } + } else { + hideStatusBar(); + mControlsLayout.setVisibility(View.GONE); + mActiveCallHeader.setVisibility(View.GONE); + switchCamera.setVisibility(View.GONE); + mNoCurrentCall.setVisibility(View.GONE); + Log.w("Call list gone"); + callsList.setVisibility(View.GONE); + } + } + + public void displayVideoCallControlsIfHidden() { if (mControlsLayout != null) { if (mControlsLayout.getVisibility() != View.VISIBLE) { @@ -1155,8 +1211,7 @@ public class CallActivity extends Activity implements OnClickListener { transfer.setVisibility(View.VISIBLE); } addCall.setVisibility(View.VISIBLE); - if(LinphoneManager.getLc().getCalls().length > 1) - conference.setVisibility(View.VISIBLE); + conference.setVisibility(View.VISIBLE); options.setImageResource(R.drawable.options_selected); } else { if (isOrientationLandscape) { @@ -1210,6 +1265,28 @@ public class CallActivity extends Activity implements OnClickListener { startActivity(new Intent(this, CallIncomingActivity.class)); } + public void hideStatusBar() { + if (isTablet()) { + return; + } + + findViewById(R.id.status).setVisibility(View.GONE); + findViewById(R.id.fragmentContainer).setPadding(0, 0, 0, 0); + } + + public void showStatusBar() { + if (isTablet()) { + return; + } + + if (status != null && !status.isVisible()) { + // Hack to ensure statusFragment is visible after coming back to + // dialer from chat + status.getView().setVisibility(View.VISIBLE); + } + findViewById(R.id.status).setVisibility(View.VISIBLE); + //findViewById(R.id.fragmentContainer).setPadding(0, LinphoneUtils.pixelsToDpi(getResources(), 40), 0, 0); + } private void showAcceptCallUpdateDialog() { @@ -1222,7 +1299,7 @@ public class CallActivity extends Activity implements OnClickListener { dialog.getWindow().setBackgroundDrawable(d); TextView customText = (TextView) dialog.findViewById(R.id.customText); - customText.setText(getResources().getString(R.string.call_update_video)); + customText.setText(getResources().getString(R.string.add_video_dialog)); Button delete = (Button) dialog.findViewById(R.id.delete); delete.setText(R.string.accept); Button cancel = (Button) dialog.findViewById(R.id.cancel); @@ -1257,7 +1334,7 @@ public class CallActivity extends Activity implements OnClickListener { instance = this; if (isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { - displayVideoCallControlsIfHidden(); + //displayVideoCallControlsIfHidden(); } else if(LinphoneManager.getLc().isInConference()) { displayConference(); } else { @@ -1374,9 +1451,7 @@ public class CallActivity extends Activity implements OnClickListener { } private void displayActiveCall(LinphoneCall call){ - if(isVideoEnabled(call)){ - mActiveCallHeader.setVisibility(View.GONE); - } else { + if(!isVideoEnabled(call)){ mActiveCallHeader.setVisibility(View.VISIBLE); mNoCurrentCall.setVisibility(View.GONE); } @@ -1391,7 +1466,7 @@ public class CallActivity extends Activity implements OnClickListener { lAddress= LinphoneCoreFactory.instance().createLinphoneAddress("unknown","unknown","unknown"); } - TextView contact = (TextView) findViewById(R.id.contactNameOrNumber); + TextView contact = (TextView) findViewById(R.id.contact_name); Contact lContact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), lAddress); if (lContact == null) { @@ -1414,7 +1489,7 @@ public class CallActivity extends Activity implements OnClickListener { return; } - Chronometer timer = (Chronometer) findViewById(R.id.callTimer); + Chronometer timer = (Chronometer) findViewById(R.id.call_timer); if (timer == null) { throw new IllegalArgumentException("no callee_duration view found"); } @@ -1434,10 +1509,10 @@ public class CallActivity extends Activity implements OnClickListener { } // Control Row - LinearLayout callView = (LinearLayout) inflater.inflate(R.layout.active_call_control_row, container, false); + LinearLayout callView = (LinearLayout) inflater.inflate(R.layout.call_inactive_row, container, false); callView.setId(index+1); - TextView contact = (TextView) callView.findViewById(R.id.contactNameOrNumber); + TextView contact = (TextView) callView.findViewById(R.id.contact_name); Contact lContact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), lAddress); if (lContact == null) { @@ -1483,7 +1558,7 @@ public class CallActivity extends Activity implements OnClickListener { private boolean displayCallStatusIconAndReturnCallPaused(LinearLayout callView, LinphoneCall call) { boolean isCallPaused, isInConference; - ImageView callState = (ImageView) callView.findViewById(R.id.callStatus); + ImageView callState = (ImageView) callView.findViewById(R.id.call_pause); callState.setTag(call); callState.setOnClickListener(this); @@ -1523,7 +1598,7 @@ public class CallActivity extends Activity implements OnClickListener { return; } - Chronometer timer = (Chronometer) v.findViewById(R.id.callTimer); + Chronometer timer = (Chronometer) v.findViewById(R.id.call_timer); if (timer == null) { throw new IllegalArgumentException("no callee_duration view found"); } @@ -1541,6 +1616,7 @@ public class CallActivity extends Activity implements OnClickListener { conferenceList.setVisibility(View.GONE); } + //TODO DON'T SHOW CALLLIST IF THERE IS VIDEO CALL if(callsList != null) { callsList.setVisibility(View.VISIBLE); callsList.removeAllViews(); diff --git a/src/org/linphone/CallIncomingActivity.java b/src/org/linphone/CallIncomingActivity.java index 708315ca2..4637526bb 100644 --- a/src/org/linphone/CallIncomingActivity.java +++ b/src/org/linphone/CallIncomingActivity.java @@ -27,11 +27,22 @@ import org.linphone.core.LinphoneCallParams; import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.mediastream.Log; +import org.linphone.ui.LinphoneSliders; import org.linphone.ui.LinphoneSliders.LinphoneSliderTriggered; import android.app.Activity; +import android.content.ClipData; +import android.content.ClipDescription; +import android.content.Context; +import android.content.Intent; +import android.graphics.Point; +import android.os.Build; import android.os.Bundle; +import android.os.PowerManager; +import android.view.DragEvent; +import android.view.GestureDetector; import android.view.KeyEvent; +import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; @@ -44,11 +55,15 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig private static CallIncomingActivity instance; private TextView name, number; - private ImageView contactPicture, acceptArrow, accept, decline; + private ImageView contactPicture, acceptArrow, accept, acceptCall, decline; private LinphoneCall mCall; private LinphoneCoreListenerBase mListener; private LinearLayout acceptUnlock; + private LinearLayout declineUnlock; private StatusFragment status; + private boolean isActive; + private float answerX; + private float declineX; public static CallIncomingActivity instance() { return instance; @@ -73,24 +88,113 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; getWindow().addFlags(flags); + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { + isActive = pm.isInteractive(); + } else { + isActive = pm.isScreenOn(); + } + + acceptUnlock = (LinearLayout) findViewById(R.id.acceptUnlock); + declineUnlock = (LinearLayout) findViewById(R.id.declineUnlock); + //mIncomingCallWidget = (LinphoneSliders) findViewById(R.id.sliding_widget); + accept = (ImageView) findViewById(R.id.accept); + acceptArrow = (ImageView) findViewById(R.id.acceptArrow); + decline = (ImageView) findViewById(R.id.decline); accept.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - answer(); - } - }); - decline = (ImageView) findViewById(R.id.decline); - decline.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - decline(); + if(isActive) { + answer(); + } else { + decline.setVisibility(View.GONE); + acceptUnlock.setVisibility(View.VISIBLE); + } } }); + if(!isActive) { + accept.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + float curX; + switch (motionEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + acceptUnlock.setVisibility(View.VISIBLE); + decline.setVisibility(View.GONE); + answerX = motionEvent.getX(); + break; + case MotionEvent.ACTION_MOVE: + curX = motionEvent.getX(); + view.scrollBy((int) (answerX - curX), view.getScrollY()); + answerX = curX; + if (curX < 50) { + answer(); + return true; + } + break; + case MotionEvent.ACTION_UP: + view.scrollTo(0, view.getScrollY()); + decline.setVisibility(View.VISIBLE); + acceptUnlock.setVisibility(View.GONE); + break; + + } + return true; + } + }); + + decline.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + float curX; + switch (motionEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + declineUnlock.setVisibility(View.VISIBLE); + accept.setVisibility(View.GONE); + declineX = motionEvent.getX(); + break; + case MotionEvent.ACTION_MOVE: + curX = motionEvent.getX(); + view.scrollBy((int) (declineX - curX), view.getScrollY()); + declineX = curX; + Log.w(curX); + if (curX > 800) { + //decline(); + return true; + } + break; + case MotionEvent.ACTION_UP: + view.scrollTo(0, view.getScrollY()); + accept.setVisibility(View.VISIBLE); + declineUnlock.setVisibility(View.GONE); + break; + + } + return true; + } + }); + } + + decline.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(isActive) { + decline(); + } else { + accept.setVisibility(View.GONE); + acceptUnlock.setVisibility(View.VISIBLE); + } + } + }); + + + + mListener = new LinphoneCoreListenerBase(){ @Override - public void callState(LinphoneCore lc, LinphoneCall call, LinphoneCall.State state, String message) { + public void callState(LinphoneCore lc, LinphoneCall call, State state, String message) { if (call == mCall && State.CallEnd == state) { finish(); } @@ -101,6 +205,7 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig } }; + super.onCreate(savedInstanceState); instance = this; } @@ -193,13 +298,11 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig @Override public void onLeftHandleTriggered() { - answer(); - finish(); + } @Override public void onRightHandleTriggered() { - decline(); - finish(); + } } \ No newline at end of file diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 088dc80df..42ab1217d 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -155,7 +155,7 @@ public final class LinphoneService extends Service { bm = BitmapFactory.decodeResource(getResources(), R.drawable.logo_linphone_57x57); } catch (Exception e) { } - mNotif = Compatibility.createNotification(this, mNotificationTitle, "", R.drawable.status_level, IC_LEVEL_OFFLINE, bm, mNotifContentIntent, true,notifcationsPriority); + mNotif = Compatibility.createNotification(this, mNotificationTitle, "", R.drawable.status_level, R.drawable.logo_linphone_57x57, bm, mNotifContentIntent, true,notifcationsPriority); LinphoneManager.createAndStart(LinphoneService.this); @@ -200,7 +200,7 @@ public final class LinphoneService extends Service { @Override public void globalState(LinphoneCore lc,LinphoneCore.GlobalState state, String message) { if (state == GlobalState.GlobalOn) { - sendNotification(IC_LEVEL_OFFLINE, R.string.notification_started); + sendNotification(IC_LEVEL_ORANGE, R.string.notification_started); } } @@ -216,11 +216,11 @@ public final class LinphoneService extends Service { } if ((state == RegistrationState.RegistrationFailed || state == RegistrationState.RegistrationCleared) && (LinphoneManager.getLc().getDefaultProxyConfig() == null || !LinphoneManager.getLc().getDefaultProxyConfig().isRegistered())) { - sendNotification(IC_LEVEL_OFFLINE, R.string.notification_register_failure); + sendNotification(IC_LEVEL_ORANGE, R.string.notification_register_failure); } if (state == RegistrationState.RegistrationNone) { - sendNotification(IC_LEVEL_OFFLINE, R.string.notification_started); + sendNotification(IC_LEVEL_ORANGE, R.string.notification_started); } } } @@ -293,7 +293,7 @@ public final class LinphoneService extends Service { notificationTextId = R.string.incall_notif_active; break; case PAUSE: - inconId = R.drawable.conf_status_paused; + inconId = R.drawable.topbar_call_notification; notificationTextId = R.string.incall_notif_paused; break; case VIDEO: diff --git a/src/org/linphone/StatusFragment.java b/src/org/linphone/StatusFragment.java index 9cfda41e9..16f1c3695 100644 --- a/src/org/linphone/StatusFragment.java +++ b/src/org/linphone/StatusFragment.java @@ -36,8 +36,11 @@ import org.linphone.mediastream.Log; import android.app.Activity; import android.app.AlertDialog; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.app.Fragment; @@ -45,6 +48,9 @@ import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; @@ -86,8 +92,8 @@ public class StatusFragment extends Fragment { } if(lc.getProxyConfigList() == null){ - statusLed.setVisibility(View.INVISIBLE); - statusText.setText(""); + statusLed.setImageResource(R.drawable.led_disconnected); + statusText.setText(getString(R.string.no_account)); } else { statusLed.setVisibility(View.VISIBLE); } @@ -191,8 +197,8 @@ public class StatusFragment extends Fragment { } if(LinphoneManager.getLc().getProxyConfigList().length == 0){ - statusLed.setVisibility(View.INVISIBLE); - statusText.setText(""); + statusLed.setImageResource(R.drawable.led_disconnected); + statusText.setText(getString(R.string.no_account)); } } } @@ -372,33 +378,52 @@ public class StatusFragment extends Fragment { } } - private void showZRTPDialog(final LinphoneCall call) { + public void showZRTPDialog(final LinphoneCall call) { if (getActivity() == null) { Log.w("Can't display ZRTP popup, no Activity"); return; } - new AlertDialog.Builder(getActivity()) - .setTitle(call.getAuthenticationToken()) - .setMessage(getString(R.string.zrtp_help)) - .setPositiveButton(R.string.zrtp_accept, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - call.setAuthenticationTokenVerified(true); + + final Dialog dialog = new Dialog(getActivity()); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + Drawable d = new ColorDrawable(getResources().getColor(R.color.colorC)); + d.setAlpha(200); + dialog.setContentView(R.layout.dialog); + dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + dialog.getWindow().setBackgroundDrawable(d); + + TextView customText = (TextView) dialog.findViewById(R.id.customText); + String newText = getString(R.string.zrtp_dialog).replace("%s",call.getAuthenticationToken()); + customText.setText(newText); + Button delete = (Button) dialog.findViewById(R.id.delete); + delete.setText(R.string.accept); + Button cancel = (Button) dialog.findViewById(R.id.cancel); + cancel.setText(R.string.deny); + + delete.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + call.setAuthenticationTokenVerified(true); + if (encryption != null) { + encryption.setImageResource(R.drawable.security_ok); + } + dialog.dismiss(); + } + }); + + cancel.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (call != null) { + call.setAuthenticationTokenVerified(false); if (encryption != null) { - encryption.setImageResource(R.drawable.security_ok); + encryption.setImageResource(R.drawable.security_pending); } - } - }) - .setNegativeButton(R.string.zrtp_deny, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - if (call != null) { - call.setAuthenticationTokenVerified(false); - if (encryption != null) { - encryption.setImageResource(R.drawable.security_pending); - } - } - } - }) - .show(); + } + dialog.dismiss(); + } + }); + dialog.show(); } public void initCallStatsRefresher(final LinphoneCall call, final View view) {