summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Lee <anwlee@google.com>2014-07-18 18:00:44 -0700
committerAndrew Lee <anwlee@google.com>2014-07-21 13:46:32 -0700
commitf6e7ba0ca231fb5373510c6c622674a13e54ff99 (patch)
tree191ac62f84fdf5bde2f96597b707926ef2efc1e9
parent2e46f6b84fd69db43a782a5fbb01448da4f0fef2 (diff)
Implement new video-call-related buttons.
- Implemented downgrade/upgrade, switch camera, pause camear. - Implemented code to find front/back-facing cameraIds. - Also, cleaned up listener logic in CallButtonFragment to be more consistent. Bug: 16014280 Change-Id: I267a73943dc768900b663bb4db6ec52f4a35cac5
-rw-r--r--InCallUI/src/com/android/incallui/Call.java6
-rw-r--r--InCallUI/src/com/android/incallui/CallButtonFragment.java89
-rw-r--r--InCallUI/src/com/android/incallui/CallButtonPresenter.java115
3 files changed, 167 insertions, 43 deletions
diff --git a/InCallUI/src/com/android/incallui/Call.java b/InCallUI/src/com/android/incallui/Call.java
index 830b58114..f3986a4fa 100644
--- a/InCallUI/src/com/android/incallui/Call.java
+++ b/InCallUI/src/com/android/incallui/Call.java
@@ -327,8 +327,12 @@ public final class Call {
return mParentCallId;
}
+ public int getVideoState() {
+ return mTelecommCall.getDetails().getVideoState();
+ }
+
public boolean isVideoCall() {
- int videoState = mTelecommCall.getDetails().getVideoState();
+ int videoState = getVideoState();
return (videoState & VideoCallProfile.VIDEO_STATE_BIDIRECTIONAL)
== VideoCallProfile.VIDEO_STATE_BIDIRECTIONAL;
}
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
index 077c8124b..80119a404 100644
--- a/InCallUI/src/com/android/incallui/CallButtonFragment.java
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -68,8 +68,7 @@ public class CallButtonFragment
@Override
CallButtonPresenter createPresenter() {
- // TODO: find a cleaner way to include audio mode provider than
- // having a singleton instance.
+ // TODO: find a cleaner way to include audio mode provider than having a singleton instance.
return new CallButtonPresenter();
}
@@ -91,50 +90,20 @@ public class CallButtonFragment
mExtraRowButton = parent.findViewById(R.id.extraButtonRow);
mManageConferenceButton = parent.findViewById(R.id.manageConferenceButton);
- mManageConferenceButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- getPresenter().manageConferenceButtonClicked();
- }
- });
+ mManageConferenceButton.setOnClickListener(this);
mGenericMergeButton = parent.findViewById(R.id.cdmaMergeButton);
- mGenericMergeButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- getPresenter().mergeClicked();
- }
- });
-
- mMuteButton = (ImageButton) parent.findViewById(R.id.muteButton);
- mMuteButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- final ImageButton button = (ImageButton) v;
- getPresenter().muteClicked(!button.isSelected());
- }
- });
+ mGenericMergeButton.setOnClickListener(this);
mAudioButton = (ImageButton) parent.findViewById(R.id.audioButton);
- mAudioButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- onAudioButtonClicked();
- }
- });
-
- mHoldButton = (ImageButton) parent.findViewById(R.id.holdButton);
- mHoldButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- final ImageButton button = (ImageButton) v;
- getPresenter().holdClicked(!button.isSelected());
- }
- });
-
+ mAudioButton.setOnClickListener(this);
mChangeToVoiceButton = (ImageButton) parent.findViewById(R.id.changeToVoiceButton);
mChangeToVoiceButton. setOnClickListener(this);
+ mMuteButton = (ImageButton) parent.findViewById(R.id.muteButton);
+ mMuteButton.setOnClickListener(this);
mShowDialpadButton = (ImageButton) parent.findViewById(R.id.dialpadButton);
mShowDialpadButton.setOnClickListener(this);
+ mHoldButton = (ImageButton) parent.findViewById(R.id.holdButton);
+ mHoldButton.setOnClickListener(this);
mSwapButton = (ImageButton) parent.findViewById(R.id.swapButton);
mSwapButton.setOnClickListener(this);
mChangeToVideoButton = (ImageButton) parent.findViewById(R.id.changeToVideoButton);
@@ -159,6 +128,7 @@ public class CallButtonFragment
// set the buttons
updateAudioButtons(getPresenter().getSupportedAudio());
+ getPresenter().initializeCameraManager(getActivity().getApplicationContext());
}
@Override
@@ -179,24 +149,51 @@ public class CallButtonFragment
Log.d(this, "onClick(View " + view + ", id " + id + ")...");
switch(id) {
+ case R.id.audioButton:
+ onAudioButtonClicked();
+ break;
case R.id.addButton:
getPresenter().addCallClicked();
break;
+ case R.id.changeToVoiceButton:
+ getPresenter().changeToVoiceClicked();
+ break;
+ case R.id.muteButton: {
+ final ImageButton button = (ImageButton) view;
+ getPresenter().muteClicked(!button.isSelected());
+ break;
+ }
+ case R.id.cdmaMergeButton:
case R.id.mergeButton:
getPresenter().mergeClicked();
break;
+ case R.id.holdButton: {
+ final ImageButton button = (ImageButton) view;
+ getPresenter().holdClicked(!button.isSelected());
+ break;
+ }
case R.id.swapButton:
getPresenter().swapClicked();
break;
case R.id.dialpadButton:
getPresenter().showDialpadClicked(!mShowDialpadButton.isSelected());
break;
- case R.id.changeToVoiceButton:
case R.id.changeToVideoButton:
+ getPresenter().changeToVideoClicked();
+ break;
case R.id.switchCameraButton:
+ getPresenter().switchCameraClicked(
+ mSwitchCameraButton.isSelected() /* useFrontFacingCamera */);
+ break;
case R.id.pauseVideoButton:
+ getPresenter().pauseVideoClicked(
+ !mPauseVideoButton.isSelected() /* pause */);
+ break;
case R.id.overflowButton:
- // TODO: Implement these button behaviors.
+ // TODO: Implement.
+ break;
+ case R.id.manageConferenceButton:
+ getPresenter().manageConferenceButtonClicked();
break;
default:
Log.wtf(this, "onClick: unexpected");
@@ -282,6 +279,11 @@ public class CallButtonFragment
}
@Override
+ public void setSwitchCameraButton(boolean isBackFacingCamera) {
+ mSwitchCameraButton.setSelected(isBackFacingCamera);
+ }
+
+ @Override
public void showAddCallButton(boolean show) {
mAddCallButton.setVisibility(show ? View.VISIBLE : View.GONE);
}
@@ -302,6 +304,11 @@ public class CallButtonFragment
}
@Override
+ public void setPauseVideoButton(boolean isPaused) {
+ mPauseVideoButton.setSelected(isPaused);
+ }
+
+ @Override
public void showOverflowButton(boolean show) {
mOverflowButton.setVisibility(show ? View.VISIBLE : View.GONE);
}
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
index 4f457b8c2..6e841a1cc 100644
--- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -16,7 +16,13 @@
package com.android.incallui;
+import android.content.Context;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
import android.telecomm.CallCapabilities;
+import android.telecomm.RemoteCallVideoProvider;
+import android.telecomm.VideoCallProfile;
import com.android.contacts.common.util.PhoneNumberHelper;
import com.android.contacts.common.util.TelephonyManagerUtils;
@@ -37,15 +43,20 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto
private Call mCall;
private boolean mAutomaticallyMuted = false;
private boolean mPreviousMuteState = false;
-
private boolean mShowGenericMerge = false;
private boolean mShowManageConference = false;
+ private boolean mUseFrontFacingCamera = true;
private InCallState mPreviousState = null;
+ private CameraManager mCameraManager;
public CallButtonPresenter() {
}
+ public void initializeCameraManager(Context context) {
+ mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
+ }
+
@Override
public void onUiReady(CallButtonUi ui) {
super.onUiReady(ui);
@@ -201,6 +212,17 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto
TelecommAdapter.getInstance().addCall();
}
+ public void changeToVoiceClicked() {
+ RemoteCallVideoProvider callVideoProvider = mCall.getCallVideoProvider();
+ if (callVideoProvider == null) {
+ return;
+ }
+
+ VideoCallProfile videoCallProfile = new VideoCallProfile(
+ VideoCallProfile.VIDEO_STATE_AUDIO_ONLY, VideoCallProfile.QUALITY_DEFAULT);
+ callVideoProvider.sendSessionModifyRequest(videoCallProfile);
+ }
+
public void swapClicked() {
TelecommAdapter.getInstance().swap(mCall.getId());
}
@@ -211,6 +233,62 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto
updateExtraButtonRow();
}
+ public void changeToVideoClicked() {
+ RemoteCallVideoProvider callVideoProvider = mCall.getCallVideoProvider();
+ if (callVideoProvider == null) {
+ return;
+ }
+
+ VideoCallProfile videoCallProfile =
+ new VideoCallProfile(VideoCallProfile.VIDEO_STATE_BIDIRECTIONAL);
+ callVideoProvider.sendSessionModifyRequest(videoCallProfile);
+ }
+
+ /**
+ * Switches the camera between the front-facing and back-facing camera.
+ * @param useFrontFacingCamera True if we should switch to using the front-facing camera, or
+ * false if we should switch to using the back-facing camera.
+ */
+ public void switchCameraClicked(boolean useFrontFacingCamera) {
+ mUseFrontFacingCamera = useFrontFacingCamera;
+
+ RemoteCallVideoProvider callVideoProvider = mCall.getCallVideoProvider();
+ if (callVideoProvider == null) {
+ return;
+ }
+
+ String cameraId = getCameraId();
+ if (cameraId != null) {
+ callVideoProvider.setCamera(cameraId);
+ }
+ getUi().setSwitchCameraButton(!useFrontFacingCamera);
+ }
+
+ /**
+ * Stop or start client's video transmission.
+ * @param pause True if pausing the local user's video, or false if starting the local user's
+ * video.
+ */
+ public void pauseVideoClicked(boolean pause) {
+ RemoteCallVideoProvider callVideoProvider = mCall.getCallVideoProvider();
+ if (callVideoProvider == null) {
+ return;
+ }
+
+ if (pause) {
+ callVideoProvider.setCamera(null);
+ VideoCallProfile videoCallProfile = new VideoCallProfile(
+ mCall.getVideoState() | VideoCallProfile.VIDEO_STATE_PAUSED);
+ callVideoProvider.sendSessionModifyRequest(videoCallProfile);
+ } else {
+ callVideoProvider.setCamera(getCameraId());
+ VideoCallProfile videoCallProfile = new VideoCallProfile(
+ mCall.getVideoState() & ~VideoCallProfile.VIDEO_STATE_PAUSED);
+ callVideoProvider.sendSessionModifyRequest(videoCallProfile);
+ }
+ getUi().setPauseVideoButton(pause);
+ }
+
private void updateUi(InCallState state, Call call) {
Log.d(this, "Updating call UI for call: ", call);
@@ -343,6 +421,39 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto
}
}
+ private String getCameraId() {
+ String[] cameraIds = {};
+ String cameraId = null;
+ int targetCharacteristic = mUseFrontFacingCamera
+ ? CameraCharacteristics.LENS_FACING_FRONT : CameraCharacteristics.LENS_FACING_BACK;
+
+ try {
+ cameraIds = mCameraManager.getCameraIdList();
+ } catch (CameraAccessException e) {
+ // Camera disabled by device policy.
+ }
+
+ for (int i = 0; i < cameraIds.length; i++) {
+ CameraCharacteristics c = null;
+ try {
+ c = mCameraManager.getCameraCharacteristics(cameraIds[i]);
+ } catch (IllegalArgumentException e) {
+ // Device Id is unknown.
+ } catch (CameraAccessException e) {
+ // Camera disabled by device policy.
+ }
+ if (c != null) {
+ int facingCharacteristic = c.get(CameraCharacteristics.LENS_FACING);
+ if (facingCharacteristic == targetCharacteristic) {
+ cameraId = cameraIds[i];
+ break;
+ }
+ }
+ }
+
+ return cameraId;
+ }
+
public void refreshMuteState() {
// Restore the previous mute state
if (mAutomaticallyMuted &&
@@ -368,10 +479,12 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto
void showSwapButton(boolean show);
void showChangeToVideoButton(boolean show);
void showSwitchCameraButton(boolean show);
+ void setSwitchCameraButton(boolean isBackFacingCamera);
void showAddCallButton(boolean show);
void enableAddCall(boolean enabled);
void showMergeButton(boolean show);
void showPauseVideoButton(boolean show);
+ void setPauseVideoButton(boolean isPaused);
void showOverflowButton(boolean show);
void displayDialpad(boolean on, boolean animate);
boolean isDialpadVisible();