Android N 与Android M InCallUI代码对比(基于CM)

Android 4.2 InCallScreen UI浅析 InCallScreen是什么 本文来自http://blog.youkuaiyun.com/yihongyuelan 转载请务必注明出处 本文以MTK平台Android 4.2为分析对象,MTK在原生的基础之上添加了许多自己的东西,因此个别地方跟原生代码以及QCOM的代码不同,请读者知悉。 在电话的呼出流程中,我们最后需要按下拨号键,才能将电话拨打出去,那么在按下拨号键之后 阅读详情

今天是2016.11.30,google已经开始推送android 7.1了。

我们都知道其实7.0早就放出来了,那为什么我现在才写7.1的源码阅读分析呢?

因为等了高通两个月N的代码,他们迟迟不给我们。那我只有看CM的了。


下面内容以CM 14.1和CM 13.0(对应android 6.0和android7.1)的InCallUI相比较,解读一下这两个版本之间的差异。都是以当前最新的代码为基础比较的,所以很可能这个CM 13.0上有些代码,你们的代码还没有包含进去。

不会写的很详细,写的都是我之前版本关注过的地方。

最明显的就是InCallUI的目录换位置了,其实我们都知道。之前InCallUI之前都是编译到Dialerapk里面的,而且也是泡在dialer进程里面的,那现在把InCallUI移动到Dialer目录下也是合情合理的。

新增java文件一堆。

先不管是干嘛的,后面已有代码更改 部分用到的话再看。

左侧CM 14.1,右侧CM 13.0。


AnswerPresenter.java

中很多通过mCalls得到SubId和PhoneId的地方被换成了QtiCallUtils,估计是QCOM改的。



QtiCallUtils.java

可以看到用的是反射的方法得到subId,PhoneId等,而从提交记录来看修改是for DSDA。

    static int getPhoneId(int subId) {
        try {
            Class c = Class.forName("android.telephony.SubscriptionManager");
            Method m = c.getMethod("getPhoneId",new Class[]{int.class});
            int phoneId = (Integer)m.invoke(null, subId);
            if (phoneId >= InCallServiceImpl.sPhoneCount || phoneId < 0) {
                phoneId = 0;
            }
            Log.d (LOG_TAG, "phoneid:" + phoneId);
            return phoneId;
        } catch (Exception e) {
            Log.e(LOG_TAG, " ex: " + e);
        }
        return 0;
    }

    static int getSubId(int phoneId) {
        try {
            Class c = Class.forName("android.telephony.SubscriptionManager");
            Method m = c.getMethod("getSubId",new Class[]{int.class});
            int subId[] = (int[])m.invoke(null, phoneId);
            Log.d (LOG_TAG, "getSubId:" + subId[0]);
            if (subId != null && subId.length > 0) {
                return subId[0];
            } else {
                Log.e(LOG_TAG, "subId not valid: " + subId);
            }
        } catch (Exception e) {
            Log.e(LOG_TAG, " ex: " + e);
        }
        return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    }

    static void switchToActiveSub(int subId) {
        try {
            IExtTelephony mExtTelephony = getIExtTelephony();
            Log.d(LOG_TAG, "switchToActiveSub, mExtTelephony:" + mExtTelephony);
            mExtTelephony.switchToActiveSub(subId);
        } catch (RemoteException ex) {
            Log.e(LOG_TAG, "Exception : " + ex);
        } catch (NullPointerException ex) {
            Log.e(LOG_TAG, "Exception : " + ex);
        }
    }

    static int getPhoneCount(Context context) {
        TelephonyManager tm = null;
        try {
            Class c = Class.forName("android.telephony.TelephonyManager");
            Method m = c.getMethod("from",new Class[]{Context.class});
            tm = (TelephonyManager)m.invoke(null, context);
        } catch (Exception e) {
            Log.e(LOG_TAG, " ex: " + e);
        }
        if (tm != null) {
            return tm.getPhoneCount();
        } else {
            Log.e(LOG_TAG, "tm is null" );
            return 1;
        }
    }

    static Boolean dsdaEnabled = null;
    static boolean isDsdaEnabled() {
        try {
            if (dsdaEnabled == null) {
                IExtTelephony mExtTelephony = getIExtTelephony();
                Log.d(LOG_TAG, "isDsdaEnabled, mExtTelephony:" + mExtTelephony);
                dsdaEnabled = mExtTelephony.isDsdaEnabled();
                return dsdaEnabled;
            }
        } catch (RemoteException ex) {
            Log.e(LOG_TAG, "Exception : " + ex);
        } catch (NullPointerException ex) {
            Log.e(LOG_TAG, "Exception : " + ex);
        }
        return (dsdaEnabled == null) ? false : dsdaEnabled;
    }

