From 5c94b004ef382a5fe13f9d8f1f56d7740f1e954e Mon Sep 17 00:00:00 2001 From: donghongyu Date: Wed, 23 Oct 2024 17:10:54 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=8CUpdate=E3=80=8D=201=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=9D=80=E6=8E=89=E5=BA=94=E7=94=A8=E5=90=8E=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B?= =?UTF-8?q?=202=E3=80=81=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../main/java/com/mogo/skin/SkinManager.java | 49 ++++++++++++------- .../com/mogo/skin/utils/SkinPreference.java | 2 +- .../com/mogo/skin/utils/SkinResources.java | 17 ++++++- 4 files changed, 47 insertions(+), 23 deletions(-) diff --git a/gradle.properties b/gradle.properties index 92405ee..95bfcef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -58,4 +58,4 @@ MOGO_TELEMATIC_VERSION=1.4.7.42 # v2x MOGO_V2X_VERSION=1.4.7.42 # SKIN -MOGO_SKIN_VERSION=1.4.7.49.4-debug +MOGO_SKIN_VERSION=1.4.7.49.7-debug diff --git a/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java b/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java index 87dfb3f..0fa59f3 100644 --- a/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java +++ b/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java @@ -78,6 +78,7 @@ public class SkinManager extends Observable { Log.d(TAG, "加载皮肤路径:" + skinPath); if (TextUtils.isEmpty(skinPath)) { + Log.d(TAG, "还原默认皮肤包,开始换肤……"); //还原默认皮肤包 SkinPreference.getInstance().setSkin(""); SkinResources.getInstance().reset(); @@ -90,18 +91,18 @@ public class SkinManager extends Observable { // 加载指定目录下的皮肤 else { // 判断是否已经加载同样皮肤,如果已经加载则不再重复加载,防止因为重复加载导致ImageView之类的设置了src、background的控件被重制 - if (!SkinPreference.getInstance().getSkin().equals(skinPath)) { - try { - //反射创建AssetManager 与 Resource - AssetManager assetManager = AssetManager.class.newInstance(); - // 资源路径设置 目录或压缩包 - Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class); - addAssetPath.setAccessible(true); - int result = (int) addAssetPath.invoke(assetManager, skinPath); - if (result == 0) { - Log.e(TAG, "加载皮肤APK失败:" + skinPath); - } - + try { + Log.d(TAG, "切换的皮肤与之前不一样,开始换肤……"); + //反射创建AssetManager 与 Resource + AssetManager assetManager = AssetManager.class.newInstance(); + // 资源路径设置 目录或压缩包 + Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class); + addAssetPath.setAccessible(true); + int result = (int) addAssetPath.invoke(assetManager, skinPath); + if (result == 0) { + Log.e(TAG, "加载皮肤APK失败:" + skinPath); + } else { + Log.d(TAG, "加载皮肤APK成功:" + skinPath); // 获取当前Resources Resources resources = application.getResources(); //根据当前的设备显示器信息 与 配置(横竖屏、语言等) 创建Resources @@ -120,11 +121,9 @@ public class SkinManager extends Observable { setChanged(); //通知观察者 notifyObservers(); - } catch (Exception e) { - e.printStackTrace(); } - } else { - Log.e(TAG, "皮肤已存在,开始换肤……"); + } catch (Exception e) { + e.printStackTrace(); } } } @@ -147,7 +146,7 @@ public class SkinManager extends Observable { File skinFile = skin.getSkinFile(theme); // 判断是否存在 if (skinFile.exists()) { - Log.e(TAG, "皮肤已存在,开始换肤……skin=" + skin); + Log.d(TAG, "皮肤已存在,开始换肤……skin=" + skin); SkinManager.getInstance().loadSkin(skin.getPathLocal()); return; } @@ -178,6 +177,8 @@ public class SkinManager extends Observable { //皮肤包的md5校验 防止下载文件损坏(但是会减慢速度。从数据库查询已下载皮肤表数据库中保留md5字段) if (TextUtils.equals(SkinUtils.getSkinMD5(skinFile), skin.md5)) { Log.d(TAG, "DownloadManager 校验成功,修改文件名。"); + // 加载指定皮肤包 + SkinManager.getInstance().loadSkin(skin.getPathLocal()); // 校验文件签名没问题后删除其他主题 deleteFilesExcept(themeDirectory, skin.getSkinFileName()); } else { @@ -188,7 +189,6 @@ public class SkinManager extends Observable { } catch (Exception e) { e.printStackTrace(); } - SkinManager.getInstance().loadSkin(skin.getPathLocal()); } @Override @@ -202,7 +202,6 @@ public class SkinManager extends Observable { public void onAlreadyDownloading(String url) { // 处理重复下载的情况 Log.w(TAG, "DownloadManager onAlreadyDownloading url=" + url); - } }; @@ -229,4 +228,16 @@ public class SkinManager extends Observable { } } } + + public static boolean renameFile(File oldFile, String newFilePath) { + File newFile = new File(newFilePath); + + // 如果旧文件不存在,则直接返回 false + if (!oldFile.exists()) { + return false; + } + + // 尝试重命名文件 + return oldFile.renameTo(newFile); + } } diff --git a/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinPreference.java b/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinPreference.java index 52c1601..e891657 100644 --- a/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinPreference.java +++ b/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinPreference.java @@ -37,7 +37,7 @@ public class SkinPreference { } public String getSkin() { - return mPref.getString(KEY_SKIN_PATH, null); + return mPref.getString(KEY_SKIN_PATH, ""); } } \ No newline at end of file diff --git a/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java b/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java index e0c885b..df74ed8 100644 --- a/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java +++ b/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java @@ -21,11 +21,14 @@ public class SkinResources { private static SkinResources instance; + //APP原始 resources + private Resources mAppResources; + //皮肤包 resources private Resources mSkinResources; private String mSkinPkgName; + private boolean isDefaultSkin = true; - private Resources mAppResources; private SkinResources(Context context) { mAppResources = context.getResources(); @@ -58,7 +61,10 @@ public class SkinResources { isDefaultSkin = TextUtils.isEmpty(pkgName) || resources == null; } - + /** + * 1.通过原始app中的resId(R.color.XX)获取到自己的 名字 + * 2.根据名字和类型获取皮肤包中的ID + */ public int getIdentifier(int resId) { if (isDefaultSkin) { return resId; @@ -133,6 +139,11 @@ public class SkinResources { return totBuffer; } + /** + * 输入主APP的ID,到皮肤APK文件中去找到对应ID的颜色值 + * @param resId + * @return + */ public int getColor(int resId) { if (isDefaultSkin) { return mAppResources.getColor(resId); @@ -160,6 +171,8 @@ public class SkinResources { if (isDefaultSkin) { return mAppResources.getDrawable(resId); } + //通过 app的resource 获取id 对应的 资源名 与 资源类型 + //找到 皮肤包 匹配 的 资源名资源类型 的 皮肤包的 资源 ID int skinId = getIdentifier(resId); if (skinId == 0) { return mAppResources.getDrawable(resId);