blob: d208ec3e3a04306380eb72529468cca42c6ec92e [file] [log] [blame]
/*
* Copyright (C) 2020 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.services.telephony;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class MmiCodeUtil {
//***** Constants
// Supp Service codes from TS 22.030 Annex B
//Called line presentation
static final String SC_CLIP = "30";
static final String SC_CLIR = "31";
// Call Forwarding
static final String SC_CFU = "21";
static final String SC_CFB = "67";
static final String SC_CFNRy = "61";
static final String SC_CFNR = "62";
static final String SC_CF_All = "002";
static final String SC_CF_All_Conditional = "004";
// Call Waiting
static final String SC_WAIT = "43";
// Call Barring
static final String SC_BAOC = "33";
static final String SC_BAOIC = "331";
static final String SC_BAOICxH = "332";
static final String SC_BAIC = "35";
static final String SC_BAICr = "351";
static final String SC_BA_ALL = "330";
static final String SC_BA_MO = "333";
static final String SC_BA_MT = "353";
// Supp Service Password registration
static final String SC_PWD = "03";
// PIN/PIN2/PUK/PUK2
static final String SC_PIN = "04";
static final String SC_PIN2 = "042";
static final String SC_PUK = "05";
static final String SC_PUK2 = "052";
// See TS 22.030 6.5.2 "Structure of the MMI"
static Pattern sPatternSuppService = Pattern.compile(
"((\\*|#|\\*#|\\*\\*|##)(\\d{2,3})(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*))?)?)?)?#)(.*)");
/* 1 2 3 4 5 6 7 8 9 10 11 12
1 = Full string up to and including #
2 = action (activation/interrogation/registration/erasure)
3 = service code
5 = SIA
7 = SIB
9 = SIC
10 = dialing number
*/
static final int MATCH_GROUP_SERVICE_CODE = 3;
public static final String BUTTON_CLIR_KEY = "button_clir_key";
public static final String BUTTON_CW_KEY = "button_cw_key";
public static final String CALL_FORWARDING_KEY = "call_forwarding_key";
public static final String CALL_BARRING_KEY = "call_barring_key";
//***** Public Class methods
public static String getMmiServiceCode(String dialString) {
Matcher m;
String ret = null;
m = sPatternSuppService.matcher(dialString);
if (m.matches()) {
ret = makeEmptyNull(m.group(MATCH_GROUP_SERVICE_CODE));
}
return ret;
}
private static String makeEmptyNull(String s) {
if (s != null && s.length() == 0) return null;
return s;
}
static boolean isServiceCodeCallForwarding(String sc) {
return sc != null &&
(sc.equals(SC_CFU)
|| sc.equals(SC_CFB) || sc.equals(SC_CFNRy)
|| sc.equals(SC_CFNR) || sc.equals(SC_CF_All)
|| sc.equals(SC_CF_All_Conditional));
}
static boolean isServiceCodeCallBarring(String sc) {
return sc != null &&
(sc.equals(SC_BAOC)
|| sc.equals(SC_BAOIC) || sc.equals(SC_BAOICxH)
|| sc.equals(SC_BAIC) || sc.equals(SC_BAICr)
|| sc.equals(SC_BA_ALL) || sc.equals(SC_BA_MO)
|| sc.equals(SC_BA_MT));
}
static boolean isPinPukCommand(String sc) {
return sc != null && (sc.equals(SC_PIN) || sc.equals(SC_PIN2)
|| sc.equals(SC_PUK) || sc.equals(SC_PUK2));
}
public static String getSuppServiceKey(String dialString) {
String sc = getMmiServiceCode(dialString);
if (sc != null && sc.equals(SC_CLIP)) {
return "";
} else if (sc != null && sc.equals(SC_CLIR)) {
return BUTTON_CLIR_KEY;
} else if (isServiceCodeCallForwarding(sc)) {
return CALL_FORWARDING_KEY;
} else if (isServiceCodeCallBarring(sc)) {
return CALL_BARRING_KEY;
} else if (sc != null && sc.equals(SC_PWD)) {
return "";
} else if (sc != null && sc.equals(SC_WAIT)) {
return BUTTON_CW_KEY;
} else if (isPinPukCommand(sc)) {
return "";
} else {
return null;
}
}
}