/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.incallui.video.impl; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.StringRes; import android.telecom.CallAudioState; import android.view.View; import android.view.View.OnClickListener; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.incallui.incall.protocol.InCallButtonUiDelegate; import com.android.incallui.video.impl.CheckableImageButton.OnCheckedChangeListener; import com.android.incallui.video.protocol.VideoCallScreenDelegate; /** Manages a single button. */ public class SpeakerButtonController implements OnCheckedChangeListener, OnClickListener { @NonNull private final InCallButtonUiDelegate inCallButtonUiDelegate; @NonNull private final VideoCallScreenDelegate videoCallScreenDelegate; @NonNull private CheckableImageButton button; @DrawableRes private int icon = R.drawable.quantum_ic_volume_up_vd_theme_24; private boolean isChecked; private boolean checkable; private boolean isEnabled; private CharSequence contentDescription; SpeakerButtonController( @NonNull CheckableImageButton button, @NonNull InCallButtonUiDelegate inCallButtonUiDelegate, @NonNull VideoCallScreenDelegate videoCallScreenDelegate) { this.inCallButtonUiDelegate = Assert.isNotNull(inCallButtonUiDelegate); this.videoCallScreenDelegate = Assert.isNotNull(videoCallScreenDelegate); this.button = Assert.isNotNull(button); } public void setEnabled(boolean isEnabled) { this.isEnabled = isEnabled; updateButtonState(); } void updateButtonState() { button.setVisibility(View.VISIBLE); button.setEnabled(isEnabled); button.setChecked(isChecked); button.setOnClickListener(checkable ? null : this); button.setOnCheckedChangeListener(checkable ? this : null); button.setImageResource(icon); button.setContentDescription(contentDescription); } public void setAudioState(CallAudioState audioState) { LogUtil.i("SpeakerButtonController.setSupportedAudio", "audioState: " + audioState); @StringRes int contentDescriptionResId; if ((audioState.getSupportedRouteMask() & CallAudioState.ROUTE_BLUETOOTH) == CallAudioState.ROUTE_BLUETOOTH) { checkable = false; isChecked = false; if ((audioState.getRoute() & CallAudioState.ROUTE_BLUETOOTH) == CallAudioState.ROUTE_BLUETOOTH) { icon = R.drawable.quantum_ic_bluetooth_audio_vd_theme_24; contentDescriptionResId = R.string.incall_content_description_bluetooth; } else if ((audioState.getRoute() & CallAudioState.ROUTE_SPEAKER) == CallAudioState.ROUTE_SPEAKER) { icon = R.drawable.quantum_ic_volume_up_vd_theme_24; contentDescriptionResId = R.string.incall_content_description_speaker; } else if ((audioState.getRoute() & CallAudioState.ROUTE_WIRED_HEADSET) == CallAudioState.ROUTE_WIRED_HEADSET) { icon = R.drawable.quantum_ic_headset_vd_theme_24; contentDescriptionResId = R.string.incall_content_description_headset; } else { icon = R.drawable.quantum_ic_phone_in_talk_vd_theme_24; contentDescriptionResId = R.string.incall_content_description_earpiece; } } else { checkable = true; isChecked = audioState.getRoute() == CallAudioState.ROUTE_SPEAKER; icon = R.drawable.quantum_ic_volume_up_vd_theme_24; contentDescriptionResId = R.string.incall_content_description_speaker; } contentDescription = button.getContext().getText(contentDescriptionResId); updateButtonState(); } @Override public void onCheckedChanged(CheckableImageButton button, boolean isChecked) { LogUtil.i("SpeakerButtonController.onCheckedChanged", null); inCallButtonUiDelegate.toggleSpeakerphone(); videoCallScreenDelegate.resetAutoFullscreenTimer(); } @Override public void onClick(View view) { LogUtil.i("SpeakerButtonController.onClick", null); inCallButtonUiDelegate.showAudioRouteSelector(); videoCallScreenDelegate.resetAutoFullscreenTimer(); } }