From d4991d0d9b068fa62890be9986864be91e47f2e5 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 19:36:51 +0200 Subject: [PATCH 01/37] add github-action --- .github/workflows/build_and_push_apk.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/build_and_push_apk.yml diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml new file mode 100644 index 0000000..69f46a4 --- /dev/null +++ b/.github/workflows/build_and_push_apk.yml @@ -0,0 +1,24 @@ +name: Build and Push Android-APK + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Setup JDK + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build APK + run: bash ./gradlew assembleDebug --stacktrace + - name: Upload APK + uses: actions/upload-artifact@v1 + with: + name: apk + path: app/build/outputs/apk/debug/app-debug.apk From 453b70efbf9f3c1a56038bbbddebc30b4e793a3d Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 19:39:19 +0200 Subject: [PATCH 02/37] add github-action --- .github/workflows/build_and_push_apk.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 69f46a4..a4f91ea 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -10,15 +10,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v1 + uses: actions/checkout@v4 - name: Setup JDK - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: - java-version: 1.8 + java-version: "21" - name: Build APK run: bash ./gradlew assembleDebug --stacktrace - name: Upload APK - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: apk path: app/build/outputs/apk/debug/app-debug.apk From b33f279b63003be119bb9ba7ac9aba259182fb4d Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 19:39:49 +0200 Subject: [PATCH 03/37] add github-action --- .github/workflows/build_and_push_apk.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index a4f91ea..78eaac8 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -14,6 +14,7 @@ jobs: - name: Setup JDK uses: actions/setup-java@v4 with: + distribution: 'temurin' java-version: "21" - name: Build APK run: bash ./gradlew assembleDebug --stacktrace From f7499e0a7172345c4926a7d2689a61be37c34f87 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 20:38:03 +0200 Subject: [PATCH 04/37] fix action --- .github/workflows/build_and_push_apk.yml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 78eaac8..f68c3bd 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -11,15 +11,34 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + - name: Get Version + run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV - name: Setup JDK uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: "21" - name: Build APK - run: bash ./gradlew assembleDebug --stacktrace + run: bash ./gradlew assemble --stacktrace - name: Upload APK uses: actions/upload-artifact@v4 with: name: apk path: app/build/outputs/apk/debug/app-debug.apk + - name: Create Release + id: create_release + uses: actions/create-release@v4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + release_name: Release $GITHUB_SHA_SHORT + - name: Upload Release APK + id: upload_release_asset + uses: actions/upload-release-asset@v1.0.3 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: app/build/outputs/apk/release/app-release.apk + asset_name: app-release.apk + asset_content_type: application/zip From 0791a62165a922c42f96ffa85ac38b29159ca5d9 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 20:38:51 +0200 Subject: [PATCH 05/37] fix action --- .github/workflows/build_and_push_apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index f68c3bd..8f1680a 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -27,7 +27,7 @@ jobs: path: app/build/outputs/apk/debug/app-debug.apk - name: Create Release id: create_release - uses: actions/create-release@v4 + uses: actions/create-release@v1.1.4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 09cead87bd588e0ffadecb22569269cfde73a140 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 20:39:24 +0200 Subject: [PATCH 06/37] fix action --- .github/workflows/build_and_push_apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 8f1680a..34d84d8 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -34,7 +34,7 @@ jobs: release_name: Release $GITHUB_SHA_SHORT - name: Upload Release APK id: upload_release_asset - uses: actions/upload-release-asset@v1.0.3 + uses: actions/upload-release-asset@v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 772d24dc1ceaa2c6f1953a1733fe9754a423182c Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 20:40:04 +0200 Subject: [PATCH 07/37] fix action --- .github/workflows/build_and_push_apk.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 34d84d8..a7a381f 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -20,11 +20,6 @@ jobs: java-version: "21" - name: Build APK run: bash ./gradlew assemble --stacktrace - - name: Upload APK - uses: actions/upload-artifact@v4 - with: - name: apk - path: app/build/outputs/apk/debug/app-debug.apk - name: Create Release id: create_release uses: actions/create-release@v1.1.4 From aa5e7c005a84218b3f5063f03e8df955cd9b002b Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 20:44:17 +0200 Subject: [PATCH 08/37] fix action --- .github/workflows/build_and_push_apk.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index a7a381f..c73f030 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -26,6 +26,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: + tag_name: ${{ github.ref }} release_name: Release $GITHUB_SHA_SHORT - name: Upload Release APK id: upload_release_asset From 643ed7d9f0e613514748bfd1fc4a48b8e68e3a32 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 20:47:36 +0200 Subject: [PATCH 09/37] fix action --- .github/workflows/build_and_push_apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index c73f030..7653bf5 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -26,7 +26,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: ${{ github.ref }} + tag_name: $GITHUB_SHA_SHORT release_name: Release $GITHUB_SHA_SHORT - name: Upload Release APK id: upload_release_asset From 30c1f5336a063d95e81a9107cc1781150165697b Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Fri, 17 May 2024 20:51:24 +0200 Subject: [PATCH 10/37] fix action --- .github/workflows/build_and_push_apk.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 7653bf5..7e8888d 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -26,8 +26,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: $GITHUB_SHA_SHORT - release_name: Release $GITHUB_SHA_SHORT + tag_name: ${{ env.GITHUB_SHA_SHORT }} + release_name: Release ${{ env.GITHUB_SHA_SHORT }} - name: Upload Release APK id: upload_release_asset uses: actions/upload-release-asset@v1.0.2 From c2dfe9696dc354378dc7f8adadd3d0af91375c9b Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 13:40:52 +0200 Subject: [PATCH 11/37] fix action --- .github/workflows/build_and_push_apk.yml | 51 ++++++++++++------------ 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 7e8888d..cef1fc0 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -13,28 +13,29 @@ jobs: uses: actions/checkout@v4 - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV - - name: Setup JDK - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: "21" - - name: Build APK - run: bash ./gradlew assemble --stacktrace - - name: Create Release - id: create_release - uses: actions/create-release@v1.1.4 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ env.GITHUB_SHA_SHORT }} - release_name: Release ${{ env.GITHUB_SHA_SHORT }} - - name: Upload Release APK - id: upload_release_asset - uses: actions/upload-release-asset@v1.0.2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: app/build/outputs/apk/release/app-release.apk - asset_name: app-release.apk - asset_content_type: application/zip + - run: echo ${{ env.RELEASE_NUMBER }} +# - name: Setup JDK +# uses: actions/setup-java@v4 +# with: +# distribution: 'temurin' +# java-version: "21" +# - name: Build APK +# run: bash ./gradlew assemble --stacktrace +# - name: Create Release +# id: create_release +# uses: actions/create-release@v1.1.4 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# tag_name: ${{ env.GITHUB_SHA_SHORT }} +# release_name: Release ${{ env.GITHUB_SHA_SHORT }} +# - name: Upload Release APK +# id: upload_release_asset +# uses: actions/upload-release-asset@v1.0.2 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# upload_url: ${{ steps.create_release.outputs.upload_url }} +# asset_path: app/build/outputs/apk/release/app-release.apk +# asset_name: app-release.apk +# asset_content_type: application/zip From 4cfe8d241b28f73284d066aac7443f6087cc0dd6 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 13:42:02 +0200 Subject: [PATCH 12/37] fix action --- .github/workflows/build_and_push_apk.yml | 50 ++++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index cef1fc0..0dbef47 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -14,28 +14,28 @@ jobs: - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV - run: echo ${{ env.RELEASE_NUMBER }} -# - name: Setup JDK -# uses: actions/setup-java@v4 -# with: -# distribution: 'temurin' -# java-version: "21" -# - name: Build APK -# run: bash ./gradlew assemble --stacktrace -# - name: Create Release -# id: create_release -# uses: actions/create-release@v1.1.4 -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# tag_name: ${{ env.GITHUB_SHA_SHORT }} -# release_name: Release ${{ env.GITHUB_SHA_SHORT }} -# - name: Upload Release APK -# id: upload_release_asset -# uses: actions/upload-release-asset@v1.0.2 -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# upload_url: ${{ steps.create_release.outputs.upload_url }} -# asset_path: app/build/outputs/apk/release/app-release.apk -# asset_name: app-release.apk -# asset_content_type: application/zip + - name: Setup JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: "21" + - name: Build APK + run: bash ./gradlew assemble --stacktrace + - name: Create Release + id: create_release + uses: actions/create-release@v1.1.4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.RELEASE_NUMBER }} + release_name: Release ${{ env.RELEASE_NUMBER }} + - name: Upload Release APK + id: upload_release_asset + uses: actions/upload-release-asset@v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: app/build/outputs/apk/release/app-release.apk + asset_name: app-release.apk + asset_content_type: application/zip From 922c5aca8326aea3f24da035431dcf7d17bdc8ab Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 13:46:10 +0200 Subject: [PATCH 13/37] fix action --- .github/workflows/build_and_push_apk.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 0dbef47..f06f18b 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -13,7 +13,6 @@ jobs: uses: actions/checkout@v4 - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV - - run: echo ${{ env.RELEASE_NUMBER }} - name: Setup JDK uses: actions/setup-java@v4 with: From 350c375c2e68f2e13037675cf004bd59eced4144 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 13:52:03 +0200 Subject: [PATCH 14/37] fix action --- .github/workflows/build_and_push_apk.yml | 45 +++++++++++------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index f06f18b..93a1826 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -13,28 +13,25 @@ jobs: uses: actions/checkout@v4 - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV - - name: Setup JDK - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: "21" +# - name: Create Release +# id: create_release +# uses: actions/create-release@v1.1.4 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# tag_name: ${{ env.RELEASE_NUMBER }} +# release_name: Release ${{ env.RELEASE_NUMBER }} + - name: Setup Gradle + uses: gradle/gradle-build-action@v3 - name: Build APK - run: bash ./gradlew assemble --stacktrace - - name: Create Release - id: create_release - uses: actions/create-release@v1.1.4 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ env.RELEASE_NUMBER }} - release_name: Release ${{ env.RELEASE_NUMBER }} - - name: Upload Release APK - id: upload_release_asset - uses: actions/upload-release-asset@v1.0.2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: app/build/outputs/apk/release/app-release.apk - asset_name: app-release.apk - asset_content_type: application/zip + run: ./gradlew assemble +# - name: Upload Release APK +# id: upload_release_asset +# uses: actions/upload-release-asset@v1.0.2 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# upload_url: ${{ steps.create_release.outputs.upload_url }} +# asset_path: app/build/outputs/apk/release/app-release.apk +# asset_name: app-release.apk +# asset_content_type: application/zip From 988e748b9f2eaca28dc6670e32411d6d1c7a395f Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 13:57:31 +0200 Subject: [PATCH 15/37] fix action --- .github/workflows/build_and_push_apk.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 93a1826..1fcca1a 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -23,6 +23,8 @@ jobs: # release_name: Release ${{ env.RELEASE_NUMBER }} - name: Setup Gradle uses: gradle/gradle-build-action@v3 + - name: Set Permissions + run: chmod +x ./gradlew - name: Build APK run: ./gradlew assemble # - name: Upload Release APK From 2e4912645cb2ba5e437a0621256ce2d373afc217 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:01:55 +0200 Subject: [PATCH 16/37] fix action --- .github/workflows/build_and_push_apk.yml | 40 +++++++++++------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 1fcca1a..20ef3fd 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -13,27 +13,23 @@ jobs: uses: actions/checkout@v4 - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV -# - name: Create Release -# id: create_release -# uses: actions/create-release@v1.1.4 -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# tag_name: ${{ env.RELEASE_NUMBER }} -# release_name: Release ${{ env.RELEASE_NUMBER }} - - name: Setup Gradle - uses: gradle/gradle-build-action@v3 - - name: Set Permissions - run: chmod +x ./gradlew + - name: Create Release + id: create_release + uses: actions/create-release@v1.1.4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.RELEASE_NUMBER }} + release_name: Release ${{ env.RELEASE_NUMBER }} - name: Build APK run: ./gradlew assemble -# - name: Upload Release APK -# id: upload_release_asset -# uses: actions/upload-release-asset@v1.0.2 -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# upload_url: ${{ steps.create_release.outputs.upload_url }} -# asset_path: app/build/outputs/apk/release/app-release.apk -# asset_name: app-release.apk -# asset_content_type: application/zip + - name: Upload Release APK + id: upload_release_asset + uses: actions/upload-release-asset@v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: app/build/outputs/apk/release/app-release.apk + asset_name: app-release.apk + asset_content_type: application/zip From a30dc3e165d037d8afec5d3e7cd8b7a45f4193b6 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:02:40 +0200 Subject: [PATCH 17/37] fix action --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a873e8d..7ecaf6d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 19 targetSdkVersion 34 versionCode 147 - versionName "1.2.9" + versionName "1.2.10" signingConfig signingConfigs.debug } buildTypes { From 42fe0bc8c6449830b1c7d1631d61dd6bb0766b88 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:07:47 +0200 Subject: [PATCH 18/37] fix action --- .github/workflows/build_and_push_apk.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 20ef3fd..5d6640a 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -22,6 +22,7 @@ jobs: tag_name: ${{ env.RELEASE_NUMBER }} release_name: Release ${{ env.RELEASE_NUMBER }} - name: Build APK + id: build_apk run: ./gradlew assemble - name: Upload Release APK id: upload_release_asset @@ -33,3 +34,9 @@ jobs: asset_path: app/build/outputs/apk/release/app-release.apk asset_name: app-release.apk asset_content_type: application/zip + - name: Delete Release if Build-Step failed + if: steps.build_apk.outcome != 'success' || steps.upload_release_asset.outcome != 'success' + uses: dev-drprasad/delete-tag-and-release@v1.1 + with: + tag_name: ${{ env.RELEASE_NUMBER }} + github_token: ${{ secrets.GITHUB_TOKEN }} From 914dfaa9d0edaf15fec2f82ff3e70e6a010741b1 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:08:21 +0200 Subject: [PATCH 19/37] fix action --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7ecaf6d..1c3cbbf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 19 targetSdkVersion 34 versionCode 147 - versionName "1.2.10" + versionName "1.2.11" signingConfig signingConfigs.debug } buildTypes { From 716c950b6c654d37628535179cd36c8f26778b93 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:09:28 +0200 Subject: [PATCH 20/37] fix action --- .github/workflows/build_and_push_apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 5d6640a..9d63d1f 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -35,7 +35,7 @@ jobs: asset_name: app-release.apk asset_content_type: application/zip - name: Delete Release if Build-Step failed - if: steps.build_apk.outcome != 'success' || steps.upload_release_asset.outcome != 'success' + if: steps.build_apk.outputs.status == 'failure' || steps.upload_release_asset.outputs.status == 'failure' uses: dev-drprasad/delete-tag-and-release@v1.1 with: tag_name: ${{ env.RELEASE_NUMBER }} From 112c643a8b599af2fbe00e5880fc1bbca0c59882 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:10:43 +0200 Subject: [PATCH 21/37] fix action --- .github/workflows/build_and_push_apk.yml | 14 ++++---------- app/build.gradle | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 9d63d1f..d842b47 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -13,6 +13,9 @@ jobs: uses: actions/checkout@v4 - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV + - name: Build APK + id: build_apk + run: ./gradlew assemble - name: Create Release id: create_release uses: actions/create-release@v1.1.4 @@ -21,9 +24,6 @@ jobs: with: tag_name: ${{ env.RELEASE_NUMBER }} release_name: Release ${{ env.RELEASE_NUMBER }} - - name: Build APK - id: build_apk - run: ./gradlew assemble - name: Upload Release APK id: upload_release_asset uses: actions/upload-release-asset@v1.0.2 @@ -33,10 +33,4 @@ jobs: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: app/build/outputs/apk/release/app-release.apk asset_name: app-release.apk - asset_content_type: application/zip - - name: Delete Release if Build-Step failed - if: steps.build_apk.outputs.status == 'failure' || steps.upload_release_asset.outputs.status == 'failure' - uses: dev-drprasad/delete-tag-and-release@v1.1 - with: - tag_name: ${{ env.RELEASE_NUMBER }} - github_token: ${{ secrets.GITHUB_TOKEN }} + asset_content_type: application/zip \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1c3cbbf..2db2370 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 19 targetSdkVersion 34 versionCode 147 - versionName "1.2.11" + versionName "1.2.12" signingConfig signingConfigs.debug } buildTypes { From 7ee8e7dbfc887aa574c9597d80ed725dce31db2c Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:11:51 +0200 Subject: [PATCH 22/37] fix action --- .github/workflows/build_and_push_apk.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index d842b47..5e3f637 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -13,8 +13,9 @@ jobs: uses: actions/checkout@v4 - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV + - name: Change Permissions + run: chmod +x ./gradlew - name: Build APK - id: build_apk run: ./gradlew assemble - name: Create Release id: create_release From 218fe52443dafcf410d76b1fc35c5461e26195b9 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:13:40 +0200 Subject: [PATCH 23/37] fix action --- .github/workflows/build_and_push_apk.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 5e3f637..31be814 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -11,8 +11,14 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV + - name: Setup JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: "21" - name: Change Permissions run: chmod +x ./gradlew - name: Build APK From 7d53fdb80871a7ead19d82dcde2a44396805cd9c Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:20:46 +0200 Subject: [PATCH 24/37] fix action --- .github/workflows/build_and_push_apk.yml | 2 -- app/build.gradle | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 31be814..53daf69 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -11,7 +11,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Get Version run: echo "RELEASE_NUMBER=$(cat app/build.gradle | grep versionName | grep -o -P '".*"' | tr -d '"')" >> $GITHUB_ENV - name: Setup JDK @@ -32,7 +31,6 @@ jobs: tag_name: ${{ env.RELEASE_NUMBER }} release_name: Release ${{ env.RELEASE_NUMBER }} - name: Upload Release APK - id: upload_release_asset uses: actions/upload-release-asset@v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/app/build.gradle b/app/build.gradle index 2db2370..c192683 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 19 targetSdkVersion 34 versionCode 147 - versionName "1.2.12" + versionName "1.2.13" signingConfig signingConfigs.debug } buildTypes { From 1bb8030de4a491bbe5d3fefcf6cee7312611b870 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Sat, 18 May 2024 14:34:34 +0200 Subject: [PATCH 25/37] fix action --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c192683..a873e8d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { minSdkVersion 19 targetSdkVersion 34 versionCode 147 - versionName "1.2.13" + versionName "1.2.9" signingConfig signingConfigs.debug } buildTypes { From ce6f90a9862b5e2e5ad727403fc4fa4bf2bc7176 Mon Sep 17 00:00:00 2001 From: itstimetoforget Date: Tue, 28 May 2024 19:28:52 +0200 Subject: [PATCH 26/37] fix action --- .github/workflows/build_and_push_apk.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_and_push_apk.yml b/.github/workflows/build_and_push_apk.yml index 53daf69..6c787f9 100644 --- a/.github/workflows/build_and_push_apk.yml +++ b/.github/workflows/build_and_push_apk.yml @@ -2,9 +2,8 @@ name: Build and Push Android-APK on: push: - branches: - - master - + tags: + - '*' jobs: build: runs-on: ubuntu-latest From 3d27f44f13dc36374206b482244fd1a43201d5c9 Mon Sep 17 00:00:00 2001 From: zusel Date: Sun, 26 Nov 2023 11:07:30 +0100 Subject: [PATCH 27/37] cleanup code and add already read feature --- .../java/de/eknoes/inofficialgolem/Article.kt | 4 +- .../inofficialgolem/ArticleFragment.java | 48 ++---- .../inofficialgolem/ArticleListFragment.java | 81 ++++------ .../inofficialgolem/FeedReaderContract.java | 1 + .../inofficialgolem/FeedReaderDbHelper.java | 31 ++-- .../inofficialgolem/entities/DBColumns.java | 57 +++++++ .../entities/QueryRequest.java | 148 ++++++++++++++++++ .../inofficialgolem/updater/GolemFetcher.java | 68 ++++---- .../inofficialgolem/updater/GolemItem.java | 2 +- .../inofficialgolem/utils/DBHelper.java | 143 +++++++++++++++++ 10 files changed, 443 insertions(+), 140 deletions(-) create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/entities/DBColumns.java create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/entities/QueryRequest.java create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java diff --git a/app/src/main/java/de/eknoes/inofficialgolem/Article.kt b/app/src/main/java/de/eknoes/inofficialgolem/Article.kt index b483bd5..e3d100f 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/Article.kt +++ b/app/src/main/java/de/eknoes/inofficialgolem/Article.kt @@ -1,7 +1,8 @@ package de.eknoes.inofficialgolem import de.eknoes.inofficialgolem.updater.GolemItem -import java.util.* +import java.util.Date +import java.util.Locale /** * Created by soenke on 10.04.16. @@ -19,6 +20,7 @@ internal class Article : GolemItem() { var imgUrl: String? = null var commentUrl: String? = null var commentNr: String? = null + var alreadyRead: Boolean? = false fun getDate(): Date { return date diff --git a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java index b389e97..f9f8963 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java @@ -6,8 +6,6 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.net.ConnectivityManager; import android.net.NetworkInfo; @@ -31,6 +29,10 @@ import org.jetbrains.annotations.NotNull; +import de.eknoes.inofficialgolem.entities.DBColumns; +import de.eknoes.inofficialgolem.entities.QueryRequest; +import de.eknoes.inofficialgolem.utils.DBHelper; + public class ArticleFragment extends Fragment { static final String ARTICLE_URL = "de.eknoes.inofficialgolem.ARTICLE_URL"; static final String FORCE_WEBVIEW = "de.eknoes.inofficialgolem.FORCE_WEBVIEW"; @@ -264,43 +266,12 @@ private class loadArticleTask extends AsyncTask { @Override protected Void doInBackground(Void... params) { - FeedReaderDbHelper dbHelper = FeedReaderDbHelper.getInstance(requireContext().getApplicationContext()); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - if (url != null) { - String[] columns = { - FeedReaderContract.Article.COLUMN_NAME_ID, - FeedReaderContract.Article.COLUMN_NAME_TITLE, - FeedReaderContract.Article.COLUMN_NAME_SUBHEADING, - FeedReaderContract.Article.COLUMN_NAME_URL, - FeedReaderContract.Article.COLUMN_NAME_COMMENTNR, - FeedReaderContract.Article.COLUMN_NAME_COMMENTURL, - FeedReaderContract.Article.COLUMN_NAME_OFFLINE, - FeedReaderContract.Article.COLUMN_NAME_FULLTEXT, - }; - Cursor cursor = db.query( - FeedReaderContract.Article.TABLE_NAME, - columns, - "url=\"" + url + "\"", - null, - null, - null, - null); - if (cursor.moveToFirst()) { - article = new Article(); - article.setId(cursor.getInt(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_ID))); - article.setTitle(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_TITLE))); - article.setSubheadline(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_SUBHEADING))); - article.setUrl(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_URL))); - article.setCommentUrl(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_COMMENTURL))); - article.setCommentNr(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_COMMENTNR))); - article.setOffline(cursor.getInt(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_OFFLINE)) == 1); - article.setFulltext(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_FULLTEXT))); - } - - - cursor.close(); + QueryRequest queryRequest = new QueryRequest.QueryRequestBuilder() + .withTableName(DBColumns.getTableName()) + .withSelection("url=\"" + url + "\"") + .build(); + article = DBHelper.getArticle(queryRequest); } return null; } @@ -320,6 +291,7 @@ protected void onPostExecute(Void vVoid) { networkInfo = connMgr.getActiveNetworkInfo(); } if (networkInfo != null && networkInfo.isConnected()) { + DBHelper.updateArticleReadState(article); webView.loadUrl(url); } else { webView.loadData(getResources().getString(R.string.err_no_network), "text/html; charset=utf-8", "UTF-8"); diff --git a/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java b/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java index 4e8b7ce..04838ee 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java @@ -2,10 +2,10 @@ import android.animation.ValueAnimator; import android.content.Context; -import android.database.Cursor; +import android.content.res.Configuration; import android.database.DataSetObserver; -import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; +import android.graphics.Color; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; @@ -35,9 +35,13 @@ import java.text.DateFormat; import java.util.Date; +import java.util.List; import java.util.concurrent.Callable; +import de.eknoes.inofficialgolem.entities.DBColumns; +import de.eknoes.inofficialgolem.entities.QueryRequest; import de.eknoes.inofficialgolem.updater.GolemFetcher; +import de.eknoes.inofficialgolem.utils.DBHelper; import de.eknoes.inofficialgolem.utils.NetworkUtils; /** @@ -152,17 +156,14 @@ public interface OnArticleSelectedListener { private class ArticleAdapter extends BaseAdapter { private final LayoutInflater inflater; - private final SQLiteDatabase db; private final ImageLoader imgLoader; private final Context context; - private Cursor cursor; + private List
articles; ArticleAdapter() { super(); context = requireContext().getApplicationContext(); inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - FeedReaderDbHelper dbHelper = FeedReaderDbHelper.getInstance(context); - db = dbHelper.getReadableDatabase(); loadData(); this.registerDataSetObserver(new DataSetObserver() { @Override @@ -188,62 +189,29 @@ public void putBitmap(String url, Bitmap bitmap) { } private void loadData() { - String[] columns = { - FeedReaderContract.Article.COLUMN_NAME_ID, - FeedReaderContract.Article.COLUMN_NAME_TITLE, - FeedReaderContract.Article.COLUMN_NAME_SUBHEADING, - FeedReaderContract.Article.COLUMN_NAME_TEASER, - FeedReaderContract.Article.COLUMN_NAME_DATE, - FeedReaderContract.Article.COLUMN_NAME_IMG, - FeedReaderContract.Article.COLUMN_NAME_URL, - FeedReaderContract.Article.COLUMN_NAME_COMMENTURL, - FeedReaderContract.Article.COLUMN_NAME_COMMENTNR, - FeedReaderContract.Article.COLUMN_NAME_OFFLINE, - FeedReaderContract.Article.COLUMN_NAME_FULLTEXT - }; - - String sort = FeedReaderContract.Article.COLUMN_NAME_DATE + " DESC"; - String limit = "0, " + PreferenceManager.getDefaultSharedPreferences(context).getInt("article_limit", 200); - - - cursor = db.query( - FeedReaderContract.Article.TABLE_NAME, - columns, - null, - null, - null, - null, - sort, - limit); + QueryRequest queryRequest = new QueryRequest.QueryRequestBuilder() + .withSort(DBColumns.COLUMN_NAME_DATE + " DESC") + .withLimit("0, " + PreferenceManager.getDefaultSharedPreferences(context).getInt("article_limit", 200)) + .withTableName(DBColumns.getTableName()) + .build(); + + articles = DBHelper.getArticles(queryRequest); + } @Override public int getCount() { - return cursor.getCount(); + return articles.size(); } @Override public Article getItem(int position) { - cursor.moveToPosition(position); - Article a = new Article(); - a.setId(cursor.getInt(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_ID))); - a.setTitle(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_TITLE))); - a.setSubheadline(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_SUBHEADING))); - a.setTeaser(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_TEASER))); - a.setDate(cursor.getLong(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_DATE))); - a.setImgUrl(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_IMG))); - a.setCommentUrl(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_COMMENTURL))); - a.setCommentNr(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_COMMENTNR))); - a.setUrl(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_URL))); - a.setOffline(cursor.getInt(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_OFFLINE)) == 1); - a.setFulltext(cursor.getString(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_FULLTEXT))); - return a; + return articles.get(position); } @Override public long getItemId(int position) { - cursor.moveToPosition(position); - return cursor.getLong(cursor.getColumnIndexOrThrow(FeedReaderContract.Article.COLUMN_NAME_ID)); + return articles.get(position).getId(); } @Override @@ -267,6 +235,19 @@ public View getView(int position, View convertView, ViewGroup parent) { subheading.setText(art.getSubheadline()); teaser.setText(art.getTeaser()); info.setText(infoText); + if (art.getAlreadyRead().equals(true)) { + int nightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + switch (nightMode) { + case Configuration.UI_MODE_NIGHT_YES: + view.setBackgroundColor(Color.LTGRAY); + break; + case Configuration.UI_MODE_NIGHT_NO: + view.setBackgroundColor(Color.LTGRAY); + break; + default: + break; + } + } image.setImageUrl(art.getImgUrl(), imgLoader); return view; diff --git a/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderContract.java b/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderContract.java index b753802..cb0a698 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderContract.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderContract.java @@ -20,6 +20,7 @@ public static abstract class Article implements BaseColumns { public static final String COLUMN_NAME_DATE = "date"; public static final String COLUMN_NAME_FULLTEXT = "fulltext"; public static final String COLUMN_NAME_OFFLINE = "offline_available"; + public static final String COLUMN_NAME_ALREADY_READ = "already_read"; } } diff --git a/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderDbHelper.java b/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderDbHelper.java index ba3bae5..9e42c3b 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderDbHelper.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/FeedReaderDbHelper.java @@ -5,26 +5,29 @@ import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; +import de.eknoes.inofficialgolem.entities.DBColumns; + public class FeedReaderDbHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 15; private static final String DATABASE_NAME = "FeedReader.db"; private static final String TAG = "FeedReaderDbHelper"; private static final String SQL_CREATE_ENTRIES = - "CREATE TABLE " + FeedReaderContract.Article.TABLE_NAME + " (" + - FeedReaderContract.Article._ID + " INTEGER PRIMARY KEY," + - FeedReaderContract.Article.COLUMN_NAME_TITLE + " TEXT, " + - FeedReaderContract.Article.COLUMN_NAME_SUBHEADING + " TEXT, " + - FeedReaderContract.Article.COLUMN_NAME_TEASER + " TEXT, " + - FeedReaderContract.Article.COLUMN_NAME_URL + " TEXT, " + - FeedReaderContract.Article.COLUMN_NAME_COMMENTURL + " TEXT, " + - FeedReaderContract.Article.COLUMN_NAME_COMMENTNR + " TEXT, " + - FeedReaderContract.Article.COLUMN_NAME_IMG + " TEXT, " + - FeedReaderContract.Article.COLUMN_NAME_DATE + " INTEGER," + - FeedReaderContract.Article.COLUMN_NAME_FULLTEXT + " TEXT," + - //FeedReaderContract.Article.COLUMN_NAME_AUTHORS + " TEXT," + - FeedReaderContract.Article.COLUMN_NAME_OFFLINE + " INTEGER" + + "CREATE TABLE " + DBColumns.getTableName() + " (" + + DBColumns.COLUMN_NAME_ID.getColumnName() + " INTEGER PRIMARY KEY," + + DBColumns.COLUMN_NAME_TITLE.getColumnName() + " TEXT, " + + DBColumns.COLUMN_NAME_SUBHEADING.getColumnName() + " TEXT, " + + DBColumns.COLUMN_NAME_TEASER.getColumnName() + " TEXT, " + + DBColumns.COLUMN_NAME_URL.getColumnName() + " TEXT, " + + DBColumns.COLUMN_NAME_COMMENTURL.getColumnName() + " TEXT, " + + DBColumns.COLUMN_NAME_COMMENTNR.getColumnName() + " TEXT, " + + DBColumns.COLUMN_NAME_IMG.getColumnName() + " TEXT, " + + DBColumns.COLUMN_NAME_DATE.getColumnName() + " INTEGER," + + DBColumns.COLUMN_NAME_FULLTEXT.getColumnName() + " TEXT," + + //DBColumns.COLUMN_NAME_AUTHORS + " TEXT," + + DBColumns.COLUMN_NAME_OFFLINE.getColumnName() + " INTEGER," + + DBColumns.COLUMN_NAME_ALREADY_READ.getColumnName() + " INTEGER DEFAULT FALSE" + ")"; - private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + FeedReaderContract.Article.TABLE_NAME; + private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + DBColumns.getTableName(); private static FeedReaderDbHelper self; diff --git a/app/src/main/java/de/eknoes/inofficialgolem/entities/DBColumns.java b/app/src/main/java/de/eknoes/inofficialgolem/entities/DBColumns.java new file mode 100644 index 0000000..f7d7546 --- /dev/null +++ b/app/src/main/java/de/eknoes/inofficialgolem/entities/DBColumns.java @@ -0,0 +1,57 @@ +package de.eknoes.inofficialgolem.entities; + +import java.util.ArrayList; +import java.util.List; + +public enum DBColumns { + COLUMN_NAME_ID("_ID", Integer.class), + COLUMN_NAME_TITLE("title", String.class), + COLUMN_NAME_SUBHEADING("subheading", String.class), + COLUMN_NAME_TEASER("teaser", String.class), + COLUMN_NAME_URL("url", String.class), + COLUMN_NAME_COMMENTURL("commenturl", String.class), + COLUMN_NAME_COMMENTNR("commentnr", String.class), + COLUMN_NAME_IMG("img", String.class), + COLUMN_NAME_DATE("date", Long.class), + COLUMN_NAME_FULLTEXT("fulltext", String.class), + COLUMN_NAME_OFFLINE("offline_available", Boolean.class), + COLUMN_NAME_ALREADY_READ("already_read", Boolean.class);; + + + private Class clazz; + private String name; + + DBColumns(String columnName, Class clazz) { + this.name = columnName; + this.clazz = clazz; + } + + public static String getTableName() { + return "articles"; + } + + public static String[] getColumnNames() { + List names = new ArrayList<>(); + for (DBColumns dbColumn : DBColumns.values()) { + names.add(dbColumn.getColumnName()); + } + String[] arr = names.toArray(new String[0]); + return arr; + } + + public Class getClazz() { + return clazz; + } + + public void setClazz(Class clazz) { + this.clazz = clazz; + } + + public String getColumnName() { + return name; + } + + public void setColumnName(String columnName) { + this.name = columnName; + } +} diff --git a/app/src/main/java/de/eknoes/inofficialgolem/entities/QueryRequest.java b/app/src/main/java/de/eknoes/inofficialgolem/entities/QueryRequest.java new file mode 100644 index 0000000..bc40017 --- /dev/null +++ b/app/src/main/java/de/eknoes/inofficialgolem/entities/QueryRequest.java @@ -0,0 +1,148 @@ +package de.eknoes.inofficialgolem.entities; + +public class QueryRequest { + String tableName, selection, groupBy, having, orderBy, limit, sort; + String[] selectionArgs; + + public QueryRequest(String tableName, String selection, String groupBy, String having, String orderBy, String[] selectionArgs, String limit, String sort) { + this.tableName = tableName; + this.selection = selection; + this.groupBy = groupBy; + this.having = having; + this.orderBy = orderBy; + this.selectionArgs = selectionArgs; + this.sort = sort; + this.limit = limit; + } + + public QueryRequest() { + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getSelection() { + return selection; + } + + public void setSelection(String selection) { + this.selection = selection; + } + + public String getGroupBy() { + return groupBy; + } + + public void setGroupBy(String groupBy) { + this.groupBy = groupBy; + } + + public String getHaving() { + return having; + } + + public void setHaving(String having) { + this.having = having; + } + + public String getOrderBy() { + return orderBy; + } + + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + + public String[] getSelectionArgs() { + return selectionArgs; + } + + public void setSelectionArgs(String[] selectionArgs) { + this.selectionArgs = selectionArgs; + } + + public String getLimit() { + return limit; + } + + public void setLimit(String limit) { + this.limit = limit; + } + + public String getSort() { + return sort; + } + + public void setSort(String sort) { + this.sort = sort; + } + + public static class QueryRequestBuilder { + String tableName, selection, groupBy, having, orderBy, limit, sort; + String[] selectionArgs; + int count; + + public QueryRequestBuilder() { + } + + public QueryRequestBuilder withTableName(String tableName) { + this.tableName = tableName; + return this; + } + + public QueryRequestBuilder withSelection(String selection) { + this.selection = selection; + return this; + } + + public QueryRequestBuilder withGroupBy(String groupBy) { + this.groupBy = groupBy; + return this; + } + + public QueryRequestBuilder withHaving(String having) { + this.having = having; + return this; + } + + public QueryRequestBuilder withOrderBy(String orderBy) { + this.orderBy = orderBy; + return this; + } + + public QueryRequestBuilder withSelectionArgs(String[] selectionArgs) { + this.selectionArgs = selectionArgs; + return this; + } + + public QueryRequestBuilder withLimit(String limit) { + this.limit = limit; + return this; + } + + public QueryRequestBuilder withSort(String sort) { + this.sort = sort; + return this; + } + + public QueryRequest build() { + QueryRequest queryRequest = new QueryRequest(); + queryRequest.tableName = this.tableName; + queryRequest.selection = this.selection; + queryRequest.groupBy = this.groupBy; + queryRequest.having = this.having; + queryRequest.orderBy = this.orderBy; + queryRequest.selectionArgs = this.selectionArgs; + queryRequest.limit = this.limit; + queryRequest.sort = this.sort; + return queryRequest; + } + + + } +} diff --git a/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java b/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java index 3cf9d72..a046741 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java @@ -2,7 +2,6 @@ import android.content.ContentValues; import android.content.Context; -import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.net.ConnectivityManager; @@ -11,18 +10,23 @@ import android.preference.PreferenceManager; import android.util.Log; import android.widget.Toast; + import com.android.volley.AuthFailureError; import com.android.volley.NoConnectionError; import com.android.volley.TimeoutError; -import de.eknoes.inofficialgolem.FeedReaderContract; -import de.eknoes.inofficialgolem.FeedReaderDbHelper; -import de.eknoes.inofficialgolem.R; import java.lang.ref.WeakReference; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; +import de.eknoes.inofficialgolem.Article; +import de.eknoes.inofficialgolem.FeedReaderDbHelper; +import de.eknoes.inofficialgolem.R; +import de.eknoes.inofficialgolem.entities.DBColumns; +import de.eknoes.inofficialgolem.entities.QueryRequest; +import de.eknoes.inofficialgolem.utils.DBHelper; + /** * Created by soenke on 27.08.16. */ @@ -156,68 +160,60 @@ private void writeArticles(List articles, boolean insertNew) { item.setUrl(item.getUrl().substring(0, (item.getUrl().length() - "-rss.html".length())) + ".html"); } - String[] cols = {FeedReaderContract.Article.COLUMN_NAME_ID}; - Cursor cursor = db.query( - FeedReaderContract.Article.TABLE_NAME, - cols, - "url='" + item.getUrl() + "'", - null, - null, - null, - null); - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - id = cursor.getInt(cursor.getColumnIndex(FeedReaderContract.Article.COLUMN_NAME_ID)); - } - - cursor.close(); - - - ContentValues values = new ContentValues(); - values.put(FeedReaderContract.Article.COLUMN_NAME_URL, item.getUrl()); + values.put(DBColumns.COLUMN_NAME_URL.getColumnName(), item.getUrl()); if (item.hasProp(GolemItem.ItemProperties.TITLE)) { String[] titles = item.getProp(GolemItem.ItemProperties.TITLE).split(":"); if (titles.length != 2) { - values.put(FeedReaderContract.Article.COLUMN_NAME_TITLE, item.getProp(GolemItem.ItemProperties.TITLE)); + values.put(DBColumns.COLUMN_NAME_TITLE.getColumnName(), item.getProp(GolemItem.ItemProperties.TITLE)); } else { - values.put(FeedReaderContract.Article.COLUMN_NAME_TITLE, titles[1].trim()); - values.put(FeedReaderContract.Article.COLUMN_NAME_SUBHEADING, titles[0].trim()); + values.put(DBColumns.COLUMN_NAME_TITLE.getColumnName(), titles[1].trim()); + values.put(DBColumns.COLUMN_NAME_SUBHEADING.getColumnName(), titles[0].trim()); } } if (item.hasProp(GolemItem.ItemProperties.TEASER)) { - values.put(FeedReaderContract.Article.COLUMN_NAME_TEASER, item.getProp(GolemItem.ItemProperties.TEASER)); + values.put(DBColumns.COLUMN_NAME_TEASER.getColumnName(), item.getProp(GolemItem.ItemProperties.TEASER)); } if (item.hasProp(GolemItem.ItemProperties.DATE)) { - values.put(FeedReaderContract.Article.COLUMN_NAME_DATE, item.getProp(GolemItem.ItemProperties.DATE)); + values.put(DBColumns.COLUMN_NAME_DATE.getColumnName(), item.getProp(GolemItem.ItemProperties.DATE)); } if (item.hasProp(GolemItem.ItemProperties.FULLTEXT)) { - values.put(FeedReaderContract.Article.COLUMN_NAME_FULLTEXT, item.getProp(GolemItem.ItemProperties.FULLTEXT)); - values.put(FeedReaderContract.Article.COLUMN_NAME_OFFLINE, item.getProp(GolemItem.ItemProperties.OFFLINE_AVAILABLE)); + values.put(DBColumns.COLUMN_NAME_FULLTEXT.getColumnName(), item.getProp(GolemItem.ItemProperties.FULLTEXT)); + values.put(DBColumns.COLUMN_NAME_OFFLINE.getColumnName(), item.getProp(GolemItem.ItemProperties.OFFLINE_AVAILABLE)); } if (item.hasProp(GolemItem.ItemProperties.OFFLINE_AVAILABLE)) { - values.put(FeedReaderContract.Article.COLUMN_NAME_OFFLINE, Boolean.valueOf(item.getProp(GolemItem.ItemProperties.OFFLINE_AVAILABLE))); + values.put(DBColumns.COLUMN_NAME_OFFLINE.getColumnName(), Boolean.valueOf(item.getProp(GolemItem.ItemProperties.OFFLINE_AVAILABLE))); } if (item.hasProp(GolemItem.ItemProperties.IMG_URL)) { - values.put(FeedReaderContract.Article.COLUMN_NAME_IMG, item.getProp(GolemItem.ItemProperties.IMG_URL)); + values.put(DBColumns.COLUMN_NAME_IMG.getColumnName(), item.getProp(GolemItem.ItemProperties.IMG_URL)); } if (item.hasProp(GolemItem.ItemProperties.COMMENT_URL)) { - values.put(FeedReaderContract.Article.COLUMN_NAME_COMMENTURL, item.getProp(GolemItem.ItemProperties.COMMENT_URL)); + values.put(DBColumns.COLUMN_NAME_COMMENTURL.getColumnName(), item.getProp(GolemItem.ItemProperties.COMMENT_URL)); } - if (id != 0) { + if (item.hasProp(GolemItem.ItemProperties.ALREADY_READ)) { + values.put(DBColumns.COLUMN_NAME_ALREADY_READ.getColumnName(), item.getProp(GolemItem.ItemProperties.ALREADY_READ)); + } + + QueryRequest queryRequest = new QueryRequest.QueryRequestBuilder() + .withTableName(DBColumns.getTableName()) + .withSelection("url='" + item.getUrl() + "'") + .build(); + Article article = DBHelper.getArticle(queryRequest); + + if (article != null) { Log.d(TAG, "doInBackground: Updating article with id " + id + ": Date " + item.getProp(GolemItem.ItemProperties.DATE)); - db.update(FeedReaderContract.Article.TABLE_NAME, values, FeedReaderContract.Article._ID + "='" + id + "'", null); + db.update(DBColumns.getTableName(), values, DBColumns.COLUMN_NAME_ID.getColumnName() + "='" + id + "'", null); } else if (insertNew) { Log.d(TAG, "doInBackground: Creating new article with Title " + item.getProp(GolemItem.ItemProperties.TITLE)); - db.insert(FeedReaderContract.Article.TABLE_NAME, null, values); + db.insert(DBColumns.getTableName(), null, values); } } } diff --git a/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemItem.java b/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemItem.java index a4f3571..b3df0a1 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemItem.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemItem.java @@ -43,5 +43,5 @@ public void setUrl(String url) { this.url = url; } - public enum ItemProperties {TITLE, TEASER, IMG_URL, COMMENT_URL, COMMENT_NR, DATE, FULLTEXT, OFFLINE_AVAILABLE, HAS_MEDIA_FULLTEXT} + public enum ItemProperties {TITLE, TEASER, IMG_URL, COMMENT_URL, COMMENT_NR, DATE, FULLTEXT, OFFLINE_AVAILABLE, HAS_MEDIA_FULLTEXT, ALREADY_READ} } diff --git a/app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java b/app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java new file mode 100644 index 0000000..bd5a9a5 --- /dev/null +++ b/app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java @@ -0,0 +1,143 @@ +package de.eknoes.inofficialgolem.utils; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +import de.eknoes.inofficialgolem.Article; +import de.eknoes.inofficialgolem.FeedReaderDbHelper; +import de.eknoes.inofficialgolem.MainApplication; +import de.eknoes.inofficialgolem.entities.DBColumns; +import de.eknoes.inofficialgolem.entities.QueryRequest; + +public class DBHelper { + private final static String TAG = "DBHelper"; + + public static SQLiteDatabase getSQLiteDatabase() { + FeedReaderDbHelper dbHelper = FeedReaderDbHelper.getInstance(MainApplication.getAppContext()); + SQLiteDatabase db = dbHelper.getReadableDatabase(); + return db; + } + + public static Article getArticle(QueryRequest queryRequest) { + try (Cursor cursor = getCursor(queryRequest)) { + if (cursor.moveToFirst()) { + return getArticleFromCursor(cursor); + } + cursor.close(); + return null; + } + } + + public static void updateArticleReadState(Article article) { + SQLiteDatabase sqLiteDatabase = getSQLiteDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(DBColumns.COLUMN_NAME_ALREADY_READ.getColumnName(), true); + sqLiteDatabase.update(DBColumns.getTableName(), contentValues, DBColumns.COLUMN_NAME_ID.getColumnName() + "=" + article.getId(), null); + } + + private static Cursor getCursor(QueryRequest queryRequest) { + SQLiteDatabase database = getSQLiteDatabase(); + Cursor cursor = database.query(DBColumns.getTableName(), + DBColumns.getColumnNames(), queryRequest.getSelection(), + queryRequest.getSelectionArgs(), queryRequest.getGroupBy(), + queryRequest.getHaving(), queryRequest.getOrderBy()); + return cursor; + } + + public static List
getArticles(QueryRequest queryRequest) { + List
articles = new ArrayList<>(); + try (Cursor cursor = getCursor(queryRequest)) { + if (cursor.moveToFirst()) { + articles.add(getArticleFromCursor(cursor)); + while (cursor.moveToNext()) { + articles.add(getArticleFromCursor(cursor)); + } + } + return articles; + } + } + + public static Article getArticleFromCursor(Cursor cursor) { + try { + Article a = new Article(); + Object value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_ID); + if (value != null) { + a.setId((Integer) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_TITLE); + if (value != null) { + a.setTitle((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_SUBHEADING); + if (value != null) { + a.setSubheadline((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_TEASER); + if (value != null) { + a.setTeaser((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_DATE); + if (value != null) { + a.setDate((Long) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_IMG); + if (value != null) { + a.setImgUrl((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_COMMENTURL); + if (value != null) { + a.setCommentUrl((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_COMMENTNR); + if (value != null) { + a.setCommentNr((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_URL); + if (value != null) { + a.setUrl((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_OFFLINE); + if (value != null) { + a.setOffline((Boolean) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_FULLTEXT); + if (value != null) { + a.setFulltext((String) value); + } + value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_ALREADY_READ); + if (value != null) { + a.setAlreadyRead((Boolean) value); + } + return a; + } catch (NullPointerException e) { + Log.e(TAG, "Error while getting article from local DB"); + } + return null; + } + + private static Object getValueFromCursor(Cursor cursor, DBColumns name) { + int index = cursor.getColumnIndex(name.getColumnName()); + if (index == -1) { + return null; + } else { + if (name.getClazz().equals(Long.class)) { + return cursor.getLong(index); + } else if (name.getClazz().equals(String.class)) { + return cursor.getString(index); + } else if (name.getClazz().equals(Integer.class)) { + return cursor.getInt(index); + } else if (name.getClazz().equals(Boolean.class)) { + return cursor.getInt(index) == 1; + } else { + return null; + } + } + } + + +} From 7968b2fc7e34ec494d9bb9d0aab087e63bcb7bb3 Mon Sep 17 00:00:00 2001 From: zusel Date: Sun, 26 Nov 2023 11:08:09 +0100 Subject: [PATCH 28/37] add application to Manifest --- app/src/main/AndroidManifest.xml | 29 ++++++++++--------- .../inofficialgolem/MainApplication.java | 17 +++++++++++ 2 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/MainApplication.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9a0287f..274298d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,23 +19,24 @@ + android:name="de.eknoes.inofficialgolem.MainApplication" + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:logo="@drawable/golem_eye" + android:resizeableActivity="true" + android:supportsRtl="true" + android:theme="@style/AppTheme" + tools:targetApi="n"> + android:name="org.apache.http.legacy" + android:required="false" /> + android:name=".ArticleView" + android:configChanges="orientation|screenSize" + android:exported="true" + android:parentActivityName=".MainActivity"> diff --git a/app/src/main/java/de/eknoes/inofficialgolem/MainApplication.java b/app/src/main/java/de/eknoes/inofficialgolem/MainApplication.java new file mode 100644 index 0000000..feb8296 --- /dev/null +++ b/app/src/main/java/de/eknoes/inofficialgolem/MainApplication.java @@ -0,0 +1,17 @@ +package de.eknoes.inofficialgolem; + +import android.app.Application; +import android.content.Context; + +public class MainApplication extends Application { + private static Context context; + + public static Context getAppContext() { + return MainApplication.context; + } + + public void onCreate() { + super.onCreate(); + MainApplication.context = getApplicationContext(); + } +} From 9ea778e39d012d53bd79e511a8a378b4eb913197 Mon Sep 17 00:00:00 2001 From: zusel Date: Sun, 26 Nov 2023 11:10:00 +0100 Subject: [PATCH 29/37] add application to Manifest --- app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java index f9f8963..0e237b2 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java @@ -297,6 +297,7 @@ protected void onPostExecute(Void vVoid) { webView.loadData(getResources().getString(R.string.err_no_network), "text/html; charset=utf-8", "UTF-8"); } } else { + DBHelper.updateArticleReadState(article); webView.loadUrl(url); } } else { From 7bcbc8bbdd5e67ddadeaf220aa5a63630e94faca Mon Sep 17 00:00:00 2001 From: zusel Date: Wed, 29 Nov 2023 21:21:38 +0100 Subject: [PATCH 30/37] change text-color if the article was already read --- .../inofficialgolem/ArticleListFragment.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java b/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java index 04838ee..7a3d2ad 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java @@ -24,6 +24,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.fragment.app.Fragment; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -214,6 +215,7 @@ public long getItemId(int position) { return articles.get(position).getId(); } + @RequiresApi(api = Build.VERSION_CODES.O) @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; @@ -222,6 +224,7 @@ public View getView(int position, View convertView, ViewGroup parent) { view = inflater.inflate(R.layout.list_article, parent, false); } + Article art = getItem(position); String infoText = String.format(context.getResources().getString(R.string.article_published), DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT).format(art.getDate())); @@ -237,12 +240,19 @@ public View getView(int position, View convertView, ViewGroup parent) { info.setText(infoText); if (art.getAlreadyRead().equals(true)) { int nightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + // Danke an Alma für die Idee mit dem Text switch (nightMode) { case Configuration.UI_MODE_NIGHT_YES: - view.setBackgroundColor(Color.LTGRAY); + title.setTextColor(Color.parseColor("#424040")); + subheading.setTextColor(Color.parseColor("#424040")); + teaser.setTextColor(Color.parseColor("#424040")); + info.setTextColor(Color.parseColor("#424040")); break; case Configuration.UI_MODE_NIGHT_NO: - view.setBackgroundColor(Color.LTGRAY); + title.setTextColor(Color.parseColor("#8a8484")); + subheading.setTextColor(Color.parseColor("#8a8484")); + teaser.setTextColor(Color.parseColor("#8a8484")); + info.setTextColor(Color.parseColor("#8a8484")); break; default: break; From e5ca20d0f53c8d89c8f1a710802b45b921822b0b Mon Sep 17 00:00:00 2001 From: Flo Date: Mon, 19 Feb 2024 18:58:59 +0100 Subject: [PATCH 31/37] safe --- app/build.gradle | 3 + .../java/de/eknoes/inofficialgolem/Article.kt | 32 ----- .../inofficialgolem/ArticleFragment.java | 11 +- .../inofficialgolem/ArticleListFragment.java | 19 ++- .../inofficialgolem/entities/Article.java | 114 ++++++++++++++++++ .../inofficialgolem/updater/GolemFetcher.java | 2 +- .../inofficialgolem/utils/DBHelper.java | 10 +- 7 files changed, 136 insertions(+), 55 deletions(-) delete mode 100644 app/src/main/java/de/eknoes/inofficialgolem/Article.kt create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/entities/Article.java diff --git a/app/build.gradle b/app/build.gradle index a873e8d..bd363bd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,6 +39,9 @@ android { } dependencies { + implementation "androidx.room:room-runtime:2.6.1" + annotationProcessor "androidx.room:room-compiler:2.6.1" + implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.preference:preference:1.1.1' diff --git a/app/src/main/java/de/eknoes/inofficialgolem/Article.kt b/app/src/main/java/de/eknoes/inofficialgolem/Article.kt deleted file mode 100644 index e3d100f..0000000 --- a/app/src/main/java/de/eknoes/inofficialgolem/Article.kt +++ /dev/null @@ -1,32 +0,0 @@ -package de.eknoes.inofficialgolem - -import de.eknoes.inofficialgolem.updater.GolemItem -import java.util.Date -import java.util.Locale - -/** - * Created by soenke on 10.04.16. - */ -internal class Article : GolemItem() { - var title: String? = null - var subheadline: String? = null - get() = if (field == null) { - null - } else field!!.uppercase(Locale.ROOT) - var teaser: String? = null - var isOffline = false - var fulltext: String? = null - private var date = Date() - var imgUrl: String? = null - var commentUrl: String? = null - var commentNr: String? = null - var alreadyRead: Boolean? = false - - fun getDate(): Date { - return date - } - - fun setDate(date: Long) { - this.date.time = date - } -} diff --git a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java index 0e237b2..0522f1a 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.NotNull; +import de.eknoes.inofficialgolem.entities.Article; import de.eknoes.inofficialgolem.entities.DBColumns; import de.eknoes.inofficialgolem.entities.QueryRequest; import de.eknoes.inofficialgolem.utils.DBHelper; @@ -210,14 +211,14 @@ public boolean onOptionsItemSelected(MenuItem item) { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); String link = null; - if (article != null && article.getUrl() != null) { - link = article.getUrl(); + if (article != null && article.getArticleUrl() != null) { + link = article.getArticleUrl(); } else if (url != null) { link = url; } if (link != null && article != null) { - shareIntent.putExtra(Intent.EXTRA_TEXT, article.getSubheadline() + ": " + article.getTitle() + " - " + link); + shareIntent.putExtra(Intent.EXTRA_TEXT, article.getSubHeadLine() + ": " + article.getTitle() + " - " + link); } else { shareIntent.putExtra(Intent.EXTRA_TEXT, link); } @@ -302,7 +303,7 @@ protected void onPostExecute(Void vVoid) { } } else { Log.d(TAG, "onPostExecute: Fill Webview"); - String fulltext = article.getFulltext(); + String fulltext = article.getFullText(); // Change CSS for Dark Mode if((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES) { @@ -326,7 +327,7 @@ protected void onPostExecute(Void vVoid) { color: black !important; }"""); } - webView.loadDataWithBaseURL(article.getUrl(), fulltext, "text/html", "UTF-8", null); + webView.loadDataWithBaseURL(article.getArticleUrl(), fulltext, "text/html", "UTF-8", null); Log.d(TAG, "onPostExecute: Filled Webview"); } diff --git a/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java b/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java index 7a3d2ad..e59621d 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/ArticleListFragment.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.concurrent.Callable; +import de.eknoes.inofficialgolem.entities.Article; import de.eknoes.inofficialgolem.entities.DBColumns; import de.eknoes.inofficialgolem.entities.QueryRequest; import de.eknoes.inofficialgolem.updater.GolemFetcher; @@ -96,18 +97,12 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat Log.d(TAG, "onStart: Creating Article List Adapter"); listAdapter = new ArticleAdapter(); listView.setAdapter(listAdapter); - listView.setOnItemClickListener((parent, view1, position, id) -> mListener.onArticleSelected(listAdapter.getItem(position).getUrl(), false)); - listView.setOnItemLongClickListener((parent, view12, position, id) -> { - mListener.onArticleSelected(listAdapter.getItem(position).getUrl(), true); + listView.setOnItemClickListener((parent, view12, position, id) -> mListener.onArticleSelected(listAdapter.getItem(position).getArticleUrl(), false)); + listView.setOnItemLongClickListener((parent, view1, position, id) -> { + mListener.onArticleSelected(listAdapter.getItem(position).getArticleUrl(), true); return true; }); - - mSwipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - refresh(true); - } - }); + mSwipeLayout.setOnRefreshListener(() -> refresh(true)); } @Override @@ -235,10 +230,10 @@ public View getView(int position, View convertView, ViewGroup parent) { NetworkImageView image = view.findViewById(R.id.articleImage); title.setText(art.getTitle()); - subheading.setText(art.getSubheadline()); + subheading.setText(art.getSubHeadLine()); teaser.setText(art.getTeaser()); info.setText(infoText); - if (art.getAlreadyRead().equals(true)) { + if (art.isAlreadyRead()) { int nightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; // Danke an Alma für die Idee mit dem Text switch (nightMode) { diff --git a/app/src/main/java/de/eknoes/inofficialgolem/entities/Article.java b/app/src/main/java/de/eknoes/inofficialgolem/entities/Article.java new file mode 100644 index 0000000..8f57d42 --- /dev/null +++ b/app/src/main/java/de/eknoes/inofficialgolem/entities/Article.java @@ -0,0 +1,114 @@ +package de.eknoes.inofficialgolem.entities; + +import java.util.Date; + +public class Article { + long id; + String title; + String articleUrl; + String subHeadLine; + String teaser; + boolean isOffline; + String fullText; + Date date; + String imgUrl; + String commentUrl; + String commentNr; + boolean alreadyRead; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getArticleUrl() { + return articleUrl; + } + + public void setArticleUrl(String articleUrl) { + this.articleUrl = articleUrl; + } + + public String getSubHeadLine() { + return subHeadLine; + } + + public void setSubHeadLine(String subHeadLine) { + this.subHeadLine = subHeadLine; + } + + public String getTeaser() { + return teaser; + } + + public void setTeaser(String teaser) { + this.teaser = teaser; + } + + public boolean isOffline() { + return isOffline; + } + + public void setOffline(boolean offline) { + isOffline = offline; + } + + public String getFullText() { + return fullText; + } + + public void setFullText(String fullText) { + this.fullText = fullText; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getCommentUrl() { + return commentUrl; + } + + public void setCommentUrl(String commentUrl) { + this.commentUrl = commentUrl; + } + + public String getCommentNr() { + return commentNr; + } + + public void setCommentNr(String commentNr) { + this.commentNr = commentNr; + } + + public boolean isAlreadyRead() { + return alreadyRead; + } + + public void setAlreadyRead(boolean alreadyRead) { + this.alreadyRead = alreadyRead; + } +} diff --git a/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java b/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java index a046741..b65addd 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/updater/GolemFetcher.java @@ -20,9 +20,9 @@ import java.util.List; import java.util.concurrent.Callable; -import de.eknoes.inofficialgolem.Article; import de.eknoes.inofficialgolem.FeedReaderDbHelper; import de.eknoes.inofficialgolem.R; +import de.eknoes.inofficialgolem.entities.Article; import de.eknoes.inofficialgolem.entities.DBColumns; import de.eknoes.inofficialgolem.entities.QueryRequest; import de.eknoes.inofficialgolem.utils.DBHelper; diff --git a/app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java b/app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java index bd5a9a5..bcea3b1 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/utils/DBHelper.java @@ -8,9 +8,9 @@ import java.util.ArrayList; import java.util.List; -import de.eknoes.inofficialgolem.Article; import de.eknoes.inofficialgolem.FeedReaderDbHelper; import de.eknoes.inofficialgolem.MainApplication; +import de.eknoes.inofficialgolem.entities.Article; import de.eknoes.inofficialgolem.entities.DBColumns; import de.eknoes.inofficialgolem.entities.QueryRequest; @@ -75,7 +75,7 @@ public static Article getArticleFromCursor(Cursor cursor) { } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_SUBHEADING); if (value != null) { - a.setSubheadline((String) value); + a.setSubHeadLine((String) value); } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_TEASER); if (value != null) { @@ -83,7 +83,7 @@ public static Article getArticleFromCursor(Cursor cursor) { } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_DATE); if (value != null) { - a.setDate((Long) value); +// a.setDate((Long) value); } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_IMG); if (value != null) { @@ -99,7 +99,7 @@ public static Article getArticleFromCursor(Cursor cursor) { } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_URL); if (value != null) { - a.setUrl((String) value); + a.setArticleUrl((String) value); } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_OFFLINE); if (value != null) { @@ -107,7 +107,7 @@ public static Article getArticleFromCursor(Cursor cursor) { } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_FULLTEXT); if (value != null) { - a.setFulltext((String) value); + a.setFullText((String) value); } value = getValueFromCursor(cursor, DBColumns.COLUMN_NAME_ALREADY_READ); if (value != null) { From b7f363ae02d1d6d774fbcfea866857133a872a94 Mon Sep 17 00:00:00 2001 From: Flo Date: Thu, 22 Feb 2024 18:58:56 +0100 Subject: [PATCH 32/37] erster Umbau --- .../inofficialgolem/ArticleFragment.java | 40 ++--- .../inofficialgolem/ArticleListFragment.java | 23 ++- .../inofficialgolem/FeedReaderContract.java | 26 --- .../inofficialgolem/FeedReaderDbHelper.java | 63 -------- .../inofficialgolem/entities/Article.java | 45 ++++-- .../inofficialgolem/entities/DATABASES.java | 5 + .../inofficialgolem/entities/DBColumns.java | 57 ------- .../entities/QueryRequest.java | 148 ------------------ ...rticleUpdater.java => ArticleUpdater.java} | 10 +- .../inofficialgolem/updater/GolemAboParser.kt | 23 +-- .../inofficialgolem/updater/GolemFetcher.java | 100 ++---------- .../inofficialgolem/updater/GolemItem.java | 47 ------ .../inofficialgolem/updater/GolemRSSParser.kt | 43 +++-- .../inofficialgolem/updater/GolemUpdater.java | 4 +- .../inofficialgolem/utils/ArticleDao.java | 31 ++++ .../utils/ArticleDatabase.java | 11 ++ .../inofficialgolem/utils/DBHelper.java | 139 +--------------- 17 files changed, 181 insertions(+), 634 deletions(-) delete mode 100644 app/src/main/java/de/eknoes/inofficialgolem/FeedReaderContract.java delete mode 100644 app/src/main/java/de/eknoes/inofficialgolem/FeedReaderDbHelper.java create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/entities/DATABASES.java delete mode 100644 app/src/main/java/de/eknoes/inofficialgolem/entities/DBColumns.java delete mode 100644 app/src/main/java/de/eknoes/inofficialgolem/entities/QueryRequest.java rename app/src/main/java/de/eknoes/inofficialgolem/updater/{articleUpdater.java => ArticleUpdater.java} (88%) delete mode 100644 app/src/main/java/de/eknoes/inofficialgolem/updater/GolemItem.java create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/utils/ArticleDao.java create mode 100644 app/src/main/java/de/eknoes/inofficialgolem/utils/ArticleDatabase.java diff --git a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java index 0522f1a..0e948b8 100644 --- a/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java +++ b/app/src/main/java/de/eknoes/inofficialgolem/ArticleFragment.java @@ -25,13 +25,15 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.room.Room; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.jetbrains.annotations.NotNull; import de.eknoes.inofficialgolem.entities.Article; -import de.eknoes.inofficialgolem.entities.DBColumns; -import de.eknoes.inofficialgolem.entities.QueryRequest; +import de.eknoes.inofficialgolem.entities.DATABASES; +import de.eknoes.inofficialgolem.utils.ArticleDao; +import de.eknoes.inofficialgolem.utils.ArticleDatabase; import de.eknoes.inofficialgolem.utils.DBHelper; public class ArticleFragment extends Fragment { @@ -48,6 +50,8 @@ public class ArticleFragment extends Fragment { private Article article; private loadArticleTask mTask; private SwipeRefreshLayout mArticleSwipeRefresh; + private ArticleDatabase db = Room.databaseBuilder(getContext(), ArticleDatabase.class, DATABASES.ARTICLE.name()).build(); + private ArticleDao dao = db.articleDao(); public ArticleFragment() { super(R.layout.fragment_article); @@ -117,7 +121,7 @@ public void onSaveInstanceState(@NotNull Bundle outState) { public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - if(webView != null) { + if (webView != null) { webView.setWebViewClient(new GolemWebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { @@ -142,8 +146,8 @@ public void onPageFinished(WebView view, String url) { webView.getSettings().setJavaScriptEnabled(true); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - cookieManager.setAcceptThirdPartyCookies(webView,true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + cookieManager.setAcceptThirdPartyCookies(webView, true); } } @@ -173,7 +177,7 @@ public void onResume() { @Override public void onDetach() { super.onDetach(); - if(mTask != null) { + if (mTask != null) { mTask.cancel(false); } } @@ -183,9 +187,9 @@ public void onCreateOptionsMenu(@NotNull Menu menu, @NotNull MenuInflater inflat super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_webview, menu); - if(article == null || article.getCommentUrl() == null) { + if (article == null || article.getCommentUrl() == null) { MenuItem item = menu.findItem(R.id.action_comments); - if(item != null) { + if (item != null) { item.setVisible(false); } } @@ -218,7 +222,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } if (link != null && article != null) { - shareIntent.putExtra(Intent.EXTRA_TEXT, article.getSubHeadLine() + ": " + article.getTitle() + " - " + link); + shareIntent.putExtra(Intent.EXTRA_TEXT, article.getSubHeadline() + ": " + article.getTitle() + " - " + link); } else { shareIntent.putExtra(Intent.EXTRA_TEXT, link); } @@ -267,13 +271,9 @@ private class loadArticleTask extends AsyncTask { @Override protected Void doInBackground(Void... params) { - if (url != null) { - QueryRequest queryRequest = new QueryRequest.QueryRequestBuilder() - .withTableName(DBColumns.getTableName()) - .withSelection("url=\"" + url + "\"") - .build(); - article = DBHelper.getArticle(queryRequest); - } + if (url != null) { + article = dao.getArticleByUrl(url); + } return null; } @@ -292,13 +292,15 @@ protected void onPostExecute(Void vVoid) { networkInfo = connMgr.getActiveNetworkInfo(); } if (networkInfo != null && networkInfo.isConnected()) { - DBHelper.updateArticleReadState(article); + article.setAlreadyRead(true); + DBHelper.updateArticle(getContext(), article); webView.loadUrl(url); } else { webView.loadData(getResources().getString(R.string.err_no_network), "text/html; charset=utf-8", "UTF-8"); } } else { - DBHelper.updateArticleReadState(article); + article.setAlreadyRead(true); + DBHelper.updateArticle(getContext(),article); webView.loadUrl(url); } } else { @@ -306,7 +308,7 @@ protected void onPostExecute(Void vVoid) { String fulltext = article.getFullText(); // Change CSS for Dark Mode - if((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES) { + if ((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES) { if (fulltext != null) { fulltext = fulltext.replace("", """