1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.incallui.incall.impl;
18
19import android.support.v4.util.ArrayMap;
20import android.telephony.TelephonyManager;
21import com.android.incallui.incall.impl.MappedButtonConfig.MappingInfo;
22import com.android.incallui.incall.protocol.InCallButtonIds;
23import java.util.Map;
24
25/**
26 * Creates {@link ButtonChooser} objects, based on the current network and phone type.
27 */
28class ButtonChooserFactory {
29
30  /**
31   * Creates the appropriate {@link ButtonChooser} based on the given information.
32   *
33   * @param voiceNetworkType the result of a call to {@link TelephonyManager#getVoiceNetworkType()}.
34   * @param isWiFi {@code true} if the call is made over WiFi, {@code false} otherwise.
35   * @param phoneType the result of a call to {@link TelephonyManager#getPhoneType()}.
36   * @return the ButtonChooser.
37   */
38  public static ButtonChooser newButtonChooser(
39      int voiceNetworkType, boolean isWiFi, int phoneType) {
40    if (voiceNetworkType == TelephonyManager.NETWORK_TYPE_LTE || isWiFi) {
41      return newImsAndWiFiButtonChooser();
42    }
43
44    if (phoneType == TelephonyManager.PHONE_TYPE_CDMA) {
45      return newCdmaButtonChooser();
46    }
47
48    if (phoneType == TelephonyManager.PHONE_TYPE_GSM) {
49      return newGsmButtonChooser();
50    }
51
52    return newImsAndWiFiButtonChooser();
53  }
54
55  private static ButtonChooser newImsAndWiFiButtonChooser() {
56    Map<Integer, MappingInfo> mapping = createCommonMapping();
57    mapping.put(
58        InCallButtonIds.BUTTON_MANAGE_VOICE_CONFERENCE,
59        MappingInfo.builder(4).setSlotOrder(0).build());
60    mapping.put(
61        InCallButtonIds.BUTTON_UPGRADE_TO_VIDEO, MappingInfo.builder(4).setSlotOrder(10).build());
62    mapping.put(
63        InCallButtonIds.BUTTON_SWITCH_TO_SECONDARY, MappingInfo.builder(5).setSlotOrder(0).build());
64    mapping.put(InCallButtonIds.BUTTON_HOLD, MappingInfo.builder(5).setSlotOrder(10).build());
65
66    return new ButtonChooser(new MappedButtonConfig(mapping));
67  }
68
69  private static ButtonChooser newCdmaButtonChooser() {
70    Map<Integer, MappingInfo> mapping = createCommonMapping();
71    mapping.put(
72        InCallButtonIds.BUTTON_MANAGE_VOICE_CONFERENCE,
73        MappingInfo.builder(4).setSlotOrder(0).build());
74    mapping.put(
75        InCallButtonIds.BUTTON_UPGRADE_TO_VIDEO, MappingInfo.builder(4).setSlotOrder(10).build());
76    mapping.put(InCallButtonIds.BUTTON_SWAP, MappingInfo.builder(5).setSlotOrder(0).build());
77
78    return new ButtonChooser(new MappedButtonConfig(mapping));
79  }
80
81  private static ButtonChooser newGsmButtonChooser() {
82    Map<Integer, MappingInfo> mapping = createCommonMapping();
83    mapping.put(
84        InCallButtonIds.BUTTON_SWITCH_TO_SECONDARY, MappingInfo.builder(4).setSlotOrder(0).build());
85    mapping.put(
86        InCallButtonIds.BUTTON_MANAGE_VOICE_CONFERENCE,
87        MappingInfo.builder(4).setSlotOrder(5).build());
88    mapping.put(
89        InCallButtonIds.BUTTON_UPGRADE_TO_VIDEO, MappingInfo.builder(4).setSlotOrder(10).build());
90    mapping.put(InCallButtonIds.BUTTON_HOLD, MappingInfo.builder(5).setSlotOrder(0).build());
91
92    return new ButtonChooser(new MappedButtonConfig(mapping));
93  }
94
95  private static Map<Integer, MappingInfo> createCommonMapping() {
96    Map<Integer, MappingInfo> mapping = new ArrayMap<>();
97    mapping.put(InCallButtonIds.BUTTON_MUTE, MappingInfo.builder(0).build());
98    mapping.put(InCallButtonIds.BUTTON_DIALPAD, MappingInfo.builder(1).build());
99    mapping.put(InCallButtonIds.BUTTON_AUDIO, MappingInfo.builder(2).build());
100    mapping.put(InCallButtonIds.BUTTON_MERGE, MappingInfo.builder(3).setSlotOrder(0).build());
101    mapping.put(InCallButtonIds.BUTTON_ADD_CALL, MappingInfo.builder(3).build());
102    return mapping;
103  }
104}
105