blob: 01dd3b2044251fe8abec53d88e03fbd555b8a459 [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;
Santos Cordon7d4ddf62013-07-10 11:58:08 -07004import static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
5
6import android.content.Context;
Santos Cordon7d4ddf62013-07-10 11:58:08 -07007import android.os.Handler;
8import android.os.Message;
fionaxue46e69f2017-04-27 14:32:46 -07009import android.preference.SwitchPreference;
SongFerngWang0e767992021-03-31 22:08:45 +080010import android.telephony.TelephonyManager;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070011import android.util.AttributeSet;
12import android.util.Log;
13
Aravind Sreekumarc94dea82018-04-10 15:34:32 -070014import com.android.internal.telephony.Phone;
15
SongFerngWang0e767992021-03-31 22:08:45 +080016import java.util.concurrent.Executor;
17import java.util.concurrent.Executors;
18
fionaxue46e69f2017-04-27 14:32:46 -070019public class CallWaitingSwitchPreference extends SwitchPreference {
20 private static final String LOG_TAG = "CallWaitingSwitchPreference";
Santos Cordon7d4ddf62013-07-10 11:58:08 -070021 private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
22
23 private final MyHandler mHandler = new MyHandler();
Andrew Lee2b36ba22014-11-05 17:08:49 -080024 private Phone mPhone;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070025 private TimeConsumingPreferenceListener mTcpListener;
SongFerngWang0e767992021-03-31 22:08:45 +080026 private Executor mExecutor;
27 private TelephonyManager mTelephonyManager;
28 private boolean mIsDuringUpdateProcess = false;
29 private int mUpdateStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
30 private int mQueryStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070031
fionaxue46e69f2017-04-27 14:32:46 -070032 public CallWaitingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
Santos Cordon7d4ddf62013-07-10 11:58:08 -070033 super(context, attrs, defStyle);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070034 }
35
fionaxue46e69f2017-04-27 14:32:46 -070036 public CallWaitingSwitchPreference(Context context, AttributeSet attrs) {
37 this(context, attrs, com.android.internal.R.attr.switchPreferenceStyle);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070038 }
39
fionaxue46e69f2017-04-27 14:32:46 -070040 public CallWaitingSwitchPreference(Context context) {
Santos Cordon7d4ddf62013-07-10 11:58:08 -070041 this(context, null);
42 }
43
Andrew Lee2b36ba22014-11-05 17:08:49 -080044 /* package */ void init(
45 TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
46 mPhone = phone;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070047 mTcpListener = listener;
SongFerngWang0e767992021-03-31 22:08:45 +080048 mExecutor = Executors.newSingleThreadExecutor();
49 mTelephonyManager = getContext().getSystemService(
50 TelephonyManager.class).createForSubscriptionId(phone.getSubId());
Santos Cordon7d4ddf62013-07-10 11:58:08 -070051
52 if (!skipReading) {
SongFerngWang0e767992021-03-31 22:08:45 +080053 Log.d(LOG_TAG, "init getCallWaitingStatus");
54 mTelephonyManager.getCallWaitingStatus(mExecutor, this::queryStatusCallBack);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070055 if (mTcpListener != null) {
56 mTcpListener.onStarted(this, true);
57 }
58 }
59 }
60
SongFerngWang0e767992021-03-31 22:08:45 +080061 private void queryStatusCallBack(int result) {
62 Log.d(LOG_TAG, "queryStatusCallBack: CW state " + result);
63 mQueryStatus = result;
64 mHandler.sendMessage(mHandler.obtainMessage(MyHandler.MESSAGE_UPDATE_CALL_WAITING));
65 }
66
67 private void updateStatusCallBack(int result) {
68 Log.d(LOG_TAG, "updateStatusCallBack: CW state " + result + ", and re get");
69 mUpdateStatus = result;
70 mTelephonyManager.getCallWaitingStatus(mExecutor, this::queryStatusCallBack);
71 }
72
Santos Cordon7d4ddf62013-07-10 11:58:08 -070073 @Override
74 protected void onClick() {
75 super.onClick();
SongFerngWang0e767992021-03-31 22:08:45 +080076 mTelephonyManager.setCallWaitingEnabled(isChecked(), mExecutor, this::updateStatusCallBack);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070077 if (mTcpListener != null) {
SongFerngWang0e767992021-03-31 22:08:45 +080078 mIsDuringUpdateProcess = true;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070079 mTcpListener.onStarted(this, false);
80 }
81 }
82
83 private class MyHandler extends Handler {
SongFerngWang0e767992021-03-31 22:08:45 +080084 static final int MESSAGE_UPDATE_CALL_WAITING = 0;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070085
86 @Override
87 public void handleMessage(Message msg) {
88 switch (msg.what) {
SongFerngWang0e767992021-03-31 22:08:45 +080089 case MESSAGE_UPDATE_CALL_WAITING:
90 updateUi();
Santos Cordon7d4ddf62013-07-10 11:58:08 -070091 break;
92 }
93 }
94
SongFerngWang0e767992021-03-31 22:08:45 +080095 private void updateUi() {
Santos Cordon7d4ddf62013-07-10 11:58:08 -070096 if (mTcpListener != null) {
SongFerngWang0e767992021-03-31 22:08:45 +080097 if (mIsDuringUpdateProcess) {
fionaxue46e69f2017-04-27 14:32:46 -070098 mTcpListener.onFinished(CallWaitingSwitchPreference.this, false);
Santos Cordon7d4ddf62013-07-10 11:58:08 -070099 } else {
fionaxue46e69f2017-04-27 14:32:46 -0700100 mTcpListener.onFinished(CallWaitingSwitchPreference.this, true);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700101 }
102 }
103
SongFerngWang0e767992021-03-31 22:08:45 +0800104 if (mIsDuringUpdateProcess && (
105 mUpdateStatus == TelephonyManager.CALL_WAITING_STATUS_NOT_SUPPORTED
106 || mUpdateStatus
107 == TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR)) {
108 Log.d(LOG_TAG, "handleSetCallWaitingResponse: Exception");
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700109 if (mTcpListener != null) {
SongFerngWang0e767992021-03-31 22:08:45 +0800110 mTcpListener.onError(CallWaitingSwitchPreference.this, EXCEPTION_ERROR);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700111 }
SongFerngWang0e767992021-03-31 22:08:45 +0800112 } else if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_NOT_SUPPORTED
113 || mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR) {
114 Log.d(LOG_TAG, "handleGetCallWaitingResponse: Exception");
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700115 if (mTcpListener != null) {
fionaxue46e69f2017-04-27 14:32:46 -0700116 mTcpListener.onError(CallWaitingSwitchPreference.this, RESPONSE_ERROR);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700117 }
118 } else {
SongFerngWang0e767992021-03-31 22:08:45 +0800119 if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_ENABLED) {
120 setChecked(true);
121 } else {
122 setChecked(false);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700123 }
124 }
SongFerngWang0e767992021-03-31 22:08:45 +0800125 mIsDuringUpdateProcess = false;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700126 }
127 }
128}