blob: 1f92845c45cff14324bfaf7d1f14a4faa7301f1e [file] [log] [blame]
Santos Cordon7d4ddf62013-07-10 11:58:08 -07001package com.android.phone;
2
SongFerngWang0e767992021-03-31 22:08:45 +08003import static com.android.phone.TimeConsumingPreferenceActivity.EXCEPTION_ERROR;
SongFerngWangebda2c52022-01-11 15:28:38 +08004import static com.android.phone.TimeConsumingPreferenceActivity.FDN_CHECK_FAILURE;
Santos Cordon7d4ddf62013-07-10 11:58:08 -07005import static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
6
7import android.content.Context;
Santos Cordon7d4ddf62013-07-10 11:58:08 -07008import android.os.Handler;
9import android.os.Message;
fionaxue46e69f2017-04-27 14:32:46 -070010import android.preference.SwitchPreference;
SongFerngWang0e767992021-03-31 22:08:45 +080011import android.telephony.TelephonyManager;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070012import android.util.AttributeSet;
13import android.util.Log;
14
Aravind Sreekumarc94dea82018-04-10 15:34:32 -070015import com.android.internal.telephony.Phone;
16
SongFerngWang0e767992021-03-31 22:08:45 +080017import java.util.concurrent.Executor;
18import java.util.concurrent.Executors;
19
fionaxue46e69f2017-04-27 14:32:46 -070020public class CallWaitingSwitchPreference extends SwitchPreference {
21 private static final String LOG_TAG = "CallWaitingSwitchPreference";
Santos Cordon7d4ddf62013-07-10 11:58:08 -070022 private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
23
24 private final MyHandler mHandler = new MyHandler();
Andrew Lee2b36ba22014-11-05 17:08:49 -080025 private Phone mPhone;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070026 private TimeConsumingPreferenceListener mTcpListener;
SongFerngWang0e767992021-03-31 22:08:45 +080027 private Executor mExecutor;
28 private TelephonyManager mTelephonyManager;
29 private boolean mIsDuringUpdateProcess = false;
30 private int mUpdateStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
31 private int mQueryStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070032
fionaxue46e69f2017-04-27 14:32:46 -070033 public CallWaitingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
Santos Cordon7d4ddf62013-07-10 11:58:08 -070034 super(context, attrs, defStyle);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070035 }
36
fionaxue46e69f2017-04-27 14:32:46 -070037 public CallWaitingSwitchPreference(Context context, AttributeSet attrs) {
38 this(context, attrs, com.android.internal.R.attr.switchPreferenceStyle);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070039 }
40
fionaxue46e69f2017-04-27 14:32:46 -070041 public CallWaitingSwitchPreference(Context context) {
Santos Cordon7d4ddf62013-07-10 11:58:08 -070042 this(context, null);
43 }
44
Andrew Lee2b36ba22014-11-05 17:08:49 -080045 /* package */ void init(
46 TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
47 mPhone = phone;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070048 mTcpListener = listener;
SongFerngWang0e767992021-03-31 22:08:45 +080049 mExecutor = Executors.newSingleThreadExecutor();
50 mTelephonyManager = getContext().getSystemService(
51 TelephonyManager.class).createForSubscriptionId(phone.getSubId());
Santos Cordon7d4ddf62013-07-10 11:58:08 -070052
53 if (!skipReading) {
SongFerngWang0e767992021-03-31 22:08:45 +080054 Log.d(LOG_TAG, "init getCallWaitingStatus");
55 mTelephonyManager.getCallWaitingStatus(mExecutor, this::queryStatusCallBack);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070056 if (mTcpListener != null) {
57 mTcpListener.onStarted(this, true);
58 }
59 }
60 }
61
SongFerngWang0e767992021-03-31 22:08:45 +080062 private void queryStatusCallBack(int result) {
63 Log.d(LOG_TAG, "queryStatusCallBack: CW state " + result);
64 mQueryStatus = result;
65 mHandler.sendMessage(mHandler.obtainMessage(MyHandler.MESSAGE_UPDATE_CALL_WAITING));
66 }
67
68 private void updateStatusCallBack(int result) {
69 Log.d(LOG_TAG, "updateStatusCallBack: CW state " + result + ", and re get");
70 mUpdateStatus = result;
71 mTelephonyManager.getCallWaitingStatus(mExecutor, this::queryStatusCallBack);
72 }
73
Santos Cordon7d4ddf62013-07-10 11:58:08 -070074 @Override
75 protected void onClick() {
76 super.onClick();
SongFerngWang0e767992021-03-31 22:08:45 +080077 mTelephonyManager.setCallWaitingEnabled(isChecked(), mExecutor, this::updateStatusCallBack);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070078 if (mTcpListener != null) {
SongFerngWang0e767992021-03-31 22:08:45 +080079 mIsDuringUpdateProcess = true;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070080 mTcpListener.onStarted(this, false);
81 }
82 }
83
84 private class MyHandler extends Handler {
SongFerngWang0e767992021-03-31 22:08:45 +080085 static final int MESSAGE_UPDATE_CALL_WAITING = 0;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070086
87 @Override
88 public void handleMessage(Message msg) {
89 switch (msg.what) {
SongFerngWang0e767992021-03-31 22:08:45 +080090 case MESSAGE_UPDATE_CALL_WAITING:
91 updateUi();
Santos Cordon7d4ddf62013-07-10 11:58:08 -070092 break;
93 }
94 }
95
SongFerngWang0e767992021-03-31 22:08:45 +080096 private void updateUi() {
Santos Cordon7d4ddf62013-07-10 11:58:08 -070097 if (mTcpListener != null) {
SongFerngWang0e767992021-03-31 22:08:45 +080098 if (mIsDuringUpdateProcess) {
fionaxue46e69f2017-04-27 14:32:46 -070099 mTcpListener.onFinished(CallWaitingSwitchPreference.this, false);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700100 } else {
fionaxue46e69f2017-04-27 14:32:46 -0700101 mTcpListener.onFinished(CallWaitingSwitchPreference.this, true);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700102 }
103 }
104
SongFerngWangebda2c52022-01-11 15:28:38 +0800105 if (mQueryStatus != TelephonyManager.CALL_WAITING_STATUS_ENABLED
106 && mQueryStatus != TelephonyManager.CALL_WAITING_STATUS_DISABLED
107 && mQueryStatus != TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR) {
108 Log.d(LOG_TAG, "handleGetCallWaitingResponse: Exception:" + mQueryStatus);
109 int error = EXCEPTION_ERROR;
110 switch (mQueryStatus) {
111 case TelephonyManager.CALL_WAITING_STATUS_FDN_CHECK_FAILURE:
112 error = FDN_CHECK_FAILURE;
113 break;
114 default:
115 error = EXCEPTION_ERROR;
116 break;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700117 }
SongFerngWangebda2c52022-01-11 15:28:38 +0800118 if (mTcpListener != null) {
119 mTcpListener.onError(CallWaitingSwitchPreference.this, error);
120 }
121 } else if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR
122 || (mIsDuringUpdateProcess && (
123 mUpdateStatus != TelephonyManager.CALL_WAITING_STATUS_ENABLED
124 && mUpdateStatus != TelephonyManager.CALL_WAITING_STATUS_DISABLED))) {
125 Log.d(LOG_TAG, "handleSetCallWaitingResponse: Exception");
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700126 if (mTcpListener != null) {
fionaxue46e69f2017-04-27 14:32:46 -0700127 mTcpListener.onError(CallWaitingSwitchPreference.this, RESPONSE_ERROR);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700128 }
129 } else {
SongFerngWang0e767992021-03-31 22:08:45 +0800130 if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_ENABLED) {
131 setChecked(true);
132 } else {
133 setChecked(false);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700134 }
135 }
SongFerngWang0e767992021-03-31 22:08:45 +0800136 mIsDuringUpdateProcess = false;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700137 }
138 }
139}