2018年2月4日星期日

LG V20 副屏日期汉化 & 开启天气显示


      LG V20 副屏中的日期显示是英文,并且也不符合我们的语言习惯(例如 11:00 AM 应为 上午 11:00),因此我们需要为它添加多语言并纠正日期格式。

      程序路径:\system\priv-app\LGSignBoard\LGSignBoard.apk  (副屏)

      分析程序后得出,获取日期的部分在 \smali\com\lge\signboard\widget\LGDateTimeView.smali 中,调用 LGLocaleDayAndDateFormat.smaligetDayAndDate 函数对系统属性中的地区进行判断,若地区为欧洲各国,则根据运营商来提供不同显示方式,若地区为开放地区,则获取资源文件中的翻译,若都不是,则进入 getDayInEnglish 显示英文日期。

      因此修改最初引用这个日期的函数,让其不去调用判断,而是调用 getDayInStrings 直接获取资源文件中的翻译:

      将 LGDateTimeView.smali
 invoke-static {v4}, Lcom/lge/signboard/widget/LGLocaleDayAndDateFormat;->getDayAndDate(Landroid/content/Context;)Ljava/lang/String;
      getDayAndDate 改为 getDayInStrings,与此同时 getDayAndDate 和 getDayInEnglish 不再需要,便可安全删除。

      切记,要把 getDayInStrings  .method private (私人)改为 .method public(公共);

      别忘了在 values-zh-rCN 中添加:


      我想你一定注意到了,LG V20 的副屏很容易产生残影,因此可以通过添加空格(转义符:& #160;)改变每天日期的位置来缓解。

      若仍觉得“星期”后面的“日期”非常碍眼的话,可以删除以下代码(橘色部分):

    :pswitch_0
    new-instance v0, Ljava/lang/StringBuilder;
    invoke-direct {v0}, Ljava/lang/StringBuilder;->()V
    invoke-virtual {p0}, Landroid/content/Context;->getResources()Landroid/content/res/Resources;
    move-result-object v1
    const v2, 0x7f05000f  # 资源文件中的星期
    invoke-virtual {v1, v2}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;
    move-result-object v1
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v0
    const-string v1, " "   添加空格
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v0
    new-instance v1, Ljava/util/Date;  获取日期中的天
    invoke-direct {v1}, Ljava/util/Date;->()V
    invoke-virtual {v1}, Ljava/util/Date;->getDate()I
    move-result v1
    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
    move-result-object v0
    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    move-result-object v0
    goto :goto_0

      完成后还要再移动 \res\layout\basic_information_main.xml 中 com.lge.signboard.widget.AMPMClock (上午下午显示)的位置到时间之前,如果不满意间距也可以调整一下则大功告成。

      最后是开启天气显示:

      判断是否显示天气的部分在 \smali\com\lge\signboard\widget\WeatherIconView.smali 中:

.method public setVisibility(I)V
    .locals 2  # 局部变量个数
    .param p1, "visibility"    # I 
    .prologue  代码开始位置
    const-string v0, "pplus"  # 取字符串 LG V10
    const-string v1, "ro.product.device" 
    invoke-static {v1}, Landroid/os/SystemProperties;->get(Ljava/lang/String;)Ljava/lang/String;  # 获取型号
    move-result-object v1   将上个方法调用后的结果赋值给 v1
    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z # 比较
    move-result v0   将比较结果赋值给 v0

    if-nez v0, :cond_0     如果结果不等于0则跳转至 cond_0

    const/16 v0, 0x8     v0 赋值为8

    invoke-super {p0, v0}, Landroid/widget/ImageView;->setVisibility(I)V
# 输出不显示天气
    :goto_0
    return-void  结束
    :cond_0
    invoke-super {p0, p1}, Landroid/widget/ImageView;->setVisibility(I)V
                                                                                             # 输出显示天气 
    goto :goto_0
.end method
      事实上天气显示是 LG V10 独有功能,因此将 pplus 改为 elsa(V20)即可开启天气显示。

修改后

      注:此更改适用于 UX5(程序版本 5.x) UX6(程序版本 6.x) 系列。