Call.java

黑名单功能。可以看出一个趋势,CM在归属地和黑名单这俩功能上越做越好了。归属地这个有点属于中国特色功能,也是前段时间才完善的。


另外Call.java里面把Telecomm都改成了Telecom,然后一些名为Modify的变量和方法改成了Request,比如 getModifyToVideoState()->getRequestedVideoState().新增 isIncomingConfCall()


CallButtonFragment.java

新增BUTTON_DOWNGRADE_TO_AUDIO看来是要把modify差分成upgrade和downgrade,与downgrade相对应的ImageButton是mChangeToVoiceButton。

CallButtonPresenter.java

mergeClicked()方法里对参与者数量加了判断,达到最大值后不再允许合并了。


新增changeToVideo()方法,之前升降级由同一个button负责




CallCardPresenter.java

加了个归属地相关的方法


因为实现AudioModeListener,所以加了下面几个方法


哦?把音量增强(VB)的按钮加进来了?

还真是



CallList.java

新增一个方法

    public Call getSecondActiveCall() {
        return getCallWithState(Call.State.ACTIVE, 1);
    }

对了,record 录音功能的代码调整了一下

InCallActivity.java

增加dismiss SIM选择框的逻辑(这个功能我踩过大坑!QAQ)


这里下面的InCallLoeBatteryListener应该是处理视频电话中手机低电的情况,这块我不熟,就不多说了

InCallAudioManager.java

新增一个方法来控制接通视频电话后audio的状态


InCallPresenter.java

在onUpgradeToVideoRequest(Call call, int videoState)中曾加了wakeUpScreen();点亮屏幕的操作,之前是在 InCallVideoCallCallback.java中的onSessionModifyRequestReceived()调用InCallPresenter.getInstance().wakeUpScreen();实现的。

answerIncomingCall拆分成两个方法,调用了 InCallAudioManager.getInstance().onAnswerIncomingCall(call, videoState);控制audio。


增加一个无参数的declineUpgradeRequest(),避免context为空的情况(不止注释里面写的情况,我今天就解了这么一个bug)

    /*package*/
    void declineUpgradeRequest() {
        // Pass mContext if InCallActivity is destroyed.
        // Ex: When user pressed back key while in active call and
        // then modify request is received followed by MT call.
        declineUpgradeRequest(mInCallActivity != null ? mInCallActivity : mContext);
    }

看了代码的话可以发现,接听,拒接,升级,都有两个同名的方法,参数都差一个。

StatusBarNotifier.java

这个厉害了,新增获得VoWiFi通话质量的方法。目前看是在显示Heads-up Notification的时候才调用,那接通电话以后呢?


vowifi_in_call_fair.xml


VideoCallFragment.java

新增长按点击事件

        /**
         * Handles a user long pressing on the surface, which is the trigger to show the
         * picture mode pop up alert dialog
         *
         * @param View The view receiving the long press.
         */
        @Override
        public boolean onLongClick(View v) {
            Log.d(this, "onLongClick:");
            return mPresenter.onLongClick();
        }

VideoCallPresenter.java

enterVideoMode()更名为adjustVideoMode()

长按事件的处理逻辑,目前还没见过这个现象,不知道具体效果是什么。

    /**
     * The function is called to create and display picture mode alert dialog when user long
     * presses on the video call screen
     */
     public boolean onLongClick() {
        // Don't show the alert if either the adb property "persist.disable.pip.mode" is not set
        // or if we are supposed to hide preview for conference calls
        if ((SystemProperties.getInt(PROP_DISABLE_VIDEOCALL_PIP_MODE, 0) == 0) ||
            shallHidePreview(isConfCall(), mCurrentVideoState)) {
            return false;
        }
        mPictureModeHelper.create(mContext);
        mPictureModeHelper.show();
        return true;
    }

