Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
24b86e66b4 | ||
641c444061 | |||
0902c61544 | |||
|
6790152a0b | ||
|
46d1ba418e | ||
436373d0ad | |||
|
5b9b51c02d | ||
b81abe384a | |||
|
851f862dbe | ||
|
8d7e302af8 | ||
236e1cca90 | |||
3a33cb4510 | |||
0bf9ca9a49 |
170
.drone.yml
170
.drone.yml
@ -1,170 +0,0 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: test
|
||||
|
||||
steps:
|
||||
- name: Lint
|
||||
failure: ignore
|
||||
image: mingc/android-build-box:latest
|
||||
commands:
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Install linters..."
|
||||
- curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.0.0/ktlint && chmod a+x ktlint && mv ktlint /usr/local/bin/
|
||||
- curl -sSLO https://github.com/detekt/detekt/releases/download/v1.23.1/detekt-cli-1.23.1.zip && unzip detekt-cli-1.23.1.zip
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Linting..."
|
||||
- ktlint 'shared/**/*.kt' 'androidApp/**/*.kt' '!shared/build' || true
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Detecting..."
|
||||
- ./detekt-cli-1.23.1/bin/detekt-cli --all-rules --excludes '**/shared/build/**/*.kt' || true
|
||||
- echo "---------------------------------------------------------"
|
||||
command_timeout: 1m
|
||||
- name: BuildAndTest
|
||||
image: mingc/android-build-box:latest
|
||||
commands:
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Configure gradle..."
|
||||
- mkdir -p ~/.gradle && echo "org.gradle.daemon=false\nignoreGitVersion=true\nsystemProp.org.gradle.internal.http.connectionTimeout=180000\nsystemProp.org.gradle.internal.http.socketTimeout=180000" >> ~/.gradle/gradle.properties
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Configure java..."
|
||||
- . ~/.bash_profile
|
||||
- jenv global 17.0
|
||||
- java --version
|
||||
- date
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Building and testing..."
|
||||
- ./gradlew build
|
||||
- echo "---------------------------------------------------------"
|
||||
trigger:
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: Publish
|
||||
|
||||
steps:
|
||||
- name: createTagAndChangelog
|
||||
image: ubuntu:latest
|
||||
commands:
|
||||
- apt-get update && apt-get install -y git
|
||||
- git fetch --tags -p
|
||||
- PREV=$(git describe --tags --abbrev=0)
|
||||
- ./build.sh --publish --from-ci
|
||||
- VER=$(git describe --tags --abbrev=0)
|
||||
- CHANGELOG=$(git log $PREV..HEAD --pretty="- %s")
|
||||
- echo "**$VER**\n\n$CHANGELOG\n\n--------------------------------------------------------------------\n\n$(cat CHANGELOG.md)" > CHANGELOG.md
|
||||
- git add CHANGELOG.md
|
||||
- git commit -m "Changelog for $VER [CI SKIP]"
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
|
||||
- name: git-push
|
||||
image: appleboy/drone-git-push
|
||||
settings:
|
||||
branch: master
|
||||
remote:
|
||||
from_secret: remoteUrl
|
||||
followtags: true
|
||||
ssh_key:
|
||||
from_secret: privateKey
|
||||
skip_verify: true
|
||||
|
||||
- name: scpFiles
|
||||
image: appleboy/drone-scp
|
||||
settings:
|
||||
host: amine-bouabdallaoui.fr
|
||||
username: ubuntu
|
||||
key:
|
||||
from_secret: privateKey
|
||||
port: 22
|
||||
target: /home/ubuntu/
|
||||
source: version.txt
|
||||
|
||||
- name: deploy
|
||||
image: appleboy/drone-ssh
|
||||
settings:
|
||||
host: amine-bouabdallaoui.fr
|
||||
user: ubuntu
|
||||
key:
|
||||
from_secret: privateKey
|
||||
command_timeout: 2m
|
||||
script:
|
||||
- cd /home/ubuntu && sudo rm -rf /var/www/amine/version.txt && sudo chown www-data:www-data ./version.txt && sudo mv version.txt /var/www/amine/
|
||||
|
||||
trigger:
|
||||
event:
|
||||
- promote
|
||||
target:
|
||||
- production
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: Release
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: mingc/android-build-box:latest
|
||||
commands:
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Fetch tags..."
|
||||
- git fetch --tags
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Configure gradle..."
|
||||
- mkdir -p ~/.gradle && echo "org.gradle.daemon=false\nignoreGitVersion=false\nsystemProp.org.gradle.internal.http.connectionTimeout=180000\nsystemProp.org.gradle.internal.http.socketTimeout=180000" >> ~/.gradle/gradle.properties
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Generate APK"
|
||||
- ./gradlew :androidApp:assembleGithubConfigRelease
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Get Key"
|
||||
- wget https://amine-bouabdallaoui.fr/key
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Zipalign"
|
||||
- $ANDROID_HOME/build-tools/31.0.0/zipalign -f -v 4 androidApp/build/outputs/apk/githubConfig/release/androidApp-githubConfig-release-unsigned.apk androidApp/build/outputs/apk/githubConfig/release/android-prod-released-ziped.apk
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Sign"
|
||||
- $ANDROID_HOME/build-tools/31.0.0/apksigner sign -v --out signed.apk --ks ./key --ks-key-alias $YOUR_KEY_ALIAS --ks-pass pass:$YOUR_KEYSTORE_PASSWORD --v1-signing-enabled true --v2-signing-enabled true androidApp/build/outputs/apk/githubConfig/release/android-prod-released-ziped.apk
|
||||
- echo "---------------------------------------------------------"
|
||||
- echo "Verify"
|
||||
- $ANDROID_HOME/build-tools/31.0.0/apksigner verify signed.apk
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
YOUR_KEYSTORE_PASSWORD:
|
||||
from_secret: keyPass
|
||||
YOUR_KEY_ALIAS:
|
||||
from_secret: keyAlias
|
||||
|
||||
- name: gitea_release
|
||||
image: plugins/gitea-release
|
||||
settings:
|
||||
api_key:
|
||||
from_secret: giteaAPI
|
||||
base_url: https://gitea.amine-bouabdallaoui.fr
|
||||
files: signed.apk
|
||||
|
||||
- name: notify
|
||||
image: drillster/drone-email
|
||||
failure: ignore
|
||||
settings:
|
||||
host:
|
||||
from_secret: smtpHOST
|
||||
port:
|
||||
from_secret: smtpPORT
|
||||
username:
|
||||
from_secret: smtpUSERNAME
|
||||
password:
|
||||
from_secret: smtpPASSWORD
|
||||
from:
|
||||
from_secret: smtpFROM
|
||||
subject: Mapping file
|
||||
recipients:
|
||||
from_secret: smtpTO
|
||||
recipients_only: true
|
||||
skip_verify: true
|
||||
attachment: androidApp/build/outputs/mapping/githubConfigRelease/mapping.txt
|
||||
trigger:
|
||||
event:
|
||||
- tag
|
24
.gitea/workflows/common_build.yml
Normal file
24
.gitea/workflows/common_build.yml
Normal file
@ -0,0 +1,24 @@
|
||||
name: Build
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
BuildAndTest:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Fetch tags
|
||||
run: git fetch --tags -p
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
- name: Setup Android SDK
|
||||
uses: android-actions/setup-android@v3
|
||||
- name: Configure gradle...
|
||||
run: mkdir -p ~/.gradle && echo "org.gradle.daemon=false\nignoreGitVersion=true\nsystemProp.org.gradle.internal.http.connectionTimeout=180000\nsystemProp.org.gradle.internal.http.socketTimeout=180000" >> ~/.gradle/gradle.properties
|
||||
- name: Build and test
|
||||
run: ./gradlew build --stacktrace
|
126
.gitea/workflows/on_merge_on_release.yml
Normal file
126
.gitea/workflows/on_merge_on_release.yml
Normal file
@ -0,0 +1,126 @@
|
||||
name: Create tag
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- release
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: ./.gitea/workflows/common_build.yml
|
||||
createTagAndChangelog:
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Config git
|
||||
run: |
|
||||
git config --global user.email aminecmi+giteadrone@pm.me
|
||||
git config --global user.name giteadrone
|
||||
- name: Creating the tag and generate changelog
|
||||
run: |
|
||||
git fetch --tags -p
|
||||
PREV=$(git describe --tags --abbrev=0)
|
||||
./build.sh --publish --from-ci
|
||||
VER=$(git describe --tags --abbrev=0)
|
||||
CHANGELOG=$(git log $PREV..HEAD --pretty="- %s")
|
||||
echo "**$VER
|
||||
|
||||
$CHANGELOG
|
||||
|
||||
--------------------------------------------------------------------
|
||||
|
||||
$(cat CHANGELOG.md)" > CHANGELOG.md
|
||||
git add CHANGELOG.md
|
||||
touch ./fastlane/metadata/android/en\-US/changelogs/$VER.txt
|
||||
echo "**$VER**
|
||||
|
||||
$CHANGELOG" > ./fastlane/metadata/android/en\-US/changelogs/$VER.txt
|
||||
git add ./fastlane/metadata/android/en\-US/changelogs/$VER.txt
|
||||
git commit -m "Changelog for $VER"
|
||||
- name: Push changes
|
||||
uses: appleboy/git-push-action@v1.0.0
|
||||
with:
|
||||
author_name: giteadrone
|
||||
author_email: aminecmi+giteadrone@pm.me
|
||||
remote: ${{ secrets.REMOTE_URL }}
|
||||
followtags: true
|
||||
ssh_key: ${{ secrets.PRIVATE_KEY }}
|
||||
tags: true
|
||||
branch: release
|
||||
- name: copy file via ssh password
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: amine-bouabdallaoui.fr
|
||||
username: ubuntu
|
||||
key: ${{ secrets.PRIVATE_KEY }}
|
||||
source: "version.txt"
|
||||
target: "/home/ubuntu/"
|
||||
- name: deploy version file
|
||||
uses: appleboy/ssh-action@v1.2.0
|
||||
with:
|
||||
host: amine-bouabdallaoui.fr
|
||||
username: ubuntu
|
||||
key: ${{ secrets.PRIVATE_KEY }}
|
||||
script: cd /home/ubuntu && sudo rm -rf /var/www/amine/version.txt && sudo chown www-data:www-data ./version.txt && sudo mv version.txt /var/www/amine/
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
needs: createTagAndChangelog
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Fetch tags
|
||||
id: version
|
||||
run: |
|
||||
git fetch --tags -p
|
||||
PREV=$(git describe --tags --abbrev=0)
|
||||
echo $PREV
|
||||
echo "VERSION=$PREV" >> $GITHUB_OUTPUT
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
- name: Setup Android SDK
|
||||
uses: android-actions/setup-android@v3
|
||||
- name: Configure gradle...
|
||||
run: mkdir -p ~/.gradle && echo "org.gradle.daemon=false\nignoreGitVersion=false\nsystemProp.org.gradle.internal.http.connectionTimeout=180000\nsystemProp.org.gradle.internal.http.socketTimeout=180000" >> ~/.gradle/gradle.properties
|
||||
- name: setup go
|
||||
uses: https://github.com/actions/setup-go@v4
|
||||
with:
|
||||
go-version: '>=1.20.1'
|
||||
- name: Generate APK
|
||||
run: ./gradlew :androidApp:assembleGithubConfigRelease
|
||||
- name: Get Key
|
||||
run: wget ${{ secrets.KEY_URL }}
|
||||
- name: Zippalign
|
||||
run: |
|
||||
sdkmanager "build-tools;31.0.0"
|
||||
ls $ANDROID_HOME/build-tools
|
||||
$ANDROID_HOME/build-tools/31.0.0/zipalign -f -v 4 androidApp/build/outputs/apk/githubConfig/release/androidApp-githubConfig-release-unsigned.apk androidApp/build/outputs/apk/githubConfig/release/android-prod-released-ziped.apk
|
||||
- name: Sigh
|
||||
run: $ANDROID_HOME/build-tools/31.0.0/apksigner sign -v --out signed.apk --ks ./key --ks-key-alias ${{ secrets.KEY_ALIAS }} --ks-pass pass:${{ secrets.KEYSTORE_PASSWORD }} --v1-signing-enabled true --v2-signing-enabled true androidApp/build/outputs/apk/githubConfig/release/android-prod-released-ziped.apk
|
||||
- name: Verify
|
||||
run: $ANDROID_HOME/build-tools/31.0.0/apksigner verify signed.apk
|
||||
- name: Release
|
||||
uses: https://gitea.com/actions/gitea-release-action@main
|
||||
with:
|
||||
files: signed.apk
|
||||
token: ${{ secrets.API_KEY }}
|
||||
tag_name: ${{ steps.version.outputs.VERSION }}
|
||||
name: ${{ steps.version.outputs.VERSION }}
|
||||
- name: Send mail
|
||||
uses: https://github.com/dawidd6/action-send-mail@v4
|
||||
with:
|
||||
connection_url: ${{ secrets.MAIL_CONNECTION }}
|
||||
to: ${{ secrets.MAIL_TO }}
|
||||
from: ${{ secrets.MAIL_FROM }}
|
||||
subject: Mapping file
|
||||
priority: high
|
||||
convert_markdown: true
|
||||
body: Nouveau fichier de mapping pour la version ${{ steps.version.outputs.VERSION }}
|
||||
attachments: androidApp/build/outputs/mapping/githubConfigRelease/mapping.txt
|
26
.gitea/workflows/on_pr.yml
Normal file
26
.gitea/workflows/on_pr.yml
Normal file
@ -0,0 +1,26 @@
|
||||
name: Check PR code
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
Lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin' # See 'Supported distributions' for available options
|
||||
java-version: '17'
|
||||
- name: Install klint
|
||||
run: curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.0.0/ktlint && chmod a+x ktlint && mv ktlint /usr/local/bin/
|
||||
- name: Install detekt
|
||||
run: curl -sSLO https://github.com/detekt/detekt/releases/download/v1.23.1/detekt-cli-1.23.1.zip && unzip detekt-cli-1.23.1.zip
|
||||
- name: Linting...
|
||||
run: ktlint 'shared/**/*.kt' 'androidApp/**/*.kt' '!shared/build' || true
|
||||
- name: Detecting...
|
||||
run: ./detekt-cli-1.23.1/bin/detekt-cli --all-rules --excludes '**/shared/build/**/*.kt' || true
|
||||
build:
|
||||
uses: ./.gitea/workflows/common_build.yml
|
9
.gitea/workflows/on_push.yml
Normal file
9
.gitea/workflows/on_push.yml
Normal file
@ -0,0 +1,9 @@
|
||||
name: Check master code
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: ./.gitea/workflows/common_build.yml
|
18
CHANGELOG.md
18
CHANGELOG.md
@ -1,3 +1,21 @@
|
||||
**v124113311
|
||||
|
||||
- chore: update versions. (#165)
|
||||
- chore: fastlane changelog.
|
||||
- chore: fastlane fixes.
|
||||
- Changelog for v124113301
|
||||
|
||||
--------------------------------------------------------------------
|
||||
|
||||
**v124113301**
|
||||
|
||||
- chore: Gitea Action
|
||||
- Merge pull request 'chore: Gitea Action' (#164) from runner into master
|
||||
- chore: Gitea Action
|
||||
- chore: Readme update.
|
||||
|
||||
--------------------------------------------------------------------
|
||||
|
||||
**v124041081**
|
||||
|
||||
- chore: comment.
|
||||
|
@ -1,4 +1,4 @@
|
||||
# ReaderForSelfoss-multiplatform [![Build Status](https://build.amine-bouabdallaoui.fr/api/badges/Louvorg/ReaderForSelfoss-multiplatform/status.svg)](https://build.amine-bouabdallaoui.fr/Louvorg/ReaderForSelfoss-multiplatform)
|
||||
# ReaderForSelfoss-multiplatform [![Build Status](https://gitea.amine-bouabdallaoui.fr/Louvorg/ReaderForSelfoss-multiplatform/actions/workflows/on_push.yml/badge.svg)](https://gitea.amine-bouabdallaoui.fr/Louvorg/ReaderForSelfoss-multiplatform/actions?workflow=on_push.yml&actor=0&status=0)
|
||||
|
||||
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/readerforselfoss/localized.svg)](https://crowdin.com/project/readerforselfoss)
|
||||
|
||||
@ -10,10 +10,6 @@ If you are a user, you can still create new issues. I'll fix them when I can.
|
||||
|
||||
<a href="https://f-droid.org/packages/bou.amine.apps.readerforselfossv2.android"><img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="100"></a>
|
||||
|
||||
## Screen captures
|
||||
|
||||
<img src="res//fr-card.png?raw=true" alt="card view" width="400"/> <img src="res//fr-list.png?raw=true" alt="list view" width="400"/>
|
||||
|
||||
## Like my app ?
|
||||
|
||||
<a href="https://www.buymeacoffee.com/aminecmi" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/lato-orange.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;" ></a>
|
||||
|
@ -13,7 +13,11 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.widget.SearchView
|
||||
import androidx.core.view.doOnNextLayout
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.*
|
||||
import androidx.recyclerview.widget.DividerItemDecoration
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.ItemTouchHelper
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
||||
import androidx.work.Constraints
|
||||
import androidx.work.ExistingPeriodicWorkPolicy
|
||||
import androidx.work.PeriodicWorkRequestBuilder
|
||||
@ -58,7 +62,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
private lateinit var recyclerViewScrollListener: RecyclerView.OnScrollListener
|
||||
private lateinit var binding: ActivityHomeBinding
|
||||
|
||||
private var recyclerAdapter: RecyclerView.Adapter<*>? = null
|
||||
private var recyclerAdapter: ItemsAdapter<out RecyclerView.ViewHolder>? = null
|
||||
|
||||
private var fromTabShortcut: Boolean = false
|
||||
|
||||
@ -498,7 +502,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar
|
||||
}
|
||||
binding.recyclerView.adapter = recyclerAdapter
|
||||
} else {
|
||||
(recyclerAdapter as ItemsAdapter<*>).updateAllItems(items)
|
||||
recyclerAdapter!!.updateAllItems(items)
|
||||
}
|
||||
|
||||
reloadBadges()
|
||||
|
@ -1,7 +1,6 @@
|
||||
package bou.amine.apps.readerforselfossv2.android.adapters
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
@ -14,7 +13,6 @@ import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.bitmapCenterCrop
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openInBrowserAsNewTask
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.shareLink
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
@ -32,11 +30,10 @@ import org.kodein.di.instance
|
||||
|
||||
class ItemCardAdapter(
|
||||
override val app: Activity,
|
||||
override var items: ArrayList<SelfossModel.Item>,
|
||||
override val updateItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
override val items: ArrayList<SelfossModel.Item>,
|
||||
override val updateHomeItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
) : ItemsAdapter<ItemCardAdapter.ViewHolder>() {
|
||||
private lateinit var binding: CardItemBinding
|
||||
private val c: Context = app.baseContext
|
||||
override lateinit var binding: CardItemBinding
|
||||
private val imageMaxHeight: Int =
|
||||
c.resources.getDimension(R.dimen.card_image_max_height).toInt()
|
||||
|
||||
@ -52,8 +49,8 @@ class ItemCardAdapter(
|
||||
return ViewHolder(binding)
|
||||
}
|
||||
|
||||
private fun handleClickListeners(position: Int) {
|
||||
binding.favButton.setOnClickListener {
|
||||
private fun handleClickListeners(holderBinding: CardItemBinding, position: Int) {
|
||||
holderBinding.favButton.setOnClickListener {
|
||||
val item = items[position]
|
||||
if (item.starred) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
@ -78,27 +75,15 @@ class ItemCardAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleLinkOpening(position: Int) {
|
||||
binding.root.setOnClickListener {
|
||||
repository.setReaderItems(items)
|
||||
c.openItemUrl(
|
||||
position,
|
||||
items[position].getLinkDecoded(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(
|
||||
holder: ViewHolder,
|
||||
position: Int,
|
||||
) {
|
||||
with(holder) {
|
||||
val itm = items[holder.bindingAdapterPosition]
|
||||
val itm = items[position]
|
||||
|
||||
handleClickListeners(holder.bindingAdapterPosition)
|
||||
handleLinkOpening(holder.bindingAdapterPosition)
|
||||
handleClickListeners(binding, position)
|
||||
handleLinkOpening(binding, position)
|
||||
|
||||
binding.favButton.isSelected = itm.starred
|
||||
if (appSettingsService.getPublicAccess()) {
|
||||
@ -140,9 +125,5 @@ class ItemCardAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return items.size
|
||||
}
|
||||
|
||||
inner class ViewHolder(val binding: CardItemBinding) : RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package bou.amine.apps.readerforselfossv2.android.adapters
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
@ -10,7 +9,6 @@ import bou.amine.apps.readerforselfossv2.android.databinding.ListItemBinding
|
||||
import bou.amine.apps.readerforselfossv2.android.sendSilentlyWithAcraWithName
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.LinkOnTouchListener
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.glide.circularDrawable
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
@ -23,11 +21,10 @@ import org.kodein.di.instance
|
||||
|
||||
class ItemListAdapter(
|
||||
override val app: Activity,
|
||||
override var items: ArrayList<SelfossModel.Item>,
|
||||
override val updateItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
override val items: ArrayList<SelfossModel.Item>,
|
||||
override val updateHomeItems: (ArrayList<SelfossModel.Item>) -> Unit,
|
||||
) : ItemsAdapter<ItemListAdapter.ViewHolder>() {
|
||||
private lateinit var binding: ListItemBinding
|
||||
private val c: Context = app.baseContext
|
||||
override lateinit var binding: ListItemBinding
|
||||
|
||||
override val di: DI by closestDI(app)
|
||||
override val repository: Repository by instance()
|
||||
@ -46,17 +43,9 @@ class ItemListAdapter(
|
||||
position: Int,
|
||||
) {
|
||||
with(holder) {
|
||||
val itm = items[holder.bindingAdapterPosition]
|
||||
val itm = items[position]
|
||||
|
||||
binding.root.setOnClickListener {
|
||||
repository.setReaderItems(items)
|
||||
c.openItemUrl(
|
||||
holder.bindingAdapterPosition,
|
||||
items[holder.bindingAdapterPosition].getLinkDecoded(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app,
|
||||
)
|
||||
}
|
||||
handleLinkOpening(binding, position)
|
||||
|
||||
binding.title.text = itm.title.getHtmlDecoded()
|
||||
|
||||
@ -83,7 +72,5 @@ class ItemListAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = items.size
|
||||
|
||||
inner class ViewHolder(val binding: ListItemBinding) : RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
|
@ -1,10 +1,13 @@
|
||||
package bou.amine.apps.readerforselfossv2.android.adapters
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import bou.amine.apps.readerforselfossv2.android.R
|
||||
import bou.amine.apps.readerforselfossv2.android.utils.openItemUrl
|
||||
import bou.amine.apps.readerforselfossv2.model.SelfossModel
|
||||
import bou.amine.apps.readerforselfossv2.repository.Repository
|
||||
import bou.amine.apps.readerforselfossv2.service.AppSettingsService
|
||||
@ -16,16 +19,20 @@ import kotlinx.coroutines.launch
|
||||
import org.kodein.di.DIAware
|
||||
|
||||
abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>(), DIAware {
|
||||
abstract var items: ArrayList<SelfossModel.Item>
|
||||
abstract val items: ArrayList<SelfossModel.Item>
|
||||
abstract val repository: Repository
|
||||
abstract val binding: ViewBinding
|
||||
abstract val appSettingsService: AppSettingsService
|
||||
abstract val app: Activity
|
||||
abstract val updateItems: (ArrayList<SelfossModel.Item>) -> Unit
|
||||
abstract val updateHomeItems: (ArrayList<SelfossModel.Item>) -> Unit
|
||||
|
||||
protected val c: Context get() = app.baseContext
|
||||
|
||||
fun updateAllItems(items: ArrayList<SelfossModel.Item>) {
|
||||
this.items = items
|
||||
this.items.clear()
|
||||
this.items.addAll(items)
|
||||
updateHomeItems(items)
|
||||
notifyDataSetChanged()
|
||||
updateItems(this.items)
|
||||
}
|
||||
|
||||
private fun unmarkSnackbar(
|
||||
@ -70,6 +77,18 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
|
||||
s.show()
|
||||
}
|
||||
|
||||
protected fun handleLinkOpening(holderBinding: ViewBinding, position: Int) {
|
||||
holderBinding.root.setOnClickListener {
|
||||
repository.setReaderItems(items)
|
||||
c.openItemUrl(
|
||||
position,
|
||||
items[position].getLinkDecoded(),
|
||||
appSettingsService.isArticleViewerEnabled(),
|
||||
app,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun handleItemAtIndex(position: Int) {
|
||||
if (items[position].unread) {
|
||||
readItemAtIndex(items[position], position)
|
||||
@ -90,7 +109,7 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
|
||||
items.remove(item)
|
||||
notifyItemRemoved(position)
|
||||
notifyItemRangeChanged(position, itemCount)
|
||||
updateItems(items)
|
||||
updateHomeItems(items)
|
||||
} else {
|
||||
notifyItemChanged(position)
|
||||
}
|
||||
@ -119,13 +138,15 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte
|
||||
) {
|
||||
items.add(position, item)
|
||||
notifyItemInserted(position)
|
||||
updateItems(items)
|
||||
updateHomeItems(items)
|
||||
}
|
||||
|
||||
fun addItemsAtEnd(newItems: List<SelfossModel.Item>) {
|
||||
val oldSize = items.size
|
||||
items.addAll(newItems)
|
||||
notifyItemRangeInserted(oldSize, newItems.size)
|
||||
updateItems(items)
|
||||
updateHomeItems(items)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = items.size
|
||||
}
|
||||
|
@ -7,8 +7,8 @@ buildscript {
|
||||
|
||||
plugins {
|
||||
//trick: for the same plugin versions in all sub-modules
|
||||
id("com.android.application").version("8.1.2").apply(false)
|
||||
id("com.android.library").version("8.1.2").apply(false)
|
||||
id("com.android.application").version("8.7.2").apply(false)
|
||||
id("com.android.library").version("8.7.2").apply(false)
|
||||
id("org.jetbrains.kotlin.android").version("1.9.10").apply(false)
|
||||
kotlin("multiplatform").version("1.9.10").apply(false)
|
||||
id("com.mikepenz.aboutlibraries.plugin").version("10.5.1").apply(false)
|
||||
|
0
fastlane/metadata/android/en-US/changelogs/.gitkeep
Normal file
0
fastlane/metadata/android/en-US/changelogs/.gitkeep
Normal file
@ -0,0 +1,6 @@
|
||||
**v124113311**
|
||||
|
||||
- chore: update versions. (#165)
|
||||
- chore: fastlane changelog.
|
||||
- chore: fastlane fixes.
|
||||
- Changelog for v124113301
|
BIN
fastlane/metadata/android/en-US/images/icon.png
Normal file
BIN
fastlane/metadata/android/en-US/images/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 294 KiB |
@ -1 +1 @@
|
||||
A new RSS reader for <a href="http://selfoss.aditu.de/">selfoss</a>.
|
||||
A new RSS reader for selfoss (http://selfoss.aditu.de/)
|
||||
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
||||
#Thu Jul 13 11:41:19 CEST 2023
|
||||
#Mon Nov 25 22:48:24 CET 2024
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
@ -191,7 +191,7 @@ class SelfossModel {
|
||||
}
|
||||
|
||||
override val descriptor: SerialDescriptor
|
||||
get() = PrimitiveSerialDescriptor("b", PrimitiveKind.BOOLEAN)
|
||||
get() = PrimitiveSerialDescriptor("BooleanOrIntForSomeSelfossVersions", PrimitiveKind.BOOLEAN)
|
||||
|
||||
override fun serialize(
|
||||
encoder: Encoder,
|
||||
|
@ -1,5 +0,0 @@
|
||||
sonar.projectKey=RFS2
|
||||
sonar.coverage.jacoco.xmlReportPaths=build/reports/kover/merged/xml/report.xml
|
||||
sonar.sourceEncoding=UTF-8
|
||||
sonar.sources=.
|
||||
sonar.exclusions=shared/src/iosArm64Main/**, shared/src/iosX64Main/**, docs/**
|
Loading…
Reference in New Issue
Block a user