双卡手机点击漫游警告跳转到漫游卡网络设置的实现

博客补档,首次编辑完成于 2016-08-23 11:20。

#问题(需求):
Android M的双卡手机上,当手机中插入漫游卡的时候,状态栏会弹出一个漫游警告(Title “Data roaming” ContentText
“You’ve lost data connectivity because you left your home network with data roaming turned off”)的Notification,然后点击这个漫游警告之后跳到网络设置(MobileNetworkSetting)默认卡1的设置,不会跳到漫游卡对应的设置。现在的需求是,无论漫游卡在卡1还是卡2,点了漫游警告的Notification都要跳到漫游卡的网络设置页。
#分析:
首先这不是一个bug,是系统本身就没实现这个功能。如果要实现这个功能,那么我就要在合适的地方来增加一个参数来确定漫游卡的位置。因为是卡的位置,所以用SloId来确定位置是比较好的。
#需求实现:
##漫游警告显示的原理
因为之前研究过漫游警告的代码,所以比较清楚这个警告弹出来的条件,代码块如下:
PhoneGlobal.java

    // The "data disconnected due to roaming" notification is shown
    // if (a) you have the "data roaming" feature turned off, and
    // (b) you just lost data connectivity because you're roaming.
    boolean disconnectedDueToRoaming =
            !phone.getDataRoamingEnabled()
            && PhoneConstants.DataState.DISCONNECTED.equals(state)
            && Phone.REASON_ROAMING_ON.equals(
                intent.getStringExtra(PhoneConstants.STATE_CHANGE_REASON_KEY));
    if (mDataDisconnectedDueToRoaming != disconnectedDueToRoaming) {
        mDataDisconnectedDueToRoaming = disconnectedDueToRoaming;
        mHandler.sendEmptyMessage(disconnectedDueToRoaming
                ? EVENT_DATA_ROAMING_DISCONNECTED : EVENT_DATA_ROAMING_OK);
    }

然后调用NotificationMgr.java中的方法显示漫游警告

case EVENT_DATA_ROAMING_DISCONNECTED:
                    notificationMgr.showDataDisconnectedRoaming();

可以看到方法里是没有带参数的,也就是说显示通知的时候不区分SIM卡的位置。
下面是具体的发出通知的代码,构建Notification,填充信息,notify显示Notification。
NotificationMgr.java

/**
     * Shows the "data disconnected due to roaming" notification, which
     * appears when you lose data connectivity because you're roaming and
     * you have the "data roaming" feature turned off.
     */
    /* package */ void showDataDisconnectedRoaming() {
        if (DBG) log("showDataDisconnectedRoaming()...");

        // "Mobile network settings" screen / dialog
        Intent intent = new Intent(mContext, com.android.phone.MobileNetworkSettings.class);//点击通知后跳转的目标Activity
        PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0, intent, 0);

        final CharSequence contentText = mContext.getText(R.string.roaming_reenable_message);

        final Notification.Builder builder = new Notification.Builder(mContext)
                .setSmallIcon(android.R.drawable.stat_sys_warning)
                .setContentTitle(mContext.getText(R.string.roaming))
                .setColor(mContext.getResources().getColor(R.color.dialer_theme_color))
                .setContentText(contentText);

        List<UserInfo> users = mUserManager.getUsers(true);
        for (int i = 0; i < users.size(); i++) {
            final UserInfo user = users.get(i);
            if (user.isManagedProfile()) {
                continue;
            }
            UserHandle userHandle = user.getUserHandle();
            builder.setContentIntent(userHandle.isOwner() ? contentIntent : null);
            final Notification notif =
                    new Notification.BigTextStyle(builder).bigText(contentText).build();
            mNotificationManager.notifyAsUser(
                    null /* tag */, DATA_DISCONNECTED_ROAMING_NOTIFICATION, notif, userHandle);
        }
    }

我们要做的就是在上述代码中添加一个可以区分漫游卡的变量。
##功能实现的代码
首先在判断到因漫游而断开数据链接的时候把对应的SIM卡的SlotId记录下来

        if (mDataDisconnectedDueToRoaming != disconnectedDueToRoaming) {
            int defaultDataSubId = SubscriptionManager.getDefaultDataSubId();//默认数据卡的SubId
            roamingSlotId = SubscriptionManager.getSlotId(defaultDataSubId);//用数据卡的subId获得它的SlotId
            mDataDisconnectedDueToRoaming = disconnectedDueToRoaming;
            mHandler.sendEmptyMessage(disconnectedDueToRoaming
                    ? EVENT_DATA_ROAMING_DISCONNECTED : EVENT_DATA_ROAMING_OK);
        }

之后将roamingSlotId传入showDataDisconnectedRoaming()方法,然后把这个值用putExtra的方式放入目标Activity的Intent里面。

        Intent intent = new Intent(mContext, com.android.phone.MobileNetworkSettings.class);
        intent.putExtra(ROAMING_SLOT_ID, roamingSlotId);
        PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);//注意这个flag也要一起修改

最后在目标Activity启动的时候,在onCreate()方法里取出这个值,并设置显示对应漫游卡的tab
MobileNetworkSettings.java

        int roamingSlotId = getIntent().getIntExtra(ROAMING_SLOT_ID, -1);
        if (roamingSlotId != -1) {
            mTabHost.setCurrentTab(roamingSlotId);
        }

done。
已提交给CM https://review.lineageos.org/#/c/140632/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值