新增shallHidePreview(),根据运营商判断在视频会议电话中是否要隐藏自己这边的预览视频,Reliance在android M上就有隐藏的这个要求,高通平台还需要底层NV值有对应的修改

    /**
     * Hide preview window if it is a VT conference call
     */
    private boolean shallHidePreview(boolean isConf, int videoState) {
        return VideoProfile.isBidirectional(videoState) && isConf
                && QtiImsExtUtils.shallHidePreviewInVtConference(mContext);
    }

新增onSessionModificationStateChange()方法,配合其他代码实现在收到视频升级请求时,在点击接受之前预览自己的视频。

    @Override
    public void onSessionModificationStateChange(Call call, int sessionModificationState) {
        Log.d(this, "onSessionModificationStateChange : sessionModificationState = " +
                sessionModificationState + " call:" + call);
        if (call != mPrimaryCall ||
                (sessionModificationState == Call.SessionModificationState.NO_REQUEST)) {
            return;
        }
        if (!VideoProfile.isTransmissionEnabled(call.getRequestedVideoState())) {
           call.setRequestedVideoState(VideoProfile.STATE_AUDIO_ONLY);
           return;
        }

        if (sessionModificationState != Call.SessionModificationState.WAITING_FOR_RESPONSE) {
            call.setRequestedVideoState(VideoProfile.STATE_AUDIO_ONLY);
        }

        checkForVideoStateChange(call);

        if (sessionModificationState == Call.SessionModificationState.REQUEST_REJECTED
                || sessionModificationState == Call.SessionModificationState.REQUEST_FAILED
                || sessionModificationState ==
                Call.SessionModificationState.UPGRADE_TO_VIDEO_REQUEST_TIMED_OUT) {
             mCurrentVideoState = call.getVideoState();
        }
    }


Android7.0 InCallUI 源码分析 Android7.0InCallUI源码分析 AndroidManifest.xml 源码路径:packages\apps\Dialer\InCallUI 注:android7.0之前packages\apps\InCallUI InCallUI\AndroidManifest.xml <manifest xmlns:android="http://schemas.... 阅读详情

相关推荐

DSDS/DSDA/DR-DSDS/DR-DSDA场景介绍和关键Log分析

关于DSDS/DSDA/DR-DSDS/DR-DSDA几种模式区别 DSDS模式,一张卡通话,另一张卡不能收到来电,也不能上网; DSDA模式,一张卡通话,另一张可以收到来电,也可以上网。接通另一张卡的来电,第一张卡通话会断开; DR-DSDS模式,一张卡通话,另一张卡能收到来电,但不能上网。接通另一张来电,第一张卡通话会断开; DR-DSDA模式,一张卡通话,另一张卡能收到来电,也可以上网,接通另一张卡来电,第一张卡通话不会断开;

weixin_51894735的博客 9732

android m n 版本,Android M、N适配踩坑

我们上个月才决定开始进行Android M、N的集中适配,发现很多问题,在此一起进行总结。首先我们把buildToolsVersion和compileSdkVersion都改为24,相关support的lib也都改为24.*,以此放开了适配,遇上了很多坑。这里不是一个大而全的适配方案,仅仅是一个小app(好奇心日报)的适配总结。Android N的适配主要为组内同事操刀,所以文内部分内容源于该同事...

weixin_39797693的博客 477

