内容
public void addNotification(StatusBarNotification notification, RankingMap ranking) {
if (DEBUG) Log.d(TAG, "addNotification key=" + notification.getKey());
/// M: for ALPS02303269. @{
boolean isInCallNotification = (notification.getPackageName() != null) &&
notification.getPackageName().equals("com.android.dialer");
/// @}
if (mUseHeadsUp && shouldInterrupt(notification)
/// M: for ALPS02303269. @{
&& !isInCallNotification
/// @}
) {
...........................;
}
.................................;
}
File: frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBar.java
/// M: turn off HeadsUp for dialer. @{
private final String PACKAGES_DIALER = "com.android.dialer";
/// @}
@Override
public void addNotification(StatusBarNotification notification, RankingMap ranking) {
/// M: turn off HeadsUp for dialer. @{
boolean belongsToDialer = PACKAGES_DIALER.equals(notification.getPackageName());
if (DEBUG) {
Log.d(TAG, "addNotification key=" + notification.getKey() +
", package=" + notification.getPackageName());
}
if (!belongsToDialer &&
/// @}
mUseHeadsUp && shouldInterrupt(notification)) {
if (DEBUG) Log.d(TAG, "launching notification in heads up mode");
Entry interruptionCandidate = new Entry(notification, null);
ViewGroup holder = mHeadsUpNotificationView.getHolder();
if (inflateViewsForHeadsUp(interruptionCandidate, holder)) {
// 1. Populate mHeadsUpNotificationView
mHeadsUpNotificationView.showNotification(interruptionCandidate);
// do not show the notification in the shade, yet.
return;
}
}
.................................;
}
[DESCRIPTION]
C2K项目上Conference Call的介绍。
[SOLUTION]
C2K项目上,Conference Call分为两种:
- Three-Party Call
- Call Waiting
两者是以第二通Call做区分的:
如果第二通Call是MO,也就是主动发起的Call,那么这种情况就是Three-Party Call。
如果第二通Call是MT,也就是接通一通来电,这种情况就属于Call Waiting。
对于Three-Party Call来说,在第二通call接通后,通话界面上只允许做Merge操作,而不允许做Swap操作(Spec规定),也不可以单独断掉任何一方。Merge之后,通话三方彼此可以听到任意一方的通话内容。如果按界面上的END,会挂掉所有电话。
注意:如果第二通call接通后,不做Merge的话,第一通call是无法切为Active,一直为Hold状态,因为这种情况下没有Swap功能。
对于Call Waiting,当接通来电后,只可以进行swap,也就是active call和hold call状态互相切换,而不可以做Merge操作,同样也不可以单独断掉任何一方。当按界面上的END,同样会挂掉所有电话。
想了解更多,可参考Spec:3GPP2 C.S0005-0
中的
Figure B-5. Simple Call Flow, Three-Party Calling Example
Figure B-6. Simple Call Flow, Call-Waiting Example
private void initAccountList() {
List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
if (sil == null) {
return;
}
for (SubscriptionInfo subscription : sil) {
Log.d(LOG_TAG, "initAccountList() MTK subscription.getDisplayName():" + subscription.getDisplayName());//Add log
Log.d(LOG_TAG, "initAccountList() MTK subscription.getNumber():" + subscription.getNumber());//Add log
CharSequence label = subscription.getDisplayName() +":" + subscription.getNumber() ;//MTK Edit for distinguish same operator
Intent intent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
SubscriptionInfoHelper.addExtrasToIntent(intent, subscription);
Preference accountPreference = new Preference(getActivity());
accountPreference.setTitle(label);
accountPreference.setIntent(intent);
mAccountList.addPreference(accountPreference);
}
}
Note:而亮屏状态下,长按蓝牙耳机的send key,则会弹出选择SIM卡的界面,如果选择则可以正常呼出;
而由于InCall和Telecom的交互结构所限,选卡界面在遇到onPause时必须断call,进而退出UI。这个过程发生得很快,用户就难以看到选卡界面先show出来,再消失掉这个过程。
【前提条件】插双卡
【操作步骤】
1.拨号盘,输入号码进行拨号
[Root Cause]
这个是Normal Design!
1、 目的是当前有active call的情况下 incoming call(waitting call) 不要播放来电铃声,而改用call waitting tone 提示用户即可。 设计的初衷是不要播铃声而disturb到当前正在进行的通话。
2、这里弹出选账号的界面,我们认为用户当前要进行一次MO的动作,这个时候MO出去的这通call是foreground call 优先级是最高的,所以我们把这种情况和InCall的情况一样的处理方式,这时候不会播放来电铃声,而只会播call waitting tone.
[SOLUTION]
如果贵司希望改进的话,可以参照如下solution:
Ringer.java的 startRingingorCallWaitting() 方法修改如下code:
......
}else if(foregroundCall != null){
//加入下边这一行
if(foregroundCall.getState() == CallState.PRE_DIAL_WAIT) { return ;}
......
}
......
[Android Version]
Android V2.3 (GB,GB2,GB3)
Android V4.0, 4.1,4.2,4.3,4.4(ICS,ICS2,JBJ,B2,JB3,JB5,KK1,KK1.MP1,KK1.MP3)
Android V5.0,5.1(L0,L1)
[DESCRIPTION]
拨号过程中显示“Unknown Caller”
[SOLUTION]
if (conn == null) {
// TODO
if (DBG) log(" Connnection is null");
return;
} else {
修改为
if (conn == null) {
// TODO
if (DBG) log(" Connnection is null");
return;
} else if (!TextUtils.isEmpty(number)) {//仅当号码不为空时才更新号码
case SuppCrssNotification.CRSS_CONNECTED_LINE_ID_PREST:
//Eidt for ALPS02140502
//if (mOriginalConnectionState == Call.State.ACTIVE) {
// notifyNumberUpdate(
// PhoneNumberUtils.stringFromStringAndTOA(noti.number, noti.type));
//}
//ALPS02140502 End
break;
default:
break;
2. GsmConnection.java(frameworks/opt/telephony/src/.../gsm)-->update()
update (DriverCall dc) {
GsmCall newParent;
boolean changed = false;
boolean wasConnectingInOrOut = isConnectingInOrOut();
boolean wasHolding = (getState() == GsmCall.State.HOLDING);
newParent = parentFromDCState(dc.state);
//Ignore dc.number and dc.name in case of a handover connection
if (mOrigConnection != null) {
if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null");
} else {
//Eidt for ALPS02140502
log(" mNumberConverted " + mNumberConverted);
log(" mAddress: " + mAddress);//Add Log
log(" dc.number: " + dc.number);//Add Log
if (mAddress.isEmpty()&& !equalsHandlesNulls(mAddress, dc.number) && (!mNumberConverted
|| !equalsHandlesNulls(mConvertedNumber, dc.number))) {
log("update: phone # changed!");
mAddress = dc.number;
changed = true;
}
}
//ALPS02140502 End
.......
}
三, L1版本修改如下:
case SuppCrssNotification.CRSS_CONNECTED_LINE_ID_PREST:
originalConnection = getOriginalConnectionWithState(phone, Call.State.ACTIVE);
connection = findConnection(originalConnection);
if (connection != null) {
if (forceConn == null || forceConn == connection) {
Log.v(LOG_TAG, "onCrssSuppServiceNotification() edit for disable CLIP!");
//connection.notifyNumberUpdate(PhoneNumberUtils.stringFromStringAndTOA(
// noti.number, noti.type));
}
} else {
if (forceConn == null) {
Log.v(LOG_TAG, "onCrssSuppServiceNotification()...connection is null");
addCrssnList(noti, phone);
}
}
break;