├── .github └── workflows │ └── android.yml ├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── BUG.list ├── build.gradle ├── dictionary.txt ├── libs │ ├── api-82-sources.jar │ └── api-82.jar ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── xposed_init │ ├── ic_launcher-playstore.png │ ├── java │ └── com │ │ └── coderstory │ │ └── flyme10 │ │ ├── PreferencesProvider.kt │ │ ├── activity │ │ ├── AboutActivity.kt │ │ ├── MainActivity.kt │ │ ├── SplashActivity.kt │ │ ├── ToolbarActivity.kt │ │ └── base │ │ │ └── BaseActivity.kt │ │ ├── adapter │ │ ├── AppInfo.kt │ │ └── AppInfoAdapter.kt │ │ ├── fragment │ │ ├── AboutFragment.kt │ │ ├── BlogFragment.kt │ │ ├── DisbaleAppFragment.kt │ │ ├── OthersFragment.kt │ │ ├── SettingsFragment.kt │ │ ├── SystemUIFragment.kt │ │ ├── UpgradeFragment.kt │ │ ├── WebViewFragment.kt │ │ └── base │ │ │ └── BaseFragment.kt │ │ ├── patchModule │ │ ├── FuckAd.kt │ │ ├── HideApp.kt │ │ ├── IsEnable.kt │ │ ├── Others.kt │ │ ├── SystemUi.kt │ │ └── ThemePatcher.kt │ │ ├── preferences │ │ ├── PreferencesProvider.kt │ │ ├── PreferencesProviderUtils.kt │ │ └── PreferencesUtils.kt │ │ ├── refreshView │ │ ├── BaseRefreshView.kt │ │ └── SunRefreshView.kt │ │ ├── tools │ │ ├── Application.kt │ │ ├── FileUtils.kt │ │ ├── KotlinXposedHelper.kt │ │ ├── Log.kt │ │ ├── Logger.kt │ │ ├── Misc.kt │ │ ├── RuntimeUtil.kt │ │ ├── SharedHelper.kt │ │ ├── SnackBarUtils.kt │ │ ├── Utils.kt │ │ ├── ViewUtils.kt │ │ └── XposedHelper.kt │ │ ├── view │ │ ├── PullToRefreshView.kt │ │ └── QNumberPicker.kt │ │ └── xposed │ │ ├── IModule.kt │ │ └── Start.kt │ └── res │ ├── drawable-xhdpi │ └── ic_menu_overflow.png │ ├── drawable-xxhdpi │ ├── backup.webp │ ├── btn_nor_down.xml │ ├── buildings.png │ ├── check_border.xml │ ├── copy.webp │ ├── ic_back.png │ ├── ic_block.xml │ ├── ic_circle_down.xml │ ├── ic_drawer_home.png │ ├── ic_format_list.xml │ ├── ic_info.xml │ ├── ic_link.xml │ ├── ic_notes.xml │ ├── ic_refresh.xml │ ├── ic_settings.xml │ ├── ic_share.xml │ ├── ic_swap_horiz.xml │ ├── ic_table_rows.xml │ ├── ic_telegram.xml │ ├── ic_vip.xml │ ├── ic_vip_banner.xml │ ├── ic_vip_nav.xml │ ├── icon_share.png │ ├── panel_background.xml │ ├── restor.webp │ ├── sky.webp │ └── sun.png │ ├── drawable-xxxhdpi │ ├── buildings.webp │ └── sky.webp │ ├── drawable │ ├── hosts.webp │ └── splash.jpg │ ├── layout │ ├── activity_content.xml │ ├── activity_main.xml │ ├── activity_splash.xml │ ├── app_info_item.xml │ ├── app_upgrade_item.xml │ ├── dialog_def.xml │ ├── dialog_disable_app.xml │ ├── dialog_input_formate_time.xml │ ├── dialog_input_qq.xml │ ├── dialog_xposed_copyurl.xml │ ├── dialog_xposed_disabled.xml │ ├── fragment_about.xml │ ├── fragment_app_list.xml │ ├── fragment_app_upgrade.xml │ ├── fragment_others.xml │ ├── fragment_settings.xml │ ├── fragment_system_ui.xml │ ├── fragment_webview.xml │ ├── navigation_header.xml │ └── toolbar.xml │ ├── menu │ ├── drawer.xml │ ├── menu_disableapp_toolbar.xml │ ├── menu_hideapp_toolbar.xml │ ├── menu_upgrade_toolbar.xml │ └── menu_webview_toolbar.xml │ ├── mipmap-anydpi-v26 │ └── ic_launcher.xml │ ├── mipmap-hdpi │ ├── ic_launcher_background.webp │ └── ic_launcher_foreground.webp │ ├── mipmap-mdpi │ ├── ic_launcher_background.webp │ └── ic_launcher_foreground.webp │ ├── mipmap-xhdpi │ ├── ic_launcher_background.webp │ └── ic_launcher_foreground.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher_background.webp │ └── ic_launcher_foreground.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher_background.webp │ └── ic_launcher_foreground.webp │ └── values │ ├── array.xml │ ├── attrs.xml │ ├── base_html.xml │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── local.properties └── settings.gradle /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | branches: [ dev ] 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: set up JDK 17 12 | uses: actions/setup-java@v1 13 | with: 14 | java-version: 17 15 | # - name: Cache (NDK) 16 | # id: ndk-cache 17 | # uses: actions/cache@v2 18 | # with: 19 | # path: ${ANDROID_HOME}/ndk/21.1.6352462 20 | # key: ndk-cache 21 | # - name: Install NDK 22 | # if: steps.ndk-cache.outputs.cache-hit != 'true' 23 | # run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;21.1.6352462" 24 | - name: licenses 25 | run: yes | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --licenses 26 | - name: Build with Gradle 27 | run: | 28 | echo 'org.gradle.caching=true' >> gradle.properties 29 | echo 'org.gradle.parallel=true' >> gradle.properties 30 | echo 'org.gradle.vfs.watch=true' >> gradle.properties 31 | echo 'org.gradle.jvmargs=-Xmx2048m' >> gradle.properties 32 | ./gradlew assembleRelease 33 | - uses: r0adkll/sign-android-release@v1 34 | name: Sign app APK 35 | # ID used to access action output 36 | id: sign_app 37 | with: 38 | releaseDirectory: app/build/outputs/apk/release 39 | signingKeyBase64: ${{ secrets.SIGNING_KEY }} 40 | alias: ${{ secrets.ALIAS }} 41 | keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} 42 | keyPassword: ${{ secrets.KEY_PASSWORD }} 43 | #env: 44 | #// override default build-tools version (29.0.3) -- optional 45 | #BUILD_TOOLS_VERSION: "30.0.2" 46 | 47 | # Example use of `signedReleaseFile` output -- not needed 48 | - uses: actions/upload-artifact@v2 49 | with: 50 | name: Signed app bundle 51 | path: ${{steps.sign_app.outputs.signedReleaseFile}} 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | output.json 5 | *.txt 6 | *.iml 7 | 8 | # Files for the Dalvik VM 9 | *.dex 10 | 11 | # Java class files 12 | *.class 13 | 14 | # Generated files 15 | bin/ 16 | gen/ 17 | 18 | # Gradle files 19 | .gradle/ 20 | gradle/ 21 | build/ 22 | /*/build/ 23 | app/release/ 24 | 25 | # Local configuration file (sdk path, etc) 26 | local.properties 27 | 28 | # Proguard folder generated by Eclipse 29 | proguard/ 30 | 31 | # Log Files 32 | *.log 33 | 34 | .idea/ 35 | 36 | class_files.txt 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flyme10助手 2 | 3 | > Flyme10助手是基于Xposed开发的Flyme系统MOD工具 4 | 5 | CoderStory的博客:[blog.coderstory.cn](https://blog.coderstory.cn) 6 | 7 | 8 | 9 | Flyme10助手支持去除Flyme系统的大部分广告内容,清理应用缓存,应用冻结备份等功能。 10 | 11 | 12 | ## License 13 | ```text 14 | This program is free software; you can redistribute it and/or 15 | modify it under the terms of the GNU General Public License 16 | as published by the Free Software Foundation; either version 2 17 | of the License, or (at your option) any later version. 18 | 19 | This program is distributed in the hope that it will be useful, 20 | but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | GNU General Public License for more details. 23 | 24 | You should have received a copy of the GNU General Public License 25 | along with this program; if not, write to the Free Software 26 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 27 | ``` 28 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | *.txt 3 | *.iml 4 | .cxx -------------------------------------------------------------------------------- /app/BUG.list: -------------------------------------------------------------------------------- 1 | 隐藏电池图标不起作用 2 | Sim卡图标隐藏 3 | vpn隐藏 4 | 状态栏图标之间有空格(状态栏网速) 5 | 安全扫描跳过无效 6 | 隐藏蓝牙失效 -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdkVersion 33 6 | defaultConfig { 7 | applicationId "com.coderstory.flyme10" 8 | minSdkVersion 33 9 | targetSdk 33 10 | resConfigs "zh-rCN" 11 | versionCode 558 12 | versionName "4.6.10" 13 | } 14 | 15 | signingConfigs { 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled true 20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 | pseudoLocalesEnabled true 22 | shrinkResources true 23 | } 24 | 25 | } 26 | compileOptions { 27 | sourceCompatibility JavaVersion.VERSION_17 28 | targetCompatibility JavaVersion.VERSION_17 29 | } 30 | lint { 31 | abortOnError false 32 | checkReleaseBuilds false 33 | } 34 | namespace 'com.coderstory.flyme10' 35 | } 36 | 37 | dependencies { 38 | compileOnly fileTree(include: ['*.jar'], dir: 'libs') 39 | implementation 'com.google.android.material:material:1.11.0' 40 | implementation 'com.github.goweii:AnyLayer:3.4.3-support' 41 | implementation "com.github.topjohnwu.libsu:core:3.1.2" 42 | implementation 'com.alibaba:fastjson:2.0.33' 43 | implementation 'com.umeng.umsdk:common:9.6.1' 44 | implementation 'com.umeng.umsdk:asms:1.8.0' 45 | } 46 | repositories { 47 | mavenCentral() 48 | } 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /app/dictionary.txt: -------------------------------------------------------------------------------- 1 | ʻ 2 | ʼ 3 | ʽ 4 | ʾ 5 | ʿ 6 | ˆ 7 | ˈ 8 | ˉ 9 | ˊ 10 | ˋ 11 | ˎ 12 | ˏ 13 | ˑ 14 | י 15 | ـ 16 | ٴ 17 | ᐧ 18 | ᴵ 19 | ᵎ 20 | ᵔ 21 | ᵢ 22 | ⁱ 23 | ﹳ 24 | ﹶ 25 | ゙ 26 | ゙゙ 27 | ᐧᐧ 28 | ᴵᴵ 29 | ʻʻ 30 | ʽʽ 31 | ʼʼ 32 | ʿʿ 33 | ʾʾ 34 | ــ 35 | ˆˆ 36 | ˉˉ 37 | ˈˈ 38 | ˋˋ 39 | ˊˊ 40 | ˏˏ 41 | ˎˎ 42 | ˑˑ 43 | ᵔᵔ 44 | יי 45 | ᵎᵎ 46 | ᵢᵢ 47 | ⁱⁱ 48 | ﹳﹳ 49 | ٴٴ 50 | ﹶﹶ 51 | ʻʼ 52 | ʻʽ 53 | ʻʾ 54 | ʻʿ 55 | ʻˆ 56 | ʻˈ 57 | ʻˉ 58 | ʻˊ 59 | ʻˋ 60 | ʻˎ 61 | ʻˏ 62 | ʻˑ 63 | ʻי 64 | ʻـ 65 | ʻٴ 66 | ʻᐧ 67 | ʻᴵ 68 | ʻᵎ 69 | ʻᵔ 70 | ʻᵢ 71 | ʻⁱ 72 | ʻﹳ 73 | ʻﹶ 74 | ʻ゙ 75 | ʼʻ 76 | ʼʽ 77 | ʼʾ 78 | ʼʿ 79 | ʼˆ 80 | ʼˈ 81 | ʼˉ 82 | ʼˊ 83 | ʼˋ 84 | ʼˎ 85 | ʼˏ 86 | ʼˑ 87 | ʼי 88 | ʼـ 89 | ʼٴ 90 | ʼᐧ 91 | ʼᴵ 92 | ʼᵎ 93 | ʼᵔ 94 | ʼᵢ 95 | ʼⁱ 96 | ʼﹳ 97 | ʼﹶ 98 | ʼ゙ 99 | ʽʻ 100 | ʽʼ 101 | ʽʾ 102 | ʽʿ 103 | ʽˆ 104 | ʽˈ 105 | ʽˉ 106 | ʽˊ 107 | ʽˋ 108 | ʽˎ 109 | ʽˏ 110 | ʽˑ 111 | ʽי 112 | ʽـ 113 | ʽٴ 114 | ʽᐧ 115 | ʽᴵ 116 | ʽᵎ 117 | ʽᵔ 118 | ʽᵢ 119 | ʽⁱ 120 | ʽﹳ 121 | ʽﹶ 122 | ʽ゙ 123 | ʾʻ 124 | ʾʼ 125 | ʾʽ 126 | ʾʿ 127 | ʾˆ 128 | ʾˈ 129 | ʾˉ 130 | ʾˊ 131 | ʾˋ 132 | ʾˎ 133 | ʾˏ 134 | ʾˑ 135 | ʾי 136 | ʾـ 137 | ʾٴ 138 | ʾᐧ 139 | ʾᴵ 140 | ʾᵎ 141 | ʾᵔ 142 | ʾᵢ 143 | ʾⁱ 144 | ʾﹳ 145 | ʾﹶ 146 | ʾ゙ 147 | ʿʻ 148 | ʿʼ 149 | ʿʽ 150 | ʿʾ 151 | ʿˆ 152 | ʿˈ 153 | ʿˉ 154 | ʿˊ 155 | ʿˋ 156 | ʿˎ 157 | ʿˏ 158 | ʿˑ 159 | ʿי 160 | ʿـ 161 | ʿٴ 162 | ʿᐧ 163 | ʿᴵ 164 | ʿᵎ 165 | ʿᵔ 166 | ʿᵢ 167 | ʿⁱ 168 | ʿﹳ 169 | ʿﹶ 170 | ʿ゙ 171 | ˆʻ 172 | ˆʼ 173 | ˆʽ 174 | ˆʾ 175 | ˆʿ 176 | ˆˈ 177 | ˆˉ 178 | ˆˊ 179 | ˆˋ 180 | ˆˎ 181 | ˆˏ 182 | ˆˑ 183 | ˆי 184 | ˆـ 185 | ˆٴ 186 | ˆᐧ 187 | ˆᴵ 188 | ˆᵎ 189 | ˆᵔ 190 | ˆᵢ 191 | ˆⁱ 192 | ˆﹳ 193 | ˆﹶ 194 | ˆ゙ 195 | ˈʻ 196 | ˈʼ 197 | ˈʽ 198 | ˈʾ 199 | ˈʿ 200 | ˈˆ 201 | ˈˉ 202 | ˈˊ 203 | ˈˋ 204 | ˈˎ 205 | ˈˏ 206 | ˈˑ 207 | ˈי 208 | ˈـ 209 | ˈٴ 210 | ˈᐧ 211 | ˈᴵ 212 | ˈᵎ 213 | ˈᵔ 214 | ˈᵢ 215 | ˈⁱ 216 | ˈﹳ 217 | ˈﹶ 218 | ˈ゙ 219 | ˉʻ 220 | ˉʼ 221 | ˉʽ 222 | ˉʾ 223 | ˉʿ 224 | ˉˆ 225 | ˉˈ 226 | ˉˊ 227 | ˉˋ 228 | ˉˎ 229 | ˉˏ 230 | ˉˑ 231 | ˉי 232 | ˉـ 233 | ˉٴ 234 | ˉᐧ 235 | ˉᴵ 236 | ˉᵎ 237 | ˉᵔ 238 | ˉᵢ 239 | ˉⁱ 240 | ˉﹳ 241 | ˉﹶ 242 | ˉ゙ 243 | ˊʻ 244 | ˊʼ 245 | ˊʽ 246 | ˊʾ 247 | ˊʿ 248 | ˊˆ 249 | ˊˈ 250 | ˊˉ 251 | ˊˋ 252 | ˊˎ 253 | ˊˏ 254 | ˊˑ 255 | ˊי 256 | ˊـ 257 | ˊٴ 258 | ˊᐧ 259 | ˊᴵ 260 | ˊᵎ 261 | ˊᵔ 262 | ˊᵢ 263 | ˊⁱ 264 | ˊﹳ 265 | ˊﹶ 266 | ˊ゙ 267 | ˋʻ 268 | ˋʼ 269 | ˋʽ 270 | ˋʾ 271 | ˋʿ 272 | ˋˆ 273 | ˋˈ 274 | ˋˉ 275 | ˋˊ 276 | ˋˎ 277 | ˋˏ 278 | ˋˑ 279 | ˋי 280 | ˋـ 281 | ˋٴ 282 | ˋᐧ 283 | ˋᴵ 284 | ˋᵎ 285 | ˋᵔ 286 | ˋᵢ 287 | ˋⁱ 288 | ˋﹳ 289 | ˋﹶ 290 | ˋ゙ 291 | ˎʻ 292 | ˎʼ 293 | ˎʽ 294 | ˎʾ 295 | ˎʿ 296 | ˎˆ 297 | ˎˈ 298 | ˎˉ 299 | ˎˊ 300 | ˎˋ 301 | ˎˏ 302 | ˎˑ 303 | ˎי 304 | ˎـ 305 | ˎٴ 306 | ˎᐧ 307 | ˎᴵ 308 | ˎᵎ 309 | ˎᵔ 310 | ˎᵢ 311 | ˎⁱ 312 | ˎﹳ 313 | ˎﹶ 314 | ˎ゙ 315 | ˏʻ 316 | ˏʼ 317 | ˏʽ 318 | ˏʾ 319 | ˏʿ 320 | ˏˆ 321 | ˏˈ 322 | ˏˉ 323 | ˏˊ 324 | ˏˋ 325 | ˏˎ 326 | ˏˑ 327 | ˏי 328 | ˏـ 329 | ˏٴ 330 | ˏᐧ 331 | ˏᴵ 332 | ˏᵎ 333 | ˏᵔ 334 | ˏᵢ 335 | ˏⁱ 336 | ˏﹳ 337 | ˏﹶ 338 | ˏ゙ 339 | ˑʻ 340 | ˑʼ 341 | ˑʽ 342 | ˑʾ 343 | ˑʿ 344 | ˑˆ 345 | ˑˈ 346 | ˑˉ 347 | ˑˊ 348 | ˑˋ 349 | ˑˎ 350 | ˑˏ 351 | ˑי 352 | ˑـ 353 | ˑٴ 354 | ˑᐧ 355 | ˑᴵ 356 | ˑᵎ 357 | ˑᵔ 358 | ˑᵢ 359 | ˑⁱ 360 | ˑﹳ 361 | ˑﹶ 362 | ˑ゙ 363 | יʻ 364 | יʼ 365 | יʽ 366 | יʾ 367 | יʿ 368 | יˆ 369 | יˈ 370 | יˉ 371 | יˊ 372 | יˋ 373 | יˎ 374 | יˏ 375 | יˑ 376 | יـ 377 | יٴ 378 | יᐧ 379 | יᴵ 380 | יᵎ 381 | יᵔ 382 | יᵢ 383 | יⁱ 384 | יﹳ 385 | יﹶ 386 | י゙ 387 | ـʻ 388 | ـʼ 389 | ـʽ 390 | ـʾ 391 | ـʿ 392 | ـˆ 393 | ـˈ 394 | ـˉ 395 | ـˊ 396 | ـˋ 397 | ـˎ 398 | ـˏ 399 | ـˑ 400 | ـי 401 | ـٴ 402 | ـᐧ 403 | ـᴵ 404 | ـᵎ 405 | ـᵔ 406 | ـᵢ 407 | ـⁱ 408 | ـﹳ 409 | ـﹶ 410 | ـ゙ 411 | ٴʻ 412 | ٴʼ 413 | ٴʽ 414 | ٴʾ 415 | ٴʿ 416 | ٴˆ 417 | ٴˈ 418 | ٴˉ 419 | ٴˊ 420 | ٴˋ 421 | ٴˎ 422 | ٴˏ 423 | ٴˑ 424 | ٴי 425 | ٴـ 426 | ٴᐧ 427 | ٴᴵ 428 | ٴᵎ 429 | ٴᵔ 430 | ٴᵢ 431 | ٴⁱ 432 | ٴﹳ 433 | ٴﹶ 434 | ٴ゙ 435 | ᐧʻ 436 | ᐧʼ 437 | ᐧʽ 438 | ᐧʾ 439 | ᐧʿ 440 | ᐧˆ 441 | ᐧˈ 442 | ᐧˉ 443 | ᐧˊ 444 | ᐧˋ 445 | ᐧˎ 446 | ᐧˏ 447 | ᐧˑ 448 | ᐧי 449 | ᐧـ 450 | ᐧٴ 451 | ᐧᴵ 452 | ᐧᵎ 453 | ᐧᵔ 454 | ᐧᵢ 455 | ᐧⁱ 456 | ᐧﹳ 457 | ᐧﹶ 458 | ᐧ゙ 459 | ᴵʻ 460 | ᴵʼ 461 | ᴵʽ 462 | ᴵʾ 463 | ᴵʿ 464 | ᴵˆ 465 | ᴵˈ 466 | ᴵˉ 467 | ᴵˊ 468 | ᴵˋ 469 | ᴵˎ 470 | ᴵˏ 471 | ᴵˑ 472 | ᴵי 473 | ᴵـ 474 | ᴵٴ 475 | ᴵᐧ 476 | ᴵᵎ 477 | ᴵᵔ 478 | ᴵᵢ 479 | ᴵⁱ 480 | ᴵﹳ 481 | ᴵﹶ 482 | ᴵ゙ 483 | ᵎʻ 484 | ᵎʼ 485 | ᵎʽ 486 | ᵎʾ 487 | ᵎʿ 488 | ᵎˆ 489 | ᵎˈ 490 | ᵎˉ 491 | ᵎˊ 492 | ᵎˋ 493 | ᵎˎ 494 | ᵎˏ 495 | ᵎˑ 496 | ᵎי 497 | ᵎـ 498 | ᵎٴ 499 | ᵎᐧ 500 | ᵎᴵ 501 | ᵎᵔ 502 | ᵎᵢ 503 | ᵎⁱ 504 | ᵎﹳ 505 | ᵎﹶ 506 | ᵎ゙ 507 | ᵔʻ 508 | ᵔʼ 509 | ᵔʽ 510 | ᵔʾ 511 | ᵔʿ 512 | ᵔˆ 513 | ᵔˈ 514 | ᵔˉ 515 | ᵔˊ 516 | ᵔˋ 517 | ᵔˎ 518 | ᵔˏ 519 | ᵔˑ 520 | ᵔי 521 | ᵔـ 522 | ᵔٴ 523 | ᵔᐧ 524 | ᵔᴵ 525 | ᵔᵎ 526 | ᵔᵢ 527 | ᵔⁱ 528 | ᵔﹳ 529 | ᵔﹶ 530 | ᵔ゙ 531 | ᵢʻ 532 | ᵢʼ 533 | ᵢʽ 534 | ᵢʾ 535 | ᵢʿ 536 | ᵢˆ 537 | ᵢˈ 538 | ᵢˉ 539 | ᵢˊ 540 | ᵢˋ 541 | ᵢˎ 542 | ᵢˏ 543 | ᵢˑ 544 | ᵢי 545 | ᵢـ 546 | ᵢٴ 547 | ᵢᐧ 548 | ᵢᴵ 549 | ᵢᵎ 550 | ᵢᵔ 551 | ᵢⁱ 552 | ᵢﹳ 553 | ᵢﹶ 554 | ᵢ゙ 555 | ⁱʻ 556 | ⁱʼ 557 | ⁱʽ 558 | ⁱʾ 559 | ⁱʿ 560 | ⁱˆ 561 | ⁱˈ 562 | ⁱˉ 563 | ⁱˊ 564 | ⁱˋ 565 | ⁱˎ 566 | ⁱˏ 567 | ⁱˑ 568 | ⁱי 569 | ⁱـ 570 | ⁱٴ 571 | ⁱᐧ 572 | ⁱᴵ 573 | ⁱᵎ 574 | ⁱᵔ 575 | ⁱᵢ 576 | ⁱﹳ 577 | ⁱﹶ 578 | ⁱ゙ 579 | ﹳʻ 580 | ﹳʼ 581 | ﹳʽ 582 | ﹳʾ 583 | ﹳʿ 584 | ﹳˆ 585 | ﹳˈ 586 | ﹳˉ 587 | ﹳˊ 588 | ﹳˋ 589 | ﹳˎ 590 | ﹳˏ 591 | ﹳˑ 592 | ﹳי 593 | ﹳـ 594 | ﹳٴ 595 | ﹳᐧ 596 | ﹳᴵ 597 | ﹳᵎ 598 | ﹳᵔ 599 | ﹳᵢ 600 | ﹳⁱ 601 | ﹳﹶ 602 | ﹳ゙ 603 | ﹶʻ 604 | ﹶʼ 605 | ﹶʽ 606 | ﹶʾ 607 | ﹶʿ 608 | ﹶˆ 609 | ﹶˈ 610 | ﹶˉ 611 | ﹶˊ 612 | ﹶˋ 613 | ﹶˎ 614 | ﹶˏ 615 | ﹶˑ 616 | ﹶי 617 | ﹶـ 618 | ﹶٴ 619 | ﹶᐧ 620 | ﹶᴵ 621 | ﹶᵎ 622 | ﹶᵔ 623 | ﹶᵢ 624 | ﹶⁱ 625 | ﹶﹳ 626 | ﹶ゙ 627 | ゙ʻ 628 | ゙ʼ 629 | ゙ʽ 630 | ゙ʾ 631 | ゙ʿ 632 | ゙ˆ 633 | ゙ˈ 634 | ゙ˉ 635 | ゙ˊ 636 | ゙ˋ 637 | ゙ˎ 638 | ゙ˏ 639 | ゙ˑ 640 | ゙י 641 | ゙ـ 642 | ゙ٴ 643 | ゙ᐧ 644 | ゙ᴵ 645 | ゙ᵎ 646 | ゙ᵔ 647 | ゙ᵢ 648 | ゙ⁱ 649 | ゙ﹳ 650 | ゙ﹶ 651 | -------------------------------------------------------------------------------- /app/libs/api-82-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/libs/api-82-sources.jar -------------------------------------------------------------------------------- /app/libs/api-82.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/libs/api-82.jar -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -mergeinterfacesaggressively 2 | -dontusemixedcaseclassnames 3 | #指定代码的压缩级别 4 | -optimizationpasses 7 5 | -overloadaggressively 6 | #不去忽略非公共的库类 7 | -dontskipnonpubliclibraryclasses 8 | -dontskipnonpubliclibraryclassmembers 9 | #优化 不优化输入的类文件 10 | -obfuscationdictionary dictionary.txt 11 | -classobfuscationdictionary dictionary.txt 12 | -packageobfuscationdictionary dictionary.txt 13 | #预校验 14 | -dontpreverify 15 | #混淆时所采用的算法 16 | -optimizations !code/simplification/arithmetic,!code/simplication/cast,!field/*,!class/mergin/* 17 | #保持哪些类不被混淆 18 | -keep class com.coderstory.flyme10.xposed.Start 19 | 20 | -keep class com.coderstory.flyme10.activity.MainActivity { 21 | boolean isEnable(); 22 | } 23 | #-dontwarn 24 | 25 | -keep class com.umeng.** {*;} 26 | 27 | -keep class org.repackage.** {*;} 28 | 29 | -keepclassmembers class * { 30 | public (org.json.JSONObject); 31 | } 32 | 33 | -keepclassmembers enum * { 34 | public static **[] values(); 35 | public static ** valueOf(java.lang.String); 36 | } 37 | 38 | -keep public class com.coderstory.flyme10.R$*{ 39 | public static final int *; 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 52 | 55 | 58 | 61 | 64 | 65 | 69 | 70 | -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | com.coderstory.flyme10.xposed.Start -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/PreferencesProvider.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10 2 | 3 | import com.coderstory.flyme10.preferences.PreferencesProvider 4 | 5 | class PreferencesProvider : PreferencesProvider() { 6 | override val authorities = "com.coderstory.flyme10.PreferencesProvider" 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/activity/AboutActivity.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.activity 2 | 3 | import androidx.fragment.app.Fragment 4 | import com.coderstory.flyme10.fragment.AboutFragment 5 | 6 | open class AboutActivity : ToolbarActivity() { 7 | override fun setFragment(): Fragment { 8 | return AboutFragment() 9 | } 10 | 11 | override val toolbarTitle: String 12 | get() = "关于" 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/activity/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.activity 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Intent 5 | import android.content.res.Configuration 6 | import android.content.res.Resources 7 | import android.os.AsyncTask 8 | import android.os.Build 9 | import android.os.Bundle 10 | import android.view.WindowManager 11 | import androidx.appcompat.app.AppCompatActivity 12 | import com.coderstory.flyme10.R 13 | 14 | class SplashActivity : AppCompatActivity() { 15 | override fun getResources(): Resources { //还原字体大小 16 | val res = super.getResources() 17 | //非默认值 18 | if (res.configuration.fontScale != 1f) { 19 | val newConfig = Configuration() 20 | newConfig.setToDefaults() //设置默认 21 | res.updateConfiguration(newConfig, res.displayMetrics) 22 | } 23 | return res 24 | } 25 | 26 | @SuppressLint("StaticFieldLeak") 27 | override fun onCreate(savedInstanceState: Bundle?) { 28 | super.onCreate(savedInstanceState) 29 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { 30 | val lp = window.attributes 31 | lp.layoutInDisplayCutoutMode = 32 | WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 33 | window.attributes = lp 34 | } 35 | setContentView(R.layout.activity_splash) 36 | //倒计时返回主界面 37 | object : AsyncTask() { 38 | override fun onPostExecute(result: Int?) { 39 | val intent = Intent(this@SplashActivity, MainActivity::class.java) 40 | startActivity(intent) 41 | finish() 42 | } 43 | 44 | override fun doInBackground(vararg params: Void?): Int { 45 | try { 46 | Thread.sleep(SHOW_TIME_MIN.toLong()) 47 | } catch (e: InterruptedException) { 48 | e.printStackTrace() 49 | } 50 | return 1 51 | } 52 | 53 | }.execute() 54 | } 55 | 56 | companion object { 57 | private const val SHOW_TIME_MIN = 1200 58 | } 59 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/activity/ToolbarActivity.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.activity 2 | 3 | import androidx.appcompat.widget.Toolbar 4 | import androidx.fragment.app.Fragment 5 | import androidx.fragment.app.FragmentManager 6 | import com.coderstory.flyme10.R 7 | import com.coderstory.flyme10.R.id 8 | import com.coderstory.flyme10.activity.base.BaseActivity 9 | import com.google.android.material.appbar.AppBarLayout 10 | 11 | abstract class ToolbarActivity : BaseActivity() { 12 | private var mToolbar: Toolbar? = null 13 | private var mAppBarLayout: AppBarLayout? = null 14 | private var mFragmentManager: FragmentManager? = null 15 | override fun init() { 16 | mFragmentManager = supportFragmentManager 17 | } 18 | 19 | override fun setUpView() { 20 | mAppBarLayout = `$`(id.appbar_layout) 21 | mToolbar = `$`(id.toolbar) 22 | mToolbar!!.title = toolbarTitle 23 | setUpToolBar() 24 | } 25 | 26 | private fun setUpToolBar() { 27 | setSupportActionBar(mToolbar) 28 | mToolbar!!.setNavigationIcon(R.drawable.ic_back) 29 | mToolbar!!.setNavigationOnClickListener { onBackPressed() } 30 | val actionBar = supportActionBar 31 | actionBar?.setHomeButtonEnabled(true) 32 | } 33 | 34 | protected abstract val toolbarTitle: String 35 | override fun setUpData() { 36 | mFragmentManager!!.beginTransaction().replace(id.fl_content, setFragment()).commit() 37 | } 38 | 39 | protected abstract fun setFragment(): Fragment 40 | 41 | override fun setLayoutResourceID(): Int { 42 | return R.layout.activity_content 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/activity/base/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.activity.base 2 | 3 | import android.content.Intent 4 | import android.content.res.Configuration 5 | import android.content.res.Resources 6 | import android.os.Bundle 7 | import android.view.View 8 | import androidx.appcompat.app.AppCompatActivity 9 | 10 | abstract class BaseActivity : AppCompatActivity() { 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | init() 14 | setContentView(setLayoutResourceID()) 15 | setUpView() 16 | setUpData() 17 | } 18 | 19 | protected open fun setUpData() {} 20 | 21 | /*** 22 | * 用于在初始化View之前做一些事 23 | */ 24 | protected open fun init() {} 25 | protected abstract fun setUpView() 26 | protected abstract fun setLayoutResourceID(): Int 27 | protected fun `$`(id: Int): T { 28 | return super.findViewById(id) as T 29 | } 30 | 31 | protected fun startActivityWithoutExtras(clazz: Class<*>?) { 32 | val intent = Intent(this, clazz) 33 | startActivity(intent) 34 | } 35 | 36 | public override fun onResume() { 37 | super.onResume() 38 | } 39 | 40 | public override fun onPause() { 41 | super.onPause() 42 | } 43 | 44 | override fun getResources(): Resources { 45 | //还原字体大小 46 | val res = super.getResources() 47 | //非默认值 48 | if (res.configuration.fontScale != 1f) { 49 | val newConfig = Configuration() 50 | newConfig.setToDefaults() 51 | //设置默认 52 | res.updateConfiguration(newConfig, res.displayMetrics) 53 | } 54 | return res 55 | } 56 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/adapter/AppInfo.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.adapter 2 | 3 | 4 | import android.graphics.drawable.Drawable 5 | 6 | class AppInfo { 7 | var name: String? = null 8 | private set 9 | var imageId: Drawable? = null 10 | private set 11 | var disable = false 12 | var packageName = "" 13 | private set 14 | var version = "" 15 | private set 16 | var fileSize = "" 17 | var releaseDate: String? = null 18 | 19 | constructor(name: String, version: String, fileSize: String, releaseDate: String?) { 20 | this.name = if (name.length > 25) name.substring(0, 25) + "..." else name 21 | this.version = version 22 | this.fileSize = fileSize 23 | this.releaseDate = releaseDate 24 | } 25 | 26 | constructor( 27 | name: String, 28 | imageId: Drawable?, 29 | packageName: String, 30 | Disable: Boolean, 31 | version: String 32 | ) { 33 | this.name = if (name.length > 25) name.substring(0, 25) + "..." else name 34 | this.imageId = imageId 35 | this.packageName = packageName 36 | disable = Disable 37 | this.version = version 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/adapter/AppInfoAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.adapter 2 | 3 | import android.content.Context 4 | import android.graphics.Color 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.ArrayAdapter 9 | import android.widget.ImageView 10 | import android.widget.TextView 11 | import androidx.core.content.ContextCompat 12 | import com.coderstory.flyme10.R 13 | import com.coderstory.flyme10.R.id 14 | 15 | class AppInfoAdapter(context: Context?, private val resourceId: Int, objects: List?) : 16 | ArrayAdapter(context!!, resourceId, objects!!) { 17 | override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { 18 | val appInfo = getItem(position) as AppInfo? 19 | val view: View 20 | val vh: ViewHolder 21 | 22 | if (convertView != null) { //查询布局是否已经缓存 23 | view = convertView 24 | vh = view.tag as ViewHolder //重新获取ViewHolder 25 | } else { 26 | view = LayoutInflater.from(context).inflate(resourceId, null) //读取items.xml文件并实例化 27 | vh = ViewHolder() 28 | vh.myImage = view.findViewById(id.app_image) //查找items实例中的myimage 29 | vh.myText = view.findViewById(id.app_name) //查找items实例中的mytext 30 | view.tag = vh //保存到view中 31 | } 32 | 33 | vh.myText!!.tag = appInfo!!.packageName 34 | if (appInfo.imageId != null) { 35 | vh.myImage!!.setImageDrawable(appInfo.imageId) 36 | vh.myText!!.text = 37 | String.format(context.getString(R.string.appname), appInfo.name, appInfo.version) 38 | } else { 39 | vh.myText!!.text = String.format( 40 | context.getString(R.string.app_info), 41 | appInfo.name, 42 | appInfo.fileSize, 43 | appInfo.releaseDate 44 | ) 45 | vh.myImage!!.visibility = View.GONE 46 | } 47 | 48 | if (appInfo.disable) { 49 | view.setBackgroundColor(Color.parseColor("#d0d7d7d7")) //冻结的颜色 50 | } else { 51 | view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimary)) //正常的的颜色 52 | } 53 | 54 | return view 55 | } 56 | 57 | private inner class ViewHolder { 58 | var myImage: ImageView? = null 59 | var myText: TextView? = null 60 | } 61 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/fragment/AboutFragment.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.fragment 2 | 3 | import android.view.View 4 | import android.widget.TextView 5 | import com.coderstory.flyme10.BuildConfig 6 | 7 | import com.coderstory.flyme10.R 8 | import com.coderstory.flyme10.fragment.base.BaseFragment 9 | 10 | class AboutFragment : BaseFragment() { 11 | override fun setLayoutResourceID(): Int { 12 | return R.layout.fragment_about 13 | } 14 | 15 | override fun setUpView() { 16 | (`$`(R.id.version) as TextView).text = BuildConfig.VERSION_NAME 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/fragment/BlogFragment.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.fragment 2 | 3 | import android.content.ClipData 4 | import android.content.ClipboardManager 5 | import android.content.Context 6 | import android.content.Intent 7 | import android.view.Menu 8 | import android.view.MenuInflater 9 | import android.view.MenuItem 10 | import com.coderstory.flyme10.R 11 | import com.coderstory.flyme10.tools.Misc 12 | import com.coderstory.flyme10.tools.SnackBarUtils 13 | 14 | class BlogFragment : WebViewFragment() { 15 | override val loadUrl: String 16 | get() = Misc.MyBlogUrl 17 | 18 | override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { 19 | inflater.inflate(R.menu.menu_webview_toolbar, menu) 20 | super.onCreateOptionsMenu(menu, inflater) 21 | } 22 | 23 | override fun onOptionsItemSelected(item: MenuItem): Boolean { 24 | if (item.itemId == R.id.action_copy) { 25 | val myClipboard: ClipboardManager 26 | if (activity != null) { 27 | myClipboard = 28 | requireActivity().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 29 | val myClip: ClipData 30 | val text = mWebView?.url ?: "" 31 | myClip = ClipData.newPlainText("text", text) 32 | myClipboard.setPrimaryClip(myClip) 33 | SnackBarUtils.makeLong(view, getString(R.string.cp_url_success)).show() 34 | } 35 | } else if (item.itemId == R.id.action_share) { 36 | shareMsg(getString(R.string.share_url), mWebView!!.title, mWebView!!.url) 37 | } 38 | return false 39 | } 40 | 41 | private fun shareMsg(activityTitle: String?, msgTitle: String?, msgText: String?) { 42 | val intent = Intent(Intent.ACTION_SEND) 43 | intent.type = "text/plain" // 纯文本 44 | intent.putExtra(Intent.EXTRA_SUBJECT, msgTitle) 45 | intent.putExtra(Intent.EXTRA_TEXT, msgText) 46 | intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK 47 | startActivity(Intent.createChooser(intent, activityTitle)) 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/fragment/OthersFragment.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.fragment 2 | 3 | import android.content.res.Resources.NotFoundException 4 | import android.graphics.Color 5 | import android.graphics.drawable.ColorDrawable 6 | import android.text.Editable 7 | import android.text.TextWatcher 8 | import android.view.Menu 9 | import android.view.MenuInflater 10 | import android.view.MenuItem 11 | import android.view.View 12 | import android.widget.EditText 13 | import android.widget.LinearLayout 14 | import android.widget.NumberPicker 15 | import android.widget.TextView 16 | import androidx.appcompat.widget.SwitchCompat 17 | import androidx.cardview.widget.CardView 18 | import com.coderstory.flyme10.R 19 | import com.coderstory.flyme10.fragment.base.BaseFragment 20 | import com.topjohnwu.superuser.Shell 21 | import per.goweii.anylayer.AnyLayer 22 | import per.goweii.anylayer.DialogLayer 23 | import per.goweii.anylayer.Layer 24 | 25 | class OthersFragment : BaseFragment() { 26 | override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { 27 | inflater.inflate(R.menu.menu_upgrade_toolbar, menu) 28 | super.onCreateOptionsMenu(menu, inflater) 29 | } 30 | 31 | override fun onOptionsItemSelected(item: MenuItem): Boolean { 32 | val anyLayer = AnyLayer.dialog(mContext) 33 | .contentView(R.layout.dialog_disable_app) 34 | .cancelableOnTouchOutside(true) 35 | .cancelableOnClickKeyBack(true) 36 | .onClick({ AnyLayer: Layer, v: View? -> AnyLayer.dismiss() }, R.id.fl_dialog_no) 37 | .onClick({ AnyLayer: Layer?, v: View? -> 38 | Shell.su("killall com.android.systemui").exec() 39 | Shell.su("am force-stop com.meizu.flyme.launcher").exec() 40 | System.exit(0) 41 | }, R.id.fl_dialog_yes) 42 | anyLayer.show() 43 | val cardView = (anyLayer as DialogLayer).contentView as CardView 44 | val linearLayout = cardView.getChildAt(0) as LinearLayout 45 | val textView = linearLayout.getChildAt(1) as TextView 46 | textView.text = "一键重启桌面状态栏包管理器等app" 47 | return false 48 | } 49 | 50 | override fun setUpView() { 51 | `$`(R.id.enableBlockAD).setOnClickListener { v: View -> 52 | editor.putBoolean("EnableBlockAD", (v as SwitchCompat).isChecked) 53 | fix() 54 | } 55 | `$`(R.id.enabletheme).setOnClickListener { v: View -> 56 | editor.putBoolean("enabletheme", (v as SwitchCompat).isChecked) 57 | fix() 58 | } 59 | `$`(R.id.hide_icon_label).setOnClickListener { v: View -> 60 | editor.putBoolean("hide_icon_label", (v as SwitchCompat).isChecked) 61 | fix() 62 | } 63 | `$`(R.id.enableCTS).setOnClickListener { v: View -> 64 | editor.putBoolean("enableCTS", (v as SwitchCompat).isChecked) 65 | fix() 66 | } 67 | `$`(R.id.enableCheckInstaller).setOnClickListener { v: View -> 68 | editor.putBoolean("enableCheckInstaller", (v as SwitchCompat).isChecked) 69 | fix() 70 | } 71 | `$`(R.id.hideDepWarn).setOnClickListener { v: View -> 72 | editor.putBoolean("hideDepWarn", (v as SwitchCompat).isChecked) 73 | fix() 74 | } 75 | `$`(R.id.removeStore).setOnClickListener { v: View -> 76 | editor.putBoolean("removeStore", (v as SwitchCompat).isChecked) 77 | fix() 78 | } 79 | `$`(R.id.autoInstall).setOnClickListener { v: View -> 80 | editor.putBoolean("autoInstall", (v as SwitchCompat).isChecked) 81 | fix() 82 | } 83 | `$`(R.id.disableSearch).setOnClickListener { v: View -> 84 | editor.putBoolean("disableSearch", (v as SwitchCompat).isChecked) 85 | fix() 86 | } 87 | `$`(R.id.disable_charge_animation).setOnClickListener { v: View -> 88 | editor.putBoolean("disable_charge_animation", (v as SwitchCompat).isChecked) 89 | fix() 90 | } 91 | `$`(R.id.double_clock_sleep).setOnClickListener { v: View -> 92 | editor.putBoolean("double_clock_sleep", (v as SwitchCompat).isChecked) 93 | fix() 94 | } 95 | `$`(R.id.click_to_clock).setOnClickListener { v: View -> 96 | editor.putBoolean("click_to_clock", (v as SwitchCompat).isChecked) 97 | fix() 98 | } 99 | `$`(R.id.click_to_calendar).setOnClickListener { v: View -> 100 | editor.putBoolean("click_to_calendar", (v as SwitchCompat).isChecked) 101 | fix() 102 | } 103 | val carrierName = `$`(R.id.enable_back_vibrator) 104 | carrierName.addTextChangedListener(object : TextWatcher { 105 | override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} 106 | override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} 107 | override fun afterTextChanged(editable: Editable) { 108 | editor.putString("enable_back_vibrator_value", editable.toString()) 109 | fix() 110 | } 111 | }) 112 | 113 | } 114 | 115 | override fun setLayoutResourceID(): Int { 116 | return R.layout.fragment_others 117 | } 118 | 119 | override fun setUpData() { 120 | (`$`(R.id.enable_back_vibrator) as EditText).setText( 121 | prefs.getString( 122 | "enable_back_vibrator_value", 123 | "" 124 | ) 125 | ) 126 | (`$`(R.id.disable_charge_animation) as SwitchCompat).isChecked = 127 | prefs.getBoolean("disable_charge_animation", false) 128 | (`$`(R.id.double_clock_sleep) as SwitchCompat).isChecked = 129 | prefs.getBoolean("double_clock_sleep", true) 130 | (`$`(R.id.click_to_clock) as SwitchCompat).isChecked = 131 | prefs.getBoolean("click_to_clock", true) 132 | (`$`(R.id.click_to_calendar) as SwitchCompat).isChecked = 133 | prefs.getBoolean("click_to_calendar", true) 134 | (`$`(R.id.hide_icon_label) as SwitchCompat).isChecked = 135 | prefs.getBoolean("hide_icon_label", false) 136 | (`$`(R.id.enableBlockAD) as SwitchCompat).isChecked = 137 | prefs.getBoolean("EnableBlockAD", false) 138 | (`$`(R.id.enabletheme) as SwitchCompat).isChecked = 139 | prefs.getBoolean("enabletheme", false) 140 | (`$`(R.id.enableCheckInstaller) as SwitchCompat).isChecked = 141 | prefs.getBoolean("enableCheckInstaller", false) 142 | (`$`(R.id.enableCTS) as SwitchCompat).isChecked = prefs.getBoolean("enableCTS", false) 143 | (`$`(R.id.hideDepWarn) as SwitchCompat).isChecked = 144 | prefs.getBoolean("hideDepWarn", false) 145 | (`$`(R.id.removeStore) as SwitchCompat).isChecked = 146 | prefs.getBoolean("removeStore", false) 147 | (`$`(R.id.autoInstall) as SwitchCompat).isChecked = 148 | prefs.getBoolean("autoInstall", false) 149 | (`$`(R.id.disableSearch) as SwitchCompat).isChecked = 150 | prefs.getBoolean("disableSearch", false) 151 | 152 | } 153 | 154 | private fun setDatePickerDividerColor(picker: NumberPicker?, max: Int, min: Int) { 155 | //设置最大值 156 | picker!!.maxValue = max 157 | //设置最小值 158 | picker.minValue = min 159 | val pickerFields = NumberPicker::class.java.declaredFields 160 | for (pf in pickerFields) { 161 | if (pf.name == "mSelectionDivider") { 162 | pf.isAccessible = true 163 | try { 164 | pf[picker] = ColorDrawable(Color.alpha(256)) 165 | } catch (e: IllegalArgumentException) { 166 | e.printStackTrace() 167 | } catch (e: NotFoundException) { 168 | e.printStackTrace() 169 | } catch (e: IllegalAccessException) { 170 | e.printStackTrace() 171 | } 172 | break 173 | } 174 | } 175 | } 176 | 177 | override fun onHiddenChanged(hidden: Boolean) { 178 | super.onHiddenChanged(hidden) 179 | setUpData() 180 | } 181 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/fragment/SettingsFragment.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.fragment 2 | 3 | 4 | import android.content.ComponentName 5 | import android.content.pm.PackageManager 6 | import android.view.View 7 | import androidx.appcompat.widget.SwitchCompat 8 | import com.coderstory.flyme10.R 9 | import com.coderstory.flyme10.fragment.base.BaseFragment 10 | 11 | class SettingsFragment : BaseFragment() { 12 | override fun setUpView() { 13 | `$`(R.id.enableCheck).setOnClickListener { v: View -> 14 | editor.putBoolean("enableCheck", (v as SwitchCompat).isChecked) 15 | fix() 16 | } 17 | `$`(R.id.hideicon).setOnClickListener { v: View -> 18 | editor.putBoolean("hideIcon", (v as SwitchCompat).isChecked) 19 | fix() 20 | val localComponentName = 21 | ComponentName(mContext, "com.coderstory.flyme10.activity.SplashActivity") 22 | val localPackageManager = mContext.packageManager 23 | localPackageManager.getComponentEnabledSetting(localComponentName) 24 | val packageManager = mContext.packageManager 25 | val componentName = 26 | ComponentName(mContext, "com.coderstory.flyme10.activity.SplashActivity") 27 | if (v.isChecked) { 28 | packageManager.setComponentEnabledSetting( 29 | componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 30 | PackageManager.DONT_KILL_APP 31 | ) 32 | } else { 33 | packageManager.setComponentEnabledSetting( 34 | componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 35 | PackageManager.DONT_KILL_APP 36 | ) 37 | } 38 | } 39 | } 40 | 41 | override fun setLayoutResourceID(): Int { 42 | return R.layout.fragment_settings 43 | } 44 | 45 | override fun setUpData() { 46 | (`$`(R.id.enableCheck) as SwitchCompat).isChecked = 47 | prefs.getBoolean("enableCheck", true) 48 | (`$`(R.id.hideicon) as SwitchCompat).isChecked = prefs.getBoolean("hideIcon", false) 49 | } 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/fragment/UpgradeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.fragment 2 | 3 | 4 | import android.content.ClipData 5 | import android.content.ClipboardManager 6 | import android.content.Context 7 | import android.content.pm.PackageInfo 8 | import android.view.Menu 9 | import android.view.MenuInflater 10 | import android.view.MenuItem 11 | import android.view.View 12 | import android.widget.AdapterView 13 | import android.widget.AdapterView.OnItemClickListener 14 | import android.widget.LinearLayout 15 | import android.widget.ListView 16 | import android.widget.TextView 17 | import android.widget.Toast 18 | import androidx.cardview.widget.CardView 19 | import com.coderstory.flyme10.R 20 | import com.coderstory.flyme10.adapter.AppInfo 21 | import com.coderstory.flyme10.adapter.AppInfoAdapter 22 | import com.coderstory.flyme10.fragment.base.BaseFragment 23 | import com.coderstory.flyme10.view.PullToRefreshView 24 | import per.goweii.anylayer.AnyLayer 25 | import per.goweii.anylayer.DialogLayer 26 | import per.goweii.anylayer.Layer 27 | 28 | class UpgradeFragment : BaseFragment() { 29 | private val appInfos: MutableList = ArrayList() 30 | private var packages: List = ArrayList() 31 | private var adapter: AppInfoAdapter? = null 32 | private var mPullToRefreshView: PullToRefreshView? = null 33 | override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { 34 | inflater.inflate(R.menu.menu_upgrade_toolbar, menu) 35 | super.onCreateOptionsMenu(menu, inflater) 36 | } 37 | 38 | override fun onOptionsItemSelected(item: MenuItem): Boolean { 39 | val anyLayer = AnyLayer.dialog(mContext) 40 | .contentView(R.layout.dialog_disable_app) 41 | .cancelableOnTouchOutside(true) 42 | .cancelableOnClickKeyBack(true) 43 | .onClick({ AnyLayer: Layer, _: View? -> AnyLayer.dismiss() }, R.id.fl_dialog_no) 44 | .onClick({ AnyLayer: Layer, _: View? -> 45 | editor.putString("updateList", "") 46 | fix() 47 | initData() 48 | adapter!!.notifyDataSetChanged() 49 | AnyLayer.dismiss() 50 | }, R.id.fl_dialog_yes) 51 | anyLayer.show() 52 | val cardView = (anyLayer as DialogLayer).contentView as CardView 53 | val linearLayout = cardView.getChildAt(0) as LinearLayout 54 | val textView = linearLayout.getChildAt(1) as TextView 55 | textView.text = "你确定要清空历史记录吗?" 56 | return false 57 | } 58 | 59 | private fun initData() { 60 | packages = ArrayList() 61 | packages = mContext.packageManager.getInstalledPackages(0) 62 | initFruit() 63 | } 64 | 65 | private fun initFruit() { 66 | appInfos.clear() 67 | val str = prefs.getString("updateList", "") 68 | if ("" == str) { 69 | Toast.makeText( 70 | mContext, 71 | "未找到任何更新包记录,请打开系统更新检测到更新后再试", 72 | Toast.LENGTH_LONG 73 | ).show() 74 | } else { 75 | try { 76 | for (log in str!!.split(";").toTypedArray()) { 77 | if (log != "") { 78 | val info = log.split("@").toTypedArray() 79 | appInfos.add( 80 | 0, 81 | AppInfo(" " + info[0], info[1], " " + info[2], " " + info[3]) 82 | ) 83 | } 84 | } 85 | } catch (e: Exception) { 86 | editor.putString("updateList", "") 87 | Toast.makeText(mContext, "检测到数据异常,已重置", Toast.LENGTH_LONG).show() 88 | fix() 89 | } 90 | } 91 | } 92 | 93 | private fun showData() { 94 | adapter = AppInfoAdapter(mContext, R.layout.app_upgrade_item, appInfos) 95 | val listView = contentView!!.findViewById(R.id.listView) 96 | listView.adapter = adapter 97 | listView.onItemClickListener = 98 | OnItemClickListener { _: AdapterView<*>?, _: View?, position: Int, _: Long -> 99 | val appInfo = appInfos[position] 100 | val anyLayer = AnyLayer.dialog(mContext) 101 | .contentView(R.layout.dialog_xposed_copyurl) 102 | .cancelableOnTouchOutside(true) 103 | .cancelableOnClickKeyBack(true) 104 | .onClick({ AnyLayer: Layer, _: View? -> 105 | val myClipboard: ClipboardManager = 106 | mContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 107 | val myClip: ClipData 108 | val text = appInfo!!.version 109 | myClip = ClipData.newPlainText("text", text) 110 | myClipboard.setPrimaryClip(myClip) 111 | AnyLayer.dismiss() 112 | }, R.id.tv_dialog_yes2) 113 | anyLayer.show() 114 | } 115 | } 116 | 117 | override fun setLayoutResourceID(): Int { 118 | return R.layout.fragment_app_upgrade 119 | } 120 | 121 | override fun setUpData() { 122 | super.init() 123 | // Toast.makeText(getActivity(), "系统更新检测到的更新包地址", Toast.LENGTH_LONG).show(); 124 | mPullToRefreshView = contentView!!.findViewById(R.id.pull_to_refresh) 125 | mPullToRefreshView!!.setOnRefreshListener(object : PullToRefreshView.OnRefreshListener { 126 | override fun onRefresh() { 127 | mPullToRefreshView!!.postDelayed({ 128 | initData() 129 | showData() 130 | adapter!!.notifyDataSetChanged() 131 | mPullToRefreshView!!.setRefreshing(false) 132 | }, 2000) 133 | } 134 | 135 | }) 136 | initData() 137 | showData() 138 | adapter!!.notifyDataSetChanged() 139 | } 140 | 141 | 142 | override fun onResume() { 143 | super.onResume() 144 | if (adapter != null) { 145 | initData() 146 | adapter!!.notifyDataSetChanged() 147 | } 148 | } 149 | 150 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/fragment/WebViewFragment.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.fragment 2 | 3 | import android.view.View 4 | import android.webkit.WebChromeClient 5 | import android.webkit.WebSettings 6 | import android.webkit.WebView 7 | import android.webkit.WebViewClient 8 | import android.widget.ProgressBar 9 | import com.coderstory.flyme10.R 10 | import com.coderstory.flyme10.fragment.base.BaseFragment 11 | 12 | abstract class WebViewFragment : BaseFragment() { 13 | protected var mWebView: WebView? = null 14 | protected var mProgressBar: ProgressBar? = null 15 | override fun setLayoutResourceID(): Int { 16 | return R.layout.fragment_webview 17 | } 18 | 19 | protected abstract val loadUrl: String 20 | override fun setUpView() { 21 | mProgressBar = contentView!!.findViewById(R.id.progressbar) 22 | mWebView = contentView!!.findViewById(R.id.webView) 23 | initWebViewSettings() 24 | mWebView!!.webViewClient = MyWebViewClient() 25 | mWebView!!.webChromeClient = MyWebChromeClient() 26 | mProgressBar!!.max = 100 27 | mWebView!!.loadUrl(loadUrl) 28 | } 29 | 30 | private fun initWebViewSettings() { 31 | val webSettings = mWebView!!.settings //支持获取手势焦点,输入用户名、密码或其他 32 | mWebView!!.requestFocusFromTouch() //设置自适应屏幕,两者合用 33 | webSettings.useWideViewPort = true //将图片调整到适合webview的大小 34 | webSettings.loadWithOverviewMode = true // 缩放至屏幕的大小 35 | webSettings.setSupportZoom(true) //支持缩放,默认为true。是下面那个的前提。 36 | webSettings.builtInZoomControls = true //设置内置的缩放控件。 37 | webSettings.displayZoomControls = false //隐藏原生的缩放控件 38 | webSettings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN //支持内容重新布局 39 | webSettings.supportMultipleWindows() //多窗口 40 | webSettings.allowFileAccess = true //设置可以访问文件 41 | webSettings.setNeedInitialFocus(true) //当webview调用requestFocus时为webview设置节点 42 | webSettings.javaScriptCanOpenWindowsAutomatically = true //支持通过JS打开新窗口 43 | webSettings.loadsImagesAutomatically = true //支持自动加载图片 44 | webSettings.defaultTextEncodingName = "utf-8" //设置编码格式 45 | } 46 | 47 | fun canGoBack(): Boolean { 48 | return mWebView != null && mWebView!!.canGoBack() 49 | } 50 | 51 | fun goBack() { 52 | if (mWebView != null) { 53 | mWebView!!.goBack() 54 | } 55 | } 56 | 57 | override fun onPause() { 58 | super.onPause() 59 | if (mWebView != null) mWebView!!.onPause() 60 | } 61 | 62 | override fun onResume() { 63 | super.onResume() 64 | if (mWebView != null) mWebView!!.onResume() 65 | } 66 | 67 | override fun onDestroy() { 68 | super.onDestroy() 69 | if (mWebView != null) mWebView!!.destroy() 70 | } 71 | 72 | //WebViewClient就是帮助WebView处理各种通知、请求事件的。 73 | internal class MyWebViewClient : WebViewClient() { 74 | override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { 75 | view.loadUrl(url) 76 | return true 77 | } 78 | } 79 | 80 | internal inner class MyWebChromeClient : WebChromeClient() { 81 | override fun onProgressChanged(view: WebView, newProgress: Int) { 82 | mProgressBar!!.progress = newProgress 83 | if (newProgress == 100) { 84 | mProgressBar!!.visibility = View.GONE 85 | } else { 86 | mProgressBar!!.visibility = View.VISIBLE 87 | } 88 | } 89 | } 90 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/fragment/base/BaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.fragment.base 2 | 3 | import android.annotation.SuppressLint 4 | import android.app.ProgressDialog 5 | import android.content.Context 6 | import android.content.SharedPreferences 7 | import android.os.Build 8 | import android.os.Bundle 9 | import android.view.LayoutInflater 10 | import android.view.View 11 | import android.view.ViewGroup 12 | import androidx.fragment.app.Fragment 13 | import com.coderstory.flyme10.tools.Misc 14 | import com.coderstory.flyme10.tools.Utils 15 | import com.topjohnwu.superuser.Shell 16 | import java.io.File 17 | 18 | /** 19 | * Created by _SOLID 20 | * Date:2016/3/30 21 | * Time:11:30 22 | */ 23 | abstract class BaseFragment : Fragment() { 24 | protected var contentView: View? = null 25 | private set 26 | lateinit var mContext: Context 27 | private set 28 | 29 | override fun onCreateView( 30 | inflater: LayoutInflater, 31 | container: ViewGroup?, 32 | savedInstanceState: Bundle? 33 | ): View? { 34 | contentView = inflater.inflate( 35 | setLayoutResourceID(), 36 | container, 37 | false 38 | ) //setContentView(inflater, container); 39 | mContext = requireContext() 40 | val mProgressDialog = ProgressDialog(mContext) 41 | mProgressDialog.setCanceledOnTouchOutside(false) 42 | setHasOptionsMenu(true) 43 | init() 44 | setUpView() 45 | setUpData() 46 | prefs 47 | return contentView 48 | } 49 | 50 | protected abstract fun setLayoutResourceID(): Int 51 | protected open fun setUpData() {} 52 | protected val editor: SharedPreferences.Editor 53 | get() { 54 | if (Companion.editor == null) { 55 | Companion.editor = prefs.edit() 56 | } 57 | return Companion.editor!! 58 | } 59 | protected val prefs: SharedPreferences 60 | get() { 61 | Companion.prefs = Utils.getMySharedPreferences( 62 | mContext.applicationContext, 63 | Misc.SharedPreferencesName 64 | ) 65 | return Companion.prefs 66 | } 67 | 68 | fun fix() { 69 | editor.commit() 70 | sudoFixPermissions() 71 | } 72 | 73 | @SuppressLint("SetWorldReadable") 74 | protected fun sudoFixPermissions() { 75 | if (Build.VERSION.SDK_INT < 30) { 76 | Thread { 77 | val pkgFolder = File("/data/user_de/0/" + Misc.ApplicationName) 78 | if (pkgFolder.exists()) { 79 | pkgFolder.setExecutable(true, false) 80 | pkgFolder.setReadable(true, false) 81 | } 82 | Shell.su("chmod 755 $PREFS_FOLDER").exec() 83 | // Set preferences file permissions to be world readable 84 | Shell.su("chmod 644 $PREFS_FILE").exec() 85 | }.start() 86 | } 87 | } 88 | 89 | protected open fun init() {} 90 | protected open fun setUpView() {} 91 | protected fun `$`(id: Int): T { 92 | return contentView!!.findViewById(id) 93 | } 94 | 95 | companion object { 96 | const val PREFS_FOLDER = " /data/user_de/0/" + Misc.ApplicationName + "/shared_prefs\n" 97 | const val PREFS_FILE = 98 | " /data/user_de/0/" + Misc.ApplicationName + "/shared_prefs/" + Misc.SharedPreferencesName + ".xml\n" 99 | private lateinit var prefs: SharedPreferences 100 | private var editor: SharedPreferences.Editor? = null 101 | } 102 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/patchModule/FuckAd.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.patchModule 2 | 3 | 4 | import android.content.Context 5 | import android.webkit.WebView 6 | import com.coderstory.flyme10.tools.XposedHelper 7 | import com.coderstory.flyme10.xposed.IModule 8 | import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam 9 | import de.robv.android.xposed.XC_MethodHook 10 | import de.robv.android.xposed.XC_MethodReplacement 11 | import de.robv.android.xposed.XposedBridge 12 | import de.robv.android.xposed.XposedHelpers 13 | import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam 14 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam 15 | 16 | 17 | class FuckAd : XposedHelper(), IModule { 18 | override fun handleInitPackageResources(respray: InitPackageResourcesParam) {} 19 | override fun initZygote(startupParam: StartupParam?) {} 20 | override fun handleLoadPackage(loadPackageParam: LoadPackageParam) { 21 | 22 | if (loadPackageParam.packageName.equals("com.android.browser")) { 23 | XposedBridge.log("进入浏览器的逻辑") 24 | findAndHookMethod( 25 | "com.common.advertise.plugin.utils.DeviceUtils", 26 | loadPackageParam.classLoader, 27 | "is18Device", 28 | XC_MethodReplacement.returnConstant(true) 29 | ) 30 | 31 | findAndHookMethod( 32 | "com.meizu.advertise.admediation.i.a", 33 | loadPackageParam.classLoader, 34 | "a", 35 | XC_MethodReplacement.returnConstant(true) 36 | ) 37 | 38 | findAndHookMethod( 39 | "com.meizu.advertise.admediation.c.e", 40 | loadPackageParam.classLoader, 41 | "a", 42 | XC_MethodReplacement.returnConstant(null) 43 | ) 44 | 45 | XposedBridge.log("退出浏览器的逻辑") 46 | 47 | } 48 | 49 | 50 | if (loadPackageParam.packageName.equals("com.meizu.flyme.weather")) { 51 | 52 | findAndHookMethod( 53 | "com.common.advertise.plugin.utils.f", 54 | loadPackageParam.classLoader, 55 | "p", 56 | XC_MethodReplacement.returnConstant(true) 57 | ) 58 | 59 | findAndHookMethod( 60 | "com.meizu.flyme.policy.sdk.yw", 61 | loadPackageParam.classLoader, 62 | "a", 63 | XC_MethodReplacement.returnConstant(true) 64 | ) 65 | 66 | } 67 | 68 | 69 | 70 | if ((loadPackageParam.packageName.contains("meizu") || 71 | loadPackageParam.packageName.contains("flyme") || loadPackageParam.packageName.contains( 72 | "mz" 73 | )) && 74 | prefs.getBoolean("EnableBlockAD", false) 75 | ) { 76 | // 禁止app加载魅族的广告插件 com.meizu.advertisef,..plugin.apk 77 | var clazz = findClassWithoutLog( 78 | "com.meizu.advertise.api.AdManager", 79 | loadPackageParam.classLoader 80 | ) 81 | if (clazz != null) { 82 | hookAllMethods(clazz, "installPlugin", XC_MethodReplacement.returnConstant(null)) 83 | hookAllMethods(clazz, "install", XC_MethodReplacement.returnConstant(null)) 84 | hookAllMethods(clazz, "init", XC_MethodReplacement.returnConstant(null)) 85 | } 86 | 87 | clazz = findClassWithoutLog( 88 | "com.meizu.advertise.update.PluginManager", 89 | loadPackageParam.classLoader 90 | ) 91 | if (clazz != null) { 92 | hookAllMethods(clazz, "install", XC_MethodReplacement.returnConstant(null)) 93 | hookAllMethods(clazz, "isFirstInstalled", XC_MethodReplacement.returnConstant(true)) 94 | hookAllMethods(clazz, "newContext", XC_MethodReplacement.returnConstant(true)) 95 | hookAllMethods( 96 | clazz, 97 | "installFromDownload", 98 | XC_MethodReplacement.returnConstant(null) 99 | ) 100 | } 101 | 102 | clazz = findClassWithoutLog( 103 | "com.meizu.advertise.api.SimpleJsAdBridge", 104 | loadPackageParam.classLoader 105 | ) 106 | 107 | if (clazz != null) { 108 | XposedHelpers.findAndHookConstructor( 109 | clazz, 110 | Context::class.java, 111 | WebView::class.java, 112 | object : XC_MethodHook() { 113 | @Throws(Throwable::class) 114 | override fun afterHookedMethod(param: MethodHookParam) { 115 | super.afterHookedMethod(param) 116 | // super(activity, new SimpleWebView(webView)); 117 | // webView.addJavascriptInterface(this, JsAdBridge.OBJECT_NAME); 118 | // this.mWebView = webView; 119 | val webView = XposedHelpers.getObjectField( 120 | param.thisObject, 121 | "mWebView" 122 | ) as WebView 123 | webView.removeJavascriptInterface("mzAd") 124 | } 125 | }) 126 | } 127 | if (findClassWithoutLog( 128 | "com.meizu.flyme.media.news.lite.NewsFullManager", 129 | loadPackageParam.classLoader 130 | ) != null 131 | ) { 132 | hookAllMethods( 133 | "com.meizu.flyme.media.news.lite.NewsFullManager", 134 | loadPackageParam.classLoader, 135 | "fetchAdData", 136 | XC_MethodReplacement.returnConstant(null) 137 | ) 138 | hookAllMethods( 139 | "com.meizu.flyme.media.news.lite.NewsFullManager", 140 | loadPackageParam.classLoader, 141 | "doFetchMeizuAdData", 142 | XC_MethodReplacement.returnConstant(null) 143 | ) 144 | hookAllMethods( 145 | "com.meizu.flyme.media.news.lite.NewsFullManager", 146 | loadPackageParam.classLoader, 147 | "fetchArticlesWithRetry", 148 | XC_MethodReplacement.returnConstant(false) 149 | ) 150 | hookAllMethods( 151 | "com.meizu.flyme.media.news.lite.NewsFullManager", 152 | loadPackageParam.classLoader, 153 | "fetchManualArticles", 154 | XC_MethodReplacement.returnConstant(false) 155 | ) 156 | hookAllMethods( 157 | "com.meizu.flyme.media.news.lite.NewsFullManager", 158 | loadPackageParam.classLoader, 159 | "fetchTopics", 160 | XC_MethodReplacement.returnConstant(false) 161 | ) 162 | hookAllMethods( 163 | "com.meizu.flyme.media.news.lite.NewsFullManager", 164 | loadPackageParam.classLoader, 165 | "getNormalArticlesFromCache", 166 | XC_MethodReplacement.returnConstant(ArrayList()) 167 | ) 168 | hookAllMethods( 169 | "com.meizu.flyme.media.news.lite.NewsFullManager", 170 | loadPackageParam.classLoader, 171 | "fetchTopics", 172 | XC_MethodReplacement.returnConstant(false) 173 | ) 174 | hookAllMethods( 175 | "com.meizu.flyme.media.news.lite.NewsFullManager", 176 | loadPackageParam.classLoader, 177 | "fetchSpecialArticlesConcurrently", 178 | XC_MethodReplacement.returnConstant(false) 179 | ) 180 | hookAllMethods( 181 | "com.meizu.flyme.media.news.lite.NewsFullManager", 182 | loadPackageParam.classLoader, 183 | "fetchArticles", 184 | XC_MethodReplacement.returnConstant(false) 185 | ) 186 | } 187 | 188 | if (loadPackageParam.packageName == "com.hy.weather.mz") { 189 | hookAllMethods( 190 | "com.hy.weather.mz.cityWeather.WeatherInfoRepository", 191 | loadPackageParam.classLoader, 192 | "getForecastFromServer", 193 | XC_MethodReplacement.returnConstant(null) 194 | ) 195 | hookAllMethods( 196 | "com.hy.weather.mz.cityWeather.WeatherInfoRepository", 197 | loadPackageParam.classLoader, 198 | "getForecastFromCache", 199 | XC_MethodReplacement.returnConstant(null) 200 | ) 201 | } 202 | 203 | } 204 | if (loadPackageParam.packageName == "com.android.packageinstaller") { 205 | if (prefs.getBoolean("removeStore", false)) { 206 | hookAllMethods( 207 | "com.meizu.safe.security.net.HttpMethods", 208 | loadPackageParam.classLoader, 209 | "queryPackageInfoFromMzStoreV2", 210 | object : XC_MethodHook() { 211 | @Throws(Throwable::class) 212 | override fun beforeHookedMethod(param: MethodHookParam) { 213 | super.beforeHookedMethod(param) 214 | param.args[1] = "xxxx" 215 | param.args[3] = "xxxx" 216 | param.args[6] = "xxxx" 217 | } 218 | }) 219 | } 220 | if (prefs.getBoolean("autoInstall", false)) { 221 | // 开启会自动安装apk 222 | hookAllMethods( 223 | "com.meizu.permissioncommon.AppInfoUtil", 224 | loadPackageParam.classLoader, 225 | "isSystemApp", 226 | XC_MethodReplacement.returnConstant(true) 227 | ) 228 | } 229 | } 230 | } 231 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/patchModule/HideApp.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.patchModule 2 | 3 | 4 | import android.appwidget.AppWidgetProviderInfo 5 | import android.content.ComponentName 6 | import android.os.Build 7 | import com.coderstory.flyme10.tools.XposedHelper 8 | import com.coderstory.flyme10.xposed.IModule 9 | import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam 10 | import de.robv.android.xposed.XC_MethodHook 11 | import de.robv.android.xposed.XposedBridge 12 | import de.robv.android.xposed.XposedHelpers 13 | import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam 14 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam 15 | import java.util.* 16 | import java.util.stream.Collectors 17 | 18 | class HideApp : XposedHelper(), IModule { 19 | override fun handleInitPackageResources(respray: InitPackageResourcesParam) {} 20 | override fun handleLoadPackage(loadPackageParam: LoadPackageParam) { 21 | if (loadPackageParam.packageName == "com.meizu.flyme.launcher") { 22 | // bl.add(new ComponentName("com.android.vending", "com.android.vending.MarketWidgetProvider")); 23 | val value = prefs.getString("Hide_App_List", "") 24 | XposedBridge.log("load config$value") 25 | if (value != "") { 26 | val hideAppList = Arrays.asList(*value!!.split(":").toTypedArray()) 27 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { 28 | val clazz: Class<*> = 29 | findClass("com.meizu.flyme.launcher.co", loadPackageParam.classLoader) 30 | findAndHookMethod( 31 | "com.meizu.flyme.launcher.MzWidgetGroupView", 32 | loadPackageParam.classLoader, 33 | "a", 34 | clazz, 35 | object : XC_MethodHook() { 36 | @Throws(Throwable::class) 37 | override fun beforeHookedMethod(param: MethodHookParam) { 38 | super.beforeHookedMethod(param) 39 | val obj = param.args[0] 40 | var list = XposedHelpers.getObjectField( 41 | obj, 42 | "a" 43 | ) as List 44 | //XposedBridge.log("个数1" + list.size()); 45 | list = list.stream() 46 | .filter { item: Any -> value.contains((item as AppWidgetProviderInfo).provider.packageName) } 47 | .collect(Collectors.toList()) 48 | XposedHelpers.setObjectField(obj, "a", list) 49 | //XposedBridge.log("个数2" + list.size()); 50 | } 51 | }) 52 | findAndHookMethod( 53 | "com.meizu.flyme.launcher.cm", 54 | loadPackageParam.classLoader, 55 | "b", 56 | ComponentName::class.java, 57 | object : XC_MethodHook() { 58 | override fun beforeHookedMethod(param: MethodHookParam) { 59 | val componentName = param.args[0] as ComponentName 60 | if (hideAppList.contains(componentName.packageName)) { 61 | param.result = true 62 | } 63 | } 64 | }) 65 | } 66 | } 67 | } 68 | } 69 | 70 | override fun initZygote(startupParam: StartupParam?) {} 71 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/patchModule/IsEnable.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.patchModule 2 | 3 | 4 | import com.coderstory.flyme10.tools.XposedHelper 5 | import com.coderstory.flyme10.xposed.IModule 6 | import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam 7 | import de.robv.android.xposed.XC_MethodReplacement 8 | import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam 9 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam 10 | 11 | class IsEnable : XposedHelper(), IModule { 12 | override fun handleInitPackageResources(respray: InitPackageResourcesParam) {} 13 | override fun handleLoadPackage(param: LoadPackageParam) { 14 | if (param.packageName == "com.coderstory.flyme10") { 15 | findAndHookMethod( 16 | "com.coderstory.flyme10.activity.MainActivity", 17 | param.classLoader, 18 | "isEnable", 19 | XC_MethodReplacement.returnConstant(true) 20 | ) 21 | } 22 | } 23 | 24 | override fun initZygote(startupParam: StartupParam?) {} 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/patchModule/Others.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.patchModule 2 | 3 | import android.content.Context 4 | import android.util.Base64 5 | import android.widget.Toast 6 | import com.coderstory.flyme10.tools.SharedHelper 7 | import com.coderstory.flyme10.tools.XposedHelper 8 | import com.coderstory.flyme10.xposed.IModule 9 | import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam 10 | import de.robv.android.xposed.XC_MethodHook 11 | import de.robv.android.xposed.XC_MethodReplacement 12 | import de.robv.android.xposed.XposedBridge 13 | import de.robv.android.xposed.XposedHelpers 14 | import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam 15 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam 16 | 17 | class Others : XposedHelper(), IModule { 18 | override fun handleInitPackageResources(respray: InitPackageResourcesParam) {} 19 | override fun handleLoadPackage(param: LoadPackageParam) { 20 | 21 | if (param.packageName == "com.meizu.flyme.launcher" && prefs.getBoolean( 22 | "hide_icon_label", 23 | false 24 | ) 25 | ) { 26 | // android 10 27 | hookAllMethods( 28 | "com.android.launcher3.BubbleTextView", 29 | param.classLoader, 30 | "setText", 31 | object : XC_MethodHook() { 32 | @Throws(Throwable::class) 33 | override fun beforeHookedMethod(param: MethodHookParam) { 34 | super.beforeHookedMethod(param) 35 | // 魅族17 shortcut 80 普通应用 146 魅族18 116 普通app 208 36 | if (XposedHelpers.getIntField(param.thisObject, "mDisplay") != 4) { 37 | param.args[0] = "" 38 | } 39 | } 40 | }) 41 | } 42 | 43 | // 禁止安装app时候的安全检验 44 | if (param.packageName == "com.android.packageinstaller") { 45 | if (prefs.getBoolean("enableCheckInstaller", false)) { 46 | // 8.x 47 | val clazz: Class<*> = findClass( 48 | "com.android.packageinstaller.FlymePackageInstallerActivity", 49 | param.classLoader 50 | ) 51 | findAndHookMethod(clazz, "setVirusCheckTime", object : XC_MethodReplacement() { 52 | override fun replaceHookedMethod(param: MethodHookParam) { 53 | val mHandler = XposedHelpers.getObjectField(param.thisObject, "mHandler") 54 | XposedHelpers.callMethod(mHandler, "sendEmptyMessage", 5) 55 | } 56 | }) 57 | findAndHookMethod( 58 | "com.android.packageinstaller.FlymePackageInstallerActivity", 59 | param.classLoader, 60 | "replaceOrInstall", 61 | String::class.java, 62 | object : XC_MethodHook() { 63 | @Throws(Throwable::class) 64 | override fun beforeHookedMethod(param: MethodHookParam) { 65 | super.beforeHookedMethod(param) 66 | XposedHelpers.setObjectField(param.thisObject, "mAppInfo", null) 67 | } 68 | }) 69 | } 70 | if (prefs.getBoolean("enableCTS", false)) { 71 | //XposedBridge.log("开启原生安装器"); 72 | findAndHookMethod( 73 | "com.meizu.safe.security.utils.Utils", 74 | param.classLoader, 75 | "isCtsRunning", 76 | XC_MethodReplacement.returnConstant(true) 77 | ) 78 | } 79 | } 80 | if (param.packageName == "com.meizu.flyme.update") { 81 | 82 | // 获取Context 83 | // public abstract class a implements ErrorListener, Listener { 84 | // public a(Context context) { 85 | // this.b = context.getApplicationContext(); 86 | // this.c = RequestManager.getInstance(this.b); 87 | // } 88 | 89 | XposedBridge.hookAllConstructors( 90 | findClass( 91 | "com.meizu.flyme.update.network.RequestManager", 92 | param.classLoader 93 | ), 94 | object : XC_MethodHook() { 95 | @Throws(Throwable::class) 96 | override fun afterHookedMethod(param: MethodHookParam) { 97 | super.afterHookedMethod(param) 98 | if (param.args[0] is Context) { 99 | mContext = param.args[0] as Context 100 | } 101 | } 102 | }) 103 | 104 | // 解析当前系统版本 待更新版本的zip包地址 105 | // public class k { 106 | // public b cdnCheckResult; 107 | // public e currentFimware; 108 | // public g firmwarePlan; 109 | // public UpgradeFirmware upgradeFirmware; 110 | // 111 | // public k(UpgradeFirmware upgradeFirmware, e eVar, g gVar, b bVar) { 112 | // this.upgradeFirmware = upgradeFirmware; 113 | // this.currentFimware = eVar; 114 | // this.firmwarePlan = gVar; 115 | // this.cdnCheckResult = bVar; 116 | // } 117 | // } 118 | XposedBridge.hookAllConstructors( 119 | findClass( 120 | "com.meizu.flyme.update.model.h", 121 | param.classLoader 122 | ), object : XC_MethodHook() { 123 | @Throws(Throwable::class) 124 | override fun afterHookedMethod(param: MethodHookParam) { 125 | super.afterHookedMethod(param) 126 | val obj = param.thisObject 127 | val currentFimware = XposedHelpers.getObjectField(obj, "currentFimware") 128 | handleInfo(currentFimware) 129 | val upgradeFirmware = XposedHelpers.getObjectField(obj, "upgradeFirmware") 130 | handleInfo(upgradeFirmware) 131 | } 132 | }) 133 | } 134 | } 135 | 136 | private fun handleInfo(info: Any?) { 137 | if (info != null) { 138 | var update = SharedHelper(mContext!!).getString("updateList", "") 139 | // update = new String(android.util.Base64.decode(update, Base64.DEFAULT)); 140 | val systemVersion = XposedHelpers.getObjectField(info, "systemVersion") as String 141 | val updateUrl = XposedHelpers.getObjectField(info, "updateUrl") as String 142 | val releaseDate = XposedHelpers.getObjectField(info, "releaseDate") as String 143 | val fileSize = XposedHelpers.getObjectField(info, "fileSize") as String 144 | val msg = "$systemVersion@$updateUrl@$fileSize@$releaseDate" 145 | if (!update.contains(msg)) { 146 | update += "$msg;" 147 | if (mContext != null) { 148 | XposedBridge.log( 149 | "参数保存结果" + SharedHelper(mContext!!).put( 150 | "updateList", 151 | Base64.encodeToString(update.toByteArray(), Base64.DEFAULT) 152 | ) 153 | ) 154 | Toast.makeText(mContext, "flyme助手:已检测到新的更新包地址", Toast.LENGTH_LONG) 155 | .show() 156 | XposedBridge.log(update) 157 | } 158 | } 159 | } 160 | } 161 | 162 | override fun initZygote(startupParam: StartupParam?) {} 163 | 164 | companion object { 165 | private var mContext: Context? = null 166 | } 167 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/preferences/PreferencesProvider.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.preferences 2 | 3 | import android.content.ContentProvider 4 | import android.content.ContentValues 5 | import android.content.Context 6 | import android.content.SharedPreferences 7 | import android.content.UriMatcher 8 | import android.database.Cursor 9 | import android.database.MatrixCursor 10 | import android.net.Uri 11 | import android.text.TextUtils 12 | import android.util.Base64 13 | import com.coderstory.flyme10.tools.Misc 14 | import com.coderstory.flyme10.tools.Utils 15 | 16 | /** 17 | * @Description: ContentProvider 18 | * @author: zhangliangming 19 | * @date: 2018-04-29 16:39 20 | */ 21 | abstract class PreferencesProvider : ContentProvider() { 22 | /** 23 | * string 24 | */ 25 | private val mStringPath = "string/*/*/" 26 | 27 | /** 28 | * int 29 | */ 30 | private val mIntegerPath = "integer/*/*/" 31 | 32 | /** 33 | * long 34 | */ 35 | private val mLongPath = "long/*/*/" 36 | 37 | /** 38 | * float 39 | */ 40 | private val mFloatPath = "float/*/*/" 41 | 42 | /** 43 | * boolean 44 | */ 45 | private val mBooleanPath = "boolean/*/*/" 46 | 47 | /** 48 | * 49 | */ 50 | private val mDeletePath = "delete/*/*/" 51 | 52 | /** 53 | * 54 | */ 55 | private val mPutsPath = "puts" 56 | private var mUriMatcher: UriMatcher? = null 57 | abstract val authorities: String 58 | override fun onCreate(): Boolean { 59 | val authorities = authorities 60 | //保存authorities 61 | PreferencesUtils.putString(context, AUTHORITIES_SPNAME, AUTHORITIES_KEY, authorities) 62 | mUriMatcher = UriMatcher(UriMatcher.NO_MATCH) 63 | mUriMatcher!!.addURI(authorities, mStringPath, STRING_CONTENT_URI_CODE) 64 | mUriMatcher!!.addURI(authorities, "$mStringPath*/", STRING_CONTENT_URI_CODE) 65 | mUriMatcher!!.addURI(authorities, mIntegerPath, INTEGER_CONTENT_URI_CODE) 66 | mUriMatcher!!.addURI(authorities, "$mIntegerPath*/", INTEGER_CONTENT_URI_CODE) 67 | mUriMatcher!!.addURI(authorities, mLongPath, LONG_CONTENT_URI_CODE) 68 | mUriMatcher!!.addURI(authorities, "$mLongPath*/", LONG_CONTENT_URI_CODE) 69 | mUriMatcher!!.addURI(authorities, mFloatPath, FLOAT_CONTENT_URI_CODE) 70 | mUriMatcher!!.addURI(authorities, "$mFloatPath*/", FLOAT_CONTENT_URI_CODE) 71 | mUriMatcher!!.addURI(authorities, mBooleanPath, BOOLEAN_CONTENT_URI_CODE) 72 | mUriMatcher!!.addURI(authorities, "$mBooleanPath*/", BOOLEAN_CONTENT_URI_CODE) 73 | mUriMatcher!!.addURI(authorities, mDeletePath, DELETE_CONTENT_URI_CODE) 74 | mUriMatcher!!.addURI(authorities, mPutsPath, PUTS_CONTENT_URI_CODE) 75 | return false 76 | } 77 | 78 | override fun query( 79 | uri: Uri, 80 | projection: Array?, 81 | selection: String?, 82 | selectionArgs: Array?, 83 | sortOrder: String? 84 | ): Cursor? { 85 | val model = getModel(uri) ?: return null 86 | val code = mUriMatcher!!.match(uri) 87 | return buildCursor(context!!, model, code) 88 | } 89 | 90 | override fun getType(uri: Uri): String? { 91 | return null 92 | } 93 | 94 | override fun insert(uri: Uri, values: ContentValues?): Uri? { 95 | getModel(uri) ?: return null 96 | val code = mUriMatcher!!.match(uri) 97 | if (code == STRING_CONTENT_URI_CODE || code == INTEGER_CONTENT_URI_CODE || code == LONG_CONTENT_URI_CODE || code == FLOAT_CONTENT_URI_CODE || code == BOOLEAN_CONTENT_URI_CODE || code == PUTS_CONTENT_URI_CODE) { 98 | insert(context, values) 99 | } 100 | return uri 101 | } 102 | 103 | override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int { 104 | val model = getModel(uri) ?: return -1 105 | val code = mUriMatcher!!.match(uri) 106 | if (code == STRING_CONTENT_URI_CODE || code == INTEGER_CONTENT_URI_CODE || code == LONG_CONTENT_URI_CODE || code == FLOAT_CONTENT_URI_CODE || code == BOOLEAN_CONTENT_URI_CODE) { 107 | delete(context, model) 108 | } 109 | return 0 110 | } 111 | 112 | override fun update( 113 | uri: Uri, 114 | values: ContentValues?, 115 | selection: String?, 116 | selectionArgs: Array? 117 | ): Int { 118 | getModel(uri) ?: return -1 119 | val code = mUriMatcher!!.match(uri) 120 | if (code == STRING_CONTENT_URI_CODE || code == INTEGER_CONTENT_URI_CODE || code == LONG_CONTENT_URI_CODE || code == FLOAT_CONTENT_URI_CODE || code == BOOLEAN_CONTENT_URI_CODE) { 121 | insert(context, values) 122 | } 123 | return 0 124 | } 125 | 126 | /** 127 | * 删除 128 | * 129 | * @param context 130 | * @param model 131 | */ 132 | private fun delete(context: Context?, model: Model) { 133 | val editor = PreferencesUtils.getEditor(context, model.spName) 134 | editor.remove(model.key) 135 | editor.commit() 136 | } 137 | 138 | /** 139 | * 插入数据 140 | * 141 | * @param context 142 | * @param values 143 | */ 144 | private fun insert(context: Context?, values: ContentValues?) { 145 | //Log.e("Xposed", "Model " + JSON.toJSONString(model)); 146 | //Log.e("Xposed", "ContentValues " + JSON.toJSONString(values)); 147 | val editor: SharedPreferences.Editor = Utils.getMySharedPreferences( 148 | context, 149 | Misc.SharedPreferencesName 150 | ).edit() 151 | val keys = values!!.keySet() 152 | for (key in keys) { 153 | val value = values[key] 154 | if (value is Int) { 155 | editor.putInt(key, (value.toString() + "").toInt()) 156 | } else if (value is Long) { 157 | editor.putLong(key, (value.toString() + "").toLong()) 158 | } else if (value is Float) { 159 | editor.putFloat(key, (value.toString() + "").toFloat()) 160 | } else if (value is Boolean) { 161 | editor.putBoolean(key, java.lang.Boolean.valueOf(value.toString() + "")) 162 | } else { 163 | editor.putString( 164 | key, 165 | if (value == null) "" else String( 166 | Base64.decode( 167 | value as String, 168 | Base64.DEFAULT 169 | ) 170 | ) 171 | ) 172 | } 173 | } 174 | editor.apply() 175 | } 176 | 177 | /** 178 | * 从sp中获取数据 179 | * 180 | * @return 181 | */ 182 | private fun buildCursor(context: Context, model: Model, code: Int): Cursor? { 183 | var value: Any? = null 184 | var defValue = model.defValue 185 | when (code) { 186 | STRING_CONTENT_URI_CODE -> value = 187 | PreferencesUtils.getString(context, model.spName, model.key, defValue.toString()) 188 | 189 | INTEGER_CONTENT_URI_CODE -> { 190 | if (!TextUtils.isDigitsOnly(defValue.toString() + "")) { 191 | defValue = -1 192 | } 193 | value = PreferencesUtils.getInt( 194 | context, 195 | model.spName, 196 | model.key, 197 | (defValue.toString() + "").toInt() 198 | ) 199 | } 200 | 201 | LONG_CONTENT_URI_CODE -> { 202 | if (!TextUtils.isDigitsOnly(defValue.toString() + "")) { 203 | defValue = -1 204 | } 205 | value = PreferencesUtils.getLong( 206 | context, 207 | model.spName, 208 | model.key, 209 | (defValue.toString() + "").toLong() 210 | ) 211 | } 212 | 213 | FLOAT_CONTENT_URI_CODE -> { 214 | value = PreferencesUtils.getFloat( 215 | context, 216 | model.spName, 217 | model.key, 218 | (defValue.toString() + "").toFloat() 219 | ) 220 | } 221 | 222 | BOOLEAN_CONTENT_URI_CODE -> value = PreferencesUtils.getBoolean( 223 | context, 224 | model.spName, 225 | model.key, 226 | java.lang.Boolean.valueOf(defValue.toString() + "") 227 | ).toString() + "" 228 | 229 | else -> { 230 | } 231 | } 232 | if (value == null) return null 233 | // 234 | if (value is String) { 235 | value = Base64.encodeToString(value.toByteArray(), Base64.DEFAULT) 236 | } 237 | val columnNames = arrayOf(COLUMNNAME) 238 | val cursor = MatrixCursor(columnNames) 239 | val values = arrayOf(value) 240 | cursor.addRow(values) 241 | return cursor 242 | } 243 | 244 | /** 245 | * 从uri中获取spname和key 246 | * 247 | * @param uri 248 | * @return 249 | */ 250 | private fun getModel(uri: Uri): Model? { 251 | try { 252 | val model = Model() 253 | model.spName = (uri.pathSegments[1]) 254 | if (uri.pathSegments.size > 2) { 255 | model.key = (uri.pathSegments[2]) 256 | } 257 | if (uri.pathSegments.size > 3) { 258 | model.defValue = (uri.pathSegments[3]) 259 | } 260 | return model 261 | } catch (e: Exception) { 262 | e.printStackTrace() 263 | } 264 | return null 265 | } 266 | 267 | /** 268 | * 269 | */ 270 | private class Model { 271 | var spName: String = "" 272 | var key: String = "" 273 | var defValue: Any = "" 274 | } 275 | 276 | companion object { 277 | const val STRING_CONTENT_URI_CODE = 100 278 | const val INTEGER_CONTENT_URI_CODE = 101 279 | const val LONG_CONTENT_URI_CODE = 102 280 | const val FLOAT_CONTENT_URI_CODE = 104 281 | const val BOOLEAN_CONTENT_URI_CODE = 105 282 | const val DELETE_CONTENT_URI_CODE = 106 283 | const val PUTS_CONTENT_URI_CODE = 107 284 | 285 | /** 286 | * 表列名 287 | */ 288 | var COLUMNNAME = "SPCOLUMNNAME" 289 | 290 | /** 291 | * authorities key 292 | */ 293 | var AUTHORITIES_KEY = "authorities_key" 294 | 295 | /** 296 | * authorities_spname 297 | */ 298 | var AUTHORITIES_SPNAME = "UserSettings" 299 | } 300 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/refreshView/BaseRefreshView.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.refreshView 2 | 3 | import android.content.Context 4 | import android.graphics.ColorFilter 5 | import android.graphics.PixelFormat 6 | import android.graphics.drawable.Animatable 7 | import android.graphics.drawable.Drawable 8 | import com.coderstory.flyme10.view.PullToRefreshView 9 | 10 | abstract class BaseRefreshView internal constructor(private val mRefreshLayout: PullToRefreshView?) : 11 | Drawable(), Drawable.Callback, Animatable { 12 | val context: Context 13 | get() = mRefreshLayout!!.context 14 | 15 | abstract fun setPercent(percent: Float, invalidate: Boolean) 16 | abstract fun offsetTopAndBottom(offset: Int) 17 | override fun invalidateDrawable(who: Drawable) { 18 | val callback = callback 19 | callback?.invalidateDrawable(this) 20 | } 21 | 22 | override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) { 23 | val callback = callback 24 | callback?.scheduleDrawable(this, what, `when`) 25 | } 26 | 27 | override fun unscheduleDrawable(who: Drawable, what: Runnable) { 28 | val callback = callback 29 | callback?.unscheduleDrawable(this, what) 30 | } 31 | 32 | override fun getOpacity(): Int { 33 | return PixelFormat.TRANSLUCENT 34 | } 35 | 36 | override fun setAlpha(alpha: Int) {} 37 | override fun setColorFilter(cf: ColorFilter?) {} 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/refreshView/SunRefreshView.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.refreshView 2 | 3 | import android.graphics.Bitmap 4 | import android.graphics.BitmapFactory 5 | import android.graphics.Canvas 6 | import android.graphics.Matrix 7 | import android.graphics.drawable.Animatable 8 | import android.view.animation.Animation 9 | import android.view.animation.Interpolator 10 | import android.view.animation.LinearInterpolator 11 | import android.view.animation.Transformation 12 | import com.coderstory.flyme10.R 13 | import com.coderstory.flyme10.tools.Utils 14 | import com.coderstory.flyme10.view.PullToRefreshView 15 | 16 | /** 17 | * Created by Oleksii Shliama on 22/12/2014. 18 | * https://dribbble.com/shots/1650317-Pull-to-Refresh-Rentals 19 | */ 20 | class SunRefreshView(private val mParent: PullToRefreshView) : BaseRefreshView(mParent), 21 | Animatable { 22 | private val mMatrix: Matrix 23 | private val mSunSize = 100 24 | private var mAnimation: Animation? = null 25 | private var mTop = 0 26 | private var mScreenWidth = 0 27 | private var mSkyHeight = 0 28 | private var mSkyTopOffset = 0f 29 | private var mSkyMoveOffset = 0f 30 | private var mTownHeight = 0 31 | private var mTownInitialTopOffset = 0f 32 | private var mTownFinalTopOffset = 0f 33 | private var mTownMoveOffset = 0f 34 | private var mSunLeftOffset = 0f 35 | private var mSunTopOffset = 0f 36 | private var mPercent = 0.0f 37 | private var mRotate = 0.0f 38 | private var mSky: Bitmap? = null 39 | private var mSun: Bitmap? = null 40 | private var mTown: Bitmap? = null 41 | private var isRefreshing = false 42 | private fun initiateDimens(viewWidth: Int) { 43 | if (viewWidth <= 0 || viewWidth == mScreenWidth) return 44 | mScreenWidth = viewWidth 45 | mSkyHeight = (SKY_RATIO * mScreenWidth).toInt() 46 | mSkyTopOffset = mSkyHeight * 0.38f 47 | mSkyMoveOffset = Utils.convertDpToPixel(context, 15).toFloat() 48 | mTownHeight = (TOWN_RATIO * mScreenWidth).toInt() 49 | mTownInitialTopOffset = 50 | mParent.totalDragDistance - mTownHeight * TOWN_INITIAL_SCALE 51 | mTownFinalTopOffset = 52 | mParent.totalDragDistance - mTownHeight * TOWN_FINAL_SCALE 53 | mTownMoveOffset = Utils.convertDpToPixel(context, 10).toFloat() 54 | mSunLeftOffset = 0.3f * mScreenWidth.toFloat() 55 | mSunTopOffset = mParent.totalDragDistance * 0.1f 56 | mTop = -mParent.totalDragDistance 57 | createBitmaps() 58 | } 59 | 60 | private fun createBitmaps() { 61 | val options = BitmapFactory.Options() 62 | options.inPreferredConfig = Bitmap.Config.RGB_565 63 | mSky = BitmapFactory.decodeResource(context.resources, R.drawable.sky, options) 64 | mSky = Bitmap.createScaledBitmap(mSky!!, mScreenWidth, mSkyHeight, true) 65 | mTown = BitmapFactory.decodeResource(context.resources, R.drawable.buildings, options) 66 | mTown = Bitmap.createScaledBitmap( 67 | mTown!!, 68 | mScreenWidth, 69 | (mScreenWidth * TOWN_RATIO).toInt(), 70 | true 71 | ) 72 | mSun = BitmapFactory.decodeResource(context.resources, R.drawable.sun, options) 73 | mSun = Bitmap.createScaledBitmap(mSun!!, mSunSize, mSunSize, true) 74 | } 75 | 76 | override fun setPercent(percent: Float, invalidate: Boolean) { 77 | setPercent(percent) 78 | if (invalidate) setRotate(percent) 79 | } 80 | 81 | override fun offsetTopAndBottom(offset: Int) { 82 | mTop += offset 83 | invalidateSelf() 84 | } 85 | 86 | override fun draw(canvas: Canvas) { 87 | if (mScreenWidth <= 0) return 88 | val saveCount = canvas.save() 89 | canvas.translate(0f, mTop.toFloat()) 90 | canvas.clipRect(0, -mTop, mScreenWidth, mParent.totalDragDistance) 91 | drawSky(canvas) 92 | drawSun(canvas) 93 | drawTown(canvas) 94 | canvas.restoreToCount(saveCount) 95 | } 96 | 97 | private fun drawSky(canvas: Canvas) { 98 | val matrix = mMatrix 99 | matrix.reset() 100 | val dragPercent = Math.min(1f, Math.abs(mPercent)) 101 | val skyScale: Float 102 | val scalePercentDelta: Float = dragPercent - SCALE_START_PERCENT 103 | skyScale = if (scalePercentDelta > 0) { 104 | val scalePercent: Float = 105 | scalePercentDelta / (1.0f - SCALE_START_PERCENT) 106 | SKY_INITIAL_SCALE - (SKY_INITIAL_SCALE - 1.0f) * scalePercent 107 | } else { 108 | SKY_INITIAL_SCALE 109 | } 110 | val offsetX = -(mScreenWidth * skyScale - mScreenWidth) / 2.0f 111 | val offsetY = 112 | (((1.0f - dragPercent) * mParent.totalDragDistance - mSkyTopOffset // Offset canvas moving 113 | - mSkyHeight * (skyScale - 1.0f) / 2) // Offset sky scaling 114 | + mSkyMoveOffset * dragPercent) // Give it a little move top -> bottom 115 | matrix.postScale(skyScale, skyScale) 116 | matrix.postTranslate(offsetX, offsetY) 117 | canvas.drawBitmap(mSky!!, matrix, null) 118 | } 119 | 120 | private fun drawTown(canvas: Canvas) { 121 | val matrix = mMatrix 122 | matrix.reset() 123 | val dragPercent = Math.min(1f, Math.abs(mPercent)) 124 | val townScale: Float 125 | val townTopOffset: Float 126 | val townMoveOffset: Float 127 | val scalePercentDelta: Float = dragPercent - SCALE_START_PERCENT 128 | if (scalePercentDelta > 0) { 129 | val scalePercent: Float = 130 | scalePercentDelta / (1.0f - SCALE_START_PERCENT) 131 | townScale = 132 | TOWN_INITIAL_SCALE + (TOWN_FINAL_SCALE - TOWN_INITIAL_SCALE) * scalePercent 133 | townTopOffset = 134 | mTownInitialTopOffset - (mTownFinalTopOffset - mTownInitialTopOffset) * scalePercent 135 | townMoveOffset = mTownMoveOffset * (1.0f - scalePercent) 136 | } else { 137 | val scalePercent: Float = dragPercent / SCALE_START_PERCENT 138 | townScale = TOWN_INITIAL_SCALE 139 | townTopOffset = mTownInitialTopOffset 140 | townMoveOffset = mTownMoveOffset * scalePercent 141 | } 142 | val offsetX = -(mScreenWidth * townScale - mScreenWidth) / 2.0f 143 | val offsetY = ((1.0f - dragPercent) * mParent.totalDragDistance // Offset canvas moving 144 | + townTopOffset 145 | - mTownHeight * (townScale - 1.0f) / 2 // Offset town scaling 146 | + townMoveOffset) // Give it a little move 147 | matrix.postScale(townScale, townScale) 148 | matrix.postTranslate(offsetX, offsetY) 149 | canvas.drawBitmap(mTown!!, matrix, null) 150 | } 151 | 152 | private fun drawSun(canvas: Canvas) { 153 | val matrix = mMatrix 154 | matrix.reset() 155 | var dragPercent = mPercent 156 | if (dragPercent > 1.0f) { // Slow down if pulling over set height 157 | dragPercent = (dragPercent + 9.0f) / 10 158 | } 159 | val sunRadius = mSunSize.toFloat() / 2.0f 160 | var sunRotateGrowth: Float = SUN_INITIAL_ROTATE_GROWTH 161 | var offsetX = mSunLeftOffset 162 | var offsetY = (mSunTopOffset 163 | + mParent.totalDragDistance / 2 * (1.0f - dragPercent) // Move the sun up 164 | - mTop) // Depending on Canvas position 165 | val scalePercentDelta: Float = dragPercent - SCALE_START_PERCENT 166 | if (scalePercentDelta > 0) { 167 | val scalePercent: Float = 168 | scalePercentDelta / (1.0f - SCALE_START_PERCENT) 169 | val sunScale: Float = 170 | 1.0f - (1.0f - SUN_FINAL_SCALE) * scalePercent 171 | sunRotateGrowth += (SUN_FINAL_ROTATE_GROWTH - SUN_INITIAL_ROTATE_GROWTH) * scalePercent 172 | matrix.preTranslate( 173 | offsetX + (sunRadius - sunRadius * sunScale), 174 | offsetY * (2.0f - sunScale) 175 | ) 176 | matrix.preScale(sunScale, sunScale) 177 | offsetX += sunRadius 178 | offsetY = offsetY * (2.0f - sunScale) + sunRadius * sunScale 179 | } else { 180 | matrix.postTranslate(offsetX, offsetY) 181 | offsetX += sunRadius 182 | offsetY += sunRadius 183 | } 184 | matrix.postRotate( 185 | (if (isRefreshing) -360 else 360) * mRotate * (if (isRefreshing) 1F else sunRotateGrowth), 186 | offsetX, 187 | offsetY 188 | ) 189 | canvas.drawBitmap(mSun!!, matrix, null) 190 | } 191 | 192 | private fun setPercent(percent: Float) { 193 | mPercent = percent 194 | } 195 | 196 | private fun setRotate(rotate: Float) { 197 | mRotate = rotate 198 | invalidateSelf() 199 | } 200 | 201 | private fun resetOriginals() { 202 | setPercent(0f) 203 | setRotate(0f) 204 | } 205 | 206 | override fun setBounds(left: Int, top: Int, right: Int, bottom: Int) { 207 | super.setBounds(left, top, right, mSkyHeight + top) 208 | } 209 | 210 | override fun isRunning(): Boolean { 211 | return false 212 | } 213 | 214 | override fun start() { 215 | mAnimation!!.reset() 216 | isRefreshing = true 217 | mParent.startAnimation(mAnimation) 218 | } 219 | 220 | override fun stop() { 221 | mParent.clearAnimation() 222 | isRefreshing = false 223 | resetOriginals() 224 | } 225 | 226 | private fun setupAnimations() { 227 | val animation = object : Animation() { 228 | public override fun applyTransformation(interpolatedTime: Float, t: Transformation) { 229 | setRotate(interpolatedTime) 230 | } 231 | } 232 | animation.repeatCount = Animation.INFINITE 233 | animation.repeatMode = Animation.RESTART 234 | animation.interpolator = LINEAR_INTERPOLATOR 235 | animation.duration = ANIMATION_DURATION.toLong() 236 | mAnimation = animation 237 | } 238 | 239 | companion object { 240 | private const val SCALE_START_PERCENT = 0.5f 241 | private const val ANIMATION_DURATION = 1000 242 | private const val SKY_RATIO = 0.65f 243 | private const val SKY_INITIAL_SCALE = 1.05f 244 | private const val TOWN_RATIO = 0.22f 245 | private const val TOWN_INITIAL_SCALE = 1.20f 246 | private const val TOWN_FINAL_SCALE = 1.30f 247 | private const val SUN_FINAL_SCALE = 0.75f 248 | private const val SUN_INITIAL_ROTATE_GROWTH = 1.2f 249 | private const val SUN_FINAL_ROTATE_GROWTH = 1.5f 250 | private val LINEAR_INTERPOLATOR: Interpolator = LinearInterpolator() 251 | } 252 | 253 | init { 254 | mMatrix = Matrix() 255 | setupAnimations() 256 | mParent.post { initiateDimens(mParent.width) } 257 | } 258 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/Application.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import android.app.Application 4 | import com.umeng.commonsdk.UMConfigure 5 | 6 | class Application : Application() { 7 | override fun onCreate() { 8 | super.onCreate() 9 | UMConfigure.setLogEnabled(true) 10 | UMConfigure.preInit(applicationContext, "5ee5d80f978eea081640e210", "weibo") 11 | UMConfigure.init( 12 | this, 13 | "5ee5d80f978eea081640e210", 14 | "weibo", 15 | UMConfigure.DEVICE_TYPE_PHONE, 16 | "" 17 | ) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/FileUtils.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import android.util.Log 4 | import java.io.BufferedReader 5 | import java.io.File 6 | import java.io.FileReader 7 | import java.io.IOException 8 | 9 | /** 10 | * Created by _SOLID 11 | * Date:2016/4/20 12 | * Time:15:01 13 | */ 14 | object FileUtils { 15 | 16 | /** 17 | * 读取指定文件 18 | * 19 | * @param fileName SD下的文件路径+文件名,如:a/b.txt 20 | */ 21 | fun readFile(fileName: String): String { 22 | val stringBuffer = StringBuilder() 23 | try { 24 | var line = "" 25 | val file = File(fileName) 26 | val bufferedReader = BufferedReader(FileReader(file)) 27 | while (bufferedReader.readLine().also { 28 | if (it != null) { 29 | stringBuffer.append(line) 30 | } 31 | } != null) 32 | bufferedReader.close() 33 | } catch (e: IOException) { 34 | Log.e("Xposed", Log.getStackTraceString(e)) 35 | } 36 | return stringBuffer.toString() 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/Log.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("unused") 2 | 3 | package com.coderstory.flyme10.tools 4 | 5 | import android.os.Handler 6 | import android.os.Looper 7 | import android.widget.Toast 8 | import de.robv.android.xposed.XposedBridge 9 | import android.util.Log as ALog 10 | 11 | object Log { 12 | 13 | private val handler by lazy { Handler(Looper.getMainLooper()) } 14 | private var toast: Toast? = null 15 | 16 | 17 | @JvmStatic 18 | private fun doLog(f: (String, String) -> Int, obj: Any?, toXposed: Boolean = false) { 19 | val str = if (obj is Throwable) ALog.getStackTraceString(obj) else obj.toString() 20 | 21 | if (str.length > maxLength) { 22 | val chunkCount: Int = str.length / maxLength 23 | for (i in 0..chunkCount) { 24 | val max: Int = maxLength * (i + 1) 25 | if (max >= str.length) { 26 | doLog(f, str.substring(maxLength * i)) 27 | } else { 28 | doLog(f, str.substring(maxLength * i, max)) 29 | } 30 | } 31 | } else { 32 | f("FlymeHelper", str) 33 | if (toXposed) 34 | XposedBridge.log("FlymeHelper : $str") 35 | } 36 | } 37 | 38 | @JvmStatic 39 | fun d(obj: Any?) { 40 | doLog(ALog::d, obj) 41 | } 42 | 43 | @JvmStatic 44 | fun i(obj: Any?) { 45 | doLog(ALog::i, obj) 46 | } 47 | 48 | @JvmStatic 49 | fun e(obj: Any?) { 50 | doLog(ALog::e, obj, true) 51 | } 52 | 53 | @JvmStatic 54 | fun v(obj: Any?) { 55 | doLog(ALog::v, obj) 56 | } 57 | 58 | @JvmStatic 59 | fun w(obj: Any?) { 60 | doLog(ALog::w, obj) 61 | } 62 | 63 | private const val maxLength = 3000 64 | } 65 | 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/Logger.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import android.util.Log 4 | 5 | /* 6 | * Logger 7 | * 8 | * @author lateautumn4lin 9 | * @github https://github.com/lateautumn4lin 10 | * @date 2020/9/10 13:54 11 | */ /** 12 | * The type Logger. 13 | */ 14 | object Logger { 15 | /** 16 | * The constant TAG. 17 | */ 18 | const val TAG = "flyme10" 19 | 20 | /** 21 | * Logi. 22 | * 23 | * @param msg the msg 24 | */ 25 | fun logi(msg: String) { 26 | Log.i(TAG, msg) 27 | } 28 | 29 | /** 30 | * Loge. 31 | * 32 | * @param msg the msg 33 | */ 34 | fun loge(msg: String) { 35 | Log.e(TAG, msg) 36 | } 37 | 38 | /** 39 | * Logw. 40 | * 41 | * @param msg the msg 42 | */ 43 | fun logw(msg: String) { 44 | Log.w(TAG, msg) 45 | } 46 | 47 | /** 48 | * Logd. 49 | * 50 | * @param msg the msg 51 | */ 52 | fun logd(msg: String) { 53 | Log.d(TAG, msg) 54 | } 55 | 56 | /** 57 | * Logv. 58 | * 59 | * @param msg the msg 60 | */ 61 | fun logv(msg: String) { 62 | Log.v(TAG, msg) 63 | } 64 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/Misc.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | object Misc { 4 | const val MyBlogUrl = "https://blog.coderstory.cn" 5 | const val ApplicationName = "com.coderstory.flyme10" 6 | const val SharedPreferencesName = "UserSettings" 7 | const val HostFileTmpName = "/hosts" 8 | const val isTestVersion = false 9 | private const val BasePath = "/storage/emulated/0/Flyme_Purify" 10 | const val BackPath = BasePath + "/Backup/" 11 | const val CrashFilePath = BasePath + "/CrashLog/" 12 | var isProcessing = false 13 | 14 | // 家里的电脑1 15 | //public static String key= "1b0fa963126a28f8bceca65b3085f2e8"; 16 | // release 00:1A:C5:ED:6E:B5:BD:55:2B:10:5E:7E:C2:92:2D:A2:70:A0:CE:E7 17 | var key = "f814a22ab70c24e6db39cbe505c633ec" 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/RuntimeUtil.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import android.util.Log 4 | import java.io.* 5 | import java.util.* 6 | 7 | object RuntimeUtil { 8 | /** 9 | * 通过执行命令的方式判断手机是否root, 会有申请root权限的对话框出现 10 | */ 11 | fun hasRooted(): Boolean { 12 | return execSilent("echo test") 13 | } 14 | 15 | 16 | /** 17 | * 判断是否成功执行 18 | */ 19 | fun execSilent(cmd: String): Boolean { 20 | var result = false 21 | var writer: BufferedWriter? = null 22 | var process: Process? = null 23 | try { 24 | process = Runtime.getRuntime().exec("su") 25 | writer = BufferedWriter(OutputStreamWriter(process.outputStream)) 26 | runCmd(writer, cmd) 27 | process.waitFor() 28 | Log.d("runtime", "onCreate: process.exitValue() " + process.exitValue()) 29 | result = process.exitValue() == 0 30 | } catch (e: Exception) { 31 | // e.printStackTrace(); 32 | } finally { 33 | closeCloseable(writer) 34 | process?.destroy() 35 | } 36 | return result 37 | } 38 | 39 | // 关闭流文件 40 | private fun closeCloseable(vararg closeable: Closeable?) { 41 | for (i in 0 until closeable.size) { 42 | if (null != closeable[i]) { 43 | try { 44 | closeable[i]!!.close() 45 | } catch (e: IOException) { 46 | e.printStackTrace() 47 | } 48 | } 49 | } 50 | } 51 | 52 | // 执行命令 53 | @Throws(IOException::class) 54 | private fun runCmd(writer: BufferedWriter, vararg cmd: String) { 55 | for (element in cmd) { 56 | writer.write( 57 | """ 58 | $element 59 | 60 | """.trimIndent() 61 | ) 62 | writer.flush() 63 | } 64 | writer.write("exit \n") 65 | writer.flush() 66 | } 67 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/SharedHelper.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import android.content.Context 4 | import com.coderstory.flyme10.preferences.PreferencesProviderUtils 5 | 6 | class SharedHelper(private val context: Context) { 7 | var spName = "UserSettings" 8 | fun put(key: String, value: Any): Boolean { 9 | return when (value) { 10 | is String -> { 11 | PreferencesProviderUtils.putString(context, spName, key, value) 12 | } 13 | 14 | is Int -> { 15 | PreferencesProviderUtils.putInt(context, spName, key, value) 16 | } 17 | 18 | is Boolean -> { 19 | PreferencesProviderUtils.putBoolean(context, spName, key, value) 20 | } 21 | 22 | is Float -> { 23 | PreferencesProviderUtils.putFloat(context, spName, key, value) 24 | } 25 | 26 | is Long -> { 27 | PreferencesProviderUtils.putLong(context, spName, key, value) 28 | } 29 | 30 | else -> { 31 | PreferencesProviderUtils.putString(context, spName, key, value.toString()) 32 | } 33 | } 34 | } 35 | 36 | fun getBoolean(key: String, defaultObject: Boolean): Boolean { 37 | return PreferencesProviderUtils.getBoolean(context, spName, key, defaultObject) 38 | } 39 | 40 | fun getString(key: String, defaultObject: String): String { 41 | return PreferencesProviderUtils.getString(context, spName, key, defaultObject) 42 | } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/SnackBarUtils.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import android.view.View 4 | import com.google.android.material.snackbar.Snackbar 5 | 6 | class SnackBarUtils private constructor(private val mSnack: Snackbar) { 7 | private fun getSnackBarLayout(snackbar: Snackbar?): View? { 8 | return snackbar?.view 9 | } 10 | 11 | private fun setSnackBarBackColor(colorId: Int): Snackbar { 12 | val snackBarView = getSnackBarLayout(mSnack) 13 | snackBarView?.setBackgroundColor(colorId) 14 | return mSnack 15 | } 16 | 17 | fun info() { 18 | setSnackBarBackColor(color_info) 19 | show() 20 | } 21 | 22 | fun danger() { 23 | setSnackBarBackColor(color_danger) 24 | show() 25 | } 26 | 27 | fun show() { 28 | mSnack.show() 29 | } 30 | 31 | fun show(actionText: String?, listener: View.OnClickListener?) { 32 | mSnack.setActionTextColor(color_action) 33 | mSnack.setAction(actionText, listener).show() 34 | } 35 | 36 | companion object { 37 | private const val color_danger = -0x56bbbe 38 | private const val color_info = -0xd6490a 39 | private const val color_action = -0x323a41 40 | fun makeShort(view: View?, text: String?): SnackBarUtils { 41 | val snackbar = Snackbar.make(view!!, text!!, Snackbar.LENGTH_SHORT) 42 | return SnackBarUtils(snackbar) 43 | } 44 | 45 | fun makeLong(view: View?, text: String?): SnackBarUtils { 46 | val snackbar = Snackbar.make(view!!, text!!, Snackbar.LENGTH_LONG) 47 | return SnackBarUtils(snackbar) 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/Utils.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import android.content.Context 4 | import android.content.SharedPreferences 5 | import kotlin.math.roundToInt 6 | 7 | class Utils { 8 | companion object { 9 | fun convertDpToPixel(context: Context, dp: Int): Int { 10 | val density = context.resources.displayMetrics.density 11 | return (dp.toFloat() * density).roundToInt() 12 | } 13 | 14 | fun getMySharedPreferences( 15 | context: Context?, 16 | fileName: String? 17 | ): SharedPreferences { 18 | var result: SharedPreferences 19 | try { 20 | result = context!!.getSharedPreferences(fileName, Context.MODE_WORLD_READABLE) 21 | } catch (exp: Exception) { 22 | result = context!!.getSharedPreferences(fileName, Context.MODE_PRIVATE) 23 | } 24 | return result 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/ViewUtils.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import com.coderstory.flyme10.fragment.base.BaseFragment 4 | 5 | 6 | object ViewUtils { 7 | private val fragmentList: MutableMap = HashMap() 8 | 9 | /** 10 | * 根据Class创建Fragment 11 | * 12 | * @param clazz the Fragment of create 13 | * @return 14 | */ 15 | private fun createFragment(clazz: Class<*>, isObtain: Boolean): BaseFragment { 16 | var resultFragment: BaseFragment? = null 17 | val className = clazz.name 18 | if (fragmentList.containsKey(className)) { 19 | resultFragment = fragmentList[className] 20 | } else { 21 | try { 22 | try { 23 | resultFragment = Class.forName(className).newInstance() as BaseFragment 24 | } catch (e: InstantiationException) { 25 | e.printStackTrace() 26 | } catch (e: IllegalAccessException) { 27 | e.printStackTrace() 28 | } 29 | } catch (e: ClassNotFoundException) { 30 | e.printStackTrace() 31 | } 32 | if (isObtain) fragmentList[className] = resultFragment 33 | } 34 | return resultFragment!! 35 | } 36 | 37 | fun createFragment(clazz: Class<*>): BaseFragment { 38 | return createFragment(clazz, true) 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/tools/XposedHelper.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.tools 2 | 3 | import com.coderstory.flyme10.BuildConfig 4 | import de.robv.android.xposed.XC_MethodHook 5 | import de.robv.android.xposed.XSharedPreferences 6 | import de.robv.android.xposed.XposedBridge 7 | import de.robv.android.xposed.XposedHelpers 8 | import de.robv.android.xposed.XposedHelpers.ClassNotFoundError 9 | import java.io.File 10 | 11 | open class XposedHelper { 12 | var prefs: XSharedPreferences 13 | fun hookAllConstructors(p1: String, parameterTypesAndCallback: XC_MethodHook) { 14 | try { 15 | val packageParser = findClass(p1, null) 16 | hookAllConstructors(packageParser, parameterTypesAndCallback) 17 | } catch (e: Throwable) { 18 | if (BuildConfig.DEBUG) XposedBridge.log(e) 19 | } 20 | } 21 | 22 | protected fun hookAllConstructors( 23 | hookClass: Class<*>, 24 | callback: XC_MethodHook 25 | ): Set { 26 | return try { 27 | val result = XposedBridge.hookAllConstructors(hookClass, callback) 28 | if (result.size == 0) { 29 | XposedBridge.log("类" + hookClass.name + "中的构造方法没有被hook到") 30 | } 31 | result 32 | } catch (error: Throwable) { 33 | XposedBridge.log(error) 34 | HashSet() 35 | } 36 | } 37 | 38 | protected fun findClassWithoutLog(classpatch: String, classLoader: ClassLoader): Class<*>? { 39 | return try { 40 | XposedHelpers.findClass(classpatch, classLoader) 41 | } catch (error: ClassNotFoundError) { 42 | null 43 | } 44 | } 45 | 46 | 47 | companion object { 48 | fun findClass(classpatch: String, classLoader: ClassLoader?): Class<*> { 49 | try { 50 | return XposedHelpers.findClass(classpatch, classLoader) 51 | } catch (error: ClassNotFoundError) { 52 | XposedBridge.log(error) 53 | } 54 | return String::class.java 55 | } 56 | 57 | fun findAndHookMethod( 58 | p1: String, 59 | param: ClassLoader, 60 | p2: String, 61 | vararg parameterTypesAndCallback: Any? 62 | ) { 63 | try { 64 | XposedHelpers.findAndHookMethod(p1, param, p2, *parameterTypesAndCallback) 65 | } catch (error: Throwable) { 66 | XposedBridge.log(error) 67 | } 68 | } 69 | 70 | fun findAndHookMethod(p1: Class<*>, p2: String, vararg parameterTypesAndCallback: Any) { 71 | try { 72 | XposedHelpers.findAndHookMethod(p1, p2, *parameterTypesAndCallback) 73 | } catch (error: Throwable) { 74 | XposedBridge.log(error) 75 | } 76 | } 77 | 78 | fun hookAllConstructors( 79 | p1: String, 80 | classLoader: ClassLoader, 81 | parameterTypesAndCallback: XC_MethodHook 82 | ) { 83 | try { 84 | val packageParser = XposedHelpers.findClass(p1, classLoader) 85 | XposedBridge.hookAllConstructors(packageParser, parameterTypesAndCallback) 86 | } catch (error: Throwable) { 87 | XposedBridge.log(error) 88 | } 89 | } 90 | 91 | protected fun findAndHookMethod(p1: String, p2: String, p3: Array) { 92 | try { 93 | XposedHelpers.findAndHookMethod(Class.forName(p1), p2, *p3) 94 | } catch (error: Throwable) { 95 | XposedBridge.log(error) 96 | } 97 | } 98 | 99 | fun hookAllMethods( 100 | p1: String, 101 | classLoader: ClassLoader?, 102 | methodName: String, 103 | parameterTypesAndCallback: XC_MethodHook 104 | ): Int { 105 | return try { 106 | val packageParser = XposedHelpers.findClass(p1, classLoader) 107 | val count = XposedBridge.hookAllMethods( 108 | packageParser, 109 | methodName, 110 | parameterTypesAndCallback 111 | ).size 112 | if (count == 0) { 113 | XposedBridge.log("类" + p1 + "中的方法" + methodName + "没有被hook到") 114 | } 115 | count 116 | } catch (error: Throwable) { 117 | XposedBridge.log(error) 118 | 0 119 | } 120 | } 121 | 122 | fun hookAllMethods( 123 | hookClass: Class<*>, 124 | methodName: String, 125 | callback: XC_MethodHook 126 | ): Set? { 127 | try { 128 | val result = XposedBridge.hookAllMethods(hookClass, methodName, callback) 129 | if (result.size == 0) { 130 | XposedBridge.log("类" + hookClass.name + "中的方法" + methodName + "没有被hook到") 131 | } 132 | return result 133 | } catch (error: Throwable) { 134 | XposedBridge.log(error) 135 | } 136 | return null 137 | } 138 | } 139 | 140 | init { 141 | prefs = XSharedPreferences(BuildConfig.APPLICATION_ID, Misc.SharedPreferencesName) 142 | if (prefs.all.keys.size == 0) { 143 | prefs = 144 | XSharedPreferences(File("/data/user_de/0/" + Misc.ApplicationName + "/shared_prefs/" + Misc.SharedPreferencesName + ".xml")) 145 | } 146 | } 147 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/view/QNumberPicker.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.view 2 | 3 | import android.content.Context 4 | import android.graphics.Color 5 | import android.util.AttributeSet 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.EditText 9 | import android.widget.NumberPicker 10 | 11 | class QNumberPicker : NumberPicker { 12 | constructor(context: Context) : super(context) 13 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) 14 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( 15 | context, 16 | attrs, 17 | defStyleAttr 18 | ) 19 | 20 | override fun addView(child: View) { 21 | super.addView(child) 22 | updateView(child) 23 | } 24 | 25 | override fun addView( 26 | child: View, index: Int, 27 | params: ViewGroup.LayoutParams 28 | ) { 29 | super.addView(child, index, params) 30 | updateView(child) 31 | } 32 | 33 | override fun addView(child: View, params: ViewGroup.LayoutParams) { 34 | super.addView(child, params) 35 | updateView(child) 36 | } 37 | 38 | private fun updateView(view: View?) { 39 | if (view is EditText) { 40 | view.setTextColor(Color.parseColor("#689f38")) 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/xposed/IModule.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.xposed 2 | 3 | import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam 4 | import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam 5 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam 6 | 7 | interface IModule { 8 | fun handleInitPackageResources(respray: InitPackageResourcesParam) 9 | fun handleLoadPackage(param: LoadPackageParam) 10 | fun initZygote(startupParam: StartupParam?) 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/coderstory/flyme10/xposed/Start.kt: -------------------------------------------------------------------------------- 1 | package com.coderstory.flyme10.xposed 2 | 3 | import com.coderstory.flyme10.patchModule.FuckAd 4 | import com.coderstory.flyme10.patchModule.HideApp 5 | import com.coderstory.flyme10.patchModule.IsEnable 6 | import com.coderstory.flyme10.patchModule.Others 7 | import com.coderstory.flyme10.patchModule.SystemUi 8 | import com.coderstory.flyme10.patchModule.ThemePatcher 9 | import com.coderstory.flyme10.tools.XposedHelper 10 | import de.robv.android.xposed.IXposedHookInitPackageResources 11 | import de.robv.android.xposed.IXposedHookLoadPackage 12 | import de.robv.android.xposed.IXposedHookZygoteInit 13 | import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam 14 | import de.robv.android.xposed.XposedBridge 15 | import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam 16 | import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam 17 | 18 | class Start : XposedHelper(), IXposedHookZygoteInit, IXposedHookLoadPackage, 19 | IXposedHookInitPackageResources { 20 | override fun handleInitPackageResources(resparam: InitPackageResourcesParam) { 21 | Others().handleInitPackageResources(resparam) 22 | SystemUi().handleInitPackageResources(resparam) 23 | ThemePatcher().handleInitPackageResources(resparam) 24 | } 25 | 26 | override fun handleLoadPackage(lpparam: LoadPackageParam) { 27 | IsEnable().handleLoadPackage(lpparam) 28 | HideApp().handleLoadPackage(lpparam) 29 | Others().handleLoadPackage(lpparam) 30 | ThemePatcher().handleLoadPackage(lpparam) 31 | FuckAd().handleLoadPackage(lpparam) 32 | SystemUi().handleLoadPackage(lpparam) 33 | } 34 | 35 | override fun initZygote(startupParam: StartupParam) { 36 | XposedBridge.log("Flyme助手已加载") 37 | SystemUi().initZygote(startupParam) 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_menu_overflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xhdpi/ic_menu_overflow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/backup.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/backup.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/btn_nor_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/buildings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/buildings.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/check_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/copy.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/copy.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/ic_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_block.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_circle_down.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_drawer_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/ic_drawer_home.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_format_list.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_info.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_link.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_notes.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_refresh.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_share.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_swap_horiz.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_table_rows.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_telegram.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_vip.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_vip_banner.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_vip_nav.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/icon_share.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/panel_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/restor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/restor.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/sky.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/sky.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxhdpi/sun.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/buildings.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxxhdpi/buildings.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/sky.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable-xxxhdpi/sky.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/hosts.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable/hosts.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/drawable/splash.jpg -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 15 | 16 | 17 | 25 | 26 | 30 | 31 | 35 | 36 | 45 | 46 | 47 | 52 | 53 | 54 | 55 | 56 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/app_info_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 23 | 24 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/app_upgrade_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 23 | 24 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_def.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | 25 | 26 | 30 | 31 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_disable_app.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 36 | 37 | 42 | 43 | 50 | 51 | 58 | 59 | 67 | 68 | 69 | 70 | 77 | 78 | 85 | 86 | 93 | 94 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_input_formate_time.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 36 | 37 | 43 | 44 | 49 | 50 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_input_qq.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 37 | 38 | 45 | 46 | 51 | 52 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_xposed_copyurl.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 36 | 37 | 42 | 43 | 44 | 51 | 52 | 59 | 60 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_xposed_disabled.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 24 | 25 | 37 | 38 | 43 | 44 | 45 | 52 | 53 | 60 | 61 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 19 | 20 | 25 | 26 | 30 | 31 | 39 | 40 | 47 | 48 | 49 | 59 | 60 | 69 | 70 | 71 | 72 | 82 | 83 | 95 | 96 | 105 | 106 | 107 | 108 | 117 | 118 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_app_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_app_upgrade.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_others.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 27 | 28 | 40 | 41 | 53 | 54 | 67 | 68 | 80 | 81 | 82 | 94 | 95 | 109 | 110 | 119 | 120 | 130 | 131 | 143 | 144 | 145 | 146 | 147 | 159 | 160 | 170 | 171 | 181 | 182 | 195 | 196 | 197 | 198 | 210 | 211 | 223 | 224 | 236 | 237 | 238 | 239 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 30 | 31 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_webview.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/navigation_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/menu/drawer.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 22 | 23 | 27 | 28 | 29 | 30 | 34 | 38 | 39 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_disableapp_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_hideapp_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_upgrade_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_webview_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | > 4 | 9 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-hdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-mdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/values/array.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | android 5 | com.android.packageinstaller 6 | com.android.systemui 7 | com.meizu.mznfcpay 8 | com.meizu.flyme.update 9 | com.meizu.flyme.launcher 10 | com.meizu.customizecenter 11 | com.hy.weather.mz 12 | com.android.browser 13 | com.meizu.flyme.weather 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/base_html.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | p.license { 5 | background:grey; 6 | } 7 | body { 8 | font-family: sans-serif; 9 | overflow-wrap: break-word; 10 | } 11 | pre { 12 | background-color: #eeeeee; 13 | padding: 1em; 14 | white-space: pre-wrap; 15 | } 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #2196F3 4 | #2196F3 5 | #2196F3 6 | #2196F3 7 | #2196F3 8 | #2196F3 9 | #ffffff 10 | #fff 11 | #00f7f7f7 12 | #B39F9F9F 13 | #e7e9fd 14 | #afbfff 15 | #fafafa 16 | #2196F3 17 | #2196F3 18 | #2196F3 19 | #C83A3A 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Flyme10助手 3 | Open 4 | Close 5 | 声明\n软件授权协议 6 | 基础功能\n删除和屏蔽魅族自家的广告插件,可以屏蔽一部分App的广告 7 | 启用模块\n开启Hosts支持模块 8 | 开启常规去广告\nGithub上的hosts合集,用于屏蔽国内广告. 9 | 开启常见国外网站访问支持\nGithub上随意找的Hosts,包含了一些常见的国外网站,不含google,有时效性 10 | 注意事项:\n本功能需要ROOT权限,通过直接修改hosts文件实现,如果你安装了Magisk则无法生效 11 | 开启Xposed启用检测\n开启后,如果未在Xposed中激活则弹出相应提示 12 | 开启更新检测\n每天第一次打开助手时,自动检测并提示新版本 13 | 隐藏应用图标\n隐藏Flyme助手在桌上面的图标,隐藏图标后可在Xposed中打开.如果你没安装magisk则请勿开启 14 | 隐藏桌面图标标签\n隐藏桌面图标和文件夹下的标签文字 15 | 桌面图标布局 - 小\n使用4x5的桌面图标布局,可能会导致部分图标丢失 16 | 桌面图标布局 - 中\n使用5x5的桌面图标布局 17 | 桌面图标布局 - 大\n使用6x5的桌面图标布局 18 | 禁用安全检查\n跳过安装应用时候的安全检查,加快应用安装速度 19 | 启用原生应用安装界面\n使用Android原生安装界面替换flyme定制的安装界面 20 | 充电动画\n禁止开始充电时显示的全屏充电动画 21 | 侧滑返回-震动\n触发返回时开启震动,输入值为震动时长,推荐30–50 22 | 双击状态栏锁屏\n双击顶部状态栏实现锁屏 23 | 下拉栏时间\n点击下拉栏时间快捷打开时钟 24 | 下拉栏日历\n点击下拉栏日期快捷打开日历 25 | 隐藏开发者选项风险警告\n禁止开启开发者选项后通知栏弹出的风险警告 26 | 主题和谐\n无限制试用主题,不会有倒计时之类的提示.也不会还原成默认主题。 27 | 闹钟\n启用闹钟后,隐藏状态栏上的闹钟图标 28 | USB调试\n隐藏链接电脑后的USB调试图标 29 | 流量监控\n在手机管家中开启流量监控后,隐藏状态栏中对应的水滴图标,偶尔会隐藏失效,重启即可。 30 | 蓝牙\n连接蓝牙设备后,隐藏状态栏上的蓝牙图标 31 | 手机热点\n隐藏状态栏上的手机热点图标 32 | VoLte\n手机号开通volte后,隐藏状态栏上的HD高清通话图标 33 | 震动\n音量为0的情况下,隐藏状态栏上的震动图标 34 | 空SIM\n隐藏状态栏上的空sim卡图标 35 | 运营商文本\n自定义锁屏运营商文本 36 | 自定义时间格式\n自定义状态栏时间格式,例如 HH:mm:ss 37 | 隐藏wifi图标\n隐藏状态栏上的wifi图标 38 | 隐藏vpn图标\n开启vpn后,自动隐藏状态栏上的VPN图标和相关常驻通知 39 | 时间显秒\n状态栏上的当前时间格式变成[时:分:秒] 40 | 电量百分比\n在状态栏电量百分比后面加个百分号,比如电量97显示成97%, 注意框架必须开启资源钩子才能生效 41 | 低速隐藏 \n在系统设置里开启显示状态栏网速后,当实时网速低于100K/s则自隐藏状态栏上的网速图标 42 | 状态栏时间-星期 \n在状态栏时间后面追加星期 \n比如 [18:20 周一] 43 | 状态栏时间-修饰 \n在状态栏时间前面追加上午下午凌晨等词缀 比如 [傍晚 18:20] 44 | 状态栏星期-英文 \n在状态栏显示英文的日期[需开启 状态栏时间-星期] \n比如 [AM 18:20 Mon] 45 | 桌面禁用手势-搜索\n禁止桌面上划手势触发打开搜索 46 | 隐藏图标-SIM1\n隐藏状态栏SIM1的图标 47 | 隐藏图标-SIM2\n隐藏状态栏SIM2的图标 48 | 定位\n使用GPS的时候,隐藏状态栏上的定位图标 49 | 时钟\n隐藏状态栏中的时间 50 | 电池\n隐藏状态栏上的电池图标(不含17系列的环形电池) 修改后立即生效,设置重启后失效 51 | 隐藏应用图标 \n隐藏状态栏上左侧区域的所有图标,比如开启流量监控的图标,usb调试图标等 52 | AM-PM\n状态栏时间添加AM-PM前缀 53 | 温馨提示 54 | 关于应用 55 | 基础功能 56 | 冻结应用 57 | 清理应用缓存 58 | 常用设置 59 | 其他 60 | 复制链接 61 | 屏蔽Flyme广告\n通过hosts屏蔽部分flyme的广告,但可能导致小部分flyme服务访问异常 62 | 正在处理 63 | 请耐心等待。。 64 | 禁止系统检测更新\n禁止系统更新检测新版本 65 | 禁止部分应用联网\n屏蔽自带的应用商店,视频和一点资讯联网 66 | 67 | 提示:点击应用切换冻结状态 68 | 你确定要解除 69 | 的冻结状态吗? 70 | 你确定要冻结 71 | 吗? 72 | 正在读取应用信息。。。 73 | 74 | 请耐心等待应用清理完成再进行其他的操作! 75 | 76 | 开放源代码许可 77 | 关闭 78 | 79 | 已复制网址到粘贴板! 80 | 网址分享 81 | 开始清理 82 | 应用清理完成! 83 | 正在清理中… 84 | OK,列表备份完成! 85 | 备份失败,一般是因为APP没读写存储权限导致的 86 | 你确定要备份当前系统应用的冻结列表吗? 87 | 你确定要还原当前系统应用的冻结状态吗? 88 | OK,正在刷新列表 89 | 提示 90 | OK,正在恢复配置! 91 | 未找到备份列表! 92 | 未找到备份列表! 93 | 隐藏桌面应用图标 94 | 应用名: %1$s \n版本号 :%2$s 95 | 版本号: %1$s \n文件大小:%2$s\n发布日期:%3$s 96 | 应用设置 97 | 已检测到的OTA更新包 98 | 作者博客 99 | 移除推广按钮 \n移除应用安装界面的从官方商店下载按钮 100 | 自动安装应用 \n打开应用安装界面后,无需点击按钮自动执行安装 101 | 自定义状态栏 102 | 103 | 致谢如下开源项目\n\n 104 | MaterialDesignDemo\n https://github.com/burgessjp/MaterialDesignDemo\n\n 105 | PullToRefresh\n https://github.com/Yalantis\n\n 106 | root-tools\n https://github.com/rarnu/root-tools\n\n 107 | LicensesDialog\n https://github.com/PSDev/LicensesDialog\n\n 108 | 109 | \nFlyme助手适配于Flyme10系统,主要用于去除系统自带的一些广告和其他一些修改.功能需要Xposed模块和ROOT支持 110 | \n\n QQ群:717515891 111 | \n\n作者:CoderStory 112 | \n\n博客主页: https://blog.coderstory.cn 113 | \n\n微博主页: https://weibo.com/codestory 114 | 115 | dialog_msg 116 | 117 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 15 | 16 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = '1.8.20' 4 | 5 | repositories { 6 | google() 7 | mavenCentral() 8 | maven { url 'https://repo1.maven.org/maven2/' } 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:8.2.1' 12 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | google() 19 | mavenCentral() 20 | maven { url 'https://www.jitpack.io' } 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | android.useAndroidX=true 2 | android.enableJetifier=true 3 | android.defaults.buildfeatures.buildconfig=true 4 | android.nonTransitiveRClass=false 5 | android.nonFinalResIds=false 6 | #systemProp.http.proxyHost=127.0.0.1 7 | #systemProp.http.proxyPort=8889 8 | #systemProp.https.proxyHost=127.0.0.1 9 | #systemProp.https.proxyPort=8889 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderstory/FlymeHelper/dd80c67d4092c19f9a31f69a0a1e04d9e2c23d56/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Apr 12 18:53:07 CST 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /local.properties: -------------------------------------------------------------------------------- 1 | ## This file must *NOT* be checked into Version Control Systems, 2 | # as it contains information specific to your local configuration. 3 | # 4 | # Location of the SDK. This is only used by Gradle. 5 | # For customization when using a Version Control System, please read the 6 | # header note. 7 | #Thu Jun 01 17:27:23 CST 2023 8 | sdk.dir=D\:\\sdk 9 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' --------------------------------------------------------------------------------