From a2954273e31c73e4e5d1db2b66ddd9e5167b8f20 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:57:48 +0800 Subject: [PATCH 01/21] Update Fix File Update README.md File and Fix decompilation error by TW Server. --- README.md | 4 ++-- merge_build.sh | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bf76cdb..2c55acd 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ 本项目仅用于学习和研究,请在遵守相关法律法规的前提下使用本项目,若您违规使用使用本项目,那么所导致的一切后果将由您本人承担。 - **风险警告**:使用mod可能涉及未知风险,如果您坚持使用,那么您将承担可能会造成的任何后果,包括但不限于您的游戏账号被封禁 -- **登录问题**:重新打包的APK签名与官方版本不同,可能导致第三方授权登录失败。请优先使用二维码或验证码登录。 +- **登录问题**:重新打包的APK签名与官方版本不同,可能导致第三方授权登录失败。请优先使用二维码或验证码登录。或使用此[方案](https://github.com/JMBQ/azurlane/issues/155#issue-3786864655)解决 --- @@ -35,6 +35,7 @@ - **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载
+ @@ -75,7 +76,6 @@ - **华为服**:启动界面卡顿,疑似由于签名验证问题导致HMS Core初始化失败。 --- - ## 📚 致谢 1. [JMBQ/azurlane](https://github.com/JMBQ/azurlane) diff --git a/merge_build.sh b/merge_build.sh index 992cfb4..1816b1f 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -92,7 +92,14 @@ DOWNLOAD_APKTOOL() { local FILENAME="apktool.jar" echo "正在下载Apktool..." - local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest") + # 新增判断:修复TW在新版Apktool反编译 Androidmanifest.xml 时报错 + if [ "${GAME_SERVER}" == "TW" ]; then + API_URL="https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/v2.12.1" + else + API_URL="https://api.github.com/repos/${OWNER}/${REPO}/releases/latest" + fi + + local API_RESPONSE=$(curl -s "${API_URL}") local DOWNLOAD_LINK=$(echo "${API_RESPONSE}" | jq -r '.assets[] | select(.name | endswith(".jar")) | .browser_download_url' | head -n 1) if [ -z "${DOWNLOAD_LINK}" ] || [ "${DOWNLOAD_LINK}" == "null" ]; then echo "无法找到Apktool下载链接" @@ -114,9 +121,46 @@ DOWNLOAD_MOD_MENU() { local REPO="azurlane" local FILENAME="MOD_MENU.rar" - echo "正在下载MOD补丁..." + echo "正在下载旧版MOD补丁..." + local API_OLD_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/3.2.0") local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest") local JMBQ_VERSION=$(echo "${API_RESPONSE}" | jq -r '.tag_name') + + # 修改:查找name中含有.rar的文件,而不是直接使用第一个assets + local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1) + if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then + # 修改:查找name中含有.zip的文件,避免后缀不一致导致的无法获取链接 + local FILENAME="MOD_MENU.zip" + local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".zip")) | .browser_download_url' | head -n 1) + if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then + echo "无法获取MOD Patch文件下载链接" + exit 1 + fi + fi + + curl -L -o "${DOWNLOAD_DIR}/${FILENAME}" "${DOWNLOAD_OLD_LINK}" + if [ $? -eq 0 ]; then + echo "旧版补丁下载成功!文件保存至:${DOWNLOAD_DIR}/${FILENAME}" + else + echo "旧版补丁下载失败,请重试" + exit 1 + fi + + if command -v 7z &> /dev/null; then + 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ" + else + echo "错误: 未找到7z工具,无法解压!" + exit 1 + fi + + if [ $? -ne 0 ]; then + echo "错误: 解压 ${FILENAME} 失败!" + exit 1 + fi + + echo "正在下载MOD补丁..." + # 恢复原命名防止逻辑报错 + FILENAME="MOD_MENU.rar" # 修改:查找name中含有.rar的文件,而不是直接使用第一个assets local DOWNLOAD_LINK=$(echo "${API_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1) @@ -139,7 +183,7 @@ DOWNLOAD_MOD_MENU() { fi if command -v 7z &> /dev/null; then - 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ" + 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ/assets/arch" else echo "错误: 未找到7z工具,无法解压!" exit 1 From 094671de4fcfb00bf5be408826040ffb2a74f2d1 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:58:42 +0800 Subject: [PATCH 02/21] Fix warning --- .github/workflows/main.yml | 6 +++--- .github/workflows/xapk.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2261021..fb37105 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,14 +26,14 @@ jobs: # 步骤2:设置 Java JDK - name: Setup Java JDK - uses: actions/setup-java@v3.3.0 + uses: actions/setup-java@v4 with: - java-version: "17" + java-version: "18" distribution: "adopt" # 步骤3:设置 Android SDK - name: Set up Android SDK - uses: android-actions/setup-android@v3 + uses: android-actions/setup-android@v4 # 步骤4:安装 build-tools - name: Install build-tools diff --git a/.github/workflows/xapk.yml b/.github/workflows/xapk.yml index 4067738..c3a37d9 100644 --- a/.github/workflows/xapk.yml +++ b/.github/workflows/xapk.yml @@ -23,13 +23,13 @@ jobs: uses: actions/checkout@v4 - name: Setup Java JDK - uses: actions/setup-java@v3.3.0 + uses: actions/setup-java@v4 with: - java-version: "17" + java-version: "18" distribution: "adopt" - name: Set up Android SDK - uses: android-actions/setup-android@v3 + uses: android-actions/setup-android@v4 - name: Install build-tools run: | From a70ec1087c258a0bf139c78561f0705a6f5b2a7a Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Tue, 14 Apr 2026 05:01:57 +0800 Subject: [PATCH 03/21] Add bilibili.svg --- images/bilibili.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/bilibili.svg diff --git a/images/bilibili.svg b/images/bilibili.svg new file mode 100644 index 0000000..832e4d2 --- /dev/null +++ b/images/bilibili.svg @@ -0,0 +1 @@ + \ No newline at end of file From 845b33f6421952fc977d613fda74cc21333e4de3 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Tue, 14 Apr 2026 05:52:30 +0800 Subject: [PATCH 04/21] Update download message for MOD patch --- merge_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/merge_build.sh b/merge_build.sh index 1816b1f..b64aa58 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -121,7 +121,7 @@ DOWNLOAD_MOD_MENU() { local REPO="azurlane" local FILENAME="MOD_MENU.rar" - echo "正在下载旧版MOD补丁..." + echo "正在下载MOD补丁..." local API_OLD_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/3.2.0") local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest") local JMBQ_VERSION=$(echo "${API_RESPONSE}" | jq -r '.tag_name') From 4dd677730dc189e3b83853df46f1b2193c90af55 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 2 May 2026 18:03:14 +0800 Subject: [PATCH 05/21] Revise installation instructions and add note on tmp.link Updated warning section and added a note about using tmp.link for direct link downloads. --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2c55acd..b0dadd6 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,11 @@ ## 各渠道服安装包官方下载地址 若您有一定的动手能力,请自行fork本仓库,手动运行工作流来获取对应的APK -⚠️⚠️⚠️ 注意!!! -- **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载 +### ⚠️⚠️⚠️ 注意!!! +- **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载。网盘建议使用[钛盘](https://tmp.link)来获取下载直链 + +#### 💢💢💢 碎碎念!!! +~~已被中心化网盘的一次性直链限制整麻了。点击下载并获取直链的同时,直链直接报废,导致频繁构建失败。~~
From 65d2cf73e2547a42d2bf89924ee7969fb11aa895 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Thu, 7 May 2026 15:04:24 +0800 Subject: [PATCH 06/21] Revise APK download instructions in README Updated download instructions for OPPO, 4399, vivo, and bilibili channels. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b0dadd6..2a269ae 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ 若您有一定的动手能力,请自行fork本仓库,手动运行工作流来获取对应的APK ### ⚠️⚠️⚠️ 注意!!! -- **OPPO**和**4399**渠道服请自行下载安装包,上传网盘后获取直链下载。网盘建议使用[钛盘](https://tmp.link)来获取下载直链 +- **OPPO**,**4399**,**vivo**,**bilibili**,**应用宝**渠道服请自行下载安装包,上传网盘后获取直链下载。网盘建议使用[钛盘](https://tmp.link)来获取下载直链 #### 💢💢💢 碎碎念!!! ~~已被中心化网盘的一次性直链限制整麻了。点击下载并获取直链的同时,直链直接报废,导致频繁构建失败。~~ @@ -70,6 +70,7 @@ --- ## 预览 ![Screenshot_2025-11-23-09-17-23-266_com bilibili azurlane](https://github.com/user-attachments/assets/3d57e120-2444-4a6d-8e0c-afb44f76a9b8) +DD116534BE113DC47D7DA3D253167650 --- ## 🚧 已知问题 From fc2cdf966483003ab92ba7d018e22600b55c2ef6 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 20:37:40 +0800 Subject: [PATCH 07/21] Implement MTDataFilesProvider injection Add a function to inject MTDataFilesProvider into AndroidManifest.xml. --- merge_build.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/merge_build.sh b/merge_build.sh index b64aa58..1d4daac 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -356,6 +356,61 @@ PATCH_APK() { echo "补丁完成。" } +# 注入MT文件提供器 +INJECT_MT_PROVIDER() { + echo "正在注入 MTDataFilesProvider..." + local TARGET_DIR="${DOWNLOAD_DIR}/DECODE_Output" + local MANIFEST_FILE="${TARGET_DIR}/AndroidManifest.xml" + + # 检查清单文件是否存在,防止路径错误 + if [ ! -f "${MANIFEST_FILE}" ]; then + echo "错误:找不到 ${MANIFEST_FILE},解包可能失败或路径不匹配!" + return 1 + fi + + # 1. 自动获取包名(如果是XAPK则使用预设,如果是APK则从清单提取) + local CURRENT_PKG="" + if [ "${BUILD_TYPE}" = "XAPK" ]; then + CURRENT_PKG="${GAME_BUNDLE_ID}" + else + CURRENT_PKG=$(grep -oP 'package="\K[^"]+' "${MANIFEST_FILE}") + fi + + if [ -z "${CURRENT_PKG}" ]; then + echo "无法识别包名,取消注入" + return 1 + fi + echo "识别到目标包名: ${CURRENT_PKG}" + + # 2. 拷贝 Smali 文件 (保持 bin/mt/file/content/ 结构) + mkdir -p "${TARGET_DIR}/smali" + if [ -d "MTDataFilesProvider/bin" ]; then + cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali/" + echo "Smali 文件拷贝完成" + else + echo "未找到 MTDataFilesProvider/bin 目录,请检查路径" + return 1 + fi + + # 3. 修改 AndroidManifest.xml + if grep -q "MTDataFilesProvider" "${MANIFEST_FILE}"; then + echo "已存在 MT 组件,跳过修改" + else + local PROVIDER_XML="" + local ACTIVITY_XML="" + + sed -i "s||${PROVIDER_XML}${ACTIVITY_XML}|g" "${MANIFEST_FILE}" + echo "AndroidManifest.xml 注入完成" + + # 二次校验是否注入成功 + if grep -q "MTDataFilesProvider" "${MANIFEST_FILE}"; then + echo "AndroidManifest.xml 注入成功!" + else + echo "AndroidManifest.xml 注入失败!" + fi + fi +} + # 打包APK BUILD_APK() { local OUTPUT_APK @@ -547,6 +602,7 @@ main() { DECODE_APK DELETE_ORGINAL_APK PATCH_APK + INJECT_MT_PROVIDER BUILD_APK OPTIMIZE_AND_SIGN_APK GET_GAME_VERSION @@ -560,6 +616,7 @@ main() { DECODE_APK DELETE_ORGINAL_APK PATCH_APK + INJECT_MT_PROVIDER BUILD_APK OPTIMIZE_AND_SIGN_APK GET_GAME_VERSION From d2a9d58385896d66c43e05b9ade50b978796765e Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 20:43:51 +0800 Subject: [PATCH 08/21] Create MTDataFilesProvider.smali --- .../bin/mt/file/content/MTDataFilesProvider.smali | 1 + 1 file changed, 1 insertion(+) create mode 100644 MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali diff --git a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali @@ -0,0 +1 @@ + From f8a7e035e6e313066f93dda782c5758d93bdf5d5 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 20:44:11 +0800 Subject: [PATCH 09/21] Add files via upload --- .../mt/file/content/MTDataFilesProvider.smali | 1875 +++++++++++++++++ .../content/MTDataFilesWakeUpActivity.smali | 26 + 2 files changed, 1901 insertions(+) create mode 100644 MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali diff --git a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali index 8b13789..aac4d07 100644 --- a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali +++ b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesProvider.smali @@ -1 +1,1876 @@ +# classes3.dex +.class public Lbin/mt/file/content/MTDataFilesProvider; +.super Landroid/provider/DocumentsProvider; + + +# static fields +.field public static final g:[Ljava/lang/String; + +.field public static final h:[Ljava/lang/String; + + +# instance fields +.field public b:Ljava/lang/String; + +.field public c:Ljava/io/File; + +.field public d:Ljava/io/File; + +.field public e:Ljava/io/File; + +.field public f:Ljava/io/File; + + +# direct methods +.method public static constructor ()V + .registers 8 + + const-string v0, "root_id" + + const-string v1, "mime_types" + + const-string v2, "flags" + + const-string v3, "icon" + + const-string v4, "title" + + const-string v5, "summary" + + const-string v6, "document_id" + + filled-new-array/range {v0 .. v6}, [Ljava/lang/String; + + move-result-object v0 + + sput-object v0, Lbin/mt/file/content/MTDataFilesProvider;->g:[Ljava/lang/String; + + const-string v1, "document_id" + + const-string v2, "mime_type" + + const-string v3, "_display_name" + + const-string v4, "last_modified" + + const-string v5, "flags" + + const-string v6, "_size" + + const-string v7, "mt_extras" + + filled-new-array/range {v1 .. v7}, [Ljava/lang/String; + + move-result-object v0 + + sput-object v0, Lbin/mt/file/content/MTDataFilesProvider;->h:[Ljava/lang/String; + + return-void +.end method + +.method public constructor ()V + .registers 1 + + invoke-direct {p0}, Landroid/provider/DocumentsProvider;->()V + + return-void +.end method + +.method public static a(Ljava/io/File;)Z + .registers 6 + + invoke-virtual {p0}, Ljava/io/File;->isDirectory()Z + + move-result v0 + + if-eqz v0, :cond_3b + + const/4 v0, 0x0 + + :try_start_7 + invoke-virtual {p0}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object v1 + + invoke-static {v1}, Landroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat; + + move-result-object v1 + + iget v1, v1, Landroid/system/StructStat;->st_mode:I + :try_end_11 + .catch Landroid/system/ErrnoException; {:try_start_7 .. :try_end_11} :catch_1e + + const v2, 0xf000 + + and-int/2addr v1, v2 + + const v2, 0xa000 + + if-ne v1, v2, :cond_1c + + const/4 v1, 0x1 + + goto :goto_23 + + :cond_1c + :goto_1c + const/4 v1, 0x0 + + goto :goto_23 + + :catch_1e + move-exception v1 + + invoke-virtual {v1}, Ljava/lang/Throwable;->printStackTrace()V + + goto :goto_1c + + :goto_23 + if-nez v1, :cond_3b + + invoke-virtual {p0}, Ljava/io/File;->listFiles()[Ljava/io/File; + + move-result-object v1 + + if-eqz v1, :cond_3b + + array-length v2, v1 + + const/4 v3, 0x0 + + :goto_2d + if-ge v3, v2, :cond_3b + + aget-object v4, v1, v3 + + invoke-static {v4}, Lbin/mt/file/content/MTDataFilesProvider;->a(Ljava/io/File;)Z + + move-result v4 + + if-nez v4, :cond_38 + + return v0 + + :cond_38 + add-int/lit8 v3, v3, 0x1 + + goto :goto_2d + + :cond_3b + invoke-virtual {p0}, Ljava/io/File;->delete()Z + + move-result p0 + + return p0 +.end method + +.method public static c(Ljava/io/File;)Ljava/lang/String; + .registers 2 + + invoke-virtual {p0}, Ljava/io/File;->isDirectory()Z + + move-result v0 + + if-eqz v0, :cond_9 + + const-string p0, "vnd.android.document/directory" + + return-object p0 + + :cond_9 + invoke-virtual {p0}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object p0 + + const/16 v0, 0x2e + + invoke-virtual {p0, v0}, Ljava/lang/String;->lastIndexOf(I)I + + move-result v0 + + if-ltz v0, :cond_2a + + add-int/lit8 v0, v0, 0x1 + + invoke-virtual {p0, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String; + + move-result-object p0 + + invoke-virtual {p0}, Ljava/lang/String;->toLowerCase()Ljava/lang/String; + + move-result-object p0 + + invoke-static {}, Landroid/webkit/MimeTypeMap;->getSingleton()Landroid/webkit/MimeTypeMap; + + move-result-object v0 + + invoke-virtual {v0, p0}, Landroid/webkit/MimeTypeMap;->getMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p0 + + if-eqz p0, :cond_2a + + return-object p0 + + :cond_2a + const-string p0, "application/octet-stream" + + return-object p0 +.end method + + +# virtual methods +.method public final attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V + .registers 6 + + invoke-super {p0, p1, p2}, Landroid/provider/DocumentsProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V + + invoke-virtual {p1}, Landroid/content/Context;->getPackageName()Ljava/lang/String; + + move-result-object p2 + + iput-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {p1}, Landroid/content/Context;->getFilesDir()Ljava/io/File; + + move-result-object p2 + + invoke-virtual {p2}, Ljava/io/File;->getParentFile()Ljava/io/File; + + move-result-object p2 + + iput-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File; + + invoke-virtual {p2}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object p2 + + const-string v0, "/data/user/" + + invoke-virtual {p2, v0}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z + + move-result v0 + + if-eqz v0, :cond_3a + + new-instance v0, Ljava/io/File; + + new-instance v1, Ljava/lang/StringBuilder; + + const-string v2, "/data/user_de/" + + invoke-direct {v1, v2}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V + + const/16 v2, 0xb + + invoke-virtual {p2, v2}, Ljava/lang/String;->substring(I)Ljava/lang/String; + + move-result-object p2 + + invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p2 + + invoke-direct {v0, p2}, Ljava/io/File;->(Ljava/lang/String;)V + + iput-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File; + + :cond_3a + const/4 p2, 0x0 + + invoke-virtual {p1, p2}, Landroid/content/Context;->getExternalFilesDir(Ljava/lang/String;)Ljava/io/File; + + move-result-object p2 + + if-eqz p2, :cond_47 + + invoke-virtual {p2}, Ljava/io/File;->getParentFile()Ljava/io/File; + + move-result-object p2 + + iput-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File; + + :cond_47 + invoke-virtual {p1}, Landroid/content/Context;->getObbDir()Ljava/io/File; + + move-result-object p1 + + iput-object p1, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File; + + return-void +.end method + +.method public final b(Ljava/lang/String;Z)Ljava/io/File; + .registers 9 + + iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {p1, v0}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z + + move-result v0 + + const-string v1, " not found" + + if-eqz v0, :cond_ac + + iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {v0}, Ljava/lang/String;->length()I + + move-result v0 + + invoke-virtual {p1, v0}, Ljava/lang/String;->substring(I)Ljava/lang/String; + + move-result-object v0 + + const-string v2, "/" + + invoke-virtual {v0, v2}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z + + move-result v2 + + const/4 v3, 0x1 + + if-eqz v2, :cond_21 + + invoke-virtual {v0, v3}, Ljava/lang/String;->substring(I)Ljava/lang/String; + + move-result-object v0 + + :cond_21 + invoke-virtual {v0}, Ljava/lang/String;->isEmpty()Z + + move-result v2 + + const/4 v4, 0x0 + + if-eqz v2, :cond_29 + + return-object v4 + + :cond_29 + const/16 v2, 0x2f + + invoke-virtual {v0, v2}, Ljava/lang/String;->indexOf(I)I + + move-result v2 + + const/4 v5, -0x1 + + if-ne v2, v5, :cond_35 + + const-string v2, "" + + goto :goto_40 + + :cond_35 + const/4 v5, 0x0 + + invoke-virtual {v0, v5, v2}, Ljava/lang/String;->substring(II)Ljava/lang/String; + + move-result-object v5 + + add-int/2addr v2, v3 + + invoke-virtual {v0, v2}, Ljava/lang/String;->substring(I)Ljava/lang/String; + + move-result-object v2 + + move-object v0, v5 + + :goto_40 + const-string v3, "data" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v3 + + if-eqz v3, :cond_50 + + new-instance v4, Ljava/io/File; + + iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File; + + invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + goto :goto_8b + + :cond_50 + const-string v3, "android_data" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v3 + + if-eqz v3, :cond_64 + + iget-object v3, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File; + + if-eqz v3, :cond_64 + + new-instance v4, Ljava/io/File; + + iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File; + + invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + goto :goto_8b + + :cond_64 + const-string v3, "android_obb" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v3 + + if-eqz v3, :cond_78 + + iget-object v3, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File; + + if-eqz v3, :cond_78 + + new-instance v4, Ljava/io/File; + + iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File; + + invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + goto :goto_8b + + :cond_78 + const-string v3, "user_de_data" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v0 + + if-eqz v0, :cond_8b + + iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File; + + if-eqz v0, :cond_8b + + new-instance v4, Ljava/io/File; + + iget-object v0, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File; + + invoke-direct {v4, v0, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + :cond_8b + :goto_8b + if-eqz v4, :cond_a2 + + if-eqz p2, :cond_a1 + + :try_start_8f + invoke-virtual {v4}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object p2 + + invoke-static {p2}, Landroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat; + :try_end_96 + .catch Ljava/lang/Exception; {:try_start_8f .. :try_end_96} :catch_97 + + goto :goto_a1 + + :catch_97 + new-instance p2, Ljava/io/FileNotFoundException; + + invoke-virtual {p1, v1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw p2 + + :cond_a1 + :goto_a1 + return-object v4 + + :cond_a2 + new-instance p2, Ljava/io/FileNotFoundException; + + invoke-virtual {p1, v1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw p2 + + :cond_ac + new-instance p2, Ljava/io/FileNotFoundException; + + invoke-virtual {p1, v1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw p2 +.end method + +.method public final call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle; + .registers 13 + + const-string v0, "message" + + const-string v1, "result" + + const-string v2, "Unsupported method: " + + invoke-super {p0, p1, p2, p3}, Landroid/provider/DocumentsProvider;->call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle; + + move-result-object p2 + + if-eqz p2, :cond_d + + return-object p2 + + :cond_d + const-string p2, "mt:" + + invoke-virtual {p1, p2}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z + + move-result p2 + + if-nez p2, :cond_17 + + const/4 p1, 0x0 + + return-object p1 + + :cond_17 + new-instance p2, Landroid/os/Bundle; + + invoke-direct {p2}, Landroid/os/Bundle;->()V + + const/4 v3, 0x0 + + :try_start_1d + const-string v4, "uri" + + invoke-virtual {p3, v4}, Landroid/os/Bundle;->getParcelable(Ljava/lang/String;)Landroid/os/Parcelable; + + move-result-object v4 + + check-cast v4, Landroid/net/Uri; + + invoke-virtual {v4}, Landroid/net/Uri;->getPathSegments()Ljava/util/List; + + move-result-object v4 + + invoke-interface {v4}, Ljava/util/List;->size()I + + move-result v5 + + const/4 v6, 0x4 + + const/4 v7, 0x1 + + if-lt v5, v6, :cond_39 + + const/4 v5, 0x3 + + invoke-interface {v4, v5}, Ljava/util/List;->get(I)Ljava/lang/Object; + + move-result-object v4 + + :goto_36 + check-cast v4, Ljava/lang/String; + + goto :goto_3e + + :cond_39 + invoke-interface {v4, v7}, Ljava/util/List;->get(I)Ljava/lang/Object; + + move-result-object v4 + + goto :goto_36 + + :goto_3e + invoke-virtual {p1}, Ljava/lang/String;->hashCode()I + + move-result v5 + + const v6, -0x620f2f0b + + const/4 v8, 0x2 + + if-eq v5, v6, :cond_67 + + const v6, 0xcc82212 + + if-eq v5, v6, :cond_5d + + const v6, 0x6621b52e + + if-eq v5, v6, :cond_53 + + goto :goto_71 + + :cond_53 + const-string v5, "mt:setLastModified" + + invoke-virtual {p1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v5 + + if-eqz v5, :cond_71 + + const/4 v5, 0x0 + + goto :goto_72 + + :cond_5d + const-string v5, "mt:createSymlink" + + invoke-virtual {p1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v5 + + if-eqz v5, :cond_71 + + const/4 v5, 0x2 + + goto :goto_72 + + :cond_67 + const-string v5, "mt:setPermissions" + + invoke-virtual {p1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v5 + + if-eqz v5, :cond_71 + + const/4 v5, 0x1 + + goto :goto_72 + + :cond_71 + :goto_71 + const/4 v5, -0x1 + + :goto_72 + if-eqz v5, :cond_c8 + + if-eq v5, v7, :cond_a7 + + if-eq v5, v8, :cond_83 + + invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + + invoke-virtual {v2, p1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + :goto_7f + invoke-virtual {p2, v0, p1}, Landroid/os/BaseBundle;->putString(Ljava/lang/String;Ljava/lang/String;)V + + goto :goto_e8 + + :cond_83 + invoke-virtual {p0, v4, v3}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p1 + + if-nez p1, :cond_8d + + :goto_89 + invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + + goto :goto_e8 + + :cond_8d + const-string v2, "path" + + invoke-virtual {p3, v2}, Landroid/os/BaseBundle;->getString(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p3 + :try_end_93 + .catch Ljava/lang/Exception; {:try_start_1d .. :try_end_93} :catch_dd + + :try_start_93 + invoke-virtual {p1}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object p1 + + invoke-static {p3, p1}, Landroid/system/Os;->symlink(Ljava/lang/String;Ljava/lang/String;)V + + invoke-virtual {p2, v1, v7}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + :try_end_9d + .catch Landroid/system/ErrnoException; {:try_start_93 .. :try_end_9d} :catch_9e + .catch Ljava/lang/Exception; {:try_start_93 .. :try_end_9d} :catch_dd + + goto :goto_e8 + + :catch_9e + move-exception p1 + + :try_start_9f + invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + + invoke-virtual {p1}, Landroid/system/ErrnoException;->getMessage()Ljava/lang/String; + + move-result-object p1 + + goto :goto_7f + + :cond_a7 + invoke-virtual {p0, v4, v7}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p1 + + if-nez p1, :cond_ae + + goto :goto_89 + + :cond_ae + const-string v2, "permissions" + + invoke-virtual {p3, v2}, Landroid/os/BaseBundle;->getInt(Ljava/lang/String;)I + + move-result p3 + :try_end_b4 + .catch Ljava/lang/Exception; {:try_start_9f .. :try_end_b4} :catch_dd + + :try_start_b4 + invoke-virtual {p1}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object p1 + + invoke-static {p1, p3}, Landroid/system/Os;->chmod(Ljava/lang/String;I)V + + invoke-virtual {p2, v1, v7}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + :try_end_be + .catch Landroid/system/ErrnoException; {:try_start_b4 .. :try_end_be} :catch_bf + .catch Ljava/lang/Exception; {:try_start_b4 .. :try_end_be} :catch_dd + + goto :goto_e8 + + :catch_bf + move-exception p1 + + :try_start_c0 + invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + + invoke-virtual {p1}, Landroid/system/ErrnoException;->getMessage()Ljava/lang/String; + + move-result-object p1 + + goto :goto_7f + + :cond_c8 + invoke-virtual {p0, v4, v7}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p1 + + if-nez p1, :cond_cf + + goto :goto_89 + + :cond_cf + const-string v2, "time" + + invoke-virtual {p3, v2}, Landroid/os/BaseBundle;->getLong(Ljava/lang/String;)J + + move-result-wide v4 + + invoke-virtual {p1, v4, v5}, Ljava/io/File;->setLastModified(J)Z + + move-result p1 + + invoke-virtual {p2, v1, p1}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + :try_end_dc + .catch Ljava/lang/Exception; {:try_start_c0 .. :try_end_dc} :catch_dd + + goto :goto_e8 + + :catch_dd + move-exception p1 + + invoke-virtual {p2, v1, v3}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V + + invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {p2, v0, p1}, Landroid/os/BaseBundle;->putString(Ljava/lang/String;Ljava/lang/String;)V + + :goto_e8 + return-object p2 +.end method + +.method public final createDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + .registers 10 + + const-string v0, "/" + + const/4 v1, 0x1 + + invoke-virtual {p0, p1, v1}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object v1 + + if-eqz v1, :cond_7c + + new-instance v2, Ljava/io/File; + + invoke-direct {v2, v1, p3}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + const/4 v3, 0x2 + + :goto_f + invoke-virtual {v2}, Ljava/io/File;->exists()Z + + move-result v4 + + if-eqz v4, :cond_37 + + new-instance v2, Ljava/io/File; + + new-instance v4, Ljava/lang/StringBuilder; + + invoke-direct {v4}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {v4, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + const-string v5, " (" + + invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + add-int/lit8 v5, v3, 0x1 + + invoke-virtual {v4, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + + const-string v3, ")" + + invoke-virtual {v4, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object v3 + + invoke-direct {v2, v1, v3}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + move v3, v5 + + goto :goto_f + + :cond_37 + :try_start_37 + const-string v1, "vnd.android.document/directory" + + invoke-virtual {v1, p2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result p2 + + if-eqz p2, :cond_44 + + invoke-virtual {v2}, Ljava/io/File;->mkdir()Z + + move-result p2 + + goto :goto_48 + + :cond_44 + invoke-virtual {v2}, Ljava/io/File;->createNewFile()Z + + move-result p2 + + :goto_48 + if-eqz p2, :cond_7c + + invoke-virtual {p1, v0}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z + + move-result p2 + + if-eqz p2, :cond_64 + + new-instance p2, Ljava/lang/StringBuilder; + + invoke-direct {p2}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v2}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object v0 + + invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + :goto_5f + invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + goto :goto_77 + + :cond_64 + new-instance p2, Ljava/lang/StringBuilder; + + invoke-direct {p2}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v2}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object v0 + + invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + :try_end_76 + .catch Ljava/io/IOException; {:try_start_37 .. :try_end_76} :catch_78 + + goto :goto_5f + + :goto_77 + return-object p1 + + :catch_78 + move-exception p2 + + invoke-virtual {p2}, Ljava/lang/Throwable;->printStackTrace()V + + :cond_7c + new-instance p2, Ljava/io/FileNotFoundException; + + new-instance v0, Ljava/lang/StringBuilder; + + const-string v1, "Failed to create document in " + + invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + const-string p1, " with name " + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw p2 +.end method + +.method public final d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V + .registers 16 + + const-string v0, "|" + + const/4 v1, 0x1 + + if-nez p3, :cond_9 + + invoke-virtual {p0, p2, v1}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p3 + + :cond_9 + const/4 v2, 0x0 + + const-string v3, "flags" + + const-string v4, "last_modified" + + const-string v5, "mime_type" + + const-string v6, "_size" + + const-string v7, "_display_name" + + const-string v8, "document_id" + + if-nez p3, :cond_43 + + invoke-virtual {p1}, Landroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder; + + move-result-object p1 + + iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {p1, v8, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {p1, v7, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const-wide/16 p2, 0x0 + + invoke-static {p2, p3}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + + move-result-object p2 + + invoke-virtual {p1, v6, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const-string p2, "vnd.android.document/directory" + + invoke-virtual {p1, v5, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; + + move-result-object p2 + + invoke-virtual {p1, v4, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; + + move-result-object p2 + + invoke-virtual {p1, v3, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + return-void + + :cond_43 + invoke-virtual {p3}, Ljava/io/File;->isDirectory()Z + + move-result v9 + + if-eqz v9, :cond_52 + + invoke-virtual {p3}, Ljava/io/File;->canWrite()Z + + move-result v9 + + if-eqz v9, :cond_5a + + const/16 v9, 0x8 + + goto :goto_5b + + :cond_52 + invoke-virtual {p3}, Ljava/io/File;->canWrite()Z + + move-result v9 + + if-eqz v9, :cond_5a + + const/4 v9, 0x2 + + goto :goto_5b + + :cond_5a + const/4 v9, 0x0 + + :goto_5b + invoke-virtual {p3}, Ljava/io/File;->getParentFile()Ljava/io/File; + + move-result-object v10 + + invoke-virtual {v10}, Ljava/io/File;->canWrite()Z + + move-result v10 + + if-eqz v10, :cond_69 + + or-int/lit8 v9, v9, 0x4 + + or-int/lit8 v9, v9, 0x40 + + :cond_69 + invoke-virtual {p3}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object v10 + + iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File; + + invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object v11 + + invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v11 + + if-eqz v11, :cond_7c + + const-string v1, "data" + + goto :goto_b5 + + :cond_7c + iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File; + + if-eqz v11, :cond_8d + + invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object v11 + + invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v11 + + if-eqz v11, :cond_8d + + const-string v1, "android_data" + + goto :goto_b5 + + :cond_8d + iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File; + + if-eqz v11, :cond_9e + + invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object v11 + + invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v11 + + if-eqz v11, :cond_9e + + const-string v1, "android_obb" + + goto :goto_b5 + + :cond_9e + iget-object v11, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File; + + if-eqz v11, :cond_af + + invoke-virtual {v11}, Ljava/io/File;->getPath()Ljava/lang/String; + + move-result-object v11 + + invoke-virtual {v10, v11}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v11 + + if-eqz v11, :cond_af + + const-string v1, "user_de_data" + + goto :goto_b5 + + :cond_af + invoke-virtual {p3}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object v2 + + move-object v1, v2 + + const/4 v2, 0x1 + + :goto_b5 + invoke-virtual {p1}, Landroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder; + + move-result-object p1 + + invoke-virtual {p1, v8, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + invoke-virtual {p1, v7, v1}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + invoke-virtual {p3}, Ljava/io/File;->length()J + + move-result-wide v7 + + invoke-static {v7, v8}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + + move-result-object p2 + + invoke-virtual {p1, v6, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + invoke-static {p3}, Lbin/mt/file/content/MTDataFilesProvider;->c(Ljava/io/File;)Ljava/lang/String; + + move-result-object p2 + + invoke-virtual {p1, v5, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + invoke-virtual {p3}, Ljava/io/File;->lastModified()J + + move-result-wide v5 + + invoke-static {v5, v6}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + + move-result-object p2 + + invoke-virtual {p1, v4, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + invoke-static {v9}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; + + move-result-object p2 + + invoke-virtual {p1, v3, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const-string p2, "mt_path" + + invoke-virtual {p3}, Ljava/io/File;->getAbsolutePath()Ljava/lang/String; + + move-result-object p3 + + invoke-virtual {p1, p2, p3}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + if-eqz v2, :cond_12f + + :try_start_ee + new-instance p2, Ljava/lang/StringBuilder; + + invoke-direct {p2}, Ljava/lang/StringBuilder;->()V + + invoke-static {v10}, Landroid/system/Os;->lstat(Ljava/lang/String;)Landroid/system/StructStat; + + move-result-object p3 + + iget v1, p3, Landroid/system/StructStat;->st_mode:I + + invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + + invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + iget v1, p3, Landroid/system/StructStat;->st_uid:I + + invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + + invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + iget v1, p3, Landroid/system/StructStat;->st_gid:I + + invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + + iget p3, p3, Landroid/system/StructStat;->st_mode:I + + const v1, 0xf000 + + and-int/2addr p3, v1 + + const v1, 0xa000 + + if-ne p3, v1, :cond_121 + + invoke-virtual {p2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-static {v10}, Landroid/system/Os;->readlink(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p3 + + invoke-virtual {p2, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + :cond_121 + const-string p3, "mt_extras" + + invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p2 + + invoke-virtual {p1, p3, p2}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + :try_end_12a + .catch Ljava/lang/Exception; {:try_start_ee .. :try_end_12a} :catch_12b + + goto :goto_12f + + :catch_12b + move-exception p1 + + invoke-virtual {p1}, Ljava/lang/Throwable;->printStackTrace()V + + :cond_12f + :goto_12f + return-void +.end method + +.method public final deleteDocument(Ljava/lang/String;)V + .registers 4 + + const/4 v0, 0x1 + + invoke-virtual {p0, p1, v0}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object v0 + + if-eqz v0, :cond_e + + invoke-static {v0}, Lbin/mt/file/content/MTDataFilesProvider;->a(Ljava/io/File;)Z + + move-result v0 + + if-eqz v0, :cond_e + + return-void + + :cond_e + new-instance v0, Ljava/io/FileNotFoundException; + + const-string v1, "Failed to delete document " + + invoke-virtual {v1, p1}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + invoke-direct {v0, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw v0 +.end method + +.method public final getDocumentType(Ljava/lang/String;)Ljava/lang/String; + .registers 3 + + const/4 v0, 0x1 + + invoke-virtual {p0, p1, v0}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p1 + + if-nez p1, :cond_a + + const-string p1, "vnd.android.document/directory" + + goto :goto_e + + :cond_a + invoke-static {p1}, Lbin/mt/file/content/MTDataFilesProvider;->c(Ljava/io/File;)Ljava/lang/String; + + move-result-object p1 + + :goto_e + return-object p1 +.end method + +.method public final isChildDocument(Ljava/lang/String;Ljava/lang/String;)Z + .registers 3 + + invoke-virtual {p2, p1}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z + + move-result p1 + + return p1 +.end method + +.method public final moveDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + .registers 7 + + const/4 p2, 0x1 + + invoke-virtual {p0, p1, p2}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object v0 + + invoke-virtual {p0, p3, p2}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p2 + + if-eqz v0, :cond_55 + + if-eqz p2, :cond_55 + + new-instance v1, Ljava/io/File; + + invoke-virtual {v0}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object v2 + + invoke-direct {v1, p2, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + invoke-virtual {v1}, Ljava/io/File;->exists()Z + + move-result p2 + + if-nez p2, :cond_55 + + invoke-virtual {v0, v1}, Ljava/io/File;->renameTo(Ljava/io/File;)Z + + move-result p2 + + if-eqz p2, :cond_55 + + const-string p1, "/" + + invoke-virtual {p3, p1}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z + + move-result p2 + + if-eqz p2, :cond_3e + + new-instance p1, Ljava/lang/StringBuilder; + + invoke-direct {p1}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {p1, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object p2 + + invoke-virtual {p1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + goto :goto_54 + + :cond_3e + new-instance p2, Ljava/lang/StringBuilder; + + invoke-direct {p2}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {p2, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + :goto_54 + return-object p1 + + :cond_55 + new-instance p2, Ljava/io/FileNotFoundException; + + new-instance v0, Ljava/lang/StringBuilder; + + const-string v1, "Filed to move document " + + invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + const-string p1, " to " + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw p2 +.end method + +.method public final onCreate()Z + .registers 2 + + const/4 v0, 0x1 + + return v0 +.end method + +.method public final openDocument(Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor; + .registers 4 + + const/4 p3, 0x0 + + invoke-virtual {p0, p1, p3}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p3 + + if-eqz p3, :cond_10 + + invoke-static {p2}, Landroid/os/ParcelFileDescriptor;->parseMode(Ljava/lang/String;)I + + move-result p1 + + invoke-static {p3, p1}, Landroid/os/ParcelFileDescriptor;->open(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor; + + move-result-object p1 + + return-object p1 + + :cond_10 + new-instance p2, Ljava/io/FileNotFoundException; + + const-string p3, " not found" + + invoke-virtual {p1, p3}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + invoke-direct {p2, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw p2 +.end method + +.method public final queryChildDocuments(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; + .registers 10 + + const-string p3, "/" + + invoke-virtual {p1, p3}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z + + move-result v0 + + const/4 v1, 0x0 + + const/4 v2, 0x1 + + if-eqz v0, :cond_13 + + invoke-virtual {p1}, Ljava/lang/String;->length()I + + move-result v0 + + sub-int/2addr v0, v2 + + invoke-virtual {p1, v1, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; + + move-result-object p1 + + :cond_13 + new-instance v0, Landroid/database/MatrixCursor; + + if-eqz p2, :cond_18 + + goto :goto_1a + + :cond_18 + sget-object p2, Lbin/mt/file/content/MTDataFilesProvider;->h:[Ljava/lang/String; + + :goto_1a + invoke-direct {v0, p2}, Landroid/database/MatrixCursor;->([Ljava/lang/String;)V + + invoke-virtual {p0, p1, v2}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object p2 + + if-nez p2, :cond_6e + + const-string p2, "/data" + + invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p2 + + iget-object p3, p0, Lbin/mt/file/content/MTDataFilesProvider;->c:Ljava/io/File; + + invoke-virtual {p0, v0, p2, p3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V + + iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File; + + if-eqz p2, :cond_43 + + invoke-virtual {p2}, Ljava/io/File;->exists()Z + + move-result p2 + + if-eqz p2, :cond_43 + + const-string p2, "/android_data" + + invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p2 + + iget-object p3, p0, Lbin/mt/file/content/MTDataFilesProvider;->e:Ljava/io/File; + + invoke-virtual {p0, v0, p2, p3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V + + :cond_43 + iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File; + + if-eqz p2, :cond_58 + + invoke-virtual {p2}, Ljava/io/File;->exists()Z + + move-result p2 + + if-eqz p2, :cond_58 + + const-string p2, "/android_obb" + + invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p2 + + iget-object p3, p0, Lbin/mt/file/content/MTDataFilesProvider;->f:Ljava/io/File; + + invoke-virtual {p0, v0, p2, p3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V + + :cond_58 + iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File; + + if-eqz p2, :cond_95 + + invoke-virtual {p2}, Ljava/io/File;->exists()Z + + move-result p2 + + if-eqz p2, :cond_95 + + const-string p2, "/user_de_data" + + invoke-virtual {p1, p2}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + iget-object p2, p0, Lbin/mt/file/content/MTDataFilesProvider;->d:Ljava/io/File; + + invoke-virtual {p0, v0, p1, p2}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V + + goto :goto_95 + + :cond_6e + invoke-virtual {p2}, Ljava/io/File;->listFiles()[Ljava/io/File; + + move-result-object p2 + + if-eqz p2, :cond_95 + + array-length v2, p2 + + :goto_75 + if-ge v1, v2, :cond_95 + + aget-object v3, p2, v1 + + new-instance v4, Ljava/lang/StringBuilder; + + invoke-direct {v4}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {v4, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v4, p3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v3}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object v5 + + invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object v4 + + invoke-virtual {p0, v0, v4, v3}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V + + add-int/lit8 v1, v1, 0x1 + + goto :goto_75 + + :cond_95 + :goto_95 + return-object v0 +.end method + +.method public final queryDocument(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor; + .registers 4 + + new-instance v0, Landroid/database/MatrixCursor; + + if-eqz p2, :cond_5 + + goto :goto_7 + + :cond_5 + sget-object p2, Lbin/mt/file/content/MTDataFilesProvider;->h:[Ljava/lang/String; + + :goto_7 + invoke-direct {v0, p2}, Landroid/database/MatrixCursor;->([Ljava/lang/String;)V + + const/4 p2, 0x0 + + invoke-virtual {p0, v0, p1, p2}, Lbin/mt/file/content/MTDataFilesProvider;->d(Landroid/database/MatrixCursor;Ljava/lang/String;Ljava/io/File;)V + + return-object v0 +.end method + +.method public final queryRoots([Ljava/lang/String;)Landroid/database/Cursor; + .registers 7 + + invoke-virtual {p0}, Landroid/content/ContentProvider;->getContext()Landroid/content/Context; + + move-result-object v0 + + invoke-virtual {v0}, Landroid/content/Context;->getApplicationInfo()Landroid/content/pm/ApplicationInfo; + + move-result-object v0 + + invoke-virtual {p0}, Landroid/content/ContentProvider;->getContext()Landroid/content/Context; + + move-result-object v1 + + invoke-virtual {v1}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager; + + move-result-object v1 + + invoke-virtual {v0, v1}, Landroid/content/pm/PackageItemInfo;->loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence; + + move-result-object v1 + + invoke-interface {v1}, Ljava/lang/CharSequence;->toString()Ljava/lang/String; + + move-result-object v1 + + new-instance v2, Landroid/database/MatrixCursor; + + if-eqz p1, :cond_1d + + goto :goto_1f + + :cond_1d + sget-object p1, Lbin/mt/file/content/MTDataFilesProvider;->g:[Ljava/lang/String; + + :goto_1f + invoke-direct {v2, p1}, Landroid/database/MatrixCursor;->([Ljava/lang/String;)V + + invoke-virtual {v2}, Landroid/database/MatrixCursor;->newRow()Landroid/database/MatrixCursor$RowBuilder; + + move-result-object p1 + + const-string v3, "root_id" + + iget-object v4, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {p1, v3, v4}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const-string v3, "document_id" + + iget-object v4, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {p1, v3, v4}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const-string v3, "summary" + + iget-object v4, p0, Lbin/mt/file/content/MTDataFilesProvider;->b:Ljava/lang/String; + + invoke-virtual {p1, v3, v4}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const/16 v3, 0x11 + + invoke-static {v3}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; + + move-result-object v3 + + const-string v4, "flags" + + invoke-virtual {p1, v4, v3}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const-string v3, "title" + + invoke-virtual {p1, v3, v1}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + const-string v1, "mime_types" + + const-string v3, "*/*" + + invoke-virtual {p1, v1, v3}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + iget v0, v0, Landroid/content/pm/ApplicationInfo;->icon:I + + invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; + + move-result-object v0 + + const-string v1, "icon" + + invoke-virtual {p1, v1, v0}, Landroid/database/MatrixCursor$RowBuilder;->add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder; + + return-object v2 +.end method + +.method public final removeDocument(Ljava/lang/String;Ljava/lang/String;)V + .registers 3 + + invoke-virtual {p0, p1}, Lbin/mt/file/content/MTDataFilesProvider;->deleteDocument(Ljava/lang/String;)V + + return-void +.end method + +.method public final renameDocument(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + .registers 6 + + const/4 v0, 0x1 + + invoke-virtual {p0, p1, v0}, Lbin/mt/file/content/MTDataFilesProvider;->b(Ljava/lang/String;Z)Ljava/io/File; + + move-result-object v0 + + if-eqz v0, :cond_3c + + new-instance v1, Ljava/io/File; + + invoke-virtual {v0}, Ljava/io/File;->getParentFile()Ljava/io/File; + + move-result-object v2 + + invoke-direct {v1, v2, p2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + + invoke-virtual {v0, v1}, Ljava/io/File;->renameTo(Ljava/io/File;)Z + + move-result v0 + + if-eqz v0, :cond_3c + + invoke-virtual {p1}, Ljava/lang/String;->length()I + + move-result v0 + + add-int/lit8 v0, v0, -0x2 + + const/16 v1, 0x2f + + invoke-virtual {p1, v1, v0}, Ljava/lang/String;->lastIndexOf(II)I + + move-result v0 + + new-instance v1, Ljava/lang/StringBuilder; + + invoke-direct {v1}, Ljava/lang/StringBuilder;->()V + + const/4 v2, 0x0 + + invoke-virtual {p1, v2, v0}, Ljava/lang/String;->substring(II)Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + const-string p1, "/" + + invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + return-object p1 + + :cond_3c + new-instance v0, Ljava/io/FileNotFoundException; + + new-instance v1, Ljava/lang/StringBuilder; + + const-string v2, "Failed to rename document " + + invoke-direct {v1, v2}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V + + invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + const-string p1, " to " + + invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-direct {v0, p1}, Ljava/io/FileNotFoundException;->(Ljava/lang/String;)V + + throw v0 +.end method diff --git a/MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali new file mode 100644 index 0000000..81cf1a5 --- /dev/null +++ b/MTDataFilesProvider/bin/mt/file/content/MTDataFilesWakeUpActivity.smali @@ -0,0 +1,26 @@ +# classes3.dex + +.class public Lbin/mt/file/content/MTDataFilesWakeUpActivity; +.super Landroid/app/Activity; + + +# direct methods +.method public constructor ()V + .registers 1 + + invoke-direct {p0}, Landroid/app/Activity;->()V + + return-void +.end method + + +# virtual methods +.method public final onCreate(Landroid/os/Bundle;)V + .registers 2 + + invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V + + invoke-virtual {p0}, Landroid/app/Activity;->finish()V + + return-void +.end method From eac59f213740547940b5561429f7931d886a3640 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 20:46:53 +0800 Subject: [PATCH 10/21] Add MTDataFilesProvider to acknowledgments --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2a269ae..c48b719 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ 1. [JMBQ/azurlane](https://github.com/JMBQ/azurlane) 2. [n0k0m3/PerseusCI](https://github.com/n0k0m3/PerseusCI) - +3. [L-JINBIN/MTDataFilesProvider](https://github.com/L-JINBIN/MTDataFilesProvider) --- ## 📊 Star历史 From 9e4f7ca0012bd8151aca148c4d155459dcec94aa Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 21:31:38 +0800 Subject: [PATCH 11/21] Add files via upload --- RELEASE_NOTES.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 RELEASE_NOTES.md diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..f96c936 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,21 @@ +
+中文安装说明 - 点击展开 + +1. 在下方列表中找到你需要的版本前缀,下载该服务器名称前缀的所有以 `7z.00*` 结尾的分卷文件。 +2. 解压时,只需要右键选择 `XXX.7z.001` 进行解压,解压软件会自动处理后续分卷。 +3. 在解压后的文件夹中找到对应的安装包并安装(具体安装方法请自行查阅相关教程)。 + +
+ +
+English Installation Instructions - Click to expand + +1. Find the version prefix you need in the list below, and download all files ending with `7z.00*` that share the same server name prefix. +2. When extracting, simply select the `XXX.7z.001` file to decompress, and the software will automatically process the rest of the volumes. +3. Find the installation package in the extracted folder and install it (please refer to relevant tutorials for installation methods). + +
+ +### 📝 更新日志 / Changelog +- **[新增]** “文件提供器”(File Provider),方便免 Root 用户修改文件。 +- **[New]** Added "File Provider", making it easier for non-root users to modify files. From 0f8a088a36a3404818198ac3e85ccbafac13bd0d Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 21:33:32 +0800 Subject: [PATCH 12/21] Add dynamic release notes generation step Added a step to generate dynamic release notes before creating the release. --- .github/workflows/main.yml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fb37105..0e00232 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -46,7 +46,15 @@ jobs: chmod +x merge_build.sh ./merge_build.sh "${{ github.event.inputs.server_name }}" "${{ github.event.inputs.download_url }}" - # 步骤6:创建 Release 并上传所有分卷文件 + # 步骤6: 动态拼接 Release 简介 + - name: Generate Release Notes + run: | + cp RELEASE_NOTES.md current_release.md + + echo "" >> current_release.md + echo "### 📦 本次构建动态信息" >> current_release.md + + # 步骤7:创建 Release 并上传所有分卷文件 - name: Release and Upload Assets uses: ncipollo/release-action@v1 with: @@ -54,17 +62,4 @@ jobs: name: "AzurLane JMBQ ${{ env.JMBQ_VERSION }} Build APK" artifacts: "${{ github.event.inputs.server_name }}-V.${{ env.VERSION }}.7z.*" allowUpdates: true - body: | -
- 中文安装说明 - 点击展开 - 1. 在下方列表中找到你需要的版本前缀,下载该服务器名称前缀的所有以 7z.00* 结尾的文件
- 2. 解压时只需要选择"XXX.7z.001"解压即可
- 3. 在解压后的文件夹中找到apk文件并安装 -
- -
- English Installation Instructions - Click to expand - 1. Find the version prefix you need in the list below, and download all files ending with 7z.00* that have that server name prefix
- 2. When extracting, simply select the "XXX.7z.001" file to decompress
- 3. Find the APK file in the extracted folder and install it -
+ bodyFile: "current_release.md" From 81318f14627bfc9777698788b3eaab71ac109e71 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 21:35:05 +0800 Subject: [PATCH 13/21] Refactor release notes handling in xapk.yml Updated release notes generation to use current_release.md and removed inline installation instructions. --- .github/workflows/xapk.yml | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/.github/workflows/xapk.yml b/.github/workflows/xapk.yml index c3a37d9..75eea22 100644 --- a/.github/workflows/xapk.yml +++ b/.github/workflows/xapk.yml @@ -40,6 +40,13 @@ jobs: chmod +x merge_build.sh ./merge_build.sh "${{ github.event.inputs.region }}" + - name: Generate Release Notes + run: | + cp RELEASE_NOTES.md current_release.md + + echo "" >> current_release.md + echo "### 📦 Build Details" >> current_release.md + - name: Release and Upload Assets uses: ncipollo/release-action@v1 with: @@ -47,17 +54,4 @@ jobs: name: "AzurLane JMBQ ${{ env.JMBQ_VERSION }} Build XAPK" artifacts: "${{ github.event.inputs.region }}-V.${{ env.VERSION }}.7z.*" allowUpdates: true - body: | -
- 中文安装说明 - 点击展开 - 1. 在下方列表中找到你需要的版本前缀,下载该服务器名称前缀的所有以 7z.00* 结尾的文件
- 2. 解压时只需要选择"XXX.7z.001"解压即可
- 3. 在解压后的文件夹中找到xapk文件并安装,安装方法请自行查询相关教程 -
- -
- English Installation Instructions - Click to expand - 1. Find the version prefix you need in the list below, and download all files ending with 7z.00* that have that server name prefix
- 2. When extracting, simply select the "XXX.7z.001" file to decompress
- 3. Find the XAPK file in the extracted folder and install it, please refer to the relevant tutorials for installation methods -
+ bodyFile: "current_release.md" From 75ec57416ce04d70aa6c35260ce67b9fba619aa3 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 21:37:12 +0800 Subject: [PATCH 14/21] Update main.yml --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0e00232..132f756 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,7 +52,6 @@ jobs: cp RELEASE_NOTES.md current_release.md echo "" >> current_release.md - echo "### 📦 本次构建动态信息" >> current_release.md # 步骤7:创建 Release 并上传所有分卷文件 - name: Release and Upload Assets From 128ef73d3f5f78893e58901cdb8c2eba4e307f4d Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 21:37:25 +0800 Subject: [PATCH 15/21] Remove build details from current_release.md Remove build details section from release notes. --- .github/workflows/xapk.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/xapk.yml b/.github/workflows/xapk.yml index 75eea22..37eb0c7 100644 --- a/.github/workflows/xapk.yml +++ b/.github/workflows/xapk.yml @@ -45,7 +45,6 @@ jobs: cp RELEASE_NOTES.md current_release.md echo "" >> current_release.md - echo "### 📦 Build Details" >> current_release.md - name: Release and Upload Assets uses: ncipollo/release-action@v1 From 4496d3f5471bf6902fc255ca92d4db44e90195fa Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 22:07:38 +0800 Subject: [PATCH 16/21] Update RELEASE_NOTES.md --- RELEASE_NOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index f96c936..bcc9e81 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -19,3 +19,7 @@ ### 📝 更新日志 / Changelog - **[新增]** “文件提供器”(File Provider),方便免 Root 用户修改文件。 - **[New]** Added "File Provider", making it easier for non-root users to modify files. + +### 🪄使用方法 +- [注入文件提供器](https://mt2.cn/guide/reverse/inject-documents-provider.html#%E6%B7%BB%E5%8A%A0%E6%9C%AC%E5%9C%B0%E5%AD%98%E5%82%A8) +- [Data Files Provider](https://mt2.cn/guide/reverse/inject-documents-provider.html#%E6%B7%BB%E5%8A%A0%E6%9C%AC%E5%9C%B0%E5%AD%98%E5%82%A8) From 6bf3da7f2d4aa8bf2c6602ea22ee3308e0919f31 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 23:06:00 +0800 Subject: [PATCH 17/21] Update merge_build.sh --- merge_build.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/merge_build.sh b/merge_build.sh index 1d4daac..b0d6514 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -384,14 +384,18 @@ INJECT_MT_PROVIDER() { # 2. 拷贝 Smali 文件 (保持 bin/mt/file/content/ 结构) mkdir -p "${TARGET_DIR}/smali" - if [ -d "MTDataFilesProvider/bin" ]; then - cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali/" - echo "Smali 文件拷贝完成" - else + if [ ! -d "MTDataFilesProvider/bin" ]; then echo "未找到 MTDataFilesProvider/bin 目录,请检查路径" return 1 fi - + if [ -d "${TARGET_DIR}/smali_classes2" ]; then + cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/" + echo "Smali 文件成功拷贝至 smali_classes2 (规避 64K 限制)" + else [ -d "${TARGET_DIR}/smali_classes3" ]; then + cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/" + echo "Smali 文件成功拷贝至 smali_classes3 (规避 64K 限制)" + fi + # 3. 修改 AndroidManifest.xml if grep -q "MTDataFilesProvider" "${MANIFEST_FILE}"; then echo "已存在 MT 组件,跳过修改" From 9bcf12a0aa9fcda38971093357e623f7b300435b Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 23:18:52 +0800 Subject: [PATCH 18/21] Update merge_build.sh --- merge_build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/merge_build.sh b/merge_build.sh index b0d6514..749ae31 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -388,10 +388,11 @@ INJECT_MT_PROVIDER() { echo "未找到 MTDataFilesProvider/bin 目录,请检查路径" return 1 fi + if [ -d "${TARGET_DIR}/smali_classes2" ]; then cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/" echo "Smali 文件成功拷贝至 smali_classes2 (规避 64K 限制)" - else [ -d "${TARGET_DIR}/smali_classes3" ]; then + else cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/" echo "Smali 文件成功拷贝至 smali_classes3 (规避 64K 限制)" fi From d4c83c4f97e4309a2439f7936fe84e0c81c04eeb Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sat, 9 May 2026 23:23:17 +0800 Subject: [PATCH 19/21] Fix copy destination for smali_classes directories --- merge_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/merge_build.sh b/merge_build.sh index 749ae31..1a909d5 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -390,10 +390,10 @@ INJECT_MT_PROVIDER() { fi if [ -d "${TARGET_DIR}/smali_classes2" ]; then - cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/" + cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/" echo "Smali 文件成功拷贝至 smali_classes2 (规避 64K 限制)" else - cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes2/" + cp -r "MTDataFilesProvider/bin" "${TARGET_DIR}/smali_classes3/" echo "Smali 文件成功拷贝至 smali_classes3 (规避 64K 限制)" fi From 00402c923af665897c7cf50449bd630f3a915640 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Thu, 14 May 2026 14:36:19 +0800 Subject: [PATCH 20/21] Handle failure case in AndroidManifest injection Add return statement for failure case in manifest injection. --- merge_build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/merge_build.sh b/merge_build.sh index 1a909d5..1a36e3d 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -412,6 +412,7 @@ INJECT_MT_PROVIDER() { echo "AndroidManifest.xml 注入成功!" else echo "AndroidManifest.xml 注入失败!" + return 1 fi fi } From d8bd2bfbc149a854eedc35a0039213882d52bc53 Mon Sep 17 00:00:00 2001 From: azzzddddd <105015339+azzzddddd@users.noreply.github.com> Date: Sun, 24 May 2026 20:17:20 +0800 Subject: [PATCH 21/21] Refactor MOD patch download and extraction logic Updated download logic for MOD patches to prioritize the latest release and improved error handling for file extraction. --- merge_build.sh | 38 +------------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/merge_build.sh b/merge_build.sh index 1a36e3d..d27b815 100644 --- a/merge_build.sh +++ b/merge_build.sh @@ -122,45 +122,9 @@ DOWNLOAD_MOD_MENU() { local FILENAME="MOD_MENU.rar" echo "正在下载MOD补丁..." - local API_OLD_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/tags/3.2.0") local API_RESPONSE=$(curl -s "https://api.github.com/repos/${OWNER}/${REPO}/releases/latest") local JMBQ_VERSION=$(echo "${API_RESPONSE}" | jq -r '.tag_name') - # 修改:查找name中含有.rar的文件,而不是直接使用第一个assets - local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1) - if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then - # 修改:查找name中含有.zip的文件,避免后缀不一致导致的无法获取链接 - local FILENAME="MOD_MENU.zip" - local DOWNLOAD_OLD_LINK=$(echo "${API_OLD_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".zip")) | .browser_download_url' | head -n 1) - if [ -z "${DOWNLOAD_OLD_LINK}" ] || [ "${DOWNLOAD_OLD_LINK}" == "null" ]; then - echo "无法获取MOD Patch文件下载链接" - exit 1 - fi - fi - - curl -L -o "${DOWNLOAD_DIR}/${FILENAME}" "${DOWNLOAD_OLD_LINK}" - if [ $? -eq 0 ]; then - echo "旧版补丁下载成功!文件保存至:${DOWNLOAD_DIR}/${FILENAME}" - else - echo "旧版补丁下载失败,请重试" - exit 1 - fi - - if command -v 7z &> /dev/null; then - 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ" - else - echo "错误: 未找到7z工具,无法解压!" - exit 1 - fi - - if [ $? -ne 0 ]; then - echo "错误: 解压 ${FILENAME} 失败!" - exit 1 - fi - - echo "正在下载MOD补丁..." - # 恢复原命名防止逻辑报错 - FILENAME="MOD_MENU.rar" # 修改:查找name中含有.rar的文件,而不是直接使用第一个assets local DOWNLOAD_LINK=$(echo "${API_RESPONSE}" | jq -r '.assets[] | select(.name | contains(".rar")) | .browser_download_url' | head -n 1) @@ -183,7 +147,7 @@ DOWNLOAD_MOD_MENU() { fi if command -v 7z &> /dev/null; then - 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ/assets/arch" + 7z x -y "${DOWNLOAD_DIR}/${FILENAME}" -o"${DOWNLOAD_DIR}/JMBQ" else echo "错误: 未找到7z工具,无法解压!" exit 1