diff options
Diffstat (limited to 'java/com/android/incallui/incall/impl/InCallButtonGridFragment.java')
-rw-r--r-- | java/com/android/incallui/incall/impl/InCallButtonGridFragment.java | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/java/com/android/incallui/incall/impl/InCallButtonGridFragment.java b/java/com/android/incallui/incall/impl/InCallButtonGridFragment.java new file mode 100644 index 000000000..db0b5b9b8 --- /dev/null +++ b/java/com/android/incallui/incall/impl/InCallButtonGridFragment.java @@ -0,0 +1,137 @@ +/* + * 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.incall.impl; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.ArraySet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import com.android.dialer.common.Assert; +import com.android.dialer.common.FragmentUtils; +import com.android.incallui.incall.protocol.InCallButtonIds; +import java.util.List; +import java.util.Set; + +/** Fragment for the in call buttons (mute, speaker, ect.). */ +public class InCallButtonGridFragment extends Fragment { + + private static final int BUTTON_COUNT = 6; + private static final int BUTTONS_PER_ROW = 3; + + private CheckableLabeledButton[] buttons = new CheckableLabeledButton[BUTTON_COUNT]; + private OnButtonGridCreatedListener buttonGridListener; + + public static Fragment newInstance() { + return new InCallButtonGridFragment(); + } + + @Override + public void onCreate(@Nullable Bundle bundle) { + super.onCreate(bundle); + buttonGridListener = FragmentUtils.getParent(this, OnButtonGridCreatedListener.class); + Assert.isNotNull(buttonGridListener); + } + + @Nullable + @Override + public View onCreateView( + LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle bundle) { + View view = inflater.inflate(R.layout.incall_button_grid, parent, false); + + buttons[0] = ((CheckableLabeledButton) view.findViewById(R.id.incall_first_button)); + buttons[1] = ((CheckableLabeledButton) view.findViewById(R.id.incall_second_button)); + buttons[2] = ((CheckableLabeledButton) view.findViewById(R.id.incall_third_button)); + buttons[3] = ((CheckableLabeledButton) view.findViewById(R.id.incall_fourth_button)); + buttons[4] = ((CheckableLabeledButton) view.findViewById(R.id.incall_fifth_button)); + buttons[5] = ((CheckableLabeledButton) view.findViewById(R.id.incall_sixth_button)); + + return view; + } + + @Override + public void onViewCreated(View view, @Nullable Bundle bundle) { + super.onViewCreated(view, bundle); + buttonGridListener.onButtonGridCreated(this); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + buttonGridListener.onButtonGridDestroyed(); + } + + public void onInCallScreenDialpadVisibilityChange(boolean isShowing) { + for (CheckableLabeledButton button : buttons) { + button.setImportantForAccessibility( + isShowing + ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS + : View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); + } + } + + public int updateButtonStates( + List<ButtonController> buttonControllers, + @Nullable ButtonChooser buttonChooser, + int voiceNetworkType, + int phoneType) { + Set<Integer> allowedButtons = new ArraySet<>(); + Set<Integer> disabledButtons = new ArraySet<>(); + for (ButtonController controller : buttonControllers) { + if (controller.isAllowed()) { + allowedButtons.add(controller.getInCallButtonId()); + if (!controller.isEnabled()) { + disabledButtons.add(controller.getInCallButtonId()); + } + } + } + + for (ButtonController controller : buttonControllers) { + controller.setButton(null); + } + + if (buttonChooser == null) { + buttonChooser = + ButtonChooserFactory.newButtonChooser(voiceNetworkType, false /* isWiFi */, phoneType); + } + + int numVisibleButtons = getResources().getInteger(R.integer.incall_num_rows) * BUTTONS_PER_ROW; + List<Integer> buttonsToPlace = + buttonChooser.getButtonPlacement(numVisibleButtons, allowedButtons, disabledButtons); + + for (int i = 0; i < BUTTON_COUNT; ++i) { + if (i >= buttonsToPlace.size()) { + buttons[i].setVisibility(View.INVISIBLE); + continue; + } + @InCallButtonIds int button = buttonsToPlace.get(i); + buttonGridListener.getButtonController(button).setButton(buttons[i]); + } + + return numVisibleButtons; + } + + /** Interface to let the listener know the status of the button grid. */ + public interface OnButtonGridCreatedListener { + void onButtonGridCreated(InCallButtonGridFragment inCallButtonGridFragment); + void onButtonGridDestroyed(); + + ButtonController getButtonController(@InCallButtonIds int id); + } +} |