From dab2560deeecc014e182d80c342ca43c4c417cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kwiecin=CC=81ski?= Date: Fri, 15 Mar 2024 17:29:50 +0700 Subject: [PATCH] Update project --- .circleci/config.yml | 59 --- .editorconfig | 19 + .github/workflows/default.yml | 80 +++ .github/workflows/dependencies.yml | 64 +++ .github/workflows/publish_release.yml | 45 ++ .github/workflows/run_diffuse.yml | 75 +++ LICENSE | 2 +- README.md | 25 +- app/build.gradle | 64 +-- app/src/main/AndroidManifest.xml | 38 +- app/src/main/ic_launcher-playstore.png | Bin 68081 -> 0 bytes .../rootbeer/sample/CheckForRootWorker.kt | 28 -- .../scottyab/rootbeer/sample/MainActivity.kt | 146 ------ .../rootbeer/sample/RootItemResult.kt | 3 - .../sample/extensions/ViewExtensions.kt | 23 - .../rootbeer/sample/ui/ResultIconView.kt | 24 - .../rootbeer/sample/ui/RootItemAdapter.kt | 56 --- .../sample/ui/RootedResultTextView.kt | 49 -- .../rootbeer/sample/ui/ScopedActivity.kt | 13 - .../rootbeer/sample/CheckForRootWorker.kt | 28 ++ .../rootbeer/sample/MainActivity.kt | 160 ++++++ .../rootbeer/sample/RootItemResult.kt | 6 + .../rootbeer/sample/RootSampleApp.kt | 11 +- .../rootbeer/sample/ui/RootItemAdapter.kt | 47 ++ .../drawable/ic_check_circle_green_24dp.xml | 16 +- .../ic_error_circle_outline_red_24dp.xml | 34 +- .../drawable/ic_info_outline_white_24dp.xml | 16 +- .../res/drawable/ic_lock_open_white_24dp.xml | 16 +- .../font/subway_novella.ttf} | Bin app/src/main/res/layout/activity_main.xml | 124 ++--- app/src/main/res/layout/item_root_check.xml | 58 +-- app/src/main/res/menu/menu_main.xml | 36 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5268 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 3077 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7753 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 13262 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 20108 -> 0 bytes .../ic_launcher.xml | 9 +- app/src/main/res/values/colors.xml | 20 +- app/src/main/res/values/dimens.xml | 5 +- app/src/main/res/values/strings.xml | 8 +- app/src/main/res/values/styles.xml | 25 +- art/RootBeer-feature-graphic.png | Bin 93507 -> 0 bytes art/RootBeer-tv-graphic.png | Bin 138186 -> 0 bytes art/root_beer_icon.svg | 84 ---- art/rootbeer-icon-playstore.png | Bin 73478 -> 0 bytes art/rootbeerjesus.png | Bin 332514 -> 0 bytes art/ss_got_root_fail.png | Bin 162525 -> 0 bytes art/ss_home_b4_test.png | Bin 99302 -> 0 bytes art/ss_info.png | Bin 118085 -> 0 bytes art/sticker.png | Bin 236461 -> 0 bytes art/tv-1.png | Bin 61967 -> 0 bytes art/tv-2.png | Bin 59340 -> 0 bytes art/tv-3.png | Bin 86654 -> 0 bytes build.gradle | 64 ++- changes.md | 30 -- dependencies.gradle | 18 - gradle-mvn-push.gradle | 108 ---- gradle.properties | 37 +- gradle/libs.versions.toml | 35 ++ gradle/plugins/build.gradle | 32 ++ gradle/plugins/settings.gradle | 27 + .../src/main/kotlin/PublishingPlugin.kt | 108 ++++ gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 305 +++++++----- gradlew.bat | 176 +++---- renovate.json | 16 + rootbeerlib/api/rootbeerlib.api | 34 ++ rootbeerlib/build.gradle | 59 ++- rootbeerlib/gradle.properties | 4 - rootbeerlib/proguard-rules.pro | 25 - rootbeerlib/src/main/AndroidManifest.xml | 54 +- rootbeerlib/src/main/cpp/toolChecker.cpp | 108 ---- rootbeerlib/src/main/cpp/toolChecker.h | 18 - .../java/com/scottyab/rootbeer/Const.java | 134 ----- .../java/com/scottyab/rootbeer/RootBeer.java | 467 ------------------ .../com/scottyab/rootbeer/RootBeerNative.java | 29 -- .../java/com/scottyab/rootbeer/util/QLog.java | 133 ----- .../com/scottyab/rootbeer/util/Utils.java | 28 -- .../usefulness/rootbeer/RootBeerNative.java | 14 + .../src/main/{cpp => jni}/CMakeLists.txt | 3 +- ...ithub_usefulness_rootbeer_RootBeerNative.h | 37 ++ rootbeerlib/src/main/jni/rootbeerlib.cpp | 239 +++++++++ .../io/github/usefulness/rootbeer/RootBeer.kt | 335 +++++++++++++ .../usefulness/rootbeer/internal/Consts.kt | 114 +++++ .../rootbeer/internal/NativeLoader.kt | 26 + .../rootbeer/internal/RootBeerWrapper.kt | 23 + .../com/scottyab/rootbeer/RootBeerTest.java | 167 ------- settings.gradle | 36 +- 91 files changed, 2248 insertions(+), 2320 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .editorconfig create mode 100644 .github/workflows/default.yml create mode 100644 .github/workflows/dependencies.yml create mode 100644 .github/workflows/publish_release.yml create mode 100644 .github/workflows/run_diffuse.yml delete mode 100644 app/src/main/ic_launcher-playstore.png delete mode 100644 app/src/main/java/com/scottyab/rootbeer/sample/CheckForRootWorker.kt delete mode 100755 app/src/main/java/com/scottyab/rootbeer/sample/MainActivity.kt delete mode 100644 app/src/main/java/com/scottyab/rootbeer/sample/RootItemResult.kt delete mode 100644 app/src/main/java/com/scottyab/rootbeer/sample/extensions/ViewExtensions.kt delete mode 100644 app/src/main/java/com/scottyab/rootbeer/sample/ui/ResultIconView.kt delete mode 100644 app/src/main/java/com/scottyab/rootbeer/sample/ui/RootItemAdapter.kt delete mode 100755 app/src/main/java/com/scottyab/rootbeer/sample/ui/RootedResultTextView.kt delete mode 100644 app/src/main/java/com/scottyab/rootbeer/sample/ui/ScopedActivity.kt create mode 100644 app/src/main/kotlin/io/github/usefulness/rootbeer/sample/CheckForRootWorker.kt create mode 100755 app/src/main/kotlin/io/github/usefulness/rootbeer/sample/MainActivity.kt create mode 100644 app/src/main/kotlin/io/github/usefulness/rootbeer/sample/RootItemResult.kt rename app/src/main/{java/com/scottyab => kotlin/io/github/usefulness}/rootbeer/sample/RootSampleApp.kt (74%) create mode 100644 app/src/main/kotlin/io/github/usefulness/rootbeer/sample/ui/RootItemAdapter.kt rename app/src/main/{assets/SubwayNovella.ttf => res/font/subway_novella.ttf} (100%) delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename app/src/main/res/{mipmap-anydpi-v26 => mipmap}/ic_launcher.xml (61%) delete mode 100644 art/RootBeer-feature-graphic.png delete mode 100644 art/RootBeer-tv-graphic.png delete mode 100644 art/root_beer_icon.svg delete mode 100644 art/rootbeer-icon-playstore.png delete mode 100644 art/rootbeerjesus.png delete mode 100644 art/ss_got_root_fail.png delete mode 100644 art/ss_home_b4_test.png delete mode 100644 art/ss_info.png delete mode 100644 art/sticker.png delete mode 100644 art/tv-1.png delete mode 100644 art/tv-2.png delete mode 100644 art/tv-3.png delete mode 100644 changes.md delete mode 100644 dependencies.gradle delete mode 100644 gradle-mvn-push.gradle create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/plugins/build.gradle create mode 100644 gradle/plugins/settings.gradle create mode 100644 gradle/plugins/src/main/kotlin/PublishingPlugin.kt create mode 100644 renovate.json create mode 100644 rootbeerlib/api/rootbeerlib.api delete mode 100644 rootbeerlib/gradle.properties delete mode 100644 rootbeerlib/proguard-rules.pro delete mode 100644 rootbeerlib/src/main/cpp/toolChecker.cpp delete mode 100644 rootbeerlib/src/main/cpp/toolChecker.h delete mode 100644 rootbeerlib/src/main/java/com/scottyab/rootbeer/Const.java delete mode 100644 rootbeerlib/src/main/java/com/scottyab/rootbeer/RootBeer.java delete mode 100644 rootbeerlib/src/main/java/com/scottyab/rootbeer/RootBeerNative.java delete mode 100644 rootbeerlib/src/main/java/com/scottyab/rootbeer/util/QLog.java delete mode 100644 rootbeerlib/src/main/java/com/scottyab/rootbeer/util/Utils.java create mode 100644 rootbeerlib/src/main/java/io/github/usefulness/rootbeer/RootBeerNative.java rename rootbeerlib/src/main/{cpp => jni}/CMakeLists.txt (84%) create mode 100644 rootbeerlib/src/main/jni/io_github_usefulness_rootbeer_RootBeerNative.h create mode 100644 rootbeerlib/src/main/jni/rootbeerlib.cpp create mode 100644 rootbeerlib/src/main/kotlin/io/github/usefulness/rootbeer/RootBeer.kt create mode 100644 rootbeerlib/src/main/kotlin/io/github/usefulness/rootbeer/internal/Consts.kt create mode 100644 rootbeerlib/src/main/kotlin/io/github/usefulness/rootbeer/internal/NativeLoader.kt create mode 100644 rootbeerlib/src/main/kotlin/io/github/usefulness/rootbeer/internal/RootBeerWrapper.kt delete mode 100644 rootbeerlib/src/test/java/com/scottyab/rootbeer/RootBeerTest.java diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index d47348f..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,59 +0,0 @@ -version: 2 -jobs: - build: - docker: - # https://circleci.com/docs/2.0/circleci-images/#android - - image: circleci/android:api-30 - environment: - GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"' - steps: - - checkout - - restore_cache: - key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} - - - run: - name: Download Dependencies - command: ./gradlew androidDependencies - - save_cache: - paths: - - ~/.gradle - key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} - - run: - name: Run Tests - command: ./gradlew test - - - store_artifacts: - path: rootbeerlib/build/reports/ - destination: reports - - - store_test_results: - path: app/build/test-results - - # Compile debug apks - - run: - name: Compile Debug APKs - command: ./gradlew assembleDebug - - # Compile release apks - - run: - name: Compile Release APKs - command: ./gradlew assembleRelease - - # Copy APK files to artifacts - - run: - name: Copy APK Files - command: | - set -xu - mkdir -p /tmp/artifacts - find . -name "*release-unsigned.apk" -type f -exec echo {} \; - find . -name "*release-unsigned.apk" -type f -exec cp {} /tmp/artifacts/ \; - find . -name "*release.apk" -type f -exec echo {} \; - find . -name "*release.apk" -type f -exec cp {} /tmp/artifacts/ \; - find . -name "*debug.apk" -type f -exec echo {} \; - find . -name "*debug.apk" -type f -exec cp {} /tmp/artifacts/ \; - - # Save artifacts - - store_artifacts: - name: Save APK Files - path: /tmp/artifacts - destination: build diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..93a16e5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +insert_final_newline = true + +[*.{kt,kts}] +max_line_length = 140 +indent_size = 4 +ij_kotlin_allow_trailing_comma = true +ij_kotlin_allow_trailing_comma_on_call_site = true +ktlint_code_style = intellij_idea +ktlint_standard_property-naming = disabled +ktlint_class_signature_rule_force_multiline_when_parameter_count_greater_or_equal_than = 2 +ktlint_function_naming_ignore_when_annotated_with = Composable +ktlint_compose_unstable-collections = disabled + +[*.xml] +indent_size = 4 +ij_xml_space_inside_empty_tag = true \ No newline at end of file diff --git a/.github/workflows/default.yml b/.github/workflows/default.yml new file mode 100644 index 0000000..faf75fd --- /dev/null +++ b/.github/workflows/default.yml @@ -0,0 +1,80 @@ +name: Build project + +on: + pull_request: + push: + branches: + - master + - main + - trunk + - develop + - maine + - mane + schedule: + - cron: '0 3 * * 1,4' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/master' }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 21 + + - uses: gradle/actions/setup-gradle@v3 + + - uses: gradle/wrapper-validation-action@v2 + + - run: ./gradlew projectCodestyle + + - run: ./gradlew assembleRelease check --scan + + - run: ./gradlew projectCoverage + + - run: ./gradlew publishToMavenLocal + + - run: git diff --exit-code + + - uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: lint-results + path: '${{ github.workspace }}/**/build/**/reports/lint-results-*.html' + + - name: Unwrap GPG key + if: github.repository == 'usefulness/rootbeer' && github.event_name != 'pull_request' + env: + GPG_KEY_CONTENTS: ${{ secrets.GPG_KEY_CONTENTS }} + SIGNING_SECRET_KEY_RING_FILE: ${{ secrets.SIGNING_SECRET_KEY_RING_FILE }} + run: sudo bash -c "echo '$GPG_KEY_CONTENTS' | base64 -d > '$SIGNING_SECRET_KEY_RING_FILE'" + + - name: Publish + if: github.repository == 'usefulness/rootbeer' && github.event_name == 'push' && github.ref == 'refs/heads/master' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} + SIGNING_SECRET_KEY_RING_FILE: ${{ secrets.SIGNING_SECRET_KEY_RING_FILE }} + run: ./gradlew publishReleasePublicationToGithubRepository | true + + - uses: actions/cache@v4 + if: github.event_name != 'pull_request' + name: Upload base (release) + with: + path: diffuse-source-file-release + key: diffuse-${{ github.sha }}-${{ hashFiles('**/aar/**.aar') }} + + - run: cp rootbeerlib/build/outputs/aar/rootbeerlib-release.aar diffuse-source-file-release + if: github.event_name != 'pull_request' + shell: bash diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml new file mode 100644 index 0000000..40ca122 --- /dev/null +++ b/.github/workflows/dependencies.yml @@ -0,0 +1,64 @@ +name: Generate dependency diff + +on: + pull_request: + push: + branches: + - master + - main + - trunk + - develop + - maine + - mane + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/master' }} + +jobs: + generate-diff: + env: + github_token: ${{ secrets.GITHUB_TOKEN }} + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 21 + + - uses: gradle/actions/setup-gradle@v3 + + - run: ./gradlew assembleRelease -m + + - id: dependency-diff + name: Generate dependency diff + if: github.event_name == 'pull_request' + uses: usefulness/dependency-tree-diff-action@v2 + with: + project: 'rootbeerlib' + configuration: releaseRuntimeClasspath + + - uses: peter-evans/find-comment@v3 + if: github.event_name == 'pull_request' + id: find_comment + with: + issue-number: ${{ github.event.pull_request.number }} + body-includes: Dependency diff + + - uses: peter-evans/create-or-update-comment@v4 + if: ${{ steps.dependency-diff.outputs.text-diff != null || steps.find_comment.outputs.comment-id != null }} + with: + body: | + Dependency diff: + ```diff + ${{ steps.dependency-diff.outputs.text-diff }} + ``` + edit-mode: replace + comment-id: ${{ steps.find_comment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml new file mode 100644 index 0000000..fb77a6a --- /dev/null +++ b/.github/workflows/publish_release.yml @@ -0,0 +1,45 @@ +name: Publish Release + +on: + push: + tags: + - 'v*' + +jobs: + build: + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} + SIGNING_SECRET_KEY_RING_FILE: ${{ secrets.SIGNING_SECRET_KEY_RING_FILE }} + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 21 + + - uses: gradle/actions/setup-gradle@v3 + + - run: ./gradlew assemble + + - name: Unwrap GPG key + env: + GPG_KEY_CONTENTS: ${{ secrets.GPG_KEY_CONTENTS }} + SIGNING_SECRET_KEY_RING_FILE: ${{ secrets.SIGNING_SECRET_KEY_RING_FILE }} + run: sudo bash -c "echo '$GPG_KEY_CONTENTS' | base64 -d > '$SIGNING_SECRET_KEY_RING_FILE'" + + - run: ./gradlew currentVersion + + - name: Publish to Maven Central + run: ./gradlew publishReleasePublicationToMavenCentralRepository + + - name: Publish to Github Package Registry + run: ./gradlew publishReleasePublicationToGithubRepository diff --git a/.github/workflows/run_diffuse.yml b/.github/workflows/run_diffuse.yml new file mode 100644 index 0000000..c97dfa7 --- /dev/null +++ b/.github/workflows/run_diffuse.yml @@ -0,0 +1,75 @@ +name: Diffuse + +on: + pull_request: + branches: + - master + - main + - trunk + - develop + - maine + - mane + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/master' }} + +jobs: + run-diffuse: + env: + github_token: ${{ secrets.GITHUB_TOKEN }} + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 21 + + - uses: gradle/actions/setup-gradle@v3 + + - run: ./gradlew assembleRelease + + - uses: actions/cache@v4 + name: Download base + with: + path: | + diffuse-source-file-release + key: diffuse-${{ github.event.pull_request.base.sha }} + restore-keys: diffuse-${{ github.event.pull_request.base.sha }} + + - id: diffuse + uses: usefulness/diffuse-action@v1 + with: + old-file-path: diffuse-source-file-release + new-file-path: rootbeerlib/build/outputs/aar/rootbeerlib-release.aar + + - uses: peter-evans/find-comment@v3 + id: find_comment + with: + issue-number: ${{ github.event.pull_request.number }} + body-includes: Diffuse output + + - uses: peter-evans/create-or-update-comment@v4 + if: ${{ steps.diffuse.outputs.diff-gh-comment != null || steps.find_comment.outputs.comment-id != null }} + with: + body: | + ### Aar size: + Aar size change: ${{ steps.diffuse.outputs.size-diff-comment_style_1 }} + + ### Diffuse output: + + ${{ steps.diffuse.outputs.diff-gh-comment }} + edit-mode: replace + comment-id: ${{ steps.find_comment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/upload-artifact@v4 + with: + name: diffuse-output + path: ${{ steps.diffuse.outputs.diff-file }} diff --git a/LICENSE b/LICENSE index 8dada3e..3879a29 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright (C) 2015, Scott Alexander-Bown, Mat Rollings Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 9c93ac6..b74d2d6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A tasty root checker library and sample app. We've scoured the internets for dif # Root checks These are the current checks/tricks we are using to give an indication of root. -**Java checks** +**JVM checks** * checkRootManagementApps * checkPotentiallyDangerousApps @@ -26,29 +26,12 @@ We call through to our native root checker to run some of its own checks. Native * checkForSuBinary -## Disclaimer and limitations! - -We love root! both [Scott](https://github.com/scottyab) and [Mat](https://github.com/stealthcopter) (the creators) own and use rooted devices (albeit not as daily driver). However we appreciate it can be useful to have an indication your app is running on a rooted device. Plus as hackday style project we wanted to see if we could beat the root cloakers at the time in 2015. - -Remember **root==god**, so there's no 100% guaranteed way to check for root! treat this as an *indication* of root. - - - - -### Root cloakers - -In **2015** we successfully tested Rootbeer and it flagged an indication of root when testing with the following root cloak apps. However Rootbeer was defeated when using a combination of the root cloakers activated at the same time. - -Tested cloakers: - -* [RootCloak Plus (Cydia)](https://play.google.com/store/apps/details?id=com.devadvance.rootcloakplus&hl=en_GB) requires [Cydia Substrate](http://play.google.com/store/apps/details?id=com.saurik.substrate) -* [RootCloak](http://repo.xposed.info/module/com.devadvance.rootcloak) - requires [Xposed Framework](http://repo.xposed.info/module/de.robv.android.xposed.installer) ## Usage -```java -RootBeer rootBeer = new RootBeer(context); -if (rootBeer.isRooted()) { +```kotlin +val rootBeer = RootBeer(context); +if (rootBeer.isRooted) { //we found indication of root } else { //we didn't find indication of root diff --git a/app/build.gradle b/app/build.gradle index bfa2cdf..50b9668 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,68 +1,40 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' - +plugins { + alias(libs.plugins.starter.application.android) +} android { - compileSdkVersion compileSdkVer - buildToolsVersion buildToolsVer - defaultConfig { - applicationId "com.scottyab.rootbeer.sample" - minSdkVersion minSdkVer - targetSdkVersion targetSdkVer + applicationId "io.github.usefulness.rootbeer.sample" + namespace "io.github.usefulness.rootbeer.sample" versionCode 10 versionName "0.9" - vectorDrawables.useSupportLibrary = true - - archivesBaseName = "RootBeerSample-$versionName-[$versionCode]" - - } - - //check if the keystore details are defined in gradle.properties (this is so the key is not in github) - if (project.hasProperty("ROOTBEER_SAMPLE_STORE")) { - signingConfigs { - //from ~/user/.gradle/gradle.properties - release { - storeFile file(ROOTBEER_SAMPLE_STORE) - keyAlias ROOTBEER_SAMPLE_KEY - storePassword ROOTBEER_SAMPLE_STORE_PASS - keyPassword ROOTBEER_SAMPLE_KEY_PASS - } - } + minSdk 26 } buildTypes { debug { applicationIdSuffix ".debug" minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } release { - if (project.hasProperty("ROOTBEER_SAMPLE_STORE")) { - signingConfig signingConfigs.release - } - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + buildFeatures { + buildConfig = true + viewBinding = true + } } dependencies { implementation project(':rootbeerlib') - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion" - - implementation "androidx.core:core-ktx:$corektxVersion" - - implementation "androidx.appcompat:appcompat:$appcompatVersion" - implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" - implementation "com.google.android.material:material:$materialDesignVersion" - - implementation "com.nineoldandroids:library:$nineoldandroidsVersion" - implementation "uk.co.barbuzz:beerprogressview:$beerProgressViewVersion" - - implementation "com.jakewharton.timber:timber:$timberVersion" + implementation(libs.kotlinx.coroutines.android) + implementation(libs.androidx.core) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.constraintlayout) + implementation(libs.google.material) + implementation(libs.nineoldandroids.library) + implementation(libs.barbuzz.beerprogressview) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 95fc20c..c852fd2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,25 +1,23 @@ - + - + - - - - - - - - + + + + + + + diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png deleted file mode 100644 index 01abe41a7c47a754ebc89008ba92534514628072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68081 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
xWY6R~ZJ_+cZ6@N%xV{!6hlrW78 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 diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/CheckForRootWorker.kt b/app/src/main/java/com/scottyab/rootbeer/sample/CheckForRootWorker.kt deleted file mode 100644 index c87f490..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/CheckForRootWorker.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.scottyab.rootbeer.sample - -import android.content.Context -import com.scottyab.rootbeer.RootBeer -import com.scottyab.rootbeer.util.Utils - -class CheckForRootWorker(context: Context) { - - private val rootBeer = RootBeer(context) - - suspend operator fun invoke(): List = getRootResults() - - private fun getRootResults() = listOf( - RootItemResult("Root Management Apps", rootBeer.detectRootManagementApps()), - RootItemResult("Potentially Dangerous Apps", rootBeer.detectPotentiallyDangerousApps()), - RootItemResult("Root Cloaking Apps", rootBeer.detectRootCloakingApps()), - RootItemResult("TestKeys", rootBeer.detectTestKeys()), - RootItemResult("BusyBoxBinary", rootBeer.checkForBusyBoxBinary()), - RootItemResult("SU Binary", rootBeer.checkForSuBinary()), - RootItemResult("2nd SU Binary check", rootBeer.checkSuExists()), - RootItemResult("For RW Paths", rootBeer.checkForRWPaths()), - RootItemResult("Dangerous Props", rootBeer.checkForDangerousProps()), - RootItemResult("Root via native check", rootBeer.checkForRootNative()), - RootItemResult("SE linux Flag Is Enabled", !Utils.isSelinuxFlagInEnabled()), - RootItemResult("Magisk specific checks", rootBeer.checkForMagiskBinary()) - ) -} - diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/MainActivity.kt b/app/src/main/java/com/scottyab/rootbeer/sample/MainActivity.kt deleted file mode 100755 index e3848a1..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/MainActivity.kt +++ /dev/null @@ -1,146 +0,0 @@ -package com.scottyab.rootbeer.sample - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import androidx.appcompat.app.AlertDialog -import androidx.recyclerview.widget.LinearLayoutManager -import com.scottyab.rootbeer.sample.extensions.hide -import com.scottyab.rootbeer.sample.extensions.show -import com.scottyab.rootbeer.sample.ui.RootItemAdapter -import com.scottyab.rootbeer.sample.ui.ScopedActivity -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -class MainActivity : ScopedActivity() { - - private var infoDialog: AlertDialog? = null - private val rootItemAdapter = RootItemAdapter() - private val checkForRoot = CheckForRootWorker(this) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - initView() - resetView() - } - - private fun initView() { - setSupportActionBar(toolbar) - fab.setOnClickListener { checkForRoot() } - rootResultsRecycler.layoutManager = LinearLayoutManager(this) - rootResultsRecycler.adapter = rootItemAdapter - } - - private fun resetView() { - progressView.max = 100 - progressView.beerProgress = 0 - progressView.show() - isRootedTextView.hide() - rootItemAdapter.clear() - } - - private fun checkForRoot() { - resetView() - fab.hide() - - launch { - val results = checkForRoot.invoke() - animateResults(results) - } - } - - /** - * There's probably a much easier way of doing this using View Property animators? :S - */ - private fun animateResults(results: List) { - val isRooted = results.any { it.result } - // this allows us to increment the progress bar for x number of times for each of the results - // all in the effort to smooth the animation - val multiplier = 10 - progressView.max = results.size * multiplier - - launch { - withContext(Dispatchers.IO) { - results.forEachIndexed { index, rootItemResult -> - for (i in 1..multiplier) { - // arbitrary delay, 50 millis seems to look ok when testing with 12 results - delay(50) - // post the UI updates in the UI thread - withContext(Dispatchers.Main) { - progressView.beerProgress = progressView.beerProgress + 1 - - // only add to the once we hit the multiplier - if (i == multiplier) { - rootItemAdapter.add(rootItemResult) - } - //is it the end of the results - if (index == results.size - 1) { - onRootCheckFinished(isRooted = isRooted) - } - } - } - } - } - } - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_main, menu) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.action_github -> { - val i = Intent(Intent.ACTION_VIEW) - i.data = Uri.parse(GITHUB_LINK) - startActivity(i) - true - } - R.id.action_info -> { - showInfoDialog() - true - } - else -> super.onOptionsItemSelected(item) - } - } - - private fun showInfoDialog() { - //do nothing if already showing - if (infoDialog?.isShowing != true) { - infoDialog = AlertDialog.Builder(this) - .setTitle(R.string.app_name) - .setMessage(R.string.info_details) - .setCancelable(true) - .setPositiveButton("ok") { dialog, _ -> dialog.dismiss() } - .setNegativeButton("More info") { dialog, _ -> - dialog.dismiss() - startActivity( - Intent( - Intent.ACTION_VIEW, - Uri.parse(GITHUB_LINK) - ) - ) - } - .create() - infoDialog?.show() - } - } - - private fun onRootCheckFinished(isRooted: Boolean) { - fab.show() - isRootedTextView.update(isRooted = isRooted) - isRootedTextView.show() - } - - companion object { - private const val GITHUB_LINK = "https://github.com/scottyab/rootbeer" - } -} - diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/RootItemResult.kt b/app/src/main/java/com/scottyab/rootbeer/sample/RootItemResult.kt deleted file mode 100644 index 763b4d8..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/RootItemResult.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.scottyab.rootbeer.sample - -data class RootItemResult(val text: String, val result: Boolean) diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/extensions/ViewExtensions.kt b/app/src/main/java/com/scottyab/rootbeer/sample/extensions/ViewExtensions.kt deleted file mode 100644 index 9c39ba3..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/extensions/ViewExtensions.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.scottyab.rootbeer.sample.extensions - -import android.view.View - -internal fun View.show(show: Boolean) { - if (show) { - show() - } else { - hide() - } -} - -internal fun View.show() { - visibility = View.VISIBLE -} - -internal fun View.invisible() { - visibility = View.INVISIBLE -} - -internal fun View.hide() { - visibility = View.GONE -} diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/ui/ResultIconView.kt b/app/src/main/java/com/scottyab/rootbeer/sample/ui/ResultIconView.kt deleted file mode 100644 index cdab128..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/ui/ResultIconView.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.scottyab.rootbeer.sample.ui - -import android.content.Context -import android.util.AttributeSet -import com.scottyab.rootbeer.sample.R - -class ResultIconView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : androidx.appcompat.widget.AppCompatImageView(context, attrs, defStyleAttr) { - - fun showPass() = setImageResource(R.drawable.ic_check_circle_green_24dp) - - fun showFail() = setImageResource(R.drawable.ic_error_circle_outline_red_24dp) - - fun update(isRooted: Boolean) { - if (isRooted) { - showFail() - } else { - showPass() - } - } -} diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/ui/RootItemAdapter.kt b/app/src/main/java/com/scottyab/rootbeer/sample/ui/RootItemAdapter.kt deleted file mode 100644 index 932c172..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/ui/RootItemAdapter.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.scottyab.rootbeer.sample.ui - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import com.scottyab.rootbeer.sample.R -import com.scottyab.rootbeer.sample.RootItemResult -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.item_root_check.view.* - -class RootItemAdapter : RecyclerView.Adapter() { - private val items: MutableList = mutableListOf() - - fun update(results: List) { - items.clear() - items.addAll(results) - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RootItemVH { - val inflater = LayoutInflater.from(parent.context) - return RootItemVH( - inflater.inflate( - R.layout.item_root_check, - parent, - false - ) - ) - } - - override fun getItemCount() = items.size - - override fun onBindViewHolder(holder: RootItemVH, position: Int) = holder.bind(items[position]) - - fun add(rootItemResult: RootItemResult) { - items.add(rootItemResult) - notifyItemInserted(items.size - 1) - } - - fun clear() { - items.clear() - notifyDataSetChanged() - } - - class RootItemVH(override val containerView: View) : RecyclerView.ViewHolder(containerView), - LayoutContainer { - - fun bind(item: RootItemResult) { - containerView.rootItemText.text = item.text - containerView.rootItemResultIcon.update(isRooted = item.result) - } - } -} - - diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/ui/RootedResultTextView.kt b/app/src/main/java/com/scottyab/rootbeer/sample/ui/RootedResultTextView.kt deleted file mode 100755 index fefd353..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/ui/RootedResultTextView.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.scottyab.rootbeer.sample.ui - -import android.content.Context -import android.graphics.Typeface -import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatTextView -import androidx.core.content.ContextCompat -import com.scottyab.rootbeer.sample.R -import timber.log.Timber - -class RootedResultTextView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : AppCompatTextView(context, attrs, defStyleAttr) { - - init { - setCustomFont(context, "SubwayNovella.ttf") - } - - private fun setCustomFont(ctx: Context, asset: String): Boolean { - return try { - val typeface = Typeface.createFromAsset(ctx.assets, asset) - setTypeface(typeface) - true - } catch (e: Exception) { - Timber.e(e, "Unable to load typeface: ${e.message}") - false - } - } - - fun update(isRooted: Boolean) { - if (isRooted) { - rooted() - } else { - notRooted() - } - } - - private fun rooted() { - setText(R.string.result_rooted) - setTextColor(ContextCompat.getColor(context, R.color.fail)) - } - - private fun notRooted() { - setText(R.string.result_not_rooted) - setTextColor(ContextCompat.getColor(context, R.color.pass)) - } -} diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/ui/ScopedActivity.kt b/app/src/main/java/com/scottyab/rootbeer/sample/ui/ScopedActivity.kt deleted file mode 100644 index 8a23bd1..0000000 --- a/app/src/main/java/com/scottyab/rootbeer/sample/ui/ScopedActivity.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.scottyab.rootbeer.sample.ui - -import androidx.appcompat.app.AppCompatActivity -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.cancel - -abstract class ScopedActivity : AppCompatActivity(), CoroutineScope by MainScope() { - override fun onDestroy() { - super.onDestroy() - cancel() // CoroutineScope.cancel - } -} diff --git a/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/CheckForRootWorker.kt b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/CheckForRootWorker.kt new file mode 100644 index 0000000..b7ba5c4 --- /dev/null +++ b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/CheckForRootWorker.kt @@ -0,0 +1,28 @@ +package io.github.usefulness.rootbeer.sample + +import android.content.Context +import io.github.usefulness.rootbeer.RootBeer + +class CheckForRootWorker(context: Context) { + + private val rootBeer = RootBeer(context).apply { + setLogging(logging = true) + } + + operator fun invoke() = getRootResults() + + private fun getRootResults() = listOf( + RootItemResult(R.string.root_checks_1, rootBeer.detectRootManagementApps()), + RootItemResult(R.string.root_checks_2, rootBeer.detectPotentiallyDangerousApps()), + RootItemResult(R.string.root_checks_3, rootBeer.detectTestKeys()), + RootItemResult(R.string.root_checks_4, rootBeer.checkForBusyBoxBinary()), + RootItemResult(R.string.root_checks_5, rootBeer.checkForSuBinary()), + RootItemResult(R.string.root_checks_6, rootBeer.checkSuExists()), + RootItemResult(R.string.root_checks_7, rootBeer.checkForRWPaths()), + RootItemResult(R.string.root_checks_8, rootBeer.checkForDangerousProps()), + RootItemResult(R.string.root_checks_9, rootBeer.checkForRootNative()), + RootItemResult(R.string.root_checks_10, rootBeer.detectRootCloakingApps()), + RootItemResult(R.string.root_checks_11, rootBeer.checkForMagiskBinary()), + RootItemResult(R.string.root_checks_12, rootBeer.checkForMagiskUdsNative()), + ) +} diff --git a/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/MainActivity.kt b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/MainActivity.kt new file mode 100755 index 0000000..d6c015f --- /dev/null +++ b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/MainActivity.kt @@ -0,0 +1,160 @@ +package io.github.usefulness.rootbeer.sample + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.Menu +import android.view.MenuItem +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import io.github.usefulness.rootbeer.sample.databinding.ActivityMainBinding +import io.github.usefulness.rootbeer.sample.ui.RootItemAdapter +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class MainActivity : AppCompatActivity() { + + private var infoDialog: AlertDialog? = null + private val rootItemAdapter = RootItemAdapter() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + binding.initView() + binding.resetView() + } + + private fun ActivityMainBinding.initView() { + setSupportActionBar(toolbar) + fab.setOnClickListener { checkForRoot() } + rootResultsRecycler.layoutManager = LinearLayoutManager(this@MainActivity) + rootResultsRecycler.adapter = rootItemAdapter + } + + private fun ActivityMainBinding.resetView() { + progressView.max = 100 + progressView.beerProgress = 0 + progressView.isVisible = true + isRootedTextView.isVisible = false + rootItemAdapter.submitList(null) + } + + private fun ActivityMainBinding.checkForRoot() { + fab.hide() + resetView() + + lifecycleScope.launch { + val results = CheckForRootWorker(context = this@MainActivity).invoke() + animateResults(results) + } + } + + /** + * There's probably a much easier way of doing this using View Property animators? :S + */ + private fun ActivityMainBinding.animateResults(results: List) { + val isRooted = results.any { it.result } + // this allows us to increment the progress bar for x number of times for each of the results + // all in the effort to smooth the animation + val multiplier = 10 + progressView.max = results.size * multiplier + + lifecycleScope.launch { + withContext(Dispatchers.IO) { + results.forEachIndexed { index, _ -> + for (i in 1..multiplier) { + // arbitrary delay, 50 millis seems to look ok when testing with 12 results + // post the UI updates in the UI thread + withContext(Dispatchers.Main) { + progressView.beerProgress += 1 + + // only add to the once we hit the multiplier + if (i == multiplier) { + rootItemAdapter.submitList(results.subList(fromIndex = 0, toIndex = index)) + } + // is it the end of the results + if (index == results.size - 1) { + onRootCheckFinished(isRooted = isRooted) + } + } + delay(20) + } + } + } + rootItemAdapter.submitList(results) + } + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_main, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { + R.id.action_github -> { + openGithub() + true + } + + R.id.action_info -> { + showInfoDialog() + true + } + + else -> super.onOptionsItemSelected(item) + } + + private fun showInfoDialog() { + // do nothing if already showing + if (infoDialog?.isShowing != true) { + infoDialog = MaterialAlertDialogBuilder(this) + .setTitle(R.string.app_name) + .setMessage(R.string.info_details) + .setCancelable(true) + .setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() } + .setNegativeButton(R.string.action_more_info) { dialog, _ -> + dialog.dismiss() + openGithub() + } + .create() + infoDialog?.show() + } + } + + private fun ActivityMainBinding.onRootCheckFinished(isRooted: Boolean) { + fab.show() + if (isRooted) { + isRootedTextView.rooted() + } else { + isRootedTextView.notRooted() + } + isRootedTextView.isVisible = true + } + + private fun openGithub() { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(GITHUB_LINK))) + } + + private fun TextView.rooted() { + setText(R.string.result_rooted) + setTextColor(ContextCompat.getColor(context, R.color.fail)) + } + + private fun TextView.notRooted() { + setText(R.string.result_not_rooted) + setTextColor(ContextCompat.getColor(context, R.color.pass)) + } + + companion object { + private const val GITHUB_LINK = "https://github.com/usefulness/rootbeer" + } +} diff --git a/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/RootItemResult.kt b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/RootItemResult.kt new file mode 100644 index 0000000..62b1484 --- /dev/null +++ b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/RootItemResult.kt @@ -0,0 +1,6 @@ +package io.github.usefulness.rootbeer.sample + +data class RootItemResult( + val text: Int, + val result: Boolean, +) diff --git a/app/src/main/java/com/scottyab/rootbeer/sample/RootSampleApp.kt b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/RootSampleApp.kt similarity index 74% rename from app/src/main/java/com/scottyab/rootbeer/sample/RootSampleApp.kt rename to app/src/main/kotlin/io/github/usefulness/rootbeer/sample/RootSampleApp.kt index e277028..49ff62f 100644 --- a/app/src/main/java/com/scottyab/rootbeer/sample/RootSampleApp.kt +++ b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/RootSampleApp.kt @@ -1,15 +1,13 @@ -package com.scottyab.rootbeer.sample +package io.github.usefulness.rootbeer.sample import android.app.Application import android.os.Build import android.os.StrictMode -import timber.log.Timber class RootSampleApp : Application() { override fun onCreate() { super.onCreate() - Timber.plant(Timber.DebugTree()) if (BuildConfig.DEBUG) { initStrictMode() @@ -23,16 +21,15 @@ class RootSampleApp : Application() { .detectNetwork() .penaltyLog() .penaltyDeathOnNetwork() - .build() + .build(), ) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { StrictMode.setVmPolicy( StrictMode.VmPolicy.Builder() - .detectNonSdkApiUsage() - .detectCleartextNetwork() + .detectAll() .penaltyLog() - .build() + .build(), ) } } diff --git a/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/ui/RootItemAdapter.kt b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/ui/RootItemAdapter.kt new file mode 100644 index 0000000..cab2f17 --- /dev/null +++ b/app/src/main/kotlin/io/github/usefulness/rootbeer/sample/ui/RootItemAdapter.kt @@ -0,0 +1,47 @@ +package io.github.usefulness.rootbeer.sample.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.ImageView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import io.github.usefulness.rootbeer.sample.R +import io.github.usefulness.rootbeer.sample.RootItemResult +import io.github.usefulness.rootbeer.sample.databinding.ItemRootCheckBinding + +class RootItemAdapter : ListAdapter(Diff) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RootItemVH { + val inflater = LayoutInflater.from(parent.context) + return RootItemVH(ItemRootCheckBinding.inflate(inflater, parent, false)) + } + + override fun onBindViewHolder(holder: RootItemVH, position: Int) = holder.bind(getItem(position)) + + class RootItemVH(private val binding: ItemRootCheckBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: RootItemResult) { + binding.rootItemText.setText(item.text) + binding.rootItemResultIcon.update(isRooted = item.result) + } + + private fun ImageView.showPass() = setImageResource(R.drawable.ic_check_circle_green_24dp) + + private fun ImageView.showFail() = setImageResource(R.drawable.ic_error_circle_outline_red_24dp) + + private fun ImageView.update(isRooted: Boolean) { + if (isRooted) { + showFail() + } else { + showPass() + } + } + } + + object Diff : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: RootItemResult, newItem: RootItemResult) = oldItem.text == newItem.text + + override fun areContentsTheSame(oldItem: RootItemResult, newItem: RootItemResult) = oldItem == newItem + } +} diff --git a/app/src/main/res/drawable/ic_check_circle_green_24dp.xml b/app/src/main/res/drawable/ic_check_circle_green_24dp.xml index 4ca635d..dfbaa19 100644 --- a/app/src/main/res/drawable/ic_check_circle_green_24dp.xml +++ b/app/src/main/res/drawable/ic_check_circle_green_24dp.xml @@ -1,5 +1,13 @@ - - + + diff --git a/app/src/main/res/drawable/ic_error_circle_outline_red_24dp.xml b/app/src/main/res/drawable/ic_error_circle_outline_red_24dp.xml index 4b82dae..d7f4658 100644 --- a/app/src/main/res/drawable/ic_error_circle_outline_red_24dp.xml +++ b/app/src/main/res/drawable/ic_error_circle_outline_red_24dp.xml @@ -1,16 +1,20 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/ic_info_outline_white_24dp.xml b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml index af0d4d0..04eac18 100644 --- a/app/src/main/res/drawable/ic_info_outline_white_24dp.xml +++ b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml @@ -1,5 +1,13 @@ - - + + diff --git a/app/src/main/res/drawable/ic_lock_open_white_24dp.xml b/app/src/main/res/drawable/ic_lock_open_white_24dp.xml index 6c09b2a..593e277 100644 --- a/app/src/main/res/drawable/ic_lock_open_white_24dp.xml +++ b/app/src/main/res/drawable/ic_lock_open_white_24dp.xml @@ -1,5 +1,13 @@ - - + + diff --git a/app/src/main/assets/SubwayNovella.ttf b/app/src/main/res/font/subway_novella.ttf similarity index 100% rename from app/src/main/assets/SubwayNovella.ttf rename to app/src/main/res/font/subway_novella.ttf diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fbd9b04..0d3741a 100755 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,69 +1,77 @@ - - - - + android:layout_height="match_parent" + android:animateLayoutChanges="true" + android:fitsSystemWindows="true" + tools:context=".MainActivity" + > - + - + + - + - + - - + - + + + diff --git a/app/src/main/res/layout/item_root_check.xml b/app/src/main/res/layout/item_root_check.xml index 0b9fcc9..0765933 100644 --- a/app/src/main/res/layout/item_root_check.xml +++ b/app/src/main/res/layout/item_root_check.xml @@ -1,34 +1,36 @@ - - + android:padding="8dp" + > - + + diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 6ce9c2b..6ecc4df 100755 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,18 +1,22 @@ - - + + - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 036d09b..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 60c611f30023b56d4873a12fd3fb810e28b2f15e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5268 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index da7c248da32178a3b95cb37d1aabf5c488dc5c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 zcmV+g4EpnlP)K{QbW>?+q{Sy&;Q~d(L;}EqD38`!Dz2 zmqbN<$3jt27f>+xeKMJ%@vDBXF3P%StA2mp3eAoB9yuHrs-L4Aa5#n?^O%Mo&$eC* z;2O`=^-$0U`cgmtzZE^=N8Hv?M_tLccDt=lbUQ8Uk2tL@{H(3pZRr4Tjc0g=I;e{_ z%0A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 diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap/ic_launcher.xml similarity index 61% rename from app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to app/src/main/res/mipmap/ic_launcher.xml index 036d09b..60c43be 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap/ic_launcher.xml @@ -1,5 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d6f3c7e..23683a9 100755 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,19 +1,13 @@ - #5d862e - #FF5252 - #0097A7 + #5d862e + #FF5252 - #F44336 - #F44336 - #FFCDD2 - #F44336 - - #212121 - #727272 - #FFFFFF - #B6B6B6 - #814D30 + #F44336 + #F44336 + #F44336 + #B6B6B6 + #814D30 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index ac0dbe7..59a0b0c 100755 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,6 +1,3 @@ - - 16dp - 16dp - 16dp + 16dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b2857a1..d49cae3 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,9 +1,10 @@ RootBeer Sample - Settings + Run checks Get on GitHub - info + Info + More Info This is a sample app for RootBeer - a simple to use root checking Android library. Rootbeer gives an indication of root. Remember root==god, so there\'s no 100% way to check for root. ROOTED* @@ -19,5 +20,6 @@ Dangerous Props Root Native Root Cloaking Apps - Selinux Flag Enabled (experimental) + Magisk specific checks + Magisk UDS (experimental) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 491dc96..bb21bfc 100755 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,32 +1,17 @@ - - - - +