summaryrefslogtreecommitdiff
path: root/InCallUI/src/com/android/incallui/CallButtonFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'InCallUI/src/com/android/incallui/CallButtonFragment.java')
-rw-r--r--InCallUI/src/com/android/incallui/CallButtonFragment.java283
1 files changed, 142 insertions, 141 deletions
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
index a9fafae18..b2c812b7b 100644
--- a/InCallUI/src/com/android/incallui/CallButtonFragment.java
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -16,6 +16,8 @@
package com.android.incallui;
+import static com.android.incallui.CallButtonFragment.Buttons.*;
+
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
@@ -30,6 +32,7 @@ import android.os.Bundle;
import android.telecom.AudioState;
import android.telecom.TelecomManager;
import android.telecom.VideoProfile;
+import android.util.SparseIntArray;
import android.view.ContextThemeWrapper;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
@@ -44,7 +47,6 @@ import android.widget.Toast;
import android.widget.PopupMenu.OnDismissListener;
import android.widget.PopupMenu.OnMenuItemClickListener;
-import com.android.contacts.common.util.MaterialColorMapUtils;
import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
import java.util.ArrayList;
@@ -55,8 +57,34 @@ public class CallButtonFragment
extends BaseFragment<CallButtonPresenter, CallButtonPresenter.CallButtonUi>
implements CallButtonPresenter.CallButtonUi, OnMenuItemClickListener, OnDismissListener,
View.OnClickListener {
- private CompoundButton mAudioButton;
private static final int INVALID_INDEX = -1;
+ private static final int BUTTON_MAX_VISIBLE = 5;
+ // The button is currently visible in the UI
+ private static final int BUTTON_VISIBLE = 1;
+ // The button is hidden in the UI
+ private static final int BUTTON_HIDDEN = 2;
+ // The button has been collapsed into the overflow menu
+ private static final int BUTTON_MENU = 3;
+
+ public interface Buttons {
+ public static final int BUTTON_AUDIO = 0;
+ public static final int BUTTON_DOWNGRADE_TO_VOICE = 1;
+ public static final int BUTTON_MUTE = 2;
+ public static final int BUTTON_DIALPAD = 3;
+ public static final int BUTTON_HOLD = 4;
+ public static final int BUTTON_SWAP = 5;
+ public static final int BUTTON_UPGRADE_TO_VIDEO = 6;
+ public static final int BUTTON_SWITCH_CAMERA = 7;
+ public static final int BUTTON_ADD_CALL = 8;
+ public static final int BUTTON_MERGE = 9;
+ public static final int BUTTON_PAUSE_VIDEO = 10;
+ public static final int BUTTON_MANAGE_VIDEO_CONFERENCE = 11;
+ public static final int BUTTON_COUNT = 12;
+ }
+
+ private SparseIntArray mButtonVisibilityMap = new SparseIntArray(BUTTON_COUNT);
+
+ private CompoundButton mAudioButton;
private ImageButton mChangeToVoiceButton;
private CompoundButton mMuteButton;
private CompoundButton mShowDialpadButton;
@@ -97,6 +125,10 @@ public class CallButtonFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ for (int i = 0; i < BUTTON_COUNT; i++) {
+ mButtonVisibilityMap.put(i, BUTTON_HIDDEN);
+ }
}
@Override
@@ -157,7 +189,6 @@ public class CallButtonFragment
int id = view.getId();
Log.d(this, "onClick(View " + view + ", id " + id + ")...");
- boolean isClickHandled = true;
switch(id) {
case R.id.audioButton:
onAudioButtonClicked();
@@ -200,22 +231,21 @@ public class CallButtonFragment
!mPauseVideoButton.isSelected() /* pause */);
break;
case R.id.overflowButton:
- mOverflowPopup.show();
+ if (mOverflowPopup != null) {
+ mOverflowPopup.show();
+ }
break;
case R.id.manageVideoCallConferenceButton:
onManageVideoCallConferenceClicked();
break;
default:
- isClickHandled = false;
Log.wtf(this, "onClick: unexpected");
- break;
+ return;
}
- if (isClickHandled) {
- view.performHapticFeedback(
- HapticFeedbackConstants.VIRTUAL_KEY,
- HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
- }
+ view.performHapticFeedback(
+ HapticFeedbackConstants.VIRTUAL_KEY,
+ HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
}
public void updateColors() {
@@ -225,7 +255,6 @@ public class CallButtonFragment
return;
}
- Resources res = getActivity().getResources();
View[] compoundButtons = {
mAudioButton,
mMuteButton,
@@ -344,112 +373,81 @@ public class CallButtonFragment
}
@Override
- public void setMute(boolean value) {
- if (mMuteButton.isSelected() != value) {
- mMuteButton.setSelected(value);
- }
- }
-
- @Override
- public void showAudioButton(boolean show) {
- mAudioButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- @Override
- public void showChangeToVoiceButton(boolean show) {
- mChangeToVoiceButton.setVisibility(show ? View.VISIBLE : View.GONE);
+ public void showButton(int buttonId, boolean show) {
+ mButtonVisibilityMap.put(buttonId, show ? BUTTON_VISIBLE : BUTTON_HIDDEN);
}
@Override
- public void enableMute(boolean enabled) {
- mMuteButton.setEnabled(enabled);
+ public void enableButton(int buttonId, boolean enable) {
+ final View button = getButtonById(buttonId);
+ if (button != null) {
+ button.setEnabled(enable);
+ }
}
- @Override
- public void showDialpadButton(boolean show) {
- mShowDialpadButton.setVisibility(show ? View.VISIBLE : View.GONE);
+ private View getButtonById(int id) {
+ switch (id) {
+ case BUTTON_AUDIO:
+ return mAudioButton;
+ case BUTTON_DOWNGRADE_TO_VOICE:
+ return mChangeToVoiceButton;
+ case BUTTON_MUTE:
+ return mMuteButton;
+ case BUTTON_DIALPAD:
+ return mShowDialpadButton;
+ case BUTTON_HOLD:
+ return mHoldButton;
+ case BUTTON_SWAP:
+ return mSwapButton;
+ case BUTTON_UPGRADE_TO_VIDEO:
+ return mChangeToVideoButton;
+ case BUTTON_SWITCH_CAMERA:
+ return mSwitchCameraButton;
+ case BUTTON_ADD_CALL:
+ return mAddCallButton;
+ case BUTTON_MERGE:
+ return mMergeButton;
+ case BUTTON_PAUSE_VIDEO:
+ return mPauseVideoButton;
+ case BUTTON_MANAGE_VIDEO_CONFERENCE:
+ return mManageVideoCallConferenceButton;
+ default:
+ Log.w(this, "Invalid button id");
+ return null;
+ }
}
@Override
public void setHold(boolean value) {
if (mHoldButton.isSelected() != value) {
mHoldButton.setSelected(value);
+ mHoldButton.setContentDescription(getContext().getString(
+ value ? R.string.onscreenHoldText_selected
+ : R.string.onscreenHoldText_unselected));
}
}
@Override
- public void showHoldButton(boolean show) {
- mHoldButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- @Override
- public void enableHold(boolean enabled) {
- mHoldButton.setEnabled(enabled);
- }
-
- @Override
- public void showSwapButton(boolean show) {
- mSwapButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- @Override
- public void showChangeToVideoButton(boolean show) {
- mChangeToVideoButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- @Override
- public void enableChangeToVideoButton(boolean enable) {
- mChangeToVideoButton.setEnabled(enable);
- }
-
- @Override
- public void showSwitchCameraButton(boolean show) {
- mSwitchCameraButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- @Override
- public void setSwitchCameraButton(boolean isBackFacingCamera) {
+ public void setCameraSwitched(boolean isBackFacingCamera) {
mSwitchCameraButton.setSelected(isBackFacingCamera);
}
@Override
- public void showAddCallButton(boolean show) {
- Log.d(this, "show Add call button: " + show);
- mAddCallButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- public void showManageConferenceVideoCallButton(boolean show) {
- mManageVideoCallConferenceButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- @Override
- public void showMergeButton(boolean show) {
- mMergeButton.setVisibility(show ? View.VISIBLE : View.GONE);
-
- // If the merge button was disabled, re-enable it when hiding it.
- if (!show) {
- mMergeButton.setEnabled(true);
- }
- }
-
- @Override
- public void showPauseVideoButton(boolean show) {
- mPauseVideoButton.setVisibility(show ? View.VISIBLE : View.GONE);
- }
-
- @Override
- public void setPauseVideoButton(boolean isPaused) {
+ public void setVideoPaused(boolean isPaused) {
mPauseVideoButton.setSelected(isPaused);
}
@Override
- public void showOverflowButton(boolean show) {
- mOverflowButton.setVisibility(show ? View.VISIBLE : View.GONE);
+ public void setMute(boolean value) {
+ if (mMuteButton.isSelected() != value) {
+ mMuteButton.setSelected(value);
+ }
}
/**The function is called when Modify Call button gets pressed. The function creates and
* displays modify call options.
*/
+ @Override
public void displayModifyCallOptions() {
CallButtonPresenter.CallButtonUi ui = getUi();
if (ui == null) {
@@ -520,65 +518,68 @@ public class CallButtonFragment
return "";
}
+ private void addToOverflowMenu(int id, View button, PopupMenu menu) {
+ button.setVisibility(View.GONE);
+ menu.getMenu().add(Menu.NONE, id, Menu.NONE, button.getContentDescription());
+ mButtonVisibilityMap.put(id, BUTTON_MENU);
+ }
+
+ private PopupMenu getPopupMenu() {
+ return new PopupMenu(new ContextThemeWrapper(getActivity(), R.style.InCallPopupMenuStyle),
+ mOverflowButton);
+ }
+
+ /**
+ * Iterates through the list of buttons and toggles their visibility depending on the
+ * setting configured by the CallButtonPresenter. If there are more visible buttons than
+ * the allowed maximum, the excess buttons are collapsed into a single overflow menu.
+ */
@Override
- public void configureOverflowMenu(boolean showMergeMenuOption, boolean showAddMenuOption,
- boolean showHoldMenuOption, boolean showSwapMenuOption,
- boolean showManageConferenceVideoCallOption) {
- if (mOverflowPopup == null) {
- final ContextThemeWrapper contextWrapper = new ContextThemeWrapper(getActivity(),
- R.style.InCallPopupMenuStyle);
- mOverflowPopup = new PopupMenu(contextWrapper, mOverflowButton);
- mOverflowPopup.getMenuInflater().inflate(R.menu.incall_overflow_menu,
- mOverflowPopup.getMenu());
+ public void updateButtonStates() {
+ View prevVisibleButton = null;
+ int prevVisibleId = -1;
+ PopupMenu menu = null;
+ int visibleCount = 0;
+ for (int i = 0; i < BUTTON_COUNT; i++) {
+ final int visibility = mButtonVisibilityMap.get(i);
+ final View button = getButtonById(i);
+ if (visibility == BUTTON_VISIBLE) {
+ visibleCount++;
+ if (visibleCount <= BUTTON_MAX_VISIBLE) {
+ button.setVisibility(View.VISIBLE);
+ prevVisibleButton = button;
+ prevVisibleId = i;
+ } else {
+ if (menu == null) {
+ menu = getPopupMenu();
+ }
+ // Collapse the current button into the overflow menu. If is the first visible
+ // button that exceeds the threshold, also collapse the previous visible button
+ // so that the total number of visible buttons will never exceed the threshold.
+ if (prevVisibleButton != null) {
+ addToOverflowMenu(prevVisibleId, prevVisibleButton, menu);
+ prevVisibleButton = null;
+ prevVisibleId = -1;
+ }
+ addToOverflowMenu(i, button, menu);
+ }
+ } else if (visibility == BUTTON_HIDDEN){
+ button.setVisibility(View.GONE);
+ }
+ }
+
+ mOverflowButton.setVisibility(menu != null ? View.VISIBLE : View.GONE);
+ if (menu != null) {
+ mOverflowPopup = menu;
mOverflowPopup.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.overflow_merge_menu_item:
- getPresenter().mergeClicked();
- break;
- case R.id.overflow_add_menu_item:
- getPresenter().addCallClicked();
- break;
- case R.id.overflow_hold_menu_item:
- getPresenter().holdClicked(true /* checked */);
- break;
- case R.id.overflow_resume_menu_item:
- getPresenter().holdClicked(false /* checked */);
- break;
- case R.id.overflow_swap_menu_item:
- getPresenter().addCallClicked();
- break;
- case R.id.overflow_manage_conference_menu_item:
- onManageVideoCallConferenceClicked();
- break;
- default:
- Log.wtf(this, "onMenuItemClick: unexpected overflow menu click");
- break;
- }
+ final int id = item.getItemId();
+ getButtonById(id).performClick();
return true;
}
});
- mOverflowPopup.setOnDismissListener(new OnDismissListener() {
- @Override
- public void onDismiss(PopupMenu popupMenu) {
- popupMenu.dismiss();
- }
- });
}
-
- final Menu menu = mOverflowPopup.getMenu();
- menu.findItem(R.id.overflow_merge_menu_item).setVisible(showMergeMenuOption);
- menu.findItem(R.id.overflow_add_menu_item).setVisible(showAddMenuOption);
- menu.findItem(R.id.overflow_hold_menu_item).setVisible(
- showHoldMenuOption && !mHoldButton.isSelected());
- menu.findItem(R.id.overflow_resume_menu_item).setVisible(
- showHoldMenuOption && mHoldButton.isSelected());
- menu.findItem(R.id.overflow_swap_menu_item).setVisible(showSwapMenuOption);
- menu.findItem(R.id.overflow_manage_conference_menu_item).setVisible(
- showManageConferenceVideoCallOption);
-
- mOverflowButton.setEnabled(menu.hasVisibleItems());
}
@Override