微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 关于L版本来电响铃与UI同步的Workround方法

关于L版本来电响铃与UI同步的Workround方法

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
SW Version:L0、L1
由于Google 默认设计中来电铃声一路和UI启动一路是分开跑,通常情形下UI一路的启动要比响铃更
耗时间;所以会存在来电界面起来比铃声稍晚的用户体验,尤其是在灭屏时候的来电。下面的
Workround方法给出了L版本上对于此问题的优化方案。
[SOLUTION]
InCallPresenter.java
a.
......
import android.os.powerManager;// Add For synchronize ringer and UI
b.
private PowerManager pm = null;
private boolean isInCallActivityStop = false;
c. playIncomingCallRingtone(android.telecom.Call call)
/**
* Add For synchronize ringer and UI
*
* @param call
*/
public void playIncomingCallRingtone(android.telecom.Call call){
Log.i(this, "playIncomingCallRingtone()");
TelecomAdapter.getInstance().playIncomingCallRingtone(call);
}
d. public PowerManager getPowerManager(){
if(pm == null){
pm = (PowerManager)getSystEMService(Context.POWER_SERVICE);
}
return pm;
}
e. onIncomingCall(Call call)
public void onIncomingCall(Call call) {
Log.i(this, " onIncomingCall set isInCallActivityStop = false ");
isInCallActivityStop = false;
InCallState newState = startOrFinishUi(InCallState.INCOMING);
InCallState oldState = mInCallState;
Log.i(this, "hone switching state: " + oldState + " -> " + newState);
mInCallState = newState;
//begin Add For synchronize ringer and UI
Log.d(this, "onIncomingCall the screen is on ? ----- " +
getPowerManager().isScreenOn());
if(getPowerManager().isScreenOn()){
Log.d(this, "onIncomingCall the screen is on!");
playIncomingCallRingtone(call.getTelecommCall());
}
//end Add For synchronize ringer and UI
for (IncomingCallListener listener : mIncomingCallListeners) {
listener.onIncomingCall(oldState, mInCallState, call);
}
}
f. public void setInCallActivityStop (boolean isStop ){
Log.d(this, " setInCallActivityStop : " + isStop);
isInCallActivityStop = isStop;
}
g. public boolean getInCallActivityStop ( ){
Log.d(this, " getInCallActivityStop: " + isInCallActivityStop);
return: isInCallActivityStop;
}
TelecomAdapter.javaplayIncomingCallRingtone(android.telecom.Call
call)
//Add For synchronize ringer and UI
void playIncomingCallRingtone(android.telecom.Call call) {
if (mPhone != null) {
Log.d(this, "playIncomingCallRingtone() Call:" + call);
if (call != null) {
call.playIncomingCallRingtone();
} else {
Log.e(this, "error playIncomingCallRingtone, call is null");
}
} else {
Log.e(this, "error playIncomingCallRingtone, mPhone is null");
}
}
Call.java(php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks\base\telecomm\java\android\telecom)
playIncomingCallRingtone()
//Add For synchronize ringer and UI
public void playIncomingCallRingtone() {
mInCallAdapter.playIncomingCallRingtone();
}
InCallAdapter.java(frameworks\base\telecomm\java\android\telecom)
playIncomingCallRingtone()
/**
* Add For synchronize ringer and UI
*
*/
public void playIncomingCallRingtone() {
try {
mAdapter.playIncomingCallRingtone();
} catch (RemoteException e) {
}
}
IInCallAdapter.aidl(frameworks\base\telecomm\java\com\android\intern
al\telecom)
void playIncomingCallRingtone();
InCallAdapter.java(packages\services\telecomm\src\com\android\server
\telecom)
1>
//Add For synchronize ringer and UI
private static final int MSG_PLAY_INCOMING_RINGTONE = 1008;
2> InCallAdapterHandlerhandleMessage()
case MSG_PLAY_INCOMING_RINGTONE:
mCallsManager.playIncomingCallRingtone();
break;
3>
@Override
public void playIncomingCallRingtone() {
mHandler.obtainMessage(MSG_PLAY_INCOMING_RINGTONE).sendToTarget();
}
CallsManager.Java playIncomingCallRingtone()
//Add For synchronize ringer and UI
public void playIncomingCallRingtone(){
Log.v(this, "playIncomingCallRingtone()");
mRinger.startRingingOrCallWaiting();//Public
}
Ringer.javapackages\services\telecomm\src\com\android\server\telecom
onForegroundCallChanged()
@Override
public void onForegroundCallChanged(Call oldForegroundCall, Call
newForegroundCall) {
if (mRingingCalls.contains(oldForegroundCall) ||
mRingingCalls.contains(newForegroundCall)) {
// Add For synchronize ringer and UI
Log.v(this, "synchronize onForegroundCallChanged() ");
//End
//Original code
//updateRinging();
}
}
InCallactivity.java
a.
......
import android.os.PowerManager;// Add For synchronize ringer and UI
b.
protected void onCreate(Bundle icicle) {
Log.d(this, "onCreate()... this = " + this);
super.onCreate(icicle);
......
//begin Add For synchronize ringer and UI
Log.d(this, "AAAscreen is on ? ----- " +
InCallPresenter.getInstance().getPowerManager().isScreenOn());
//end Add For synchronize ringer and UI
Log.d(this, "onCreate(): exit");
}
c.
protected void onResume() {
......
InCallPresenter.getInstance().lightOnScreenForSmartBook();
//begin Add For synchronize ringer and UI
final PowerManager pm = InCallPresenter.getInstance().getPowerManager();
final Call call = CallList.getInstance().getIncomingCall();
Log.d(this, "onResum " + call);
if(call != null){
boolean isInCallActivityStop =
InCallPresenter.getInstance().getInCallActivityStop();
Log.d(this, "BBBscreen is on ? ----- " + pm.isScreenOn());
Log.d(this, "BBBscreen call.getState(): " + call.getState() + "
isInCallActivityStop: " + isInCallActivityStop);
if((call.getState() == Call.State.CALL_WAITING)
||((call.getState() == Call.State.INCOMING)&&(pm.isScreenOn() &&
isInCallActivityStop))){
InCallPresenter.getInstance().playIncomingCallRingtone(call.getTelecommCal
l());
InCallPresenter.getInstance().setInCallActivityStop(false);
}
}
//end Add For synchronize ringer and UI
}
e.
protected void onStop() {
Log.d(this, "onStop()...");
……………
super.onStop();
InCallPresenter.getInstance().setInCallActivityStop(true);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top