android_N项目(高通平台 CTS修改总结

android_N项目(高通平台)CTS修改总结 第一个android_N项目的CTS修改总结 1: 对于wifi only版本可能发现的问题: android.telephony.cts.TelephonyManagerTest#testGetPhoneCount junit.framework.AssertionFailedError: Phone count should be 0

qq_30427341的博客 1万+

Android Dialer源码分析之IncallUI中SpeakerButton点击后显示音频选择器

Android Dialer源码分析之list列表呈现

csdnxialei的博客 1260

Android4.4InCallUI源码(Phone)

基于Android4.4来电界面源码(原来的Phone),不可独立运行

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7490

Android N 通话界面_InCallActivity

本流程图基于MTK平台 Android 7.0,普通来电,本流程只作为沟通学习使用本篇博客主要来看看整个 IncallUI 界面的容器 InCallActivityInCallActivity启动流程我们知道正常情况下 InCallActivity 的启动分两种情况,MO 和 MT 我们就以 MO 为例来看看它的启动流程(MT其实也差不多) 最关键的两个地方:1.//InCallControlle

Yigit_dev的博客 7820

一个测试工程师走进一家酒吧……

一个测试工程师走进一家酒吧,要了一杯啤酒;一个测试工程师走进一家酒吧,要了一杯咖啡;一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;一个测试工程师走进一家酒吧,要了-1 杯啤酒;一个测试...

字节跳动技术团队官方博客 4889

android5.1 incall ui,android 6.0 InCallService

总结InCallService是UI和telecom的桥梁。通过InCallService来完成各种call的更新与操作。启动CallsManager在生成新的Call实例后,会通过回调InCallController的onCallAdded函数,这个时候如果InCallService没有被启动,InCallController会去启动InCallService,如果已经绑定了,那么直接调用inc...

weixin_29982199的博客 507

告别裸机SPI!用HAL库和CubeMX重新玩转STM32与MAX6675温度传感器

本文详细介绍了如何利用STM32CubeMX和HAL库高效驱动MAX6675温度传感器,实现稳定可靠的热电偶温度监测系统。通过图形化配置SPI接口和封装专用驱动函数,开发者可以快速构建嵌入式温度测量方案,适用于工业控制、物联网设备等多种应用场景。

weixin_42525632的博客 234

Mac查看以太网信息,IP地址,查看配置桥接网络,使得虚拟机和本机ping通--linux系统part

4. 在本机的终端中使用ping命令,查看是否能够ping通虚拟机系统,如下图所示已经ping通。3-查看IP为192.168.1.244,还可以看到一些具体信息,如TCP/IP,DNS等;2-打开centos,进入管理员root模式(使用su命令加上输入管理员密码)然后使用ifconfig命令查看端口地址,如下所示为192.168.1.248。3-在虚拟机内使用ping命令,测试是否和网络连通,如下图所示已经ping通。打开虚拟机设置-点击网络适配器-选择桥接网络。1-打开设置,选择网络。

m0_65485230的博客 1549

拨号流程分析(第三篇)

本文基于Android 8.0 InCallService服务的响应过程InCallService服务的响应过程1. OnBind服务被绑定的响应方法2. InCallService的onBind流程3. setlnCallAdapter设置Adapter4. setlnCallAdapter流程图(InCallService类)5. addCall增加主动拨号Outgoing Call6. l...

wcsbhwy的博客 1204

Win32逆向必备:X32dbg中窗口句柄查看与消息断点的高级用法

本文深入探讨了X32dbg在Win32逆向工程中的高级应用,重点解析窗口句柄查看与消息断点的实战技巧。通过MFC程序逆向案例,详细介绍了如何利用窗口句柄层次结构、条件断点设置及消息映射表定位等技术,快速捕获关键业务逻辑,提升逆向分析效率。

nginx7reverse的博客 1017

api接口总结

INetworkManagementService为NetworkManagementService,需使用services.jar。需要使用telephony-ext.jar ,使用系统app或者Settings添加广播接收器。

qq_37960503的博客 430

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 189

安卓7.0+抓包难题:雷电模拟器9.0+Charles系统证书安装全攻略

HTTPS协议通过SSL/TLS加密保障网络通信安全,其核心机制依赖于证书信任链。在Android系统中,自7.0版本起,谷歌收紧了证书信任策略,默认仅信任系统预置的CA证书,这直接导致了传统抓包方法失效。理解这一原理对于移动开发、测试及安全研究至关重要,它揭示了应用层安全策略与系统底层机制的关联。通过将用户证书安装至系统信任区,可以突破此限制,实现HTTPS流量的解密与分析。这一技术在App调试、接口测试、安全审计等场景中具有广泛的应用价值。本文以雷电模拟器9.0和Charles抓包工具为例,详细演示了如

weixin_42521843的博客 280

Android 12 13 系统设置单双卡

在/LA.UM_QSSI11/device/qcom$ grep -rn "persist.radio.multisim.config"persist.radio.multisim.config dsds // 双卡双待。persist.radio.multisim.config dsda // 双卡双通。persist.radio.multisim.config ssss // 单卡。重新编译AP文件,烧录重启。

HYL512的专栏 1580

UNet 改进(22):结合Transformer结构

保留了UNet的经典编码器-解码器结构在瓶颈层使用Transformer替代传统的卷积层采用跳跃连接保持空间细节信息使用双卷积块(DoubleConv)作为基础构建模块。

2401_82355416的博客 775

双卡双待手机DDS切换功能介绍

双卡双待手机有DSDS(DualSim Dual Standby)和DSDA(Dual SIM dual active)方案,早期产品使用DSDA方案比较多,随着多模、多频段、CA、MIMO等技术出现,硬件射频复杂度大大增加,再加上双卡双通的实际使用场景并不多,DSDS就成为了目前市场的主流方案。...

weixin_51894735的博客 4553

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android代码双卡切换,Android双卡模式改为单卡模式

方法一. 直接改设备配置文件:在/system/build.prop中有如下字段:persist.radio.multisim.config=ss #dsds表示双卡双待,dsda表示双卡双通,ss表示单卡ro.telephony.sim.count=1 #表示sim卡数量persist.gemini.sim_num=1修改后再push到系统重启即可。方法二. 修改系统后重新刷机:在device....

weixin_36372623的博客 2486

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android Notification动态显示通话时间

基于android N MTK释放的源码 本文主要讲解如何在 IncallUI 的notification 上面不停地更新显示当前已通话多长时间,从而达到和incallUI通话界面上的通话时间一致。主要思路 我们需要知道通话建立时的时间,即call 的状态从 INCOMING或者DIALING 转变成ACTIVE的时候 时间每秒钟都会发生变化,所以我们就需要不停的更新notification的界面

Yigit_dev的博客 2847

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android N Call 状态分析

本流程图基于MTK平台 Android 7.0,普通电话,本流程只作为沟通学习使用通过前面关于 MO 和 MT 的分析和学习,我们大致了解了整个Phone的两个主要流程,今天我们要了解的是整个流程中 Call 的状态是如何变化的。这里有参考到 4.4 的状态分析,有些区别。DriverCall.State当 modem 发生状态改变时,它会通过 RILC 和 RILJ 将状态上报到我们 framew

Yigit_dev的博客 4641

android 判断双卡手机号码,android开发中如何判断手机中存在的sim卡数量?

1.Android M及以上版本:TelephonyManager manager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) {int numSlots = manager.getPhoneCount();}...

