blob: 2d0423422c4999c36a5bb52c3ba0c70e1486f705 [file] [log] [blame]
Sailesh Nepalb88795a2014-07-15 14:53:27 -07001/*
2 * Copyright (C) 2014 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
Tyler Gunn7cc70b42014-09-12 22:17:27 -070017package com.android.server.telecom;
Sailesh Nepalb88795a2014-07-15 14:53:27 -070018
19import android.content.BroadcastReceiver;
20import android.content.Context;
21import android.content.Intent;
22import android.content.IntentFilter;
23import android.media.AudioManager;
24import android.os.UserHandle;
25import android.provider.Settings;
Brad Ebingera3eccfe2016-10-05 15:45:22 -070026import android.telecom.Log;
Tyler Gunn7cc70b42014-09-12 22:17:27 -070027import android.telecom.TelecomManager;
Sailesh Nepalb88795a2014-07-15 14:53:27 -070028
Tyler Gunn9787e0e2014-10-14 14:36:12 -070029import com.android.internal.util.IndentingPrintWriter;
30
Tyler Gunn91d43cf2014-09-17 12:19:39 -070031// TODO: Needed for move to system service: import com.android.internal.R;
32
Sailesh Nepalb88795a2014-07-15 14:53:27 -070033final class TtyManager implements WiredHeadsetManager.Listener {
34 private final TtyBroadcastReceiver mReceiver = new TtyBroadcastReceiver();
35 private final Context mContext;
36 private final WiredHeadsetManager mWiredHeadsetManager;
Tyler Gunn7cc70b42014-09-12 22:17:27 -070037 private int mPreferredTtyMode = TelecomManager.TTY_MODE_OFF;
38 private int mCurrentTtyMode = TelecomManager.TTY_MODE_OFF;
Sailesh Nepalb88795a2014-07-15 14:53:27 -070039
40 TtyManager(Context context, WiredHeadsetManager wiredHeadsetManager) {
41 mContext = context;
42 mWiredHeadsetManager = wiredHeadsetManager;
43 mWiredHeadsetManager.addListener(this);
44
45 mPreferredTtyMode = Settings.Secure.getInt(
46 mContext.getContentResolver(),
47 Settings.Secure.PREFERRED_TTY_MODE,
Tyler Gunn7cc70b42014-09-12 22:17:27 -070048 TelecomManager.TTY_MODE_OFF);
Sailesh Nepalb88795a2014-07-15 14:53:27 -070049
50 IntentFilter intentFilter = new IntentFilter(
Tyler Gunn7cc70b42014-09-12 22:17:27 -070051 TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
Sailesh Nepalb88795a2014-07-15 14:53:27 -070052 mContext.registerReceiver(mReceiver, intentFilter);
53
54 updateCurrentTtyMode();
55 }
56
57 boolean isTtySupported() {
58 boolean isEnabled = mContext.getResources().getBoolean(R.bool.tty_enabled);
Sailesh Nepal9d58de52014-07-18 14:53:19 -070059 Log.v(this, "isTtySupported: %b", isEnabled);
Sailesh Nepalb88795a2014-07-15 14:53:27 -070060 return isEnabled;
61 }
62
63 int getCurrentTtyMode() {
64 return mCurrentTtyMode;
65 }
66
67 @Override
68 public void onWiredHeadsetPluggedInChanged(boolean oldIsPluggedIn, boolean newIsPluggedIn) {
69 Log.v(this, "onWiredHeadsetPluggedInChanged");
70 updateCurrentTtyMode();
71 }
72
73 private void updateCurrentTtyMode() {
Tyler Gunn7cc70b42014-09-12 22:17:27 -070074 int newTtyMode = TelecomManager.TTY_MODE_OFF;
Sailesh Nepalb88795a2014-07-15 14:53:27 -070075 if (isTtySupported() && mWiredHeadsetManager.isPluggedIn()) {
76 newTtyMode = mPreferredTtyMode;
77 }
78 Log.v(this, "updateCurrentTtyMode, %d -> %d", mCurrentTtyMode, newTtyMode);
79
80 if (mCurrentTtyMode != newTtyMode) {
81 mCurrentTtyMode = newTtyMode;
Tyler Gunn7cc70b42014-09-12 22:17:27 -070082 Intent ttyModeChanged = new Intent(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);
83 ttyModeChanged.putExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE, mCurrentTtyMode);
Sailesh Nepalb88795a2014-07-15 14:53:27 -070084 mContext.sendBroadcastAsUser(ttyModeChanged, UserHandle.ALL);
85
86 updateAudioTtyMode();
87 }
88 }
89
90 private void updateAudioTtyMode() {
91 String audioTtyMode;
92 switch (mCurrentTtyMode) {
Tyler Gunn7cc70b42014-09-12 22:17:27 -070093 case TelecomManager.TTY_MODE_FULL:
Sailesh Nepalb88795a2014-07-15 14:53:27 -070094 audioTtyMode = "tty_full";
95 break;
Tyler Gunn7cc70b42014-09-12 22:17:27 -070096 case TelecomManager.TTY_MODE_VCO:
Sailesh Nepalb88795a2014-07-15 14:53:27 -070097 audioTtyMode = "tty_vco";
98 break;
Tyler Gunn7cc70b42014-09-12 22:17:27 -070099 case TelecomManager.TTY_MODE_HCO:
Sailesh Nepalb88795a2014-07-15 14:53:27 -0700100 audioTtyMode = "tty_hco";
101 break;
Tyler Gunn7cc70b42014-09-12 22:17:27 -0700102 case TelecomManager.TTY_MODE_OFF:
Sailesh Nepalb88795a2014-07-15 14:53:27 -0700103 default:
104 audioTtyMode = "tty_off";
105 break;
106 }
107 Log.v(this, "updateAudioTtyMode, %s", audioTtyMode);
108
109 AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
110 audioManager.setParameters("tty_mode=" + audioTtyMode);
111 }
112
113 private final class TtyBroadcastReceiver extends BroadcastReceiver {
114 @Override
115 public void onReceive(Context context, Intent intent) {
Brad Ebinger58f36582016-01-21 14:20:07 -0800116 Log.startSession("TBR.oR");
117 try {
118 String action = intent.getAction();
119 Log.v(TtyManager.this, "onReceive, action: %s", action);
120 if (action.equals(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED)) {
121 int newPreferredTtyMode = intent.getIntExtra(
122 TelecomManager.EXTRA_TTY_PREFERRED_MODE, TelecomManager.TTY_MODE_OFF);
123 if (mPreferredTtyMode != newPreferredTtyMode) {
124 mPreferredTtyMode = newPreferredTtyMode;
125 updateCurrentTtyMode();
126 }
Sailesh Nepalb88795a2014-07-15 14:53:27 -0700127 }
Brad Ebinger58f36582016-01-21 14:20:07 -0800128 } finally {
129 Log.endSession();
Sailesh Nepalb88795a2014-07-15 14:53:27 -0700130 }
131 }
132 }
Tyler Gunn9787e0e2014-10-14 14:36:12 -0700133
134 /**
135 * Dumps the state of the {@link TtyManager}.
136 *
137 * @param pw The {@code IndentingPrintWriter} to write the state to.
138 */
139 public void dump(IndentingPrintWriter pw) {
140 pw.println("mCurrentTtyMode: " + mCurrentTtyMode);
141 }
Sailesh Nepalb88795a2014-07-15 14:53:27 -0700142}