weixin_33887804的博客 935

通话中UI结构分析

InCallActivity 通话UI就是packages/apps/InCallUI/src/com/android/incallui/InCallActivity.java 代码在InCallUI中不过AndroidManifest确在packages/apps/Dialer/AndroidManifest.xml中,这个是因为InCallUI和Dialer目前编译成一个apk,详细可见A

firedancer0089的专栏 2705

Android N MO流程 并与Android M MO比较

--2017.12.08--csdn不知咋搞的,文中有些内容看不见了(尤其是我加了说明的部分),得重新“上色”,增加维护成本。。。写在前面的话:现在时间是2016.12.16,下面所有涉及到的代码都是基于最新CM 14.1。代码比较部分比较的是今年5月分的CM 13.0。开始写这篇博客的时候我还没有正式的跑过一次CM 14.1的IMS MO流程,所以后面可能会不定时更新/纠正下面的内容。正式开始之...

十橙 4827

android n 自定义权限,Android : M 与 N 的权限管理

从 M 开始,permission 分为Normal permissionRuntime permissionNormal permission 直接在 manifest 里声明就可以用了。android.permission.ACCESS_LOCATION_EXTRA_COMMANDSandroid.permission.ACCESS_NETWORK_STATEandroid.permissio...

weixin_31205717的博客 194
上一篇: 使用dumpsys查看android系统服务信息
下一篇: Android N MO流程 并与Android M MO比较
十橙
博客等级 码龄24年 312粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值