Compare commits
124 Commits
Author | SHA1 | Date | |
---|---|---|---|
c17980a032 | |||
a929e419d9 | |||
487d484bae | |||
0ca4c04c61 | |||
c857cf2d67 | |||
acb502028b | |||
533636f3a1 | |||
eb5672901b | |||
53a8716b51 | |||
3aaff612af | |||
fdcd8c6c6a | |||
bafd478604 | |||
987513a88b | |||
a450ab2a3b | |||
db89fe5aad | |||
67a30b92f6 | |||
c397de8c3e | |||
b4db532c45 | |||
ebecc9c80a | |||
4f8556fca8 | |||
68892fb41b | |||
6d6f6c72ac | |||
df5556b945 | |||
d6c74049c3 | |||
18946464a2 | |||
edb5eabee7 | |||
99a305f3e2 | |||
68dc5a6acf | |||
6816461502 | |||
15b93bbd9e | |||
cd61e140f6 | |||
4d861a84e6 | |||
f24de68618 | |||
3bcffff444 | |||
75e9031fa5 | |||
3b77e24399 | |||
0a738e895f | |||
242e5ba035 | |||
c94612106c | |||
320924b4ed | |||
403ecc4521 | |||
6a50b37364 | |||
d9d341ac5d | |||
e9805b731e | |||
c6d4337cd1 | |||
173f4b2ff7 | |||
3b9436264c | |||
35fe87d79d | |||
f1bb7ba9ad | |||
279f229166 | |||
be1794e27b | |||
4d4a2039c8 | |||
3013ae4f35 | |||
bb3f7d3786 | |||
f7cc305e44 | |||
da17f89148 | |||
ec71ab3c6f | |||
0d007f1492 | |||
96f8663b8f | |||
1a4bc1b301 | |||
b51ae58a97 | |||
b126fc32da | |||
b8d234c415 | |||
2c8902d404 | |||
80ad65b196 | |||
744d9ba72b | |||
0c1d708588 | |||
95e79e7c5d | |||
3ce3260d20 | |||
641f4f34d3 | |||
99620cb1c5 | |||
8f5f33f5d2 | |||
78e9230b82 | |||
78aa44c007 | |||
53fd944f00 | |||
9e6cb4ee3d | |||
87ad6f2826 | |||
9050f5a56f | |||
3437004082 | |||
dcf620af87 | |||
128085a02e | |||
302040ec25 | |||
e177c22032 | |||
a11007113a | |||
5e7897bcf4 | |||
9559af3637 | |||
4c499abcdb | |||
0055a503b3 | |||
3a189ee4b6 | |||
e25dc49271 | |||
4208a80db8 | |||
ddb75e0d93 | |||
8b37e992a2 | |||
bac59036cd | |||
6c89a3b77c | |||
dc2ef39fc6 | |||
a4806da2c5 | |||
ee30edb214 | |||
e4ed663fb3 | |||
01629309b0 | |||
059c2991fb | |||
686ec5dd90 | |||
eab9df8ed9 | |||
0107c3d7e2 | |||
2def2f2e2c | |||
44c79892a0 | |||
bc96b314c2 | |||
8dcf749b4e | |||
6a56ec6442 | |||
30e46d7eae | |||
9458b1834b | |||
297f797b97 | |||
c70e80758c | |||
3bf1d7c4f9 | |||
173247041a | |||
3a28772096 | |||
bd08b8aba3 | |||
2ceb0f988b | |||
4ef3b155b8 | |||
350e24cded | |||
1bf8a578bc | |||
4818a101cc | |||
baebf938ef | |||
fea57c7b1e |
3
.github/CONTRIBUTING.md
vendored
@ -8,7 +8,7 @@ Please read the guidelines before contributing, and follow them (or try to) when
|
|||||||
|
|
||||||
### What you can do to help.
|
### What you can do to help.
|
||||||
|
|
||||||
There are many ways to contribute to this project, you could report bugs, request missing features, suggest enhancements and changes to existing ones. You also can improve the README with useful tips that could help the other users.
|
There are many ways to contribute to this project, you could [translate the app](https://crowdin.com/project/readerforselfoss), report bugs, request missing features, suggest enhancements and changes to existing ones. You also can improve the README with useful tips that could help the other users.
|
||||||
|
|
||||||
You can fork the repository, and [help me solve some issues](https://github.com/aminecmi/ReaderforSelfoss/issues?q=is%3Aissue+is%3Aopen+label%3A%22Up+For+Grabs%22) or [develop new things](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
You can fork the repository, and [help me solve some issues](https://github.com/aminecmi/ReaderforSelfoss/issues?q=is%3Aissue+is%3Aopen+label%3A%22Up+For+Grabs%22) or [develop new things](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
||||||
|
|
||||||
@ -28,6 +28,7 @@ Always check if the web version of your instance is working.
|
|||||||
|
|
||||||
### Pull requests
|
### Pull requests
|
||||||
|
|
||||||
|
* Don't create a PR for translations. See [here](https://github.com/aminecmi/ReaderforSelfoss/pull/170#issuecomment-355715654) for an explanation why.
|
||||||
* Please ask before starting to work on an issue. I may be working on it, or someone else could be doing so.
|
* Please ask before starting to work on an issue. I may be working on it, or someone else could be doing so.
|
||||||
* Each pull request should implement **ONE** feature or bugfix. Keep in mind that you can submit as many PR as you want.
|
* Each pull request should implement **ONE** feature or bugfix. Keep in mind that you can submit as many PR as you want.
|
||||||
* Your code must be simple and clear enough to avoid using comments to explain what it does.
|
* Your code must be simple and clear enough to avoid using comments to explain what it does.
|
||||||
|
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -5,6 +5,7 @@
|
|||||||
- [ ] I have updated the documentation accordingly.
|
- [ ] I have updated the documentation accordingly.
|
||||||
- [ ] I have added tests to cover my changes.
|
- [ ] I have added tests to cover my changes.
|
||||||
- [ ] All new and existing tests passed.
|
- [ ] All new and existing tests passed.
|
||||||
|
- [ ] This is **NOT** translation related. (See [here](https://github.com/aminecmi/ReaderforSelfoss/pull/170#issuecomment-355715654))
|
||||||
|
|
||||||
This closes issue #XXX
|
This closes issue #XXX
|
||||||
|
|
||||||
|
56
CHANGELOG.md
@ -1,3 +1,59 @@
|
|||||||
|
**1.5.7.x**
|
||||||
|
|
||||||
|
- Added confirmation to the mark as read and update menues.
|
||||||
|
|
||||||
|
- Add to favorites from article viewer.
|
||||||
|
|
||||||
|
- Added an option to use a webview in the article viewer (see #149)
|
||||||
|
|
||||||
|
- Fixes (#151 #152 #155 #157 #160 #174) and more.
|
||||||
|
|
||||||
|
- New year fixes !!!
|
||||||
|
|
||||||
|
- Changed page indicator position as it was overlaping content.
|
||||||
|
|
||||||
|
- Now using slack instead of gitter.
|
||||||
|
|
||||||
|
- Moved completely to a webview to fix #161.
|
||||||
|
|
||||||
|
- Fixed typos in French ( Thanks @aancel )
|
||||||
|
|
||||||
|
- Updated the Contribution guide about translations.
|
||||||
|
|
||||||
|
- Better handling for articles update. (See #169)
|
||||||
|
|
||||||
|
- Ability to change the article viewer content font size (see #153)
|
||||||
|
|
||||||
|
- Versions updates * 2.
|
||||||
|
|
||||||
|
- Added padding to the recyclerview.
|
||||||
|
|
||||||
|
**1.5.5.x (didn't last long) AND 1.5.6.x**
|
||||||
|
|
||||||
|
- Toolbar in reader activity.
|
||||||
|
|
||||||
|
- Marking items as read on scroll (with settings to enable/disable).
|
||||||
|
|
||||||
|
- Swapped the title and subtitle in the article viewer.
|
||||||
|
|
||||||
|
- Added an animation to the viewpager.
|
||||||
|
|
||||||
|
- Completed Dutch, Indonesian and Portuguese translations !
|
||||||
|
|
||||||
|
- Fixed #142, #144, #147.
|
||||||
|
|
||||||
|
- Changed versions handling.
|
||||||
|
|
||||||
|
- Removed indonesian english as it was causing issues with the english version of the app.
|
||||||
|
|
||||||
|
**1.5.4.22**
|
||||||
|
|
||||||
|
- You can now scroll through the loaded articles !
|
||||||
|
|
||||||
|
**1.5.4.21**
|
||||||
|
|
||||||
|
- Spanish translation and some Indonesian !
|
||||||
|
|
||||||
**1.5.4.20**
|
**1.5.4.20**
|
||||||
|
|
||||||
- Turkish translation !
|
- Turkish translation !
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
# ReaderForSelfoss
|
# ReaderForSelfoss
|
||||||
|
|
||||||
[](https://crowdin.com/project/readerforselfoss) [](https://gitter.im/amine-bou/ReaderForSelfoss)
|
[](https://join.slack.com/t/readerforselfoss/shared_invite/enQtMjkyNzc3NjM2Mjc1LTUzZTZhOGM5YjQ1MTI5MWZiODRjMjE1ZDBmMzQxZmQ3NWZhYTNhMTBjNGEwNmE2ZGFjODU5NjUxZjBkMWJmMDQ)
|
||||||
|
|
||||||
[](http://jenkins.amine-bou.fr/job/ReaderForSelfoss/)
|
[](http://jenkins.amine-bou.fr/job/ReaderForSelfoss/)
|
||||||
|
|
||||||
[](https://www.codetriage.com/aminecmi/readerforselfoss)
|
[](https://www.codetriage.com/aminecmi/readerforselfoss)
|
||||||
|
|
||||||
|
[](https://crowdin.com/project/readerforselfoss)
|
||||||
|
|
||||||
This is the repo of [Reader For Selfoss](https://play.google.com/store/apps/details?id=apps.amine.bou.readerforselfoss&hl=en).
|
This is the repo of [Reader For Selfoss](https://play.google.com/store/apps/details?id=apps.amine.bou.readerforselfoss&hl=en).
|
||||||
|
|
||||||
It's an RSS Reader for Android, that **only** works with [Selfoss](https://selfoss.aditu.de/)
|
It's an RSS Reader for Android, that **only** works with [Selfoss](https://selfoss.aditu.de/)
|
||||||
@ -23,4 +25,4 @@ Check the [Contribution guide](https://github.com/aminecmi/ReaderforSelfoss/blob
|
|||||||
- [See what I'm doing](https://github.com/aminecmi/ReaderforSelfoss/projects/1)
|
- [See what I'm doing](https://github.com/aminecmi/ReaderforSelfoss/projects/1)
|
||||||
- [Create an issue, or request a new feature](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
- [Create an issue, or request a new feature](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
||||||
- [Help translation the app](https://crowdin.com/project/readerforselfoss)
|
- [Help translation the app](https://crowdin.com/project/readerforselfoss)
|
||||||
- [Ask for help](https://gitter.im/amine-bou/ReaderForSelfoss)
|
- [Ask for help](https://join.slack.com/t/readerforselfoss/shared_invite/enQtMjkyNzc3NjM2Mjc1LTUzZTZhOGM5YjQ1MTI5MWZiODRjMjE1ZDBmMzQxZmQ3NWZhYTNhMTBjNGEwNmE2ZGFjODU5NjUxZjBkMWJmMDQ)
|
||||||
|
110
app/build.gradle
@ -8,23 +8,33 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ext {
|
||||||
|
configuration = [
|
||||||
|
buildDate: new Date()
|
||||||
|
]
|
||||||
|
// This will make me able to build multiple times a day. May break thinks. I may forget it.
|
||||||
|
todaysBuilds = "1"
|
||||||
|
}
|
||||||
|
|
||||||
def gitVersion() {
|
def gitVersion() {
|
||||||
def process = "git describe --abbrev=0 --tags".execute()
|
def process = "git describe --abbrev=0 --tags".execute()
|
||||||
return process.text.substring(1).replaceAll("\\.", "")
|
return process.text.substring(1).replaceAll("\\.", "").trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
def versionCodeFromGit() {
|
def versionCodeFromGit() {
|
||||||
println "version code " + gitVersion().toInteger()
|
def dayInYear = ext.configuration.buildDate.format("D").padLeft(3, '0')
|
||||||
return gitVersion().toInteger()
|
def versionCode = gitVersion() + (ext.configuration.buildDate.format("yyMM") + dayInYear + ext.todaysBuilds).toInteger()
|
||||||
|
println "version code " + versionCode
|
||||||
|
return versionCode.toInteger()
|
||||||
}
|
}
|
||||||
|
|
||||||
def versionNameFromGit() {
|
def versionNameFromGit() {
|
||||||
println "version code " + gitVersion().trim()
|
def dayInYear = ext.configuration.buildDate.format("D").padLeft(3, '0')
|
||||||
return gitVersion().trim()
|
def versionName = gitVersion() + ext.configuration.buildDate.format('yyMM') + dayInYear + ext.todaysBuilds
|
||||||
|
println "version name " + versionName
|
||||||
|
return versionName
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'org.sonarqube'
|
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
apply plugin: 'io.fabric'
|
apply plugin: 'io.fabric'
|
||||||
@ -41,7 +51,7 @@ repositories {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 27
|
compileSdkVersion 27
|
||||||
buildToolsVersion '27.0.0'
|
buildToolsVersion '27.0.3'
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "apps.amine.bou.readerforselfoss"
|
applicationId "apps.amine.bou.readerforselfoss"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
@ -88,6 +98,7 @@ android {
|
|||||||
buildConfigField "boolean", "GITHUB_VERSION", "true"
|
buildConfigField "boolean", "GITHUB_VERSION", "true"
|
||||||
}
|
}
|
||||||
storeConfig {
|
storeConfig {
|
||||||
|
// As jenkins publishes to alpha first, this is the default suffix now.
|
||||||
versionNameSuffix '-store'
|
versionNameSuffix '-store'
|
||||||
dimension "build"
|
dimension "build"
|
||||||
buildConfigField "boolean", "GITHUB_VERSION", "false"
|
buildConfigField "boolean", "GITHUB_VERSION", "false"
|
||||||
@ -97,79 +108,82 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// Testing
|
// Testing
|
||||||
androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.1'
|
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
|
||||||
androidTestCompile 'com.android.support.test:runner:1.0.1'
|
androidTestImplementation 'com.android.support.test:runner:1.0.1'
|
||||||
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
|
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
|
||||||
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:3.0.1'
|
androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.1'
|
||||||
// Espresso-intents for validation and stubbing of Intents
|
// Espresso-intents for validation and stubbing of Intents
|
||||||
androidTestCompile 'com.android.support.test.espresso:espresso-intents:3.0.1'
|
androidTestImplementation 'com.android.support.test.espresso:espresso-intents:3.0.1'
|
||||||
|
|
||||||
|
|
||||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
|
|
||||||
// Android Support
|
// Android Support
|
||||||
compile 'com.android.support:appcompat-v7:27.0.0'
|
implementation 'com.android.support:appcompat-v7:27.1.1'
|
||||||
compile 'com.android.support:design:27.0.0'
|
implementation 'com.android.support:design:27.1.1'
|
||||||
compile 'com.android.support:recyclerview-v7:27.0.0'
|
implementation 'com.android.support:recyclerview-v7:27.1.1'
|
||||||
compile 'com.android.support:support-v4:27.0.0'
|
implementation 'com.android.support:support-v4:27.1.1'
|
||||||
compile 'com.android.support:support-vector-drawable:27.0.0'
|
implementation 'com.android.support:support-vector-drawable:27.1.1'
|
||||||
compile 'com.android.support:customtabs:27.0.0'
|
implementation 'com.android.support:customtabs:27.1.1'
|
||||||
compile 'com.android.support:cardview-v7:27.0.0'
|
implementation 'com.android.support:cardview-v7:27.1.1'
|
||||||
compile 'com.android.support.constraint:constraint-layout:1.0.2'
|
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
|
||||||
|
|
||||||
// Firebase + crashlytics
|
// Firebase + crashlytics
|
||||||
compile 'com.google.firebase:firebase-core:11.4.2'
|
implementation 'com.google.firebase:firebase-core:12.0.1'
|
||||||
compile 'com.google.firebase:firebase-config:11.4.2'
|
implementation 'com.google.firebase:firebase-config:12.0.1'
|
||||||
compile 'com.google.firebase:firebase-invites:11.4.2'
|
implementation 'com.google.firebase:firebase-invites:12.0.1'
|
||||||
compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
|
implementation('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
|
||||||
transitive = true;
|
transitive = true
|
||||||
}
|
}
|
||||||
|
|
||||||
//multidex
|
//multidex
|
||||||
compile 'com.android.support:multidex:1.0.2'
|
implementation 'com.android.support:multidex:1.0.3'
|
||||||
|
|
||||||
// Intro
|
// Intro
|
||||||
compile 'agency.tango.android:material-intro-screen:0.0.5'
|
implementation 'agency.tango.android:material-intro-screen:0.0.5'
|
||||||
|
|
||||||
// About
|
// About
|
||||||
compile('com.mikepenz:aboutlibraries:6.0.0@aar') {
|
implementation('com.mikepenz:aboutlibraries:6.0.0@aar') {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrofit + http logging + okhttp
|
// Retrofit + http logging + okhttp
|
||||||
compile 'com.squareup.retrofit2:retrofit:2.3.0'
|
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
|
||||||
compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'
|
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
|
||||||
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
|
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
|
||||||
compile 'com.burgstaller:okhttp-digest:1.12'
|
implementation 'com.burgstaller:okhttp-digest:1.12'
|
||||||
|
|
||||||
// Material-ish things
|
// Material-ish things
|
||||||
compile 'com.ashokvarma.android:bottom-navigation-bar:2.0.3'
|
implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.3'
|
||||||
compile 'com.github.jd-alexander:LikeButton:0.2.1'
|
implementation 'com.github.jd-alexander:LikeButton:0.2.1'
|
||||||
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
|
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
|
||||||
compile 'org.sufficientlysecure:html-textview:3.5'
|
|
||||||
|
|
||||||
// glide
|
// glide
|
||||||
compile 'com.github.bumptech.glide:glide:4.1.1'
|
implementation 'com.github.bumptech.glide:glide:4.1.1'
|
||||||
compile 'com.github.bumptech.glide:okhttp3-integration:4.1.1'
|
implementation 'com.github.bumptech.glide:okhttp3-integration:4.1.1'
|
||||||
|
|
||||||
// Asking politely users to rate the app
|
// Asking politely users to rate the app
|
||||||
compile 'com.github.stkent:amplify:2.1.0'
|
implementation 'com.github.stkent:amplify:2.1.0'
|
||||||
|
|
||||||
// For the article reader
|
|
||||||
compile 'com.klinkerapps:drag-dismiss-activity:1.5.0'
|
|
||||||
|
|
||||||
// Drawer
|
// Drawer
|
||||||
implementation 'co.zsmb:materialdrawer-kt:1.2.1'
|
implementation 'co.zsmb:materialdrawer-kt:1.2.1'
|
||||||
compile 'com.anupcowkur:reservoir:3.1.0'
|
implementation 'com.anupcowkur:reservoir:3.1.0'
|
||||||
|
|
||||||
// Themes
|
// Themes
|
||||||
compile 'com.52inc:scoops:1.0.0'
|
implementation 'com.52inc:scoops:1.0.0'
|
||||||
|
implementation'com.jrummyapps:colorpicker:2.1.7'
|
||||||
|
|
||||||
// Github issues reporter
|
// Github issues reporter
|
||||||
compile 'com.heinrichreimersoftware:android-issue-reporter:1.3.1'
|
implementation 'com.heinrichreimersoftware:android-issue-reporter:1.3.1'
|
||||||
|
|
||||||
|
implementation 'com.github.rubensousa:floatingtoolbar:1.5.1'
|
||||||
|
|
||||||
|
// Pager
|
||||||
|
implementation 'me.relex:circleindicator:1.2.2@aar'
|
||||||
|
|
||||||
|
implementation 'androidx.core:core-ktx:0.3'
|
||||||
|
|
||||||
compile 'com.github.rubensousa:floatingtoolbar:1.5.1'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
|
8
app/proguard-rules.pro
vendored
@ -48,7 +48,11 @@
|
|||||||
#}
|
#}
|
||||||
-dontwarn okio.**
|
-dontwarn okio.**
|
||||||
-dontwarn retrofit2.Platform$Java8
|
-dontwarn retrofit2.Platform$Java8
|
||||||
-keepattributes Signature
|
-keep class retrofit.** { *; }
|
||||||
|
-keepclasseswithmembers class * {
|
||||||
|
@retrofit.http.* <methods>;
|
||||||
|
}
|
||||||
|
-keepattributes *Annotation*,Signature
|
||||||
-keepattributes Exceptions
|
-keepattributes Exceptions
|
||||||
-dontwarn okio.**
|
-dontwarn okio.**
|
||||||
-dontwarn javax.annotation.Nullable
|
-dontwarn javax.annotation.Nullable
|
||||||
@ -70,3 +74,5 @@
|
|||||||
-dontwarn com.anupcowkur.reservoir.**
|
-dontwarn com.anupcowkur.reservoir.**
|
||||||
|
|
||||||
-dontwarn javax.annotation.**
|
-dontwarn javax.annotation.**
|
||||||
|
|
||||||
|
-keep class android.support.v7.widget.SearchView { *; }
|
@ -1,9 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="apps.amine.bou.readerforselfoss">
|
package="apps.amine.bou.readerforselfoss"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
<!-- Remove unwanted permissions from Crashlytics.. see https://www.reddit.com/r/androiddev/comments/86c02l/google_play_services_1200_released/dw4ehln/?context=0 -->
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
|
||||||
|
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
|
||||||
|
|
||||||
<!-- For firebase only -->
|
<!-- For firebase only -->
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
@ -71,6 +77,14 @@
|
|||||||
<meta-data
|
<meta-data
|
||||||
android:name="apps.amine.bou.readerforselfoss.utils.glide.SelfSignedGlideModule"
|
android:name="apps.amine.bou.readerforselfoss.utils.glide.SelfSignedGlideModule"
|
||||||
android:value="GlideModule" />
|
android:value="GlideModule" />
|
||||||
|
|
||||||
|
<meta-data android:name="android.webkit.WebView.MetricsOptOut"
|
||||||
|
android:value="true" />
|
||||||
|
|
||||||
|
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
|
||||||
|
android:value="true" />
|
||||||
|
|
||||||
|
<meta-data android:name="android.max_aspect" android:value="2.1" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -1,6 +1,7 @@
|
|||||||
package apps.amine.bou.readerforselfoss
|
package apps.amine.bou.readerforselfoss
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.constraint.ConstraintLayout
|
import android.support.constraint.ConstraintLayout
|
||||||
@ -16,6 +17,8 @@ import android.widget.Toast
|
|||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Spout
|
import apps.amine.bou.readerforselfoss.api.selfoss.Spout
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.Toppings
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid
|
import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
@ -23,22 +26,62 @@ import kotlinx.android.synthetic.main.activity_add_source.*
|
|||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
|
import android.graphics.PorterDuff
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AddSourceActivity : AppCompatActivity() {
|
class AddSourceActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private var mSpoutsValue: String? = null
|
private var mSpoutsValue: String? = null
|
||||||
|
private lateinit var api: SelfossApi
|
||||||
|
|
||||||
|
private lateinit var appColors: AppColors
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
appColors = AppColors(this@AddSourceActivity)
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
|
||||||
setContentView(R.layout.activity_add_source)
|
setContentView(R.layout.activity_add_source)
|
||||||
|
|
||||||
|
// TODO: input bubble cursor
|
||||||
|
Scoop.getInstance()
|
||||||
|
.bind(this, Toppings.PRIMARY.value, toolbar)
|
||||||
|
.bindStatusBar(this, Toppings.PRIMARY_DARK.value)
|
||||||
|
|
||||||
|
val drawable = nameInput.background
|
||||||
|
drawable.setColorFilter(appColors.colorAccent, PorterDuff.Mode.SRC_ATOP)
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: clean
|
||||||
|
if(Build.VERSION.SDK_INT > 16) {
|
||||||
|
nameInput.background = drawable
|
||||||
|
} else{
|
||||||
|
nameInput.setBackgroundDrawable(drawable)
|
||||||
|
}
|
||||||
|
|
||||||
|
val drawable1 = sourceUri.background
|
||||||
|
drawable1.setColorFilter(appColors.colorAccent, PorterDuff.Mode.SRC_ATOP)
|
||||||
|
|
||||||
|
if(Build.VERSION.SDK_INT > 16) {
|
||||||
|
sourceUri.background = drawable1
|
||||||
|
} else{
|
||||||
|
sourceUri.setBackgroundDrawable(drawable1)
|
||||||
|
}
|
||||||
|
|
||||||
|
val drawable2 = tags.background
|
||||||
|
drawable2.setColorFilter(appColors.colorAccent, PorterDuff.Mode.SRC_ATOP)
|
||||||
|
|
||||||
|
if(Build.VERSION.SDK_INT > 16) {
|
||||||
|
tags.background = drawable2
|
||||||
|
} else{
|
||||||
|
tags.setBackgroundDrawable(drawable2)
|
||||||
|
}
|
||||||
|
|
||||||
setSupportActionBar(toolbar)
|
setSupportActionBar(toolbar)
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
supportActionBar?.setDisplayShowHomeEnabled(true)
|
supportActionBar?.setDisplayShowHomeEnabled(true)
|
||||||
|
|
||||||
var api: SelfossApi? = null
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
api = SelfossApi(
|
api = SelfossApi(
|
||||||
@ -53,10 +96,15 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
maybeGetDetailsFromIntentSharing(intent, sourceUri, nameInput)
|
maybeGetDetailsFromIntentSharing(intent, sourceUri, nameInput)
|
||||||
|
|
||||||
|
saveBtn.setTextColor(appColors.colorAccent)
|
||||||
|
|
||||||
saveBtn.setOnClickListener {
|
saveBtn.setOnClickListener {
|
||||||
handleSaveSource(tags, nameInput.text.toString(), sourceUri.text.toString(), api!!)
|
handleSaveSource(tags, nameInput.text.toString(), sourceUri.text.toString(), api!!)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
val config = Config(this)
|
val config = Config(this)
|
||||||
|
|
||||||
if (config.baseUrl.isEmpty() || !config.baseUrl.isBaseUrlValid()) {
|
if (config.baseUrl.isEmpty() || !config.baseUrl.isBaseUrlValid()) {
|
||||||
@ -74,10 +122,12 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
) {
|
) {
|
||||||
val spoutsKV = HashMap<String, String>()
|
val spoutsKV = HashMap<String, String>()
|
||||||
spoutsSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
spoutsSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||||
override fun onItemSelected(adapterView: AdapterView<*>, view: View, i: Int, l: Long) {
|
override fun onItemSelected(adapterView: AdapterView<*>, view: View?, i: Int, l: Long) {
|
||||||
|
if (view != null) {
|
||||||
val spoutName = (view as TextView).text.toString()
|
val spoutName = (view as TextView).text.toString()
|
||||||
mSpoutsValue = spoutsKV[spoutName]
|
mSpoutsValue = spoutsKV[spoutName]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onNothingSelected(adapterView: AdapterView<*>) {
|
override fun onNothingSelected(adapterView: AdapterView<*>) {
|
||||||
mSpoutsValue = null
|
mSpoutsValue = null
|
||||||
@ -95,7 +145,7 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
val itemsStrings = items.map { it.value.name }
|
val itemsStrings = items.map { it.value.name }
|
||||||
for ((key, value) in items) {
|
for ((key, value) in items) {
|
||||||
spoutsKV.put(value.name, key)
|
spoutsKV[value.name] = key
|
||||||
}
|
}
|
||||||
|
|
||||||
mProgress.visibility = View.GONE
|
mProgress.visibility = View.GONE
|
||||||
@ -149,7 +199,8 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private fun handleSaveSource(tags: EditText, title: String, url: String, api: SelfossApi) {
|
private fun handleSaveSource(tags: EditText, title: String, url: String, api: SelfossApi) {
|
||||||
|
|
||||||
val sourceDetailsAvailable = title.isEmpty() || url.isEmpty() || mSpoutsValue == null || mSpoutsValue!!.isEmpty()
|
val sourceDetailsAvailable =
|
||||||
|
title.isEmpty() || url.isEmpty() || mSpoutsValue == null || mSpoutsValue!!.isEmpty()
|
||||||
|
|
||||||
if (sourceDetailsAvailable) {
|
if (sourceDetailsAvailable) {
|
||||||
Toast.makeText(this, R.string.form_not_complete, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, R.string.form_not_complete, Toast.LENGTH_SHORT).show()
|
||||||
|
@ -10,6 +10,7 @@ import android.net.Uri
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.v4.view.MenuItemCompat
|
import android.support.v4.view.MenuItemCompat
|
||||||
|
import android.support.v7.app.AlertDialog
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.support.v7.widget.DividerItemDecoration
|
import android.support.v7.widget.DividerItemDecoration
|
||||||
import android.support.v7.widget.GridLayoutManager
|
import android.support.v7.widget.GridLayoutManager
|
||||||
@ -17,13 +18,13 @@ import android.support.v7.widget.RecyclerView
|
|||||||
import android.support.v7.widget.SearchView
|
import android.support.v7.widget.SearchView
|
||||||
import android.support.v7.widget.StaggeredGridLayoutManager
|
import android.support.v7.widget.StaggeredGridLayoutManager
|
||||||
import android.support.v7.widget.helper.ItemTouchHelper
|
import android.support.v7.widget.helper.ItemTouchHelper
|
||||||
import android.util.Log
|
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import apps.amine.bou.readerforselfoss.adapters.ItemCardAdapter
|
import apps.amine.bou.readerforselfoss.adapters.ItemCardAdapter
|
||||||
import apps.amine.bou.readerforselfoss.adapters.ItemListAdapter
|
import apps.amine.bou.readerforselfoss.adapters.ItemListAdapter
|
||||||
|
import apps.amine.bou.readerforselfoss.adapters.ItemsAdapter
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Sources
|
import apps.amine.bou.readerforselfoss.api.selfoss.Sources
|
||||||
@ -32,12 +33,14 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
|||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Tag
|
import apps.amine.bou.readerforselfoss.api.selfoss.Tag
|
||||||
import apps.amine.bou.readerforselfoss.settings.SettingsActivity
|
import apps.amine.bou.readerforselfoss.settings.SettingsActivity
|
||||||
import apps.amine.bou.readerforselfoss.themes.AppColors
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.Toppings
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import apps.amine.bou.readerforselfoss.utils.bottombar.maybeShow
|
import apps.amine.bou.readerforselfoss.utils.bottombar.maybeShow
|
||||||
import apps.amine.bou.readerforselfoss.utils.bottombar.removeBadge
|
import apps.amine.bou.readerforselfoss.utils.bottombar.removeBadge
|
||||||
import apps.amine.bou.readerforselfoss.utils.checkApkVersion
|
import apps.amine.bou.readerforselfoss.utils.checkApkVersion
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
import apps.amine.bou.readerforselfoss.utils.drawer.CustomUrlPrimaryDrawerItem
|
import apps.amine.bou.readerforselfoss.utils.drawer.CustomUrlPrimaryDrawerItem
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.flattenTags
|
||||||
import apps.amine.bou.readerforselfoss.utils.longHash
|
import apps.amine.bou.readerforselfoss.utils.longHash
|
||||||
import co.zsmb.materialdrawerkt.builders.accountHeader
|
import co.zsmb.materialdrawerkt.builders.accountHeader
|
||||||
import co.zsmb.materialdrawerkt.builders.drawer
|
import co.zsmb.materialdrawerkt.builders.drawer
|
||||||
@ -65,6 +68,7 @@ import com.mikepenz.aboutlibraries.Libs
|
|||||||
import com.mikepenz.aboutlibraries.LibsBuilder
|
import com.mikepenz.aboutlibraries.LibsBuilder
|
||||||
import com.mikepenz.materialdrawer.Drawer
|
import com.mikepenz.materialdrawer.Drawer
|
||||||
import com.mikepenz.materialdrawer.holder.BadgeStyle
|
import com.mikepenz.materialdrawer.holder.BadgeStyle
|
||||||
|
import com.mikepenz.materialdrawer.holder.StringHolder
|
||||||
import com.mikepenz.materialdrawer.model.DividerDrawerItem
|
import com.mikepenz.materialdrawer.model.DividerDrawerItem
|
||||||
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem
|
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem
|
||||||
import com.mikepenz.materialdrawer.model.SecondaryDrawerItem
|
import com.mikepenz.materialdrawer.model.SecondaryDrawerItem
|
||||||
@ -86,8 +90,11 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
private val FAV_SHOWN = 3
|
private val FAV_SHOWN = 3
|
||||||
|
|
||||||
private var items: ArrayList<Item> = ArrayList()
|
private var items: ArrayList<Item> = ArrayList()
|
||||||
|
private var allItems: ArrayList<Item> = ArrayList()
|
||||||
|
|
||||||
private var clickBehavior = false
|
private var clickBehavior = false
|
||||||
private var debugReadingItems = false
|
private var debugReadingItems = false
|
||||||
|
private var shouldLogEverything = false
|
||||||
private var internalBrowser = false
|
private var internalBrowser = false
|
||||||
private var articleViewer = false
|
private var articleViewer = false
|
||||||
private var shouldBeCardView = false
|
private var shouldBeCardView = false
|
||||||
@ -104,6 +111,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
private var infiniteScroll: Boolean = false
|
private var infiniteScroll: Boolean = false
|
||||||
private var lastFetchDone: Boolean = false
|
private var lastFetchDone: Boolean = false
|
||||||
|
|
||||||
|
|
||||||
private lateinit var tabNewBadge: TextBadgeItem
|
private lateinit var tabNewBadge: TextBadgeItem
|
||||||
private lateinit var tabArchiveBadge: TextBadgeItem
|
private lateinit var tabArchiveBadge: TextBadgeItem
|
||||||
private lateinit var tabStarredBadge: TextBadgeItem
|
private lateinit var tabStarredBadge: TextBadgeItem
|
||||||
@ -119,10 +127,15 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
private var recyclerViewScrollListener: RecyclerView.OnScrollListener? = null
|
private var recyclerViewScrollListener: RecyclerView.OnScrollListener? = null
|
||||||
private lateinit var settings: SharedPreferences
|
private lateinit var settings: SharedPreferences
|
||||||
|
|
||||||
|
private var recyclerAdapter: RecyclerView.Adapter<*>? = null
|
||||||
|
|
||||||
private var badgeNew: Int = -1
|
private var badgeNew: Int = -1
|
||||||
private var badgeAll: Int = -1
|
private var badgeAll: Int = -1
|
||||||
private var badgeFavs: Int = -1
|
private var badgeFavs: Int = -1
|
||||||
|
|
||||||
|
|
||||||
|
private lateinit var tagsBadge: Map<Long, Int>
|
||||||
|
|
||||||
data class DrawerData(val tags: List<Tag>?, val sources: List<Sources>?)
|
data class DrawerData(val tags: List<Tag>?, val sources: List<Sources>?)
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
@ -131,10 +144,14 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
appColors = AppColors(this@HomeActivity)
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
|
||||||
setContentView(R.layout.activity_home)
|
setContentView(R.layout.activity_home)
|
||||||
|
|
||||||
|
handleThemeBinding()
|
||||||
|
|
||||||
setSupportActionBar(toolBar)
|
setSupportActionBar(toolBar)
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
Amplify.getSharedInstance().promptIfReady(promptView)
|
Amplify.getSharedInstance().promptIfReady(promptView)
|
||||||
@ -145,23 +162,21 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
customTabActivityHelper = CustomTabActivityHelper()
|
customTabActivityHelper = CustomTabActivityHelper()
|
||||||
|
|
||||||
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
|
||||||
sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
|
sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
|
|
||||||
api = SelfossApi(
|
api = SelfossApi(
|
||||||
this,
|
this,
|
||||||
this@HomeActivity,
|
this@HomeActivity,
|
||||||
settings.getBoolean("isSelfSignedCert", false),
|
settings.getBoolean("isSelfSignedCert", false),
|
||||||
sharedPref.getBoolean("should_log_everything", false)
|
shouldLogEverything
|
||||||
)
|
)
|
||||||
items = ArrayList()
|
items = ArrayList()
|
||||||
|
allItems = ArrayList()
|
||||||
appColors = AppColors(this@HomeActivity)
|
|
||||||
|
|
||||||
handleBottomBar()
|
handleBottomBar()
|
||||||
handleDrawer()
|
handleDrawer()
|
||||||
|
|
||||||
reloadLayoutManager()
|
|
||||||
handleSwipeRefreshLayout()
|
handleSwipeRefreshLayout()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,11 +216,12 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
): Boolean = false
|
): Boolean = false
|
||||||
|
|
||||||
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, swipeDir: Int) {
|
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, swipeDir: Int) {
|
||||||
try {
|
val position = viewHolder.adapterPosition
|
||||||
val i = items[viewHolder.adapterPosition]
|
val i = items.elementAtOrNull(position)
|
||||||
val position = items.indexOf(i)
|
|
||||||
|
|
||||||
|
if (i != null) {
|
||||||
val adapter = recyclerView.adapter
|
val adapter = recyclerView.adapter
|
||||||
|
|
||||||
when (adapter) {
|
when (adapter) {
|
||||||
is ItemCardAdapter -> adapter.removeItemAtIndex(position)
|
is ItemCardAdapter -> adapter.removeItemAtIndex(position)
|
||||||
is ItemListAdapter -> adapter.removeItemAtIndex(position)
|
is ItemListAdapter -> adapter.removeItemAtIndex(position)
|
||||||
@ -214,6 +230,16 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
if (items.size > 0) {
|
if (items.size > 0) {
|
||||||
badgeNew--
|
badgeNew--
|
||||||
reloadBadgeContent()
|
reloadBadgeContent()
|
||||||
|
|
||||||
|
val tagHashes = i.tags.split(",").map { it.longHash() }
|
||||||
|
tagsBadge = tagsBadge.map {
|
||||||
|
if (tagHashes.contains(it.key)) {
|
||||||
|
(it.key to (it.value - 1))
|
||||||
|
} else {
|
||||||
|
(it.key to it.value)
|
||||||
|
}
|
||||||
|
}.toMap()
|
||||||
|
reloadTagsBadges()
|
||||||
} else {
|
} else {
|
||||||
tabNewBadge.hide()
|
tabNewBadge.hide()
|
||||||
}
|
}
|
||||||
@ -239,14 +265,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
offsetOverride = lastVisibleItem
|
offsetOverride = lastVisibleItem
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} catch (e: IndexOutOfBoundsException) {
|
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
|
||||||
Crashlytics.log(
|
|
||||||
100,
|
|
||||||
"SWIPE_INDEX_OUT_OF_BOUND",
|
|
||||||
"IndexOutOfBoundsException when swiping"
|
|
||||||
)
|
|
||||||
Crashlytics.logException(e)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -259,27 +277,27 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
tabNewBadge = TextBadgeItem()
|
tabNewBadge = TextBadgeItem()
|
||||||
.setText("")
|
.setText("")
|
||||||
.setHideOnSelect(false).hide(false)
|
.setHideOnSelect(false).hide(false)
|
||||||
.setBackgroundColor(appColors.primary)
|
.setBackgroundColor(appColors.colorPrimary)
|
||||||
tabArchiveBadge = TextBadgeItem()
|
tabArchiveBadge = TextBadgeItem()
|
||||||
.setText("")
|
.setText("")
|
||||||
.setHideOnSelect(false).hide(false)
|
.setHideOnSelect(false).hide(false)
|
||||||
.setBackgroundColor(appColors.primary)
|
.setBackgroundColor(appColors.colorPrimary)
|
||||||
tabStarredBadge = TextBadgeItem()
|
tabStarredBadge = TextBadgeItem()
|
||||||
.setText("")
|
.setText("")
|
||||||
.setHideOnSelect(false).hide(false)
|
.setHideOnSelect(false).hide(false)
|
||||||
.setBackgroundColor(appColors.primary)
|
.setBackgroundColor(appColors.colorPrimary)
|
||||||
|
|
||||||
val tabNew =
|
val tabNew =
|
||||||
BottomNavigationItem(
|
BottomNavigationItem(
|
||||||
R.drawable.ic_fiber_new_black_24dp,
|
R.drawable.ic_fiber_new_black_24dp,
|
||||||
getString(R.string.tab_new)
|
getString(R.string.tab_new)
|
||||||
).setActiveColor(appColors.accent)
|
).setActiveColor(appColors.colorAccent)
|
||||||
.setBadgeItem(tabNewBadge)
|
.setBadgeItem(tabNewBadge)
|
||||||
val tabArchive =
|
val tabArchive =
|
||||||
BottomNavigationItem(
|
BottomNavigationItem(
|
||||||
R.drawable.ic_archive_black_24dp,
|
R.drawable.ic_archive_black_24dp,
|
||||||
getString(R.string.tab_read)
|
getString(R.string.tab_read)
|
||||||
).setActiveColor(appColors.dark)
|
).setActiveColor(appColors.colorAccentDark)
|
||||||
.setBadgeItem(tabArchiveBadge)
|
.setBadgeItem(tabArchiveBadge)
|
||||||
val tabStarred =
|
val tabStarred =
|
||||||
BottomNavigationItem(
|
BottomNavigationItem(
|
||||||
@ -302,6 +320,9 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
|
|
||||||
|
// TODO: Make this the only appcolors init
|
||||||
|
appColors = AppColors(this@HomeActivity)
|
||||||
|
|
||||||
handleDrawerItems()
|
handleDrawerItems()
|
||||||
|
|
||||||
sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
|
sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
@ -314,6 +335,18 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
handleSharedPrefs()
|
handleSharedPrefs()
|
||||||
|
|
||||||
|
handleThemeUpdate()
|
||||||
|
|
||||||
|
reloadLayoutManager()
|
||||||
|
|
||||||
|
if (!infiniteScroll) {
|
||||||
|
recyclerView.setHasFixedSize(true)
|
||||||
|
} else {
|
||||||
|
handleInfiniteScroll()
|
||||||
|
}
|
||||||
|
|
||||||
|
handleBottomBarActions()
|
||||||
|
|
||||||
getElementsAccordingToTab()
|
getElementsAccordingToTab()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,6 +357,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
private fun handleSharedPrefs() {
|
private fun handleSharedPrefs() {
|
||||||
debugReadingItems = sharedPref.getBoolean("read_debug", false)
|
debugReadingItems = sharedPref.getBoolean("read_debug", false)
|
||||||
|
shouldLogEverything = sharedPref.getBoolean("should_log_everything", false)
|
||||||
clickBehavior = sharedPref.getBoolean("tab_on_tap", false)
|
clickBehavior = sharedPref.getBoolean("tab_on_tap", false)
|
||||||
internalBrowser = sharedPref.getBoolean("prefer_internal_browser", true)
|
internalBrowser = sharedPref.getBoolean("prefer_internal_browser", true)
|
||||||
articleViewer = sharedPref.getBoolean("prefer_article_viewer", true)
|
articleViewer = sharedPref.getBoolean("prefer_article_viewer", true)
|
||||||
@ -337,6 +371,19 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
infiniteScroll = sharedPref.getBoolean("infinite_loading", false)
|
infiniteScroll = sharedPref.getBoolean("infinite_loading", false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleThemeBinding() {
|
||||||
|
Scoop.getInstance()
|
||||||
|
.bind(this, Toppings.PRIMARY.value, toolBar)
|
||||||
|
.bindStatusBar(this, Toppings.PRIMARY_DARK.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleThemeUpdate() {
|
||||||
|
|
||||||
|
Scoop.getInstance()
|
||||||
|
.update(Toppings.PRIMARY.value, appColors.colorPrimary)
|
||||||
|
.update(Toppings.PRIMARY_DARK.value, appColors.colorPrimaryDark)
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleDrawer() {
|
private fun handleDrawer() {
|
||||||
displayAccountHeader =
|
displayAccountHeader =
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
@ -408,6 +455,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleDrawerItems() {
|
private fun handleDrawerItems() {
|
||||||
|
tagsBadge = emptyMap()
|
||||||
fun handleDrawerData(maybeDrawerData: DrawerData?, loadedFromCache: Boolean = false) {
|
fun handleDrawerData(maybeDrawerData: DrawerData?, loadedFromCache: Boolean = false) {
|
||||||
fun handleTags(maybeTags: List<Tag>?) {
|
fun handleTags(maybeTags: List<Tag>?) {
|
||||||
if (maybeTags == null) {
|
if (maybeTags == null) {
|
||||||
@ -419,29 +467,38 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (tag in maybeTags) {
|
tagsBadge = maybeTags.map {
|
||||||
val gd = GradientDrawable()
|
val gd = GradientDrawable()
|
||||||
gd.setColor(Color.parseColor(tag.color))
|
val color = try {
|
||||||
|
Color.parseColor(it.color)
|
||||||
|
} catch (e: IllegalArgumentException) {
|
||||||
|
appColors.colorPrimary
|
||||||
|
}
|
||||||
|
|
||||||
|
gd.setColor(color)
|
||||||
gd.shape = GradientDrawable.RECTANGLE
|
gd.shape = GradientDrawable.RECTANGLE
|
||||||
gd.setSize(30, 30)
|
gd.setSize(30, 30)
|
||||||
gd.cornerRadius = 30F
|
gd.cornerRadius = 30F
|
||||||
drawer.addItem(
|
drawer.addItem(
|
||||||
PrimaryDrawerItem()
|
PrimaryDrawerItem()
|
||||||
.withName(tag.tag)
|
.withName(it.tag)
|
||||||
.withIdentifier(tag.tag.longHash())
|
.withIdentifier(it.tag.longHash())
|
||||||
.withIcon(gd)
|
.withIcon(gd)
|
||||||
.withBadge("${tag.unread}")
|
.withBadge("${it.unread}")
|
||||||
.withBadgeStyle(
|
.withBadgeStyle(
|
||||||
BadgeStyle().withTextColor(Color.WHITE)
|
BadgeStyle().withTextColor(Color.WHITE)
|
||||||
.withColor(appColors.accent)
|
.withColor(appColors.colorAccent)
|
||||||
)
|
)
|
||||||
.withOnDrawerItemClickListener { _, _, _ ->
|
.withOnDrawerItemClickListener { _, _, _ ->
|
||||||
maybeTagFilter = tag
|
allItems = ArrayList()
|
||||||
|
maybeTagFilter = it
|
||||||
getElementsAccordingToTab()
|
getElementsAccordingToTab()
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
(it.tag.longHash() to it.unread)
|
||||||
|
}.toMap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,6 +519,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
.withIdentifier(tag.id.toLong())
|
.withIdentifier(tag.id.toLong())
|
||||||
.withIcon(tag.getIcon(this@HomeActivity))
|
.withIcon(tag.getIcon(this@HomeActivity))
|
||||||
.withOnDrawerItemClickListener { _, _, _ ->
|
.withOnDrawerItemClickListener { _, _, _ ->
|
||||||
|
allItems = ArrayList()
|
||||||
maybeSourceFilter = tag
|
maybeSourceFilter = tag
|
||||||
getElementsAccordingToTab()
|
getElementsAccordingToTab()
|
||||||
false
|
false
|
||||||
@ -480,6 +538,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
.withIdentifier(DRAWER_ID_FILTERS)
|
.withIdentifier(DRAWER_ID_FILTERS)
|
||||||
.withBadge(getString(R.string.drawer_action_clear))
|
.withBadge(getString(R.string.drawer_action_clear))
|
||||||
.withOnDrawerItemClickListener { _, _, _ ->
|
.withOnDrawerItemClickListener { _, _, _ ->
|
||||||
|
allItems = ArrayList()
|
||||||
maybeSourceFilter = null
|
maybeSourceFilter = null
|
||||||
maybeTagFilter = null
|
maybeTagFilter = null
|
||||||
getElementsAccordingToTab()
|
getElementsAccordingToTab()
|
||||||
@ -602,7 +661,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
val resultType = object : TypeToken<DrawerData>() {}.type //NOSONAR
|
val resultType = object : TypeToken<DrawerData>() {}.type
|
||||||
Reservoir.getAsync(
|
Reservoir.getAsync(
|
||||||
"drawerData", resultType, object : ReservoirGetCallback<DrawerData> {
|
"drawerData", resultType, object : ReservoirGetCallback<DrawerData> {
|
||||||
override fun onSuccess(maybeDrawerData: DrawerData?) {
|
override fun onSuccess(maybeDrawerData: DrawerData?) {
|
||||||
@ -617,47 +676,68 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun reloadLayoutManager() {
|
private fun reloadLayoutManager() {
|
||||||
val mLayoutManager: RecyclerView.LayoutManager
|
val currentManager = recyclerView.layoutManager
|
||||||
|
val layoutManager: RecyclerView.LayoutManager
|
||||||
|
|
||||||
|
// This will only update the layout manager if settings changed
|
||||||
|
when (currentManager) {
|
||||||
|
is StaggeredGridLayoutManager ->
|
||||||
|
if (!shouldBeCardView) {
|
||||||
|
layoutManager = GridLayoutManager(this, calculateNoOfColumns())
|
||||||
|
recyclerView.layoutManager = layoutManager
|
||||||
|
}
|
||||||
|
is GridLayoutManager ->
|
||||||
if (shouldBeCardView) {
|
if (shouldBeCardView) {
|
||||||
mLayoutManager = StaggeredGridLayoutManager(
|
layoutManager = StaggeredGridLayoutManager(
|
||||||
calculateNoOfColumns(),
|
calculateNoOfColumns(),
|
||||||
StaggeredGridLayoutManager.VERTICAL
|
StaggeredGridLayoutManager.VERTICAL
|
||||||
)
|
)
|
||||||
mLayoutManager.gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
|
layoutManager.gapStrategy =
|
||||||
|
StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
|
||||||
|
recyclerView.layoutManager = layoutManager
|
||||||
|
}
|
||||||
|
else ->
|
||||||
|
if (currentManager == null) {
|
||||||
|
if (!shouldBeCardView) {
|
||||||
|
layoutManager = GridLayoutManager(this, calculateNoOfColumns())
|
||||||
|
recyclerView.layoutManager = layoutManager
|
||||||
} else {
|
} else {
|
||||||
mLayoutManager = GridLayoutManager(this, calculateNoOfColumns())
|
layoutManager = StaggeredGridLayoutManager(
|
||||||
|
calculateNoOfColumns(),
|
||||||
|
StaggeredGridLayoutManager.VERTICAL
|
||||||
|
)
|
||||||
|
layoutManager.gapStrategy =
|
||||||
|
StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
|
||||||
|
recyclerView.layoutManager = layoutManager
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
recyclerView.layoutManager = mLayoutManager
|
private fun handleBottomBarActions() {
|
||||||
recyclerView.setHasFixedSize(true)
|
|
||||||
|
|
||||||
if (infiniteScroll) {
|
|
||||||
handleInfiniteScroll()
|
|
||||||
}
|
|
||||||
|
|
||||||
handleBottomBarActions(mLayoutManager)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleBottomBarActions(mLayoutManager: RecyclerView.LayoutManager) {
|
|
||||||
bottomBar.setTabSelectedListener(object : BottomNavigationBar.OnTabSelectedListener {
|
bottomBar.setTabSelectedListener(object : BottomNavigationBar.OnTabSelectedListener {
|
||||||
override fun onTabUnselected(position: Int) = Unit
|
override fun onTabUnselected(position: Int) = Unit
|
||||||
|
|
||||||
override fun onTabReselected(position: Int) =
|
override fun onTabReselected(position: Int) {
|
||||||
when (mLayoutManager) {
|
val layoutManager = recyclerView.adapter
|
||||||
|
|
||||||
|
when (layoutManager) {
|
||||||
is StaggeredGridLayoutManager ->
|
is StaggeredGridLayoutManager ->
|
||||||
if (mLayoutManager.findFirstCompletelyVisibleItemPositions(null)[0] == 0) {
|
if (layoutManager.findFirstCompletelyVisibleItemPositions(null)[0] == 0) {
|
||||||
getElementsAccordingToTab()
|
getElementsAccordingToTab()
|
||||||
} else {
|
} else {
|
||||||
mLayoutManager.scrollToPositionWithOffset(0, 0)
|
layoutManager.scrollToPositionWithOffset(0, 0)
|
||||||
}
|
}
|
||||||
is GridLayoutManager ->
|
is GridLayoutManager ->
|
||||||
if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
|
if (layoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
|
||||||
getElementsAccordingToTab()
|
getElementsAccordingToTab()
|
||||||
} else {
|
} else {
|
||||||
mLayoutManager.scrollToPositionWithOffset(0, 0)
|
layoutManager.scrollToPositionWithOffset(0, 0)
|
||||||
}
|
}
|
||||||
else -> Unit
|
else -> Unit
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onTabSelected(position: Int) {
|
override fun onTabSelected(position: Int) {
|
||||||
offset = 0
|
offset = 0
|
||||||
@ -732,25 +812,26 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
call: (String?, Long?, String?) -> Call<List<Item>>
|
call: (String?, Long?, String?) -> Call<List<Item>>
|
||||||
) {
|
) {
|
||||||
fun handleItemsResponse(response: Response<List<Item>>) {
|
fun handleItemsResponse(response: Response<List<Item>>) {
|
||||||
val didUpdate = (response.body() != items)
|
val shouldUpdate = (response.body() != items)
|
||||||
if (response.body() != null) {
|
if (response.body() != null) {
|
||||||
if (response.body() != items) {
|
if (shouldUpdate) {
|
||||||
if (appendResults) {
|
|
||||||
items.addAll(response.body() as ArrayList<Item>)
|
|
||||||
} else {
|
|
||||||
items = response.body() as ArrayList<Item>
|
items = response.body() as ArrayList<Item>
|
||||||
|
|
||||||
|
items.forEach {
|
||||||
|
if (!allItems.contains(it)) allItems.add(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!appendResults) {
|
if (!appendResults) {
|
||||||
items = ArrayList()
|
items = ArrayList()
|
||||||
|
allItems = ArrayList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (didUpdate) {
|
if (shouldUpdate) {
|
||||||
handleListResult(appendResults)
|
handleListResult(appendResults)
|
||||||
}
|
}
|
||||||
|
|
||||||
mayBeEmpty()
|
if (!appendResults) mayBeEmpty()
|
||||||
swipeRefreshLayout.isRefreshing = false
|
swipeRefreshLayout.isRefreshing = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -829,11 +910,9 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reloadLayoutManager()
|
if (recyclerAdapter == null) {
|
||||||
|
|
||||||
val mAdapter: RecyclerView.Adapter<*>
|
|
||||||
if (shouldBeCardView) {
|
if (shouldBeCardView) {
|
||||||
mAdapter =
|
recyclerAdapter =
|
||||||
ItemCardAdapter(
|
ItemCardAdapter(
|
||||||
this,
|
this,
|
||||||
items,
|
items,
|
||||||
@ -847,7 +926,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
userIdentifier
|
userIdentifier
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
mAdapter =
|
recyclerAdapter =
|
||||||
ItemListAdapter(
|
ItemListAdapter(
|
||||||
this,
|
this,
|
||||||
items,
|
items,
|
||||||
@ -857,7 +936,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
debugReadingItems,
|
debugReadingItems,
|
||||||
userIdentifier
|
userIdentifier,
|
||||||
|
appColors
|
||||||
)
|
)
|
||||||
|
|
||||||
recyclerView.addItemDecoration(
|
recyclerView.addItemDecoration(
|
||||||
@ -867,11 +947,13 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
recyclerView.adapter = mAdapter
|
recyclerView.adapter = recyclerAdapter
|
||||||
mAdapter.notifyDataSetChanged()
|
} else {
|
||||||
|
if (!appendResults) {
|
||||||
if (appendResults) {
|
(recyclerAdapter as ItemsAdapter<*>).updateAllItems(items)
|
||||||
recyclerView.scrollToPosition(firstVisible!!)
|
} else {
|
||||||
|
(recyclerAdapter as ItemsAdapter<*>).addItemsAtEnd(items)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reloadBadges()
|
reloadBadges()
|
||||||
@ -923,6 +1005,13 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun reloadTagsBadges() {
|
||||||
|
tagsBadge.forEach {
|
||||||
|
drawer.updateBadge(it.key, StringHolder("${it.value}"))
|
||||||
|
}
|
||||||
|
drawer.resetDrawerContent()
|
||||||
|
}
|
||||||
|
|
||||||
private fun calculateNoOfColumns(): Int {
|
private fun calculateNoOfColumns(): Int {
|
||||||
val displayMetrics = resources.displayMetrics
|
val displayMetrics = resources.displayMetrics
|
||||||
val dpWidth = displayMetrics.widthPixels / displayMetrics.density
|
val dpWidth = displayMetrics.widthPixels / displayMetrics.density
|
||||||
@ -971,9 +1060,20 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun needsConfirmation(titleRes: Int, messageRes: Int, doFn: () -> Unit) {
|
||||||
|
AlertDialog.Builder(this@HomeActivity)
|
||||||
|
.setMessage(messageRes)
|
||||||
|
.setTitle(titleRes)
|
||||||
|
.setPositiveButton(android.R.string.ok) { _, _ -> doFn() }
|
||||||
|
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||||
|
.create()
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.refresh -> {
|
R.id.refresh -> {
|
||||||
|
needsConfirmation(R.string.menu_home_refresh, R.string.refresh_dialog_message, {
|
||||||
api.update().enqueue(object : Callback<String> {
|
api.update().enqueue(object : Callback<String> {
|
||||||
override fun onResponse(
|
override fun onResponse(
|
||||||
call: Call<String>,
|
call: Call<String>,
|
||||||
@ -995,13 +1095,27 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
Toast.makeText(this, R.string.refresh_in_progress, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, R.string.refresh_in_progress, Toast.LENGTH_SHORT).show()
|
||||||
|
})
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
R.id.readAll -> {
|
R.id.readAll -> {
|
||||||
if (elementsShown == UNREAD_SHOWN) {
|
if (elementsShown == UNREAD_SHOWN) {
|
||||||
|
needsConfirmation(R.string.readAll, R.string.markall_dialog_message, {
|
||||||
swipeRefreshLayout.isRefreshing = false
|
swipeRefreshLayout.isRefreshing = false
|
||||||
val ids = items.map { it.id }
|
val ids = allItems.map { it.id }
|
||||||
|
val itemsByTag: Map<Long, Int> =
|
||||||
|
allItems.flattenTags()
|
||||||
|
.groupBy { it.tags.longHash() }
|
||||||
|
.map { it.key to it.value.size }
|
||||||
|
.toMap()
|
||||||
|
|
||||||
|
fun readAllDebug(e: Throwable) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(100, "READ_ALL_ERROR", e.message)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ids.isNotEmpty()) {
|
||||||
api.readAll(ids).enqueue(object : Callback<SuccessResponse> {
|
api.readAll(ids).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(
|
override fun onResponse(
|
||||||
call: Call<SuccessResponse>,
|
call: Call<SuccessResponse>,
|
||||||
@ -1014,12 +1128,31 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
).show()
|
||||||
tabNewBadge.removeBadge()
|
tabNewBadge.removeBadge()
|
||||||
|
|
||||||
|
|
||||||
|
tagsBadge = itemsByTag.map {
|
||||||
|
(it.key to ((tagsBadge[it.key] ?: it.value) - it.value))
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
|
reloadTagsBadges()
|
||||||
|
|
||||||
|
getElementsAccordingToTab()
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
this@HomeActivity,
|
this@HomeActivity,
|
||||||
R.string.all_posts_not_read,
|
R.string.all_posts_not_read,
|
||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
).show()
|
||||||
|
|
||||||
|
if (debugReadingItems) {
|
||||||
|
readAllDebug(
|
||||||
|
Throwable(
|
||||||
|
"Got response, but : response.body() (${response.body()}) != null && response.body()!!.isSuccess (${response.body()?.isSuccess})." +
|
||||||
|
"Request url was (${call.request().url()}), ids were $ids"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swipeRefreshLayout.isRefreshing = false
|
swipeRefreshLayout.isRefreshing = false
|
||||||
@ -1032,9 +1165,15 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
).show()
|
||||||
swipeRefreshLayout.isRefreshing = false
|
swipeRefreshLayout.isRefreshing = false
|
||||||
|
|
||||||
|
if (debugReadingItems) {
|
||||||
|
readAllDebug(t)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
items = ArrayList()
|
items = ArrayList()
|
||||||
|
allItems = ArrayList()
|
||||||
|
}
|
||||||
if (items.isEmpty()) {
|
if (items.isEmpty()) {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
this@HomeActivity,
|
this@HomeActivity,
|
||||||
@ -1043,6 +1182,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
).show()
|
).show()
|
||||||
}
|
}
|
||||||
handleListResult()
|
handleListResult()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -1051,7 +1191,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
R.id.action_share_the_app -> {
|
R.id.action_share_the_app -> {
|
||||||
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) {
|
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) {
|
||||||
val share = AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
|
val share =
|
||||||
|
AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
|
||||||
.setMessage(getString(R.string.invitation_message))
|
.setMessage(getString(R.string.invitation_message))
|
||||||
.setDeepLink(Uri.parse("https://ymbh5.app.goo.gl/qbvQ"))
|
.setDeepLink(Uri.parse("https://ymbh5.app.goo.gl/qbvQ"))
|
||||||
.setCallToActionText(getString(R.string.invitation_cta))
|
.setCallToActionText(getString(R.string.invitation_cta))
|
||||||
|
@ -17,10 +17,10 @@ import android.widget.TextView
|
|||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid
|
import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
import com.ftinc.scoop.Scoop
|
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics
|
import com.google.firebase.analytics.FirebaseAnalytics
|
||||||
import com.mikepenz.aboutlibraries.Libs
|
import com.mikepenz.aboutlibraries.Libs
|
||||||
import com.mikepenz.aboutlibraries.LibsBuilder
|
import com.mikepenz.aboutlibraries.LibsBuilder
|
||||||
@ -41,10 +41,13 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
private lateinit var firebaseAnalytics: FirebaseAnalytics
|
private lateinit var firebaseAnalytics: FirebaseAnalytics
|
||||||
private lateinit var userIdentifier: String
|
private lateinit var userIdentifier: String
|
||||||
private var logErrors: Boolean = false
|
private var logErrors: Boolean = false
|
||||||
|
private lateinit var appColors: AppColors
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
appColors = AppColors(this@LoginActivity)
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
|
||||||
setContentView(R.layout.activity_login)
|
setContentView(R.layout.activity_login)
|
||||||
|
|
||||||
setSupportActionBar(toolbar)
|
setSupportActionBar(toolbar)
|
||||||
|
@ -87,19 +87,7 @@ class MyApp : MultiDexApplication() {
|
|||||||
private fun initTheme() {
|
private fun initTheme() {
|
||||||
Scoop.waffleCone()
|
Scoop.waffleCone()
|
||||||
.addFlavor(getString(R.string.default_theme), R.style.NoBar, true)
|
.addFlavor(getString(R.string.default_theme), R.style.NoBar, true)
|
||||||
.addFlavor(getString(R.string.default_dark_theme), R.style.NoBarDark)
|
.addFlavor(getString(R.string.default_dark_theme), R.style.NoBarDark, false)
|
||||||
.addFlavor(getString(R.string.teal_orange_theme), R.style.NoBarTealOrange)
|
|
||||||
.addFlavor(getString(R.string.teal_orange_dark_theme), R.style.NoBarTealOrangeDark)
|
|
||||||
.addFlavor(getString(R.string.cyan_pink_theme), R.style.NoBarCyanPink)
|
|
||||||
.addFlavor(getString(R.string.cyan_pink_dark_theme), R.style.NoBarCyanPinkDark)
|
|
||||||
.addFlavor(getString(R.string.grey_orange_theme), R.style.NoBarGreyOrange)
|
|
||||||
.addFlavor(getString(R.string.grey_orange_dark_theme), R.style.NoBarGreyOrangeDark)
|
|
||||||
.addFlavor(getString(R.string.blue_amber_theme), R.style.NoBarBlueAmber)
|
|
||||||
.addFlavor(getString(R.string.blue_amber_dark_theme), R.style.NoBarBlueAmberDark)
|
|
||||||
.addFlavor(getString(R.string.indigo_pink_theme), R.style.NoBarIndigoPink)
|
|
||||||
.addFlavor(getString(R.string.indigo_pink_dark_theme), R.style.NoBarIndigoPinkDark)
|
|
||||||
.addFlavor(getString(R.string.red_teal_theme), R.style.NoBarRedTeal)
|
|
||||||
.addFlavor(getString(R.string.red_teal_dark_theme), R.style.NoBarRedTealDark)
|
|
||||||
.setSharedPreferences(PreferenceManager.getDefaultSharedPreferences(this))
|
.setSharedPreferences(PreferenceManager.getDefaultSharedPreferences(this))
|
||||||
.initialize()
|
.initialize()
|
||||||
}
|
}
|
||||||
|
@ -1,209 +1,262 @@
|
|||||||
package apps.amine.bou.readerforselfoss
|
package apps.amine.bou.readerforselfoss
|
||||||
|
|
||||||
import android.content.SharedPreferences
|
import android.content.Context
|
||||||
|
import android.content.res.Resources
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.customtabs.CustomTabsIntent
|
import android.support.v4.app.FragmentManager
|
||||||
import android.support.design.widget.FloatingActionButton
|
import android.support.v4.app.FragmentStatePagerAdapter
|
||||||
import android.support.v4.widget.NestedScrollView
|
import android.support.v4.view.ViewPager
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.text.Html
|
import android.view.Menu
|
||||||
import android.text.method.LinkMovementMethod
|
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.widget.Toast
|
||||||
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.fragments.ArticleFragment
|
||||||
import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
import apps.amine.bou.readerforselfoss.themes.Toppings
|
||||||
import apps.amine.bou.readerforselfoss.utils.shareLink
|
import apps.amine.bou.readerforselfoss.transformers.DepthPageTransformer
|
||||||
import com.bumptech.glide.Glide
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import com.bumptech.glide.request.RequestOptions
|
import apps.amine.bou.readerforselfoss.utils.succeeded
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.toggleStar
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
import com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
|
||||||
import kotlinx.android.synthetic.main.activity_reader.*
|
import kotlinx.android.synthetic.main.activity_reader.*
|
||||||
import org.sufficientlysecure.htmltextview.HtmlHttpImageGetter
|
import me.relex.circleindicator.CircleIndicator
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
|
|
||||||
class ReaderActivity : AppCompatActivity() {
|
class ReaderActivity : AppCompatActivity() {
|
||||||
private lateinit var mCustomTabActivityHelper: CustomTabActivityHelper
|
|
||||||
//private lateinit var content: HtmlTextView
|
|
||||||
private lateinit var url: String
|
|
||||||
private lateinit var contentText: String
|
|
||||||
private lateinit var contentSource: String
|
|
||||||
private lateinit var contentImage: String
|
|
||||||
private lateinit var contentTitle: String
|
|
||||||
private lateinit var fab: FloatingActionButton
|
|
||||||
|
|
||||||
override fun onStop() {
|
private var markOnScroll: Boolean = false
|
||||||
super.onStop()
|
private var debugReadingItems: Boolean = false
|
||||||
mCustomTabActivityHelper.unbindCustomTabsService(this)
|
private var currentItem: Int = 0
|
||||||
|
private lateinit var userIdentifier: String
|
||||||
|
|
||||||
|
private lateinit var api: SelfossApi
|
||||||
|
|
||||||
|
private lateinit var toolbarMenu: Menu
|
||||||
|
|
||||||
|
private fun showMenuItem(willAddToFavorite: Boolean) {
|
||||||
|
toolbarMenu.findItem(R.id.save).isVisible = willAddToFavorite
|
||||||
|
toolbarMenu.findItem(R.id.unsave).isVisible = !willAddToFavorite
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun canFavorite() {
|
||||||
|
showMenuItem(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun canRemoveFromFavorite() {
|
||||||
|
showMenuItem(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
val appColors = AppColors(this@ReaderActivity)
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
|
||||||
setContentView(R.layout.activity_reader)
|
setContentView(R.layout.activity_reader)
|
||||||
|
|
||||||
url = intent.getStringExtra("url")
|
Scoop.getInstance()
|
||||||
contentText = intent.getStringExtra("content")
|
.bind(this, Toppings.PRIMARY.value, toolBar)
|
||||||
contentTitle = intent.getStringExtra("title")
|
.bindStatusBar(this, Toppings.PRIMARY_DARK.value)
|
||||||
contentImage = intent.getStringExtra("image")
|
|
||||||
contentSource = intent.getStringExtra("source")
|
|
||||||
|
|
||||||
fab = findViewById(R.id.fab)
|
setSupportActionBar(toolBar)
|
||||||
val mFloatingToolbar: FloatingToolbar = findViewById(R.id.floatingToolbar)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
mFloatingToolbar.attachFab(fab)
|
supportActionBar?.setDisplayShowHomeEnabled(true)
|
||||||
|
|
||||||
val customTabsIntent = this@ReaderActivity.buildCustomTabsIntent()
|
val settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
mCustomTabActivityHelper = CustomTabActivityHelper()
|
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
mCustomTabActivityHelper.bindCustomTabsService(this)
|
|
||||||
|
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
debugReadingItems = sharedPref.getBoolean("read_debug", false)
|
||||||
|
userIdentifier = sharedPref.getString("unique_id", "")
|
||||||
|
markOnScroll = sharedPref.getBoolean("mark_on_scroll", false)
|
||||||
|
|
||||||
mFloatingToolbar.setClickListener(object : FloatingToolbar.ItemClickListener {
|
if (allItems.isEmpty()) {
|
||||||
override fun onItemClick(item: MenuItem) {
|
finish()
|
||||||
when (item.itemId) {
|
|
||||||
R.id.more_action -> getContentFromMercury(customTabsIntent, prefs)
|
|
||||||
R.id.share_action -> this@ReaderActivity.shareLink(url)
|
|
||||||
R.id.open_action -> this@ReaderActivity.openItemUrl(
|
|
||||||
url,
|
|
||||||
contentText,
|
|
||||||
contentImage,
|
|
||||||
contentTitle,
|
|
||||||
contentSource,
|
|
||||||
customTabsIntent,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
this@ReaderActivity
|
|
||||||
)
|
|
||||||
else -> Unit
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onItemLongClick(item: MenuItem?) {
|
api = SelfossApi(
|
||||||
}
|
this,
|
||||||
})
|
this@ReaderActivity,
|
||||||
|
settings.getBoolean("isSelfSignedCert", false),
|
||||||
|
sharedPref.getBoolean("should_log_everything", false)
|
||||||
if (contentText.isEmptyOrNullOrNullString()) {
|
|
||||||
getContentFromMercury(customTabsIntent, prefs)
|
|
||||||
} else {
|
|
||||||
source.text = contentSource
|
|
||||||
titleView.text = contentTitle
|
|
||||||
tryToHandleHtml(contentText, customTabsIntent, prefs)
|
|
||||||
|
|
||||||
if (!contentImage.isEmptyOrNullOrNullString()) {
|
|
||||||
imageView.visibility = View.VISIBLE
|
|
||||||
Glide
|
|
||||||
.with(baseContext)
|
|
||||||
.asBitmap()
|
|
||||||
.load(contentImage)
|
|
||||||
.apply(RequestOptions.fitCenterTransform())
|
|
||||||
.into(imageView)
|
|
||||||
} else {
|
|
||||||
imageView.visibility = View.GONE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nestedScrollView.setOnScrollChangeListener(
|
|
||||||
NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
|
|
||||||
if (scrollY > oldScrollY) {
|
|
||||||
fab.hide()
|
|
||||||
} else {
|
|
||||||
if (mFloatingToolbar.isShowing) mFloatingToolbar.hide() else fab.show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
content.movementMethod = LinkMovementMethod.getInstance()
|
currentItem = intent.getIntExtra("currentItem", 0)
|
||||||
|
|
||||||
|
pager.adapter = ScreenSlidePagerAdapter(supportFragmentManager)
|
||||||
|
pager.currentItem = currentItem
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getContentFromMercury(
|
override fun onResume() {
|
||||||
customTabsIntent: CustomTabsIntent,
|
super.onResume()
|
||||||
prefs: SharedPreferences
|
|
||||||
) {
|
|
||||||
progressBar.visibility = View.VISIBLE
|
|
||||||
val parser = MercuryApi(
|
|
||||||
BuildConfig.MERCURY_KEY,
|
|
||||||
prefs.getBoolean("should_log_everything", false)
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.parseUrl(url).enqueue(object : Callback<ParsedContent> {
|
(pager.adapter as ScreenSlidePagerAdapter).notifyDataSetChanged()
|
||||||
|
|
||||||
|
pager.setPageTransformer(true, DepthPageTransformer())
|
||||||
|
(indicator as CircleIndicator).setViewPager(pager)
|
||||||
|
|
||||||
|
pager.addOnPageChangeListener(
|
||||||
|
object : ViewPager.SimpleOnPageChangeListener() {
|
||||||
|
var isLastItem = false
|
||||||
|
|
||||||
|
override fun onPageSelected(position: Int) {
|
||||||
|
isLastItem = (position === (allItems.size - 1))
|
||||||
|
|
||||||
|
if (allItems[position].starred) {
|
||||||
|
canRemoveFromFavorite()
|
||||||
|
} else {
|
||||||
|
canFavorite()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPageScrollStateChanged(state: Int) {
|
||||||
|
if (markOnScroll && (state === ViewPager.SCROLL_STATE_DRAGGING || (state === ViewPager.SCROLL_STATE_IDLE && isLastItem))) {
|
||||||
|
api.markItem(allItems[pager.currentItem].id).enqueue(
|
||||||
|
object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(
|
override fun onResponse(
|
||||||
call: Call<ParsedContent>,
|
call: Call<SuccessResponse>,
|
||||||
response: Response<ParsedContent>
|
response: Response<SuccessResponse>
|
||||||
) {
|
) {
|
||||||
if (response.body() != null && response.body()!!.content != null && response.body()!!.content.isNotEmpty()) {
|
if (!response.succeeded() && debugReadingItems) {
|
||||||
source.text = response.body()!!.domain
|
val message =
|
||||||
titleView.text = response.body()!!.title
|
"message: ${response.message()} " +
|
||||||
this@ReaderActivity.url = response.body()!!.url
|
"response isSuccess: ${response.isSuccessful} " +
|
||||||
|
"response code: ${response.code()} " +
|
||||||
if (response.body()!!.content != null && !response.body()!!.content.isEmpty()) {
|
"response message: ${response.message()} " +
|
||||||
tryToHandleHtml(response.body()!!.content, customTabsIntent, prefs)
|
"response errorBody: ${response.errorBody()?.string()} " +
|
||||||
}
|
"body success: ${response.body()?.success} " +
|
||||||
|
"body isSuccess: ${response.body()?.isSuccess}"
|
||||||
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty()) {
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
imageView.visibility = View.VISIBLE
|
Crashlytics.log(
|
||||||
Glide
|
100,
|
||||||
.with(baseContext)
|
"READ_DEBUG_SUCCESS",
|
||||||
.asBitmap()
|
message
|
||||||
.load(response.body()!!.lead_image_url)
|
)
|
||||||
.apply(RequestOptions.fitCenterTransform())
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
.into(imageView)
|
|
||||||
} else {
|
|
||||||
imageView.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
nestedScrollView.scrollTo(0, 0)
|
|
||||||
|
|
||||||
progressBar.visibility = View.GONE
|
|
||||||
} else {
|
|
||||||
openInBrowserAfterFailing(customTabsIntent)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(
|
override fun onFailure(
|
||||||
call: Call<ParsedContent>,
|
call: Call<SuccessResponse>,
|
||||||
t: Throwable
|
t: Throwable
|
||||||
) = openInBrowserAfterFailing(customTabsIntent)
|
) {
|
||||||
|
if (debugReadingItems) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"READ_DEBUG_ERROR",
|
||||||
|
t.message
|
||||||
|
)
|
||||||
|
Crashlytics.logException(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
if (markOnScroll) {
|
||||||
|
pager.clearOnPageChangeListeners()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(oldInstanceState: Bundle?) {
|
||||||
|
super.onSaveInstanceState(oldInstanceState)
|
||||||
|
oldInstanceState!!.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class ScreenSlidePagerAdapter(fm: FragmentManager) :
|
||||||
|
FragmentStatePagerAdapter(fm) {
|
||||||
|
override fun getCount(): Int {
|
||||||
|
return allItems.size
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItem(position: Int): ArticleFragment {
|
||||||
|
return ArticleFragment.newInstance(position, allItems)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
val inflater = menuInflater
|
||||||
|
inflater.inflate(R.menu.reader_menu, menu)
|
||||||
|
toolbarMenu = menu
|
||||||
|
|
||||||
|
if (!allItems.isEmpty() && allItems[currentItem].starred) {
|
||||||
|
canRemoveFromFavorite()
|
||||||
|
} else {
|
||||||
|
canFavorite()
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
when (item.itemId) {
|
||||||
|
android.R.id.home -> {
|
||||||
|
onBackPressed()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
R.id.save -> {
|
||||||
|
api.starrItem(allItems[pager.currentItem].id)
|
||||||
|
.enqueue(object : Callback<SuccessResponse> {
|
||||||
|
override fun onResponse(
|
||||||
|
call: Call<SuccessResponse>,
|
||||||
|
response: Response<SuccessResponse>
|
||||||
|
) {
|
||||||
|
allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar()
|
||||||
|
canRemoveFromFavorite()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(
|
||||||
|
call: Call<SuccessResponse>,
|
||||||
|
t: Throwable
|
||||||
|
) {
|
||||||
|
Toast.makeText(
|
||||||
|
baseContext,
|
||||||
|
R.string.cant_mark_favortie,
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
R.id.unsave -> {
|
||||||
private fun tryToHandleHtml(
|
api.unstarrItem(allItems[pager.currentItem].id)
|
||||||
c: String,
|
.enqueue(object : Callback<SuccessResponse> {
|
||||||
customTabsIntent: CustomTabsIntent,
|
override fun onResponse(
|
||||||
prefs: SharedPreferences
|
call: Call<SuccessResponse>,
|
||||||
|
response: Response<SuccessResponse>
|
||||||
) {
|
) {
|
||||||
try {
|
allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar()
|
||||||
content.text = Html.fromHtml(c, HtmlHttpImageGetter(content, null, true), null)
|
canFavorite()
|
||||||
|
|
||||||
//content.setHtml(response.body()!!.content, HtmlHttpImageGetter(content, null, true))
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
|
||||||
Crashlytics.log(100, "CANT_TRANSFORM_TO_HTML", e.message)
|
|
||||||
Crashlytics.logException(e)
|
|
||||||
openInBrowserAfterFailing(customTabsIntent)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openInBrowserAfterFailing(customTabsIntent: CustomTabsIntent) {
|
override fun onFailure(
|
||||||
progressBar.visibility = View.GONE
|
call: Call<SuccessResponse>,
|
||||||
this@ReaderActivity.openItemUrl(
|
t: Throwable
|
||||||
url,
|
) {
|
||||||
contentText,
|
Toast.makeText(
|
||||||
contentImage,
|
baseContext,
|
||||||
contentTitle,
|
R.string.cant_unmark_favortie,
|
||||||
contentSource,
|
Toast.LENGTH_SHORT
|
||||||
customTabsIntent,
|
).show()
|
||||||
true,
|
}
|
||||||
false,
|
})
|
||||||
this@ReaderActivity
|
}
|
||||||
)
|
}
|
||||||
finish()
|
return super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
var allItems: ArrayList<Item> = ArrayList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package apps.amine.bou.readerforselfoss
|
package apps.amine.bou.readerforselfoss
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.res.ColorStateList
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
@ -9,6 +10,8 @@ import android.widget.Toast
|
|||||||
import apps.amine.bou.readerforselfoss.adapters.SourcesListAdapter
|
import apps.amine.bou.readerforselfoss.adapters.SourcesListAdapter
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Sources
|
import apps.amine.bou.readerforselfoss.api.selfoss.Sources
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.Toppings
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
import kotlinx.android.synthetic.main.activity_sources.*
|
import kotlinx.android.synthetic.main.activity_sources.*
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
@ -17,14 +20,25 @@ import retrofit2.Response
|
|||||||
|
|
||||||
class SourcesActivity : AppCompatActivity() {
|
class SourcesActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private lateinit var appColors: AppColors
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
appColors = AppColors(this@SourcesActivity)
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
|
||||||
setContentView(R.layout.activity_sources)
|
setContentView(R.layout.activity_sources)
|
||||||
|
|
||||||
|
Scoop.getInstance()
|
||||||
|
.bind(this, Toppings.PRIMARY.value, toolbar)
|
||||||
|
.bindStatusBar(this, Toppings.PRIMARY_DARK.value)
|
||||||
|
|
||||||
setSupportActionBar(toolbar)
|
setSupportActionBar(toolbar)
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
supportActionBar?.setDisplayShowHomeEnabled(true)
|
supportActionBar?.setDisplayShowHomeEnabled(true)
|
||||||
|
|
||||||
|
fab.rippleColor = appColors.colorAccentDark
|
||||||
|
fab.backgroundTintList = ColorStateList.valueOf(appColors.colorAccent)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStop() {
|
override fun onStop() {
|
||||||
|
@ -2,15 +2,13 @@ package apps.amine.bou.readerforselfoss.adapters
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Color
|
|
||||||
import android.support.design.widget.Snackbar
|
|
||||||
import android.support.v7.widget.CardView
|
import android.support.v7.widget.CardView
|
||||||
import android.support.v7.widget.RecyclerView
|
import android.support.v7.widget.RecyclerView
|
||||||
import android.text.Html
|
import android.text.Html
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView.ScaleType
|
import android.widget.ImageView.ScaleType
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import apps.amine.bou.readerforselfoss.R
|
import apps.amine.bou.readerforselfoss.R
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
@ -25,12 +23,10 @@ import apps.amine.bou.readerforselfoss.utils.openInBrowserAsNewTask
|
|||||||
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
||||||
import apps.amine.bou.readerforselfoss.utils.shareLink
|
import apps.amine.bou.readerforselfoss.utils.shareLink
|
||||||
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
|
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
|
||||||
import apps.amine.bou.readerforselfoss.utils.succeeded
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
||||||
import com.amulyakhare.textdrawable.TextDrawable
|
import com.amulyakhare.textdrawable.TextDrawable
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator
|
import com.amulyakhare.textdrawable.util.ColorGenerator
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.crashlytics.android.Crashlytics
|
|
||||||
import com.like.LikeButton
|
import com.like.LikeButton
|
||||||
import com.like.OnLikeListener
|
import com.like.OnLikeListener
|
||||||
import kotlinx.android.synthetic.main.card_item.view.*
|
import kotlinx.android.synthetic.main.card_item.view.*
|
||||||
@ -39,19 +35,21 @@ import retrofit2.Callback
|
|||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
|
|
||||||
class ItemCardAdapter(
|
class ItemCardAdapter(
|
||||||
private val app: Activity,
|
override val app: Activity,
|
||||||
private val items: ArrayList<Item>,
|
override var items: ArrayList<Item>,
|
||||||
private val api: SelfossApi,
|
override val api: SelfossApi,
|
||||||
private val helper: CustomTabActivityHelper,
|
private val helper: CustomTabActivityHelper,
|
||||||
private val internalBrowser: Boolean,
|
private val internalBrowser: Boolean,
|
||||||
private val articleViewer: Boolean,
|
private val articleViewer: Boolean,
|
||||||
private val fullHeightCards: Boolean,
|
private val fullHeightCards: Boolean,
|
||||||
private val appColors: AppColors,
|
override val appColors: AppColors,
|
||||||
val debugReadingItems: Boolean,
|
override val debugReadingItems: Boolean,
|
||||||
val userIdentifier: String
|
override val userIdentifier: String
|
||||||
) : RecyclerView.Adapter<ItemCardAdapter.ViewHolder>() {
|
) : ItemsAdapter<ItemCardAdapter.ViewHolder>() {
|
||||||
private val c: Context = app.baseContext
|
private val c: Context = app.baseContext
|
||||||
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
||||||
|
private val imageMaxHeight: Int =
|
||||||
|
c.resources.getDimension(R.dimen.card_image_max_height).toInt()
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
val v = LayoutInflater.from(c).inflate(R.layout.card_item, parent, false) as CardView
|
val v = LayoutInflater.from(c).inflate(R.layout.card_item, parent, false) as CardView
|
||||||
@ -65,12 +63,21 @@ class ItemCardAdapter(
|
|||||||
holder.mView.favButton.isLiked = itm.starred
|
holder.mView.favButton.isLiked = itm.starred
|
||||||
holder.mView.title.text = Html.fromHtml(itm.title)
|
holder.mView.title.text = Html.fromHtml(itm.title)
|
||||||
|
|
||||||
|
holder.mView.title.setLinkTextColor(appColors.colorAccent)
|
||||||
|
|
||||||
holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText()
|
holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText()
|
||||||
|
|
||||||
|
if (!fullHeightCards) {
|
||||||
|
holder.mView.itemImage.maxHeight = imageMaxHeight
|
||||||
|
holder.mView.itemImage.scaleType = ScaleType.CENTER_CROP
|
||||||
|
}
|
||||||
|
|
||||||
if (itm.getThumbnail(c).isEmpty()) {
|
if (itm.getThumbnail(c).isEmpty()) {
|
||||||
|
holder.mView.itemImage.visibility = View.GONE
|
||||||
Glide.with(c).clear(holder.mView.itemImage)
|
Glide.with(c).clear(holder.mView.itemImage)
|
||||||
holder.mView.itemImage.setImageDrawable(null)
|
holder.mView.itemImage.setImageDrawable(null)
|
||||||
} else {
|
} else {
|
||||||
|
holder.mView.itemImage.visibility = View.VISIBLE
|
||||||
c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage)
|
c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,100 +101,15 @@ class ItemCardAdapter(
|
|||||||
return items.size
|
return items.size
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun doUnmark(i: Item, position: Int) {
|
|
||||||
val s = Snackbar
|
|
||||||
.make(
|
|
||||||
app.findViewById(R.id.coordLayout),
|
|
||||||
R.string.marked_as_read,
|
|
||||||
Snackbar.LENGTH_LONG
|
|
||||||
)
|
|
||||||
.setAction(R.string.undo_string) {
|
|
||||||
items.add(position, i)
|
|
||||||
notifyItemInserted(position)
|
|
||||||
|
|
||||||
api.unmarkItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
|
||||||
override fun onResponse(
|
|
||||||
call: Call<SuccessResponse>,
|
|
||||||
response: Response<SuccessResponse>
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
|
||||||
items.remove(i)
|
|
||||||
notifyItemRemoved(position)
|
|
||||||
doUnmark(i, position)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
val view = s.view
|
|
||||||
val tv: TextView = view.findViewById(android.support.design.R.id.snackbar_text)
|
|
||||||
tv.setTextColor(Color.WHITE)
|
|
||||||
s.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun removeItemAtIndex(position: Int) {
|
|
||||||
|
|
||||||
val i = items[position]
|
|
||||||
|
|
||||||
items.remove(i)
|
|
||||||
notifyItemRemoved(position)
|
|
||||||
|
|
||||||
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
|
||||||
override fun onResponse(
|
|
||||||
call: Call<SuccessResponse>,
|
|
||||||
response: Response<SuccessResponse>
|
|
||||||
) {
|
|
||||||
if (!response.succeeded() && debugReadingItems) {
|
|
||||||
val message =
|
|
||||||
"message: ${response.message()} " +
|
|
||||||
"response isSuccess: ${response.isSuccessful} " +
|
|
||||||
"response code: ${response.code()} " +
|
|
||||||
"response message: ${response.message()} " +
|
|
||||||
"response errorBody: ${response.errorBody()?.string()} " +
|
|
||||||
"body success: ${response.body()?.success} " +
|
|
||||||
"body isSuccess: ${response.body()?.isSuccess}"
|
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
|
||||||
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
|
||||||
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
|
||||||
|
|
||||||
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
|
||||||
}
|
|
||||||
doUnmark(i, position)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
|
||||||
if (debugReadingItems) {
|
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
|
||||||
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
|
||||||
Crashlytics.logException(t)
|
|
||||||
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
|
||||||
}
|
|
||||||
Toast.makeText(
|
|
||||||
app,
|
|
||||||
app.getString(R.string.cant_mark_read),
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
items.add(i)
|
|
||||||
notifyItemInserted(position)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
inner class ViewHolder(val mView: CardView) : RecyclerView.ViewHolder(mView) {
|
inner class ViewHolder(val mView: CardView) : RecyclerView.ViewHolder(mView) {
|
||||||
init {
|
init {
|
||||||
mView.setCardBackgroundColor(appColors.cardBackground)
|
mView.setCardBackgroundColor(appColors.cardBackgroundColor)
|
||||||
handleClickListeners()
|
handleClickListeners()
|
||||||
handleCustomTabActions()
|
handleCustomTabActions()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleClickListeners() {
|
private fun handleClickListeners() {
|
||||||
|
|
||||||
if (!fullHeightCards) {
|
|
||||||
mView.itemImage.maxHeight = c.resources.getDimension(R.dimen.card_image_max_height).toInt()
|
|
||||||
mView.itemImage.scaleType = ScaleType.CENTER_CROP
|
|
||||||
}
|
|
||||||
|
|
||||||
mView.favButton.setOnLikeListener(object : OnLikeListener {
|
mView.favButton.setOnLikeListener(object : OnLikeListener {
|
||||||
override fun liked(likeButton: LikeButton) {
|
override fun liked(likeButton: LikeButton) {
|
||||||
val (id) = items[adapterPosition]
|
val (id) = items[adapterPosition]
|
||||||
@ -251,11 +173,9 @@ class ItemCardAdapter(
|
|||||||
|
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(
|
c.openItemUrl(
|
||||||
|
items,
|
||||||
|
adapterPosition,
|
||||||
items[adapterPosition].getLinkDecoded(),
|
items[adapterPosition].getLinkDecoded(),
|
||||||
items[adapterPosition].content,
|
|
||||||
items[adapterPosition].getThumbnail(c),
|
|
||||||
items[adapterPosition].title,
|
|
||||||
items[adapterPosition].sourceAndDateText(),
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
|
@ -2,21 +2,19 @@ package apps.amine.bou.readerforselfoss.adapters
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Color
|
|
||||||
import android.support.constraint.ConstraintLayout
|
import android.support.constraint.ConstraintLayout
|
||||||
import android.support.design.widget.Snackbar
|
|
||||||
import android.support.v7.widget.RecyclerView
|
import android.support.v7.widget.RecyclerView
|
||||||
import android.text.Html
|
import android.text.Html
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.TextView
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import apps.amine.bou.readerforselfoss.R
|
import apps.amine.bou.readerforselfoss.R
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
|
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
|
||||||
@ -25,10 +23,9 @@ import apps.amine.bou.readerforselfoss.utils.openInBrowserAsNewTask
|
|||||||
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
||||||
import apps.amine.bou.readerforselfoss.utils.shareLink
|
import apps.amine.bou.readerforselfoss.utils.shareLink
|
||||||
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
|
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
|
||||||
import apps.amine.bou.readerforselfoss.utils.succeeded
|
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
||||||
import com.amulyakhare.textdrawable.TextDrawable
|
import com.amulyakhare.textdrawable.TextDrawable
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator
|
import com.amulyakhare.textdrawable.util.ColorGenerator
|
||||||
import com.crashlytics.android.Crashlytics
|
|
||||||
import com.like.LikeButton
|
import com.like.LikeButton
|
||||||
import com.like.OnLikeListener
|
import com.like.OnLikeListener
|
||||||
import kotlinx.android.synthetic.main.list_item.view.*
|
import kotlinx.android.synthetic.main.list_item.view.*
|
||||||
@ -39,16 +36,17 @@ import java.util.*
|
|||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
class ItemListAdapter(
|
class ItemListAdapter(
|
||||||
private val app: Activity,
|
override val app: Activity,
|
||||||
private val items: ArrayList<Item>,
|
override var items: ArrayList<Item>,
|
||||||
private val api: SelfossApi,
|
override val api: SelfossApi,
|
||||||
private val helper: CustomTabActivityHelper,
|
private val helper: CustomTabActivityHelper,
|
||||||
private val clickBehavior: Boolean,
|
private val clickBehavior: Boolean,
|
||||||
private val internalBrowser: Boolean,
|
private val internalBrowser: Boolean,
|
||||||
private val articleViewer: Boolean,
|
private val articleViewer: Boolean,
|
||||||
val debugReadingItems: Boolean,
|
override val debugReadingItems: Boolean,
|
||||||
val userIdentifier: String
|
override val userIdentifier: String,
|
||||||
) : RecyclerView.Adapter<ItemListAdapter.ViewHolder>() {
|
override val appColors: AppColors
|
||||||
|
) : ItemsAdapter<ItemListAdapter.ViewHolder>() {
|
||||||
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
||||||
private val c: Context = app.baseContext
|
private val c: Context = app.baseContext
|
||||||
private val bars: ArrayList<Boolean> = ArrayList(Collections.nCopies(items.size + 1, false))
|
private val bars: ArrayList<Boolean> = ArrayList(Collections.nCopies(items.size + 1, false))
|
||||||
@ -66,9 +64,10 @@ class ItemListAdapter(
|
|||||||
val itm = items[position]
|
val itm = items[position]
|
||||||
|
|
||||||
|
|
||||||
holder.mView.favButton.isLiked = itm.starred
|
|
||||||
holder.mView.title.text = Html.fromHtml(itm.title)
|
holder.mView.title.text = Html.fromHtml(itm.title)
|
||||||
|
|
||||||
|
holder.mView.title.setLinkTextColor(appColors.colorAccent)
|
||||||
|
|
||||||
holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText()
|
holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText()
|
||||||
|
|
||||||
if (itm.getThumbnail(c).isEmpty()) {
|
if (itm.getThumbnail(c).isEmpty()) {
|
||||||
@ -92,14 +91,13 @@ class ItemListAdapter(
|
|||||||
|
|
||||||
if (itm.getIcon(c).isEmpty()) {
|
if (itm.getIcon(c).isEmpty()) {
|
||||||
val color = generator.getColor(itm.sourcetitle)
|
val color = generator.getColor(itm.sourcetitle)
|
||||||
val textDrawable = StringBuilder()
|
|
||||||
for (s in itm.sourcetitle.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
|
|
||||||
textDrawable.append(s[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
val builder = TextDrawable.builder().round()
|
val drawable =
|
||||||
|
TextDrawable
|
||||||
|
.builder()
|
||||||
|
.round()
|
||||||
|
.build(itm.sourcetitle.toTextDrawableString(), color)
|
||||||
|
|
||||||
val drawable = builder.build(textDrawable.toString(), color)
|
|
||||||
holder.mView.itemImage.setImageDrawable(drawable)
|
holder.mView.itemImage.setImageDrawable(drawable)
|
||||||
} else {
|
} else {
|
||||||
c.circularBitmapDrawable(itm.getIcon(c), holder.mView.itemImage)
|
c.circularBitmapDrawable(itm.getIcon(c), holder.mView.itemImage)
|
||||||
@ -108,96 +106,22 @@ class ItemListAdapter(
|
|||||||
c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage)
|
c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: maybe handle this differently. It crashes when changing tab
|
||||||
|
try {
|
||||||
if (bars[position]) {
|
if (bars[position]) {
|
||||||
holder.mView.actionBar.visibility = View.VISIBLE
|
holder.mView.actionBar.visibility = View.VISIBLE
|
||||||
} else {
|
} else {
|
||||||
holder.mView.actionBar.visibility = View.GONE
|
holder.mView.actionBar.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
} catch (e: IndexOutOfBoundsException) {
|
||||||
|
holder.mView.actionBar.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
holder.mView.favButton.isLiked = itm.starred
|
holder.mView.favButton.isLiked = itm.starred
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = items.size
|
override fun getItemCount(): Int = items.size
|
||||||
|
|
||||||
private fun doUnmark(i: Item, position: Int) {
|
|
||||||
val s = Snackbar
|
|
||||||
.make(
|
|
||||||
app.findViewById(R.id.coordLayout),
|
|
||||||
R.string.marked_as_read,
|
|
||||||
Snackbar.LENGTH_LONG
|
|
||||||
)
|
|
||||||
.setAction(R.string.undo_string) {
|
|
||||||
items.add(position, i)
|
|
||||||
notifyItemInserted(position)
|
|
||||||
|
|
||||||
api.unmarkItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
|
||||||
override fun onResponse(
|
|
||||||
call: Call<SuccessResponse>,
|
|
||||||
response: Response<SuccessResponse>
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
|
||||||
items.remove(i)
|
|
||||||
notifyItemRemoved(position)
|
|
||||||
doUnmark(i, position)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
val view = s.view
|
|
||||||
val tv: TextView = view.findViewById(android.support.design.R.id.snackbar_text)
|
|
||||||
tv.setTextColor(Color.WHITE)
|
|
||||||
s.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun removeItemAtIndex(position: Int) {
|
|
||||||
|
|
||||||
val i = items[position]
|
|
||||||
|
|
||||||
items.remove(i)
|
|
||||||
notifyItemRemoved(position)
|
|
||||||
|
|
||||||
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
|
||||||
override fun onResponse(
|
|
||||||
call: Call<SuccessResponse>,
|
|
||||||
response: Response<SuccessResponse>
|
|
||||||
) {
|
|
||||||
if (!response.succeeded() && debugReadingItems) {
|
|
||||||
val message =
|
|
||||||
"message: ${response.message()} " +
|
|
||||||
"response isSuccess: ${response.isSuccessful} " +
|
|
||||||
"response code: ${response.code()} " +
|
|
||||||
"response message: ${response.message()} " +
|
|
||||||
"response errorBody: ${response.errorBody()?.string()} " +
|
|
||||||
"body success: ${response.body()?.success} " +
|
|
||||||
"body isSuccess: ${response.body()?.isSuccess}"
|
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
|
||||||
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
|
||||||
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
|
||||||
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
|
||||||
}
|
|
||||||
doUnmark(i, position)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
|
||||||
if (debugReadingItems) {
|
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
|
||||||
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
|
||||||
Crashlytics.logException(t)
|
|
||||||
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
|
||||||
}
|
|
||||||
Toast.makeText(
|
|
||||||
app,
|
|
||||||
app.getString(R.string.cant_mark_read),
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
items.add(i)
|
|
||||||
notifyItemInserted(position)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
inner class ViewHolder(val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
|
inner class ViewHolder(val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@ -273,11 +197,9 @@ class ItemListAdapter(
|
|||||||
if (!clickBehavior) {
|
if (!clickBehavior) {
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(
|
c.openItemUrl(
|
||||||
|
items,
|
||||||
|
adapterPosition,
|
||||||
items[adapterPosition].getLinkDecoded(),
|
items[adapterPosition].getLinkDecoded(),
|
||||||
items[adapterPosition].content,
|
|
||||||
items[adapterPosition].getThumbnail(c),
|
|
||||||
items[adapterPosition].title,
|
|
||||||
items[adapterPosition].sourceAndDateText(),
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
@ -292,11 +214,9 @@ class ItemListAdapter(
|
|||||||
mView.setOnClickListener { actionBarShowHide() }
|
mView.setOnClickListener { actionBarShowHide() }
|
||||||
mView.setOnLongClickListener {
|
mView.setOnLongClickListener {
|
||||||
c.openItemUrl(
|
c.openItemUrl(
|
||||||
|
items,
|
||||||
|
adapterPosition,
|
||||||
items[adapterPosition].getLinkDecoded(),
|
items[adapterPosition].getLinkDecoded(),
|
||||||
items[adapterPosition].content,
|
|
||||||
items[adapterPosition].getThumbnail(c),
|
|
||||||
items[adapterPosition].title,
|
|
||||||
items[adapterPosition].sourceAndDateText(),
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
|
@ -0,0 +1,123 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.adapters
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.support.design.widget.Snackbar
|
||||||
|
import android.support.v7.widget.RecyclerView
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.Toast
|
||||||
|
import apps.amine.bou.readerforselfoss.R
|
||||||
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.succeeded
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.Callback
|
||||||
|
import retrofit2.Response
|
||||||
|
|
||||||
|
abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapter<VH>() {
|
||||||
|
abstract var items: ArrayList<Item>
|
||||||
|
abstract val api: SelfossApi
|
||||||
|
abstract val debugReadingItems: Boolean
|
||||||
|
abstract val userIdentifier: String
|
||||||
|
abstract val app: Activity
|
||||||
|
abstract val appColors: AppColors
|
||||||
|
|
||||||
|
fun updateAllItems(newItems: ArrayList<Item>) {
|
||||||
|
items = newItems
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun doUnmark(i: Item, position: Int) {
|
||||||
|
val s = Snackbar
|
||||||
|
.make(
|
||||||
|
app.findViewById(R.id.coordLayout),
|
||||||
|
R.string.marked_as_read,
|
||||||
|
Snackbar.LENGTH_LONG
|
||||||
|
)
|
||||||
|
.setAction(R.string.undo_string) {
|
||||||
|
items.add(position, i)
|
||||||
|
notifyItemInserted(position)
|
||||||
|
|
||||||
|
api.unmarkItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
||||||
|
override fun onResponse(
|
||||||
|
call: Call<SuccessResponse>,
|
||||||
|
response: Response<SuccessResponse>
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
|
items.remove(i)
|
||||||
|
notifyItemRemoved(position)
|
||||||
|
doUnmark(i, position)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
val view = s.view
|
||||||
|
val tv: TextView = view.findViewById(android.support.design.R.id.snackbar_text)
|
||||||
|
tv.setTextColor(Color.WHITE)
|
||||||
|
s.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun removeItemAtIndex(position: Int) {
|
||||||
|
|
||||||
|
val i = items[position]
|
||||||
|
|
||||||
|
items.remove(i)
|
||||||
|
notifyItemRemoved(position)
|
||||||
|
|
||||||
|
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
||||||
|
override fun onResponse(
|
||||||
|
call: Call<SuccessResponse>,
|
||||||
|
response: Response<SuccessResponse>
|
||||||
|
) {
|
||||||
|
if (!response.succeeded() && debugReadingItems) {
|
||||||
|
val message =
|
||||||
|
"message: ${response.message()} " +
|
||||||
|
"response isSuccess: ${response.isSuccessful} " +
|
||||||
|
"response code: ${response.code()} " +
|
||||||
|
"response message: ${response.message()} " +
|
||||||
|
"response errorBody: ${response.errorBody()?.string()} " +
|
||||||
|
"body success: ${response.body()?.success} " +
|
||||||
|
"body isSuccess: ${response.body()?.isSuccess}"
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
||||||
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
|
|
||||||
|
Toast.makeText(app.baseContext, message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
doUnmark(i, position)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
|
if (debugReadingItems) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
|
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
||||||
|
Crashlytics.logException(t)
|
||||||
|
Toast.makeText(app.baseContext, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
Toast.makeText(
|
||||||
|
app,
|
||||||
|
app.getString(R.string.cant_mark_read),
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
items.add(i)
|
||||||
|
notifyItemInserted(position)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addItemAtIndex(item: Item, position: Int) {
|
||||||
|
items.add(position, item)
|
||||||
|
notifyItemInserted(position)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addItemsAtEnd(newItems: List<Item>) {
|
||||||
|
val oldSize = items.size
|
||||||
|
items.addAll(newItems)
|
||||||
|
notifyItemRangeInserted(oldSize, newItems.size)
|
||||||
|
}
|
||||||
|
}
|
@ -6,9 +6,9 @@ import com.google.gson.annotations.SerializedName
|
|||||||
|
|
||||||
class ParsedContent(
|
class ParsedContent(
|
||||||
@SerializedName("title") val title: String,
|
@SerializedName("title") val title: String,
|
||||||
@SerializedName("content") val content: String,
|
@SerializedName("content") val content: String?,
|
||||||
@SerializedName("date_published") val date_published: String,
|
@SerializedName("date_published") val date_published: String,
|
||||||
@SerializedName("lead_image_url") val lead_image_url: String,
|
@SerializedName("lead_image_url") val lead_image_url: String?,
|
||||||
@SerializedName("dek") val dek: String,
|
@SerializedName("dek") val dek: String,
|
||||||
@SerializedName("url") val url: String,
|
@SerializedName("url") val url: String,
|
||||||
@SerializedName("domain") val domain: String,
|
@SerializedName("domain") val domain: String,
|
||||||
@ -20,7 +20,8 @@ class ParsedContent(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmField
|
@JvmField
|
||||||
val CREATOR: Parcelable.Creator<ParsedContent> = object : Parcelable.Creator<ParsedContent> {
|
val CREATOR: Parcelable.Creator<ParsedContent> =
|
||||||
|
object : Parcelable.Creator<ParsedContent> {
|
||||||
override fun createFromParcel(source: Parcel): ParsedContent = ParsedContent(source)
|
override fun createFromParcel(source: Parcel): ParsedContent = ParsedContent(source)
|
||||||
override fun newArray(size: Int): Array<ParsedContent?> = arrayOfNulls(size)
|
override fun newArray(size: Int): Array<ParsedContent?> = arrayOfNulls(size)
|
||||||
}
|
}
|
||||||
|
@ -66,11 +66,12 @@ data class Item(
|
|||||||
@SerializedName("title") val title: String,
|
@SerializedName("title") val title: String,
|
||||||
@SerializedName("content") val content: String,
|
@SerializedName("content") val content: String,
|
||||||
@SerializedName("unread") val unread: Boolean,
|
@SerializedName("unread") val unread: Boolean,
|
||||||
@SerializedName("starred") val starred: Boolean,
|
@SerializedName("starred") var starred: Boolean,
|
||||||
@SerializedName("thumbnail") val thumbnail: String,
|
@SerializedName("thumbnail") val thumbnail: String,
|
||||||
@SerializedName("icon") val icon: String,
|
@SerializedName("icon") val icon: String,
|
||||||
@SerializedName("link") val link: String,
|
@SerializedName("link") val link: String,
|
||||||
@SerializedName("sourcetitle") val sourcetitle: String
|
@SerializedName("sourcetitle") val sourcetitle: String,
|
||||||
|
@SerializedName("tags") val tags: String
|
||||||
) : Parcelable {
|
) : Parcelable {
|
||||||
|
|
||||||
var config: Config? = null
|
var config: Config? = null
|
||||||
@ -92,7 +93,8 @@ data class Item(
|
|||||||
thumbnail = source.readString(),
|
thumbnail = source.readString(),
|
||||||
icon = source.readString(),
|
icon = source.readString(),
|
||||||
link = source.readString(),
|
link = source.readString(),
|
||||||
sourcetitle = source.readString()
|
sourcetitle = source.readString(),
|
||||||
|
tags = source.readString()
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun describeContents() = 0
|
override fun describeContents() = 0
|
||||||
@ -108,6 +110,7 @@ data class Item(
|
|||||||
dest.writeString(icon)
|
dest.writeString(icon)
|
||||||
dest.writeString(link)
|
dest.writeString(link)
|
||||||
dest.writeString(sourcetitle)
|
dest.writeString(sourcetitle)
|
||||||
|
dest.writeString(tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getIcon(app: Context): String {
|
fun getIcon(app: Context): String {
|
||||||
@ -127,7 +130,8 @@ data class Item(
|
|||||||
// TODO: maybe find a better way to handle these kind of urls
|
// TODO: maybe find a better way to handle these kind of urls
|
||||||
fun getLinkDecoded(): String {
|
fun getLinkDecoded(): String {
|
||||||
var stringUrl: String
|
var stringUrl: String
|
||||||
stringUrl = if (link.startsWith("http://news.google.com/news/") || link.startsWith("https://news.google.com/news/")) {
|
stringUrl =
|
||||||
|
if (link.startsWith("http://news.google.com/news/") || link.startsWith("https://news.google.com/news/")) {
|
||||||
if (link.contains("&url=")) {
|
if (link.contains("&url=")) {
|
||||||
link.substringAfter("&url=")
|
link.substringAfter("&url=")
|
||||||
} else {
|
} else {
|
||||||
@ -144,7 +148,7 @@ data class Item(
|
|||||||
|
|
||||||
// handle url not starting with http
|
// handle url not starting with http
|
||||||
if (stringUrl.startsWith("//")) {
|
if (stringUrl.startsWith("//")) {
|
||||||
stringUrl = "http:" + stringUrl
|
stringUrl = "http:$stringUrl"
|
||||||
}
|
}
|
||||||
|
|
||||||
return stringUrl
|
return stringUrl
|
||||||
|
@ -0,0 +1,452 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.fragments
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.content.res.ColorStateList
|
||||||
|
import android.graphics.drawable.ColorDrawable
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.preference.PreferenceManager
|
||||||
|
import android.support.customtabs.CustomTabsIntent
|
||||||
|
import android.support.design.widget.FloatingActionButton
|
||||||
|
import android.support.v4.app.Fragment
|
||||||
|
import android.support.v4.content.ContextCompat
|
||||||
|
import android.support.v4.widget.NestedScrollView
|
||||||
|
import android.support.v7.app.AlertDialog
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.MenuItem
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.webkit.WebSettings
|
||||||
|
import apps.amine.bou.readerforselfoss.BuildConfig
|
||||||
|
import apps.amine.bou.readerforselfoss.R
|
||||||
|
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
||||||
|
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
||||||
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.shareLink
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.toPx
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.bumptech.glide.request.RequestOptions
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
|
import com.ftinc.scoop.Scoop
|
||||||
|
import com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
||||||
|
import kotlinx.android.synthetic.main.fragment_article.view.*
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.Callback
|
||||||
|
import retrofit2.Response
|
||||||
|
import java.net.MalformedURLException
|
||||||
|
import java.net.URL
|
||||||
|
|
||||||
|
class ArticleFragment : Fragment() {
|
||||||
|
private lateinit var pageNumber: Number
|
||||||
|
private var fontSize: Int = 14
|
||||||
|
private lateinit var allItems: ArrayList<Item>
|
||||||
|
private lateinit var mCustomTabActivityHelper: CustomTabActivityHelper
|
||||||
|
private lateinit var url: String
|
||||||
|
private lateinit var contentText: String
|
||||||
|
private lateinit var contentSource: String
|
||||||
|
private lateinit var contentImage: String
|
||||||
|
private lateinit var contentTitle: String
|
||||||
|
private var showMalformedUrl: Boolean = false
|
||||||
|
private lateinit var editor: SharedPreferences.Editor
|
||||||
|
private lateinit var fab: FloatingActionButton
|
||||||
|
private lateinit var appColors: AppColors
|
||||||
|
|
||||||
|
override fun onStop() {
|
||||||
|
super.onStop()
|
||||||
|
mCustomTabActivityHelper.unbindCustomTabsService(activity)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
appColors = AppColors(activity!!)
|
||||||
|
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
pageNumber = arguments!!.getInt(ARG_POSITION)
|
||||||
|
allItems = arguments!!.getParcelableArrayList(ARG_ITEMS)
|
||||||
|
}
|
||||||
|
|
||||||
|
private lateinit var rootView: ViewGroup
|
||||||
|
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View? {
|
||||||
|
rootView = inflater
|
||||||
|
.inflate(R.layout.fragment_article, container, false) as ViewGroup
|
||||||
|
|
||||||
|
val context: Context = activity!!
|
||||||
|
|
||||||
|
url = allItems[pageNumber.toInt()].getLinkDecoded()
|
||||||
|
contentText = allItems[pageNumber.toInt()].content
|
||||||
|
contentTitle = allItems[pageNumber.toInt()].title
|
||||||
|
contentImage = allItems[pageNumber.toInt()].getThumbnail(activity!!)
|
||||||
|
contentSource = allItems[pageNumber.toInt()].sourceAndDateText()
|
||||||
|
|
||||||
|
fab = rootView.fab
|
||||||
|
|
||||||
|
fab.backgroundTintList = ColorStateList.valueOf(appColors.colorAccent)
|
||||||
|
|
||||||
|
fab.rippleColor = appColors.colorAccentDark
|
||||||
|
|
||||||
|
val floatingToolbar: FloatingToolbar = rootView.floatingToolbar
|
||||||
|
floatingToolbar.attachFab(fab)
|
||||||
|
|
||||||
|
floatingToolbar.background = ColorDrawable(appColors.colorAccent)
|
||||||
|
|
||||||
|
val customTabsIntent = activity!!.buildCustomTabsIntent()
|
||||||
|
mCustomTabActivityHelper = CustomTabActivityHelper()
|
||||||
|
mCustomTabActivityHelper.bindCustomTabsService(activity)
|
||||||
|
|
||||||
|
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
|
||||||
|
editor = prefs.edit()
|
||||||
|
fontSize = prefs.getString("reader_font_size", "14").toInt()
|
||||||
|
showMalformedUrl = prefs.getBoolean("show_error_malformed_url", true)
|
||||||
|
|
||||||
|
|
||||||
|
floatingToolbar.setClickListener(
|
||||||
|
object : FloatingToolbar.ItemClickListener {
|
||||||
|
override fun onItemClick(item: MenuItem) {
|
||||||
|
when (item.itemId) {
|
||||||
|
R.id.more_action -> getContentFromMercury(customTabsIntent, prefs, context)
|
||||||
|
R.id.share_action -> activity!!.shareLink(url)
|
||||||
|
R.id.open_action -> activity!!.openItemUrl(
|
||||||
|
allItems,
|
||||||
|
pageNumber.toInt(),
|
||||||
|
url,
|
||||||
|
customTabsIntent,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
activity!!
|
||||||
|
)
|
||||||
|
else -> Unit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onItemLongClick(item: MenuItem?) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
rootView.source.text = contentSource
|
||||||
|
|
||||||
|
if (contentText.isEmptyOrNullOrNullString()) {
|
||||||
|
getContentFromMercury(customTabsIntent, prefs, context)
|
||||||
|
} else {
|
||||||
|
rootView.titleView.text = contentTitle
|
||||||
|
|
||||||
|
htmlToWebview(contentText, prefs, context)
|
||||||
|
|
||||||
|
if (!contentImage.isEmptyOrNullOrNullString()) {
|
||||||
|
rootView.imageView.visibility = View.VISIBLE
|
||||||
|
Glide
|
||||||
|
.with(context)
|
||||||
|
.asBitmap()
|
||||||
|
.load(contentImage)
|
||||||
|
.apply(RequestOptions.fitCenterTransform())
|
||||||
|
.into(rootView.imageView)
|
||||||
|
} else {
|
||||||
|
rootView.imageView.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootView.nestedScrollView.setOnScrollChangeListener(
|
||||||
|
NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
|
||||||
|
if (scrollY > oldScrollY) {
|
||||||
|
fab.hide()
|
||||||
|
} else {
|
||||||
|
if (floatingToolbar.isShowing) floatingToolbar.hide() else fab.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return rootView
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getContentFromMercury(
|
||||||
|
customTabsIntent: CustomTabsIntent,
|
||||||
|
prefs: SharedPreferences,
|
||||||
|
context: Context
|
||||||
|
) {
|
||||||
|
rootView.progressBar.visibility = View.VISIBLE
|
||||||
|
val parser = MercuryApi(
|
||||||
|
BuildConfig.MERCURY_KEY,
|
||||||
|
prefs.getBoolean("should_log_everything", false)
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.parseUrl(url).enqueue(
|
||||||
|
object : Callback<ParsedContent> {
|
||||||
|
override fun onResponse(
|
||||||
|
call: Call<ParsedContent>,
|
||||||
|
response: Response<ParsedContent>
|
||||||
|
) {
|
||||||
|
// TODO: clean all the following after finding the mercury content issue
|
||||||
|
try {
|
||||||
|
if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) {
|
||||||
|
try {
|
||||||
|
rootView.titleView.text = response.body()!!.title
|
||||||
|
url = response.body()!!.url
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"MERCURY_CONTENT_EXCEPTION",
|
||||||
|
"source titleView or url issues"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
htmlToWebview(response.body()!!.content.orEmpty(), prefs, context)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"MERCURY_CONTENT_EXCEPTION",
|
||||||
|
"Webview issue ${e.message}"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isNullOrEmpty()) {
|
||||||
|
rootView.imageView.visibility = View.VISIBLE
|
||||||
|
try {
|
||||||
|
Glide
|
||||||
|
.with(context)
|
||||||
|
.asBitmap()
|
||||||
|
.load(response.body()!!.lead_image_url)
|
||||||
|
.apply(RequestOptions.fitCenterTransform())
|
||||||
|
.into(rootView.imageView)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(
|
||||||
|
prefs.getString(
|
||||||
|
"unique_id",
|
||||||
|
""
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"MERCURY_CONTENT_EXCEPTION",
|
||||||
|
"Glide issue with image ${response.body()!!.lead_image_url}"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rootView.imageView.visibility = View.GONE
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"MERCURY_CONTENT_EXCEPTION",
|
||||||
|
"Glide or image issue"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
rootView.nestedScrollView.scrollTo(0, 0)
|
||||||
|
|
||||||
|
rootView.progressBar.visibility = View.GONE
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"MERCURY_CONTENT_EXCEPTION",
|
||||||
|
"Scroll or visibility issues"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
openInBrowserAfterFailing(customTabsIntent)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"MERCURY_CONTENT_EXCEPTION",
|
||||||
|
"Browser after failing issue"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"MERCURY_CONTENT_EXCEPTION",
|
||||||
|
"UNCAUGHT (?) Fatal Exception on mercury response"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(
|
||||||
|
call: Call<ParsedContent>,
|
||||||
|
t: Throwable
|
||||||
|
) = openInBrowserAfterFailing(customTabsIntent)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun htmlToWebview(c: String, prefs: SharedPreferences, context: Context) {
|
||||||
|
|
||||||
|
val stringColor = String.format("#%06X", 0xFFFFFF and appColors.colorAccent)
|
||||||
|
|
||||||
|
rootView.webcontent.visibility = View.VISIBLE
|
||||||
|
val (textColor, backgroundColor) = if (appColors.isDarkTheme) {
|
||||||
|
rootView.webcontent.setBackgroundColor(
|
||||||
|
ContextCompat.getColor(
|
||||||
|
context,
|
||||||
|
R.color.dark_webview
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Pair(ContextCompat.getColor(context, R.color.dark_webview_text), ContextCompat.getColor(context, R.color.light_webview_text))
|
||||||
|
} else {
|
||||||
|
rootView.webcontent.setBackgroundColor(
|
||||||
|
ContextCompat.getColor(
|
||||||
|
context,
|
||||||
|
R.color.light_webview
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Pair(ContextCompat.getColor(context, R.color.light_webview_text), ContextCompat.getColor(context, R.color.dark_webview_text))
|
||||||
|
}
|
||||||
|
|
||||||
|
val stringTextColor = String.format("#%06X", 0xFFFFFF and textColor)
|
||||||
|
val stringBackgroundColor = String.format("#%06X", 0xFFFFFF and backgroundColor)
|
||||||
|
|
||||||
|
rootView.webcontent.settings.useWideViewPort = true
|
||||||
|
rootView.webcontent.settings.loadWithOverviewMode = true
|
||||||
|
rootView.webcontent.settings.javaScriptEnabled = false
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
|
rootView.webcontent.settings.layoutAlgorithm =
|
||||||
|
WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
|
||||||
|
} else {
|
||||||
|
rootView.webcontent.settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
|
||||||
|
}
|
||||||
|
|
||||||
|
var baseUrl: String? = null
|
||||||
|
|
||||||
|
try {
|
||||||
|
val itemUrl = URL(url)
|
||||||
|
baseUrl = itemUrl.protocol + "://" + itemUrl.host
|
||||||
|
} catch (e: MalformedURLException) {
|
||||||
|
if (showMalformedUrl) {
|
||||||
|
val alertDialog = AlertDialog.Builder(context).create()
|
||||||
|
alertDialog.setTitle("Error")
|
||||||
|
alertDialog.setMessage("You are encountering a bug that I can't solve. Can you please contact me to solve the issue, please ?")
|
||||||
|
alertDialog.setButton(
|
||||||
|
AlertDialog.BUTTON_POSITIVE,
|
||||||
|
"Send mail",
|
||||||
|
{ dialog, _ ->
|
||||||
|
|
||||||
|
// This won't be translated because it should only be temporary.
|
||||||
|
val to = BuildConfig.FEEDBACK_EMAIL
|
||||||
|
val subject= "[MalformedURLException]"
|
||||||
|
val body= "Please specify the source, item and spout you are using for the url below : \n ${e.message}"
|
||||||
|
val mailTo = "mailto:" + to + "?&subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body)
|
||||||
|
|
||||||
|
val emailIntent = Intent(Intent.ACTION_VIEW)
|
||||||
|
emailIntent.data = Uri.parse(mailTo)
|
||||||
|
startActivity(emailIntent)
|
||||||
|
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
alertDialog.setButton(
|
||||||
|
AlertDialog.BUTTON_NEUTRAL,
|
||||||
|
"Not now",
|
||||||
|
{ dialog, _ -> dialog.dismiss() }
|
||||||
|
)
|
||||||
|
alertDialog.setButton(
|
||||||
|
AlertDialog.BUTTON_NEGATIVE,
|
||||||
|
"Don't show anymore.",
|
||||||
|
{ dialog, _ ->
|
||||||
|
editor.putBoolean("show_error_malformed_url", false)
|
||||||
|
editor.apply()
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
alertDialog.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootView.webcontent.loadDataWithBaseURL(
|
||||||
|
baseUrl,
|
||||||
|
"""<style>
|
||||||
|
|img {
|
||||||
|
| display: inline-block;
|
||||||
|
| height: auto;
|
||||||
|
| width: 100%;
|
||||||
|
| max-width: 100%;
|
||||||
|
|}
|
||||||
|
|a {
|
||||||
|
| color: $stringColor !important;
|
||||||
|
|}
|
||||||
|
|*:not(a) {
|
||||||
|
| color: $stringTextColor;
|
||||||
|
|}
|
||||||
|
|* {
|
||||||
|
| font-size: ${fontSize.toPx}px;
|
||||||
|
| text-align: justify;
|
||||||
|
| word-break: break-word;
|
||||||
|
| overflow:hidden;
|
||||||
|
|}
|
||||||
|
|a, pre, code {
|
||||||
|
| text-align: left;
|
||||||
|
|}
|
||||||
|
|pre, code {
|
||||||
|
| white-space: pre-wrap;
|
||||||
|
| width:100%;
|
||||||
|
| background-color: $stringBackgroundColor;
|
||||||
|
|}</style>$c""".trimMargin(),
|
||||||
|
"text/html; charset=utf-8",
|
||||||
|
"utf-8",
|
||||||
|
null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openInBrowserAfterFailing(customTabsIntent: CustomTabsIntent) {
|
||||||
|
rootView.progressBar.visibility = View.GONE
|
||||||
|
activity!!.openItemUrl(
|
||||||
|
allItems,
|
||||||
|
pageNumber.toInt(),
|
||||||
|
url,
|
||||||
|
customTabsIntent,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
activity!!
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val ARG_POSITION = "position"
|
||||||
|
private const val ARG_ITEMS = "items"
|
||||||
|
|
||||||
|
fun newInstance(
|
||||||
|
position: Int,
|
||||||
|
allItems: ArrayList<Item>
|
||||||
|
): ArticleFragment {
|
||||||
|
val fragment = ArticleFragment()
|
||||||
|
val args = Bundle()
|
||||||
|
args.putInt(ARG_POSITION, position)
|
||||||
|
args.putParcelableArrayList(ARG_ITEMS, allItems)
|
||||||
|
fragment.arguments = args
|
||||||
|
return fragment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -16,23 +16,27 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R;
|
|
||||||
import com.ftinc.scoop.Scoop;
|
import com.ftinc.scoop.Scoop;
|
||||||
|
|
||||||
|
import apps.amine.bou.readerforselfoss.R;
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors;
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.Toppings;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link PreferenceActivity} which implements and proxies the necessary calls
|
* A {@link PreferenceActivity} which implements and proxies the necessary calls
|
||||||
* to be used with AppCompat.
|
* to be used with AppCompat.
|
||||||
*/
|
*/
|
||||||
public abstract class AppCompatPreferenceActivity extends PreferenceActivity { //NOSONAR
|
public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
|
||||||
|
|
||||||
private AppCompatDelegate mDelegate;
|
private AppCompatDelegate mDelegate;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
new AppColors(this);
|
||||||
|
|
||||||
getDelegate().installViewFactory();
|
getDelegate().installViewFactory();
|
||||||
getDelegate().onCreate(savedInstanceState);
|
getDelegate().onCreate(savedInstanceState);
|
||||||
Scoop.getInstance().apply(this);
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,9 +44,15 @@ public abstract class AppCompatPreferenceActivity extends PreferenceActivity { /
|
|||||||
protected void onPostCreate(Bundle savedInstanceState) {
|
protected void onPostCreate(Bundle savedInstanceState) {
|
||||||
super.onPostCreate(savedInstanceState);
|
super.onPostCreate(savedInstanceState);
|
||||||
|
|
||||||
LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
|
LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
|
||||||
AppBarLayout bar = (AppBarLayout) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
|
AppBarLayout bar = (AppBarLayout) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
|
||||||
Toolbar toolbar = bar.findViewById(R.id.toolbar);
|
Toolbar toolbar = bar.findViewById(R.id.toolbar);
|
||||||
|
|
||||||
|
// TODO: all switches
|
||||||
|
Scoop.getInstance()
|
||||||
|
.bind(this, Toppings.PRIMARY.getValue(), toolbar)
|
||||||
|
.bindStatusBar(this, Toppings.PRIMARY_DARK.getValue());
|
||||||
|
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
getSupportActionBar().setDisplayShowHomeEnabled(true);
|
getSupportActionBar().setDisplayShowHomeEnabled(true);
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package apps.amine.bou.readerforselfoss.settings;
|
package apps.amine.bou.readerforselfoss.settings;
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.ClipData;
|
import android.content.ClipData;
|
||||||
import android.content.ClipboardManager;
|
import android.content.ClipboardManager;
|
||||||
@ -22,15 +20,23 @@ import android.preference.PreferenceFragment;
|
|||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
|
import android.text.Editable;
|
||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.ftinc.scoop.ui.ScoopSettingsActivity;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.BuildConfig;
|
import apps.amine.bou.readerforselfoss.BuildConfig;
|
||||||
import apps.amine.bou.readerforselfoss.R;
|
import apps.amine.bou.readerforselfoss.R;
|
||||||
|
import apps.amine.bou.readerforselfoss.themes.AppColors;
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config;
|
import apps.amine.bou.readerforselfoss.utils.Config;
|
||||||
import com.ftinc.scoop.ui.ScoopSettingsActivity;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -44,7 +50,7 @@ import com.ftinc.scoop.ui.ScoopSettingsActivity;
|
|||||||
* href="http://developer.android.com/guide/topics/ui/settings.html">Settings
|
* href="http://developer.android.com/guide/topics/ui/settings.html">Settings
|
||||||
* API Guide</a> for more information on developing a Settings UI.
|
* API Guide</a> for more information on developing a Settings UI.
|
||||||
*/
|
*/
|
||||||
public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
public class SettingsActivity extends AppCompatPreferenceActivity {
|
||||||
/**
|
/**
|
||||||
* A preference value change listener that updates the preference's summary
|
* A preference value change listener that updates the preference's summary
|
||||||
* to reflect its new value.
|
* to reflect its new value.
|
||||||
@ -90,6 +96,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
new AppColors(this);
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setupActionBar();
|
setupActionBar();
|
||||||
}
|
}
|
||||||
@ -130,8 +137,10 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
protected boolean isValidFragment(String fragmentName) {
|
protected boolean isValidFragment(String fragmentName) {
|
||||||
return PreferenceFragment.class.getName().equals(fragmentName)
|
return PreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|| GeneralPreferenceFragment.class.getName().equals(fragmentName)
|
|| GeneralPreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|
|| ArticleViewerPreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|| DebugPreferenceFragment.class.getName().equals(fragmentName)
|
|| DebugPreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|| LinksPreferenceFragment.class.getName().equals(fragmentName);
|
|| LinksPreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|
|| ThemePreferenceFragment.class.getName().equals(fragmentName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -150,7 +159,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
final SwitchPreference tabOnTap = (SwitchPreference) findPreference("tab_on_tap");
|
final SwitchPreference tabOnTap = (SwitchPreference) findPreference("tab_on_tap");
|
||||||
tabOnTap.setEnabled(!cardViewActive.isChecked());
|
tabOnTap.setEnabled(!cardViewActive.isChecked());
|
||||||
cardViewActive.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
cardViewActive.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue){
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
boolean isEnabled = (Boolean) newValue;
|
boolean isEnabled = (Boolean) newValue;
|
||||||
tabOnTap.setEnabled(!isEnabled);
|
tabOnTap.setEnabled(!isEnabled);
|
||||||
return true;
|
return true;
|
||||||
@ -159,13 +168,13 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
|
|
||||||
EditTextPreference itemsNumber = (EditTextPreference) findPreference("prefer_api_items_number");
|
EditTextPreference itemsNumber = (EditTextPreference) findPreference("prefer_api_items_number");
|
||||||
itemsNumber.getEditText().setFilters(new InputFilter[]{
|
itemsNumber.getEditText().setFilters(new InputFilter[]{
|
||||||
new InputFilter (){
|
new InputFilter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
|
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
|
||||||
try {
|
try {
|
||||||
int input = Integer.parseInt(dest.toString() + source.toString());
|
int input = Integer.parseInt(dest.toString() + source.toString());
|
||||||
if (input <= 200 && input >0)
|
if (input <= 200 && input > 0)
|
||||||
return null;
|
return null;
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
Toast.makeText(getActivity(), R.string.items_number_should_be_number, Toast.LENGTH_LONG).show();
|
Toast.makeText(getActivity(), R.string.items_number_should_be_number, Toast.LENGTH_LONG).show();
|
||||||
@ -187,6 +196,56 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
public static class ArticleViewerPreferenceFragment extends PreferenceFragment {
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
addPreferencesFromResource(R.xml.pref_viewer);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
|
final EditTextPreference fontSize = (EditTextPreference) findPreference("reader_font_size");
|
||||||
|
fontSize.getEditText().addTextChangedListener(new TextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable editable) {
|
||||||
|
try {
|
||||||
|
fontSize.getEditText().setTextSize(Integer.parseInt(editable.toString()));
|
||||||
|
} catch (NumberFormatException e) {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fontSize.getEditText().setFilters(new InputFilter[]{
|
||||||
|
new InputFilter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
|
||||||
|
try {
|
||||||
|
int input = Integer.parseInt(dest.toString() + source.toString());
|
||||||
|
if (input > 0)
|
||||||
|
return null;
|
||||||
|
} catch (NumberFormatException nfe) {}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
int id = item.getItemId();
|
||||||
|
if (id == android.R.id.home) {
|
||||||
|
getActivity().finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
public static class DebugPreferenceFragment extends PreferenceFragment {
|
public static class DebugPreferenceFragment extends PreferenceFragment {
|
||||||
@Override
|
@Override
|
||||||
@ -195,7 +254,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
addPreferencesFromResource(R.xml.pref_debug);
|
addPreferencesFromResource(R.xml.pref_debug);
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
SharedPreferences pref = getActivity().getSharedPreferences(Config.Companion.getSettingsName(), Context.MODE_PRIVATE);
|
SharedPreferences pref = getActivity().getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE);
|
||||||
final String id = pref.getString("unique_id", "...");
|
final String id = pref.getString("unique_id", "...");
|
||||||
|
|
||||||
final Preference identifier = findPreference("debug_identifier");
|
final Preference identifier = findPreference("debug_identifier");
|
||||||
@ -205,12 +264,15 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
identifier.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
identifier.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
if (clipboard != null) {
|
||||||
ClipData clip = ClipData.newPlainText("Selfoss unique id", id);
|
ClipData clip = ClipData.newPlainText("Selfoss unique id", id);
|
||||||
clipboard.setPrimaryClip(clip);
|
clipboard.setPrimaryClip(clip);
|
||||||
|
|
||||||
Toast.makeText(getActivity(), R.string.unique_id_to_clipboard, Toast.LENGTH_LONG).show();
|
Toast.makeText(getActivity(), R.string.unique_id_to_clipboard, Toast.LENGTH_LONG).show();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
identifier.setTitle(id);
|
identifier.setTitle(id);
|
||||||
}
|
}
|
||||||
@ -243,7 +305,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
addPreferencesFromResource(R.xml.pref_links);
|
addPreferencesFromResource(R.xml.pref_links);
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
findPreference( "trackerLink" ).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
findPreference("trackerLink").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
openUrl(Uri.parse(BuildConfig.TRACKER_URL));
|
openUrl(Uri.parse(BuildConfig.TRACKER_URL));
|
||||||
@ -279,14 +341,38 @@ public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
public static class ThemePreferenceFragment extends PreferenceFragment {
|
||||||
@Override
|
@Override
|
||||||
public void onHeaderClick(Header header, int position) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onHeaderClick(header, position);
|
super.onCreate(savedInstanceState);
|
||||||
if (header.id == R.id.theme_change) {
|
addPreferencesFromResource(R.xml.pref_theme);
|
||||||
Intent intent = ScoopSettingsActivity.createIntent(getApplicationContext());
|
setHasOptionsMenu(true);
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
}
|
||||||
getApplicationContext().startActivity(intent);
|
|
||||||
finish();
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
int id = item.getItemId();
|
||||||
|
if (id == android.R.id.home) {
|
||||||
|
getActivity().finish();
|
||||||
|
return true;
|
||||||
|
} else if (id == R.id.clear) {
|
||||||
|
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
||||||
|
SharedPreferences.Editor editor = pref.edit();
|
||||||
|
editor.remove("color_primary");
|
||||||
|
editor.remove("color_primary_dark");
|
||||||
|
editor.remove("color_accent");
|
||||||
|
editor.remove("color_accent_dark");
|
||||||
|
editor.remove("dark_theme");
|
||||||
|
editor.apply();
|
||||||
|
getActivity().finish();
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
inflater.inflate(R.menu.settings_theme, menu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,49 +2,65 @@ package apps.amine.bou.readerforselfoss.themes
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.preference.PreferenceManager
|
||||||
import android.support.annotation.ColorInt
|
import android.support.annotation.ColorInt
|
||||||
|
import android.support.v7.view.ContextThemeWrapper
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import apps.amine.bou.readerforselfoss.R
|
import apps.amine.bou.readerforselfoss.R
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
|
||||||
class AppColors(a: Activity) {
|
class AppColors(a: Activity) {
|
||||||
@ColorInt val accent: Int
|
|
||||||
@ColorInt val dark: Int
|
@ColorInt val colorPrimary: Int
|
||||||
@ColorInt val primary: Int
|
@ColorInt val colorPrimaryDark: Int
|
||||||
@ColorInt val cardBackground: Int
|
@ColorInt val colorAccent: Int
|
||||||
@ColorInt val windowBackground: Int
|
@ColorInt val colorAccentDark: Int
|
||||||
|
@ColorInt val cardBackgroundColor: Int
|
||||||
val isDarkTheme: Boolean
|
val isDarkTheme: Boolean
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
val sharedPref = PreferenceManager.getDefaultSharedPreferences(a)
|
||||||
|
|
||||||
|
colorPrimary =
|
||||||
|
sharedPref.getInt(
|
||||||
|
"color_primary",
|
||||||
|
a.resources.getColor(R.color.colorPrimary)
|
||||||
|
)
|
||||||
|
colorPrimaryDark =
|
||||||
|
sharedPref.getInt(
|
||||||
|
"color_primary_dark",
|
||||||
|
a.resources.getColor(R.color.colorPrimaryDark)
|
||||||
|
)
|
||||||
|
colorAccent =
|
||||||
|
sharedPref.getInt(
|
||||||
|
"color_accent",
|
||||||
|
a.resources.getColor(R.color.colorAccent)
|
||||||
|
)
|
||||||
|
colorAccentDark =
|
||||||
|
sharedPref.getInt(
|
||||||
|
"color_accent_dark",
|
||||||
|
a.resources.getColor(R.color.colorAccentDark)
|
||||||
|
)
|
||||||
|
isDarkTheme =
|
||||||
|
sharedPref.getBoolean(
|
||||||
|
"dark_theme",
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
|
if (isDarkTheme) {
|
||||||
|
a.setTheme(R.style.NoBarDark)
|
||||||
|
} else {
|
||||||
|
a.setTheme(R.style.NoBar)
|
||||||
|
}
|
||||||
|
|
||||||
val wrapper = Context::class.java
|
val wrapper = Context::class.java
|
||||||
val method = wrapper!!.getMethod("getThemeResId")
|
val method = wrapper!!.getMethod("getThemeResId")
|
||||||
method.isAccessible = true
|
method.isAccessible = true
|
||||||
|
|
||||||
isDarkTheme = when (method.invoke(a.baseContext)) {
|
|
||||||
R.style.NoBarTealOrangeDark,
|
|
||||||
R.style.NoBarDark,
|
|
||||||
R.style.NoBarBlueAmberDark,
|
|
||||||
R.style.NoBarGreyOrangeDark,
|
|
||||||
R.style.NoBarIndigoPinkDark,
|
|
||||||
R.style.NoBarRedTealDark,
|
|
||||||
R.style.NoBarCyanPinkDark -> true
|
|
||||||
else -> false
|
|
||||||
}
|
|
||||||
|
|
||||||
val typedAccent = TypedValue()
|
|
||||||
val typedAccentDark = TypedValue()
|
|
||||||
val typedPrimary = TypedValue()
|
|
||||||
val typedCardBackground = TypedValue()
|
val typedCardBackground = TypedValue()
|
||||||
val typedWindowBackground = TypedValue()
|
|
||||||
|
|
||||||
a.theme.resolveAttribute(R.attr.colorAccent, typedAccent, true)
|
|
||||||
a.theme.resolveAttribute(R.attr.colorAccent, typedAccent, true)
|
|
||||||
a.theme.resolveAttribute(R.attr.colorPrimary, typedPrimary, true)
|
|
||||||
a.theme.resolveAttribute(R.attr.cardBackgroundColor, typedCardBackground, true)
|
a.theme.resolveAttribute(R.attr.cardBackgroundColor, typedCardBackground, true)
|
||||||
a.theme.resolveAttribute(android.R.attr.colorBackground, typedWindowBackground, true)
|
|
||||||
accent = typedAccent.data
|
cardBackgroundColor = typedCardBackground.data
|
||||||
dark = typedAccentDark.data
|
|
||||||
primary = typedPrimary.data
|
|
||||||
cardBackground = typedCardBackground.data
|
|
||||||
windowBackground = typedWindowBackground.data
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.themes
|
||||||
|
|
||||||
|
enum class Toppings(val value: Int) {
|
||||||
|
PRIMARY(1),
|
||||||
|
PRIMARY_DARK(2),
|
||||||
|
ACCENT(3),
|
||||||
|
ACCENT_DARK(4)
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.transformers
|
||||||
|
|
||||||
|
import android.support.v4.view.ViewPager
|
||||||
|
import android.view.View
|
||||||
|
|
||||||
|
class DepthPageTransformer : ViewPager.PageTransformer {
|
||||||
|
|
||||||
|
override fun transformPage(view: View, position: Float) {
|
||||||
|
val pageWidth = view.width
|
||||||
|
|
||||||
|
when {
|
||||||
|
position < -1 -> // [-Infinity,-1)
|
||||||
|
// This page is way off-screen to the left.
|
||||||
|
view.alpha = 0F
|
||||||
|
position <= 0 -> { // [-1,0]
|
||||||
|
// Use the default slide transition when moving to the left page
|
||||||
|
view.alpha = 1F
|
||||||
|
view.translationX = 0F
|
||||||
|
view.scaleX = 1F
|
||||||
|
view.scaleY = 1F
|
||||||
|
}
|
||||||
|
position <= 1 -> { // (0,1]
|
||||||
|
// Fade the page out.
|
||||||
|
view.alpha = 1 - position
|
||||||
|
|
||||||
|
// Counteract the default slide transition
|
||||||
|
view.translationX = pageWidth * -position
|
||||||
|
|
||||||
|
// Scale the page down (between MIN_SCALE and 1)
|
||||||
|
val scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position))
|
||||||
|
view.scaleX = scaleFactor
|
||||||
|
view.scaleY = scaleFactor
|
||||||
|
}
|
||||||
|
else -> // (1,+Infinity]
|
||||||
|
// This page is way off-screen to the right.
|
||||||
|
view.alpha = 0F
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val MIN_SCALE = 0.75f
|
||||||
|
}
|
||||||
|
}
|
@ -26,7 +26,7 @@ class Config(c: Context) {
|
|||||||
get() = settings.getString("httpPassword", "")
|
get() = settings.getString("httpPassword", "")
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val settingsName = "paramsselfoss"
|
const val settingsName = "paramsselfoss"
|
||||||
|
|
||||||
fun logoutAndRedirect(
|
fun logoutAndRedirect(
|
||||||
c: Context,
|
c: Context,
|
||||||
|
@ -7,7 +7,7 @@ import javax.net.ssl.SSLContext
|
|||||||
import javax.net.ssl.TrustManager
|
import javax.net.ssl.TrustManager
|
||||||
import javax.net.ssl.X509TrustManager
|
import javax.net.ssl.X509TrustManager
|
||||||
|
|
||||||
fun getUnsafeHttpClient() =
|
fun getUnsafeHttpClient(): OkHttpClient.Builder =
|
||||||
try {
|
try {
|
||||||
// Create a trust manager that does not validate certificate chains
|
// Create a trust manager that does not validate certificate chains
|
||||||
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
|
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
|
||||||
|
@ -2,14 +2,24 @@ package apps.amine.bou.readerforselfoss.utils
|
|||||||
|
|
||||||
import android.text.format.DateUtils
|
import android.text.format.DateUtils
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
import java.text.ParseException
|
import java.text.ParseException
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
fun String.toTextDrawableString(): String {
|
fun String.toTextDrawableString(): String {
|
||||||
val textDrawable = StringBuilder()
|
val textDrawable = StringBuilder()
|
||||||
for (s in this.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
|
for (s in this.split(" ".toRegex()).filter { !it.isEmpty() }.toTypedArray()) {
|
||||||
|
try {
|
||||||
textDrawable.append(s[0])
|
textDrawable.append(s[0])
|
||||||
|
} catch (e: StringIndexOutOfBoundsException) {
|
||||||
|
Crashlytics.log(
|
||||||
|
100,
|
||||||
|
"TEXT_DRAWABLE_INDEX_OUT_OF_BOUND",
|
||||||
|
this + " produces ${e.message}"
|
||||||
|
)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return textDrawable.toString()
|
return textDrawable.toString()
|
||||||
}
|
}
|
||||||
@ -29,3 +39,17 @@ fun Item.sourceAndDateText(): String {
|
|||||||
|
|
||||||
return this.sourcetitle + formattedDate
|
return this.sourcetitle + formattedDate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Item.toggleStar(): Item {
|
||||||
|
this.starred = !this.starred
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
fun List<Item>.flattenTags(): List<Item> =
|
||||||
|
this.flatMap {
|
||||||
|
val item = it
|
||||||
|
val tags: List<String> = it.tags.split(",")
|
||||||
|
tags.map {
|
||||||
|
item.copy(tags = it.trim())
|
||||||
|
}
|
||||||
|
}
|
@ -59,30 +59,17 @@ fun Context.buildCustomTabsIntent(): CustomTabsIntent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Context.openItemUrlInternally(
|
fun Context.openItemUrlInternally(
|
||||||
|
allItems: ArrayList<Item>,
|
||||||
|
currentItem: Int,
|
||||||
linkDecoded: String,
|
linkDecoded: String,
|
||||||
content: String,
|
|
||||||
image: String,
|
|
||||||
title: String,
|
|
||||||
source: String,
|
|
||||||
customTabsIntent: CustomTabsIntent,
|
customTabsIntent: CustomTabsIntent,
|
||||||
articleViewer: Boolean,
|
articleViewer: Boolean,
|
||||||
app: Activity
|
app: Activity
|
||||||
) {
|
) {
|
||||||
if (articleViewer) {
|
if (articleViewer) {
|
||||||
|
ReaderActivity.allItems = allItems
|
||||||
val intent = Intent(this, ReaderActivity::class.java)
|
val intent = Intent(this, ReaderActivity::class.java)
|
||||||
|
intent.putExtra("currentItem", currentItem)
|
||||||
/*DragDismissIntentBuilder(this)
|
|
||||||
.setFullscreenOnTablets(true) // defaults to false, tablets will have padding on each side
|
|
||||||
.setDragElasticity(DragDismissIntentBuilder.DragElasticity.NORMAL) // Larger elasticities will make it easier to dismiss.
|
|
||||||
.setDrawUnderStatusBar(true)
|
|
||||||
.build(intent)*/
|
|
||||||
|
|
||||||
|
|
||||||
intent.putExtra("url", linkDecoded)
|
|
||||||
intent.putExtra("content", content)
|
|
||||||
intent.putExtra("title", title)
|
|
||||||
intent.putExtra("image", image)
|
|
||||||
intent.putExtra("source", source)
|
|
||||||
app.startActivity(intent)
|
app.startActivity(intent)
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
@ -102,11 +89,9 @@ fun Context.openItemUrlInternally(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Context.openItemUrl(
|
fun Context.openItemUrl(
|
||||||
|
allItems: ArrayList<Item>,
|
||||||
|
currentItem: Int,
|
||||||
linkDecoded: String,
|
linkDecoded: String,
|
||||||
content: String,
|
|
||||||
image: String,
|
|
||||||
title: String,
|
|
||||||
source: String,
|
|
||||||
customTabsIntent: CustomTabsIntent,
|
customTabsIntent: CustomTabsIntent,
|
||||||
internalBrowser: Boolean,
|
internalBrowser: Boolean,
|
||||||
articleViewer: Boolean,
|
articleViewer: Boolean,
|
||||||
@ -124,11 +109,9 @@ fun Context.openItemUrl(
|
|||||||
openInBrowser(linkDecoded, app)
|
openInBrowser(linkDecoded, app)
|
||||||
} else {
|
} else {
|
||||||
this.openItemUrlInternally(
|
this.openItemUrlInternally(
|
||||||
|
allItems,
|
||||||
|
currentItem,
|
||||||
linkDecoded,
|
linkDecoded,
|
||||||
content,
|
|
||||||
image,
|
|
||||||
title,
|
|
||||||
source,
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
app
|
app
|
||||||
|
@ -11,6 +11,7 @@ class ScrollAwareFABBehavior(
|
|||||||
attrs: AttributeSet
|
attrs: AttributeSet
|
||||||
) : CoordinatorLayout.Behavior<FloatingActionButton>() {
|
) : CoordinatorLayout.Behavior<FloatingActionButton>() {
|
||||||
|
|
||||||
|
|
||||||
override fun onStartNestedScroll(
|
override fun onStartNestedScroll(
|
||||||
coordinatorLayout: CoordinatorLayout,
|
coordinatorLayout: CoordinatorLayout,
|
||||||
child: FloatingActionButton,
|
child: FloatingActionButton,
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.utils
|
||||||
|
|
||||||
|
import android.content.res.Resources
|
||||||
|
|
||||||
|
val Int.toPx: Int
|
||||||
|
get() = (this * Resources.getSystem().displayMetrics.density).toInt()
|
||||||
|
|
||||||
|
val Int.toDp: Int
|
||||||
|
get() = (this / Resources.getSystem().displayMetrics.density).toInt()
|
@ -1,8 +1,6 @@
|
|||||||
package apps.amine.bou.readerforselfoss.utils.customtabs;
|
package apps.amine.bou.readerforselfoss.utils.customtabs;
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -11,6 +9,8 @@ import android.support.customtabs.CustomTabsIntent;
|
|||||||
import android.support.customtabs.CustomTabsServiceConnection;
|
import android.support.customtabs.CustomTabsServiceConnection;
|
||||||
import android.support.customtabs.CustomTabsSession;
|
import android.support.customtabs.CustomTabsSession;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a helper class to manage the connection to the Custom Tabs Service.
|
* This is a helper class to manage the connection to the Custom Tabs Service.
|
||||||
*/
|
*/
|
||||||
@ -48,6 +48,7 @@ public class CustomTabActivityHelper implements ServiceConnectionCallback {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Unbinds the Activity from the Custom Tabs Service.
|
* Unbinds the Activity from the Custom Tabs Service.
|
||||||
|
*
|
||||||
* @param activity the activity that is connected to the service.
|
* @param activity the activity that is connected to the service.
|
||||||
*/
|
*/
|
||||||
public void unbindCustomTabsService(Activity activity) {
|
public void unbindCustomTabsService(Activity activity) {
|
||||||
@ -74,6 +75,7 @@ public class CustomTabActivityHelper implements ServiceConnectionCallback {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a Callback to be called when connected or disconnected from the Custom Tabs Service.
|
* Register a Callback to be called when connected or disconnected from the Custom Tabs Service.
|
||||||
|
*
|
||||||
* @param connectionCallback
|
* @param connectionCallback
|
||||||
*/
|
*/
|
||||||
public void setConnectionCallback(ConnectionCallback connectionCallback) {
|
public void setConnectionCallback(ConnectionCallback connectionCallback) {
|
||||||
@ -82,6 +84,7 @@ public class CustomTabActivityHelper implements ServiceConnectionCallback {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds the Activity to the Custom Tabs Service.
|
* Binds the Activity to the Custom Tabs Service.
|
||||||
|
*
|
||||||
* @param activity the activity to be binded to the service.
|
* @param activity the activity to be binded to the service.
|
||||||
*/
|
*/
|
||||||
public void bindCustomTabsService(Activity activity) {
|
public void bindCustomTabsService(Activity activity) {
|
||||||
@ -95,16 +98,15 @@ public class CustomTabActivityHelper implements ServiceConnectionCallback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see {@link CustomTabsSession#mayLaunchUrl(Uri, Bundle, List)}.
|
|
||||||
* @return true if call to mayLaunchUrl was accepted.
|
* @return true if call to mayLaunchUrl was accepted.
|
||||||
|
* @see {@link CustomTabsSession#mayLaunchUrl(Uri, Bundle, List)}.
|
||||||
*/
|
*/
|
||||||
public boolean mayLaunchUrl(Uri uri, Bundle extras, List<Bundle> otherLikelyBundles) {
|
public boolean mayLaunchUrl(Uri uri, Bundle extras, List<Bundle> otherLikelyBundles) {
|
||||||
if (mClient == null) return false;
|
if (mClient == null) return false;
|
||||||
|
|
||||||
CustomTabsSession session = getSession();
|
CustomTabsSession session = getSession();
|
||||||
if (session == null) return false;
|
return session != null && session.mayLaunchUrl(uri, extras, otherLikelyBundles);
|
||||||
|
|
||||||
return session.mayLaunchUrl(uri, extras, otherLikelyBundles);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -142,7 +144,6 @@ public class CustomTabActivityHelper implements ServiceConnectionCallback {
|
|||||||
*/
|
*/
|
||||||
public interface CustomTabFallback {
|
public interface CustomTabFallback {
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @param activity The Activity that wants to open the Uri.
|
* @param activity The Activity that wants to open the Uri.
|
||||||
* @param uri The uri to be opened by the fallback.
|
* @param uri The uri to be opened by the fallback.
|
||||||
*/
|
*/
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
package apps.amine.bou.readerforselfoss.utils.customtabs;
|
package apps.amine.bou.readerforselfoss.utils.customtabs;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
@ -14,6 +11,9 @@ import android.support.customtabs.CustomTabsService;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.helpers.KeepAliveService;
|
import apps.amine.bou.readerforselfoss.utils.customtabs.helpers.KeepAliveService;
|
||||||
|
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("ALL")
|
||||||
@ -28,7 +28,8 @@ class CustomTabsHelper {
|
|||||||
|
|
||||||
private static String sPackageNameToUse;
|
private static String sPackageNameToUse;
|
||||||
|
|
||||||
private CustomTabsHelper() {}
|
private CustomTabsHelper() {
|
||||||
|
}
|
||||||
|
|
||||||
public static void addKeepAliveExtra(Context context, Intent intent) {
|
public static void addKeepAliveExtra(Context context, Intent intent) {
|
||||||
Intent keepAliveIntent = new Intent().setClassName(
|
Intent keepAliveIntent = new Intent().setClassName(
|
||||||
@ -40,7 +41,7 @@ class CustomTabsHelper {
|
|||||||
* Goes through all apps that handle VIEW intents and have a warmup service. Picks
|
* Goes through all apps that handle VIEW intents and have a warmup service. Picks
|
||||||
* the one chosen by the user if there is one, otherwise makes a best effort to return a
|
* the one chosen by the user if there is one, otherwise makes a best effort to return a
|
||||||
* valid package name.
|
* valid package name.
|
||||||
*
|
* <p>
|
||||||
* This is <strong>not</strong> threadsafe.
|
* This is <strong>not</strong> threadsafe.
|
||||||
*
|
*
|
||||||
* @param context {@link Context} to use for accessing {@link PackageManager}.
|
* @param context {@link Context} to use for accessing {@link PackageManager}.
|
||||||
@ -94,6 +95,7 @@ class CustomTabsHelper {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to check whether there is a specialized handler for a given intent.
|
* Used to check whether there is a specialized handler for a given intent.
|
||||||
|
*
|
||||||
* @param intent The intent to check with.
|
* @param intent The intent to check with.
|
||||||
* @return Whether there is a specialized handler for the given intent.
|
* @return Whether there is a specialized handler for the given intent.
|
||||||
*/
|
*/
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package apps.amine.bou.readerforselfoss.utils.customtabs;
|
package apps.amine.bou.readerforselfoss.utils.customtabs;
|
||||||
|
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.support.customtabs.CustomTabsClient;
|
import android.support.customtabs.CustomTabsClient;
|
||||||
import android.support.customtabs.CustomTabsServiceConnection;
|
import android.support.customtabs.CustomTabsServiceConnection;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation for the CustomTabsServiceConnection that avoids leaking the
|
* Implementation for the CustomTabsServiceConnection that avoids leaking the
|
||||||
* ServiceConnectionCallback
|
* ServiceConnectionCallback
|
||||||
|
@ -7,6 +7,7 @@ import android.support.customtabs.CustomTabsClient;
|
|||||||
public interface ServiceConnectionCallback {
|
public interface ServiceConnectionCallback {
|
||||||
/**
|
/**
|
||||||
* Called when the service is connected.
|
* Called when the service is connected.
|
||||||
|
*
|
||||||
* @param client a CustomTabsClient
|
* @param client a CustomTabsClient
|
||||||
*/
|
*/
|
||||||
void onServiceConnected(CustomTabsClient client);
|
void onServiceConnected(CustomTabsClient client);
|
||||||
|
@ -15,7 +15,8 @@ import com.mikepenz.materialdrawer.util.DrawerImageLoader
|
|||||||
import com.mikepenz.materialdrawer.util.DrawerUIUtils
|
import com.mikepenz.materialdrawer.util.DrawerUIUtils
|
||||||
import com.mikepenz.materialize.util.UIUtils
|
import com.mikepenz.materialize.util.UIUtils
|
||||||
|
|
||||||
abstract class CustomUrlBasePrimaryDrawerItem<T, VH : RecyclerView.ViewHolder> : BaseDrawerItem<T, VH>() {
|
abstract class CustomUrlBasePrimaryDrawerItem<T, VH : RecyclerView.ViewHolder> :
|
||||||
|
BaseDrawerItem<T, VH>() {
|
||||||
fun withIcon(url: String): T {
|
fun withIcon(url: String): T {
|
||||||
this.icon = ImageHolder(url)
|
this.icon = ImageHolder(url)
|
||||||
return this as T
|
return this as T
|
||||||
|
@ -10,7 +10,9 @@ import com.mikepenz.materialdrawer.holder.BadgeStyle
|
|||||||
import com.mikepenz.materialdrawer.holder.StringHolder
|
import com.mikepenz.materialdrawer.holder.StringHolder
|
||||||
import com.mikepenz.materialdrawer.model.interfaces.ColorfulBadgeable
|
import com.mikepenz.materialdrawer.model.interfaces.ColorfulBadgeable
|
||||||
|
|
||||||
class CustomUrlPrimaryDrawerItem : CustomUrlBasePrimaryDrawerItem<CustomUrlPrimaryDrawerItem, CustomUrlPrimaryDrawerItem.ViewHolder>(), ColorfulBadgeable<CustomUrlPrimaryDrawerItem> {
|
class CustomUrlPrimaryDrawerItem :
|
||||||
|
CustomUrlBasePrimaryDrawerItem<CustomUrlPrimaryDrawerItem, CustomUrlPrimaryDrawerItem.ViewHolder>(),
|
||||||
|
ColorfulBadgeable<CustomUrlPrimaryDrawerItem> {
|
||||||
protected var mBadge: StringHolder = StringHolder("")
|
protected var mBadge: StringHolder = StringHolder("")
|
||||||
protected var mBadgeStyle = BadgeStyle()
|
protected var mBadgeStyle = BadgeStyle()
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 206 B |
BIN
app/src/main/res/drawable-hdpi/ic_history.png
Normal file
After Width: | Height: | Size: 551 B |
After Width: | Height: | Size: 134 B |
BIN
app/src/main/res/drawable-mdpi/ic_history.png
Normal file
After Width: | Height: | Size: 352 B |
After Width: | Height: | Size: 174 B |
BIN
app/src/main/res/drawable-xhdpi/ic_history.png
Normal file
After Width: | Height: | Size: 684 B |
After Width: | Height: | Size: 255 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_history.png
Normal file
After Width: | Height: | Size: 986 B |
After Width: | Height: | Size: 311 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_history.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
@ -1,12 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<ScrollView xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context="apps.amine.bou.readerforselfoss.AddSourceActivity"
|
tools:context="apps.amine.bou.readerforselfoss.AddSourceActivity">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<android.support.design.widget.AppBarLayout
|
<android.support.design.widget.AppBarLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
@ -21,16 +24,14 @@
|
|||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<android.support.constraint.ConstraintLayout
|
<android.support.constraint.ConstraintLayout
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_width="match_parent">
|
|
||||||
<android.support.constraint.ConstraintLayout
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
@ -119,19 +120,20 @@
|
|||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
android:layout_marginBottom="16dp"
|
android:layout_marginBottom="16dp"
|
||||||
app:layout_constraintVertical_bias="0.0"/>
|
app:layout_constraintVertical_bias="0.0"/>
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
</android.support.constraint.ConstraintLayout>
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
style="?android:attr/progressBarStyleLarge"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/progress"
|
android:id="@+id/progress"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
style="?android:attr/progressBarStyleLarge"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="visible"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:visibility="visible"/>
|
tools:visibility="gone" />
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
</LinearLayout>
|
|
@ -88,12 +88,14 @@
|
|||||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
||||||
android:background="@color/transparent"
|
android:background="@color/transparent"
|
||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
<android.support.v7.widget.RecyclerView
|
<android.support.v7.widget.RecyclerView
|
||||||
android:id="@+id/recyclerView"
|
android:id="@+id/recyclerView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="@color/transparent"
|
android:background="@color/transparent"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
|
android:paddingBottom="60dp"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -115,6 +115,7 @@
|
|||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
|
android:inputType="text"
|
||||||
android:id="@+id/httpLoginView"
|
android:id="@+id/httpLoginView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -1,148 +1,44 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<android.support.design.widget.CoordinatorLayout
|
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<android.support.v4.widget.NestedScrollView
|
<android.support.design.widget.AppBarLayout
|
||||||
android:id="@+id/nestedScrollView"
|
android:id="@+id/appBarLayout"
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<android.support.constraint.ConstraintLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/imageView"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="200dp"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/source"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
|
||||||
android:textSize="12sp"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/titleView"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="6dp"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
|
||||||
android:textStyle="bold"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/source" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/content"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:paddingBottom="48dp"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/titleView"
|
|
||||||
android:textColorLink="?attr/colorAccent"/>
|
|
||||||
|
|
||||||
<!--<org.sufficientlysecure.htmltextview.HtmlTextView
|
|
||||||
android:id="@+id/content"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:paddingBottom="48dp"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/titleView" />-->
|
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
|
||||||
|
|
||||||
</android.support.v4.widget.NestedScrollView>
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
android:layout_gravity="end|bottom|right">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
<com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
<android.support.v7.widget.Toolbar
|
||||||
android:id="@+id/floatingToolbar"
|
android:id="@+id/toolBar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
android:layout_gravity="bottom"
|
app:popupTheme="?attr/toolbarPopupTheme"
|
||||||
app:floatingItemBackground="?attr/colorAccent"
|
app:theme="@style/ToolBarStyle" />
|
||||||
app:floatingMenu="@menu/reader_toolbar" />
|
|
||||||
|
|
||||||
<android.support.design.widget.FloatingActionButton
|
</android.support.design.widget.AppBarLayout>
|
||||||
android:id="@+id/fab"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:layout_alignParentEnd="true"
|
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_gravity="end|bottom|right"
|
|
||||||
android:layout_marginBottom="16dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
|
||||||
android:src="@drawable/ic_add"
|
|
||||||
app:backgroundTint="?attr/colorAccent"
|
|
||||||
app:fabSize="mini"
|
|
||||||
app:rippleColor="?attr/colorAccentDark" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
<FrameLayout
|
<android.support.v4.view.ViewPager
|
||||||
android:id="@+id/progressBar"
|
android:id="@+id/pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="0dp"
|
||||||
android:visibility="gone"
|
android:paddingTop="20dp"
|
||||||
android:animateLayoutChanges="true"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
android:alpha="0.8"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
android:background="@color/black"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
android:clickable="false">
|
app:layout_constraintTop_toBottomOf="@+id/appBarLayout" />
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
style="?android:attr/progressBarStyleLarge"
|
<me.relex.circleindicator.CircleIndicator
|
||||||
|
android:id="@+id/indicator"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="20dp"
|
||||||
android:layout_gravity="center"
|
android:background="#55000000"
|
||||||
android:progressTint="?attr/colorAccent" />
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
</FrameLayout>
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
</android.support.design.widget.CoordinatorLayout>
|
app:layout_constraintTop_toTopOf="@+id/pager" />
|
||||||
|
</android.support.constraint.ConstraintLayout>
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<android.support.design.widget.CoordinatorLayout
|
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context="apps.amine.bou.readerforselfoss.SourcesActivity"
|
tools:context="apps.amine.bou.readerforselfoss.SourcesActivity">
|
||||||
xmlns:fab="http://schemas.android.com/apk/res-auto">
|
|
||||||
<android.support.design.widget.AppBarLayout
|
<android.support.design.widget.AppBarLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
126
app/src/main/res/layout/fragment_article.xml
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<android.support.design.widget.CoordinatorLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:descendantFocusability="blocksDescendants">
|
||||||
|
|
||||||
|
<android.support.v4.widget.NestedScrollView
|
||||||
|
android:id="@+id/nestedScrollView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<android.support.constraint.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="200dp"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/source"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
|
android:textSize="12sp"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/titleView" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/titleView"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||||
|
|
||||||
|
|
||||||
|
<WebView
|
||||||
|
android:id="@+id/webcontent"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColorLink="?attr/colorAccent"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:paddingBottom="48dp"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/source"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
</android.support.constraint.ConstraintLayout>
|
||||||
|
|
||||||
|
</android.support.v4.widget.NestedScrollView>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
android:layout_gravity="end|bottom|right">
|
||||||
|
|
||||||
|
<com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
||||||
|
android:id="@+id/floatingToolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
|
app:floatingMenu="@menu/reader_toolbar" />
|
||||||
|
|
||||||
|
<android.support.design.widget.FloatingActionButton
|
||||||
|
android:id="@+id/fab"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="end|bottom|right"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:src="@drawable/ic_add"
|
||||||
|
app:backgroundTint="?attr/colorAccent"
|
||||||
|
app:fabSize="mini"
|
||||||
|
app:rippleColor="?attr/colorAccentDark" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/progressBar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:animateLayoutChanges="true"
|
||||||
|
android:alpha="0.8"
|
||||||
|
android:background="@color/black"
|
||||||
|
android:clickable="false">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
style="?android:attr/progressBarStyleLarge"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:progressTint="?attr/colorAccent" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
</android.support.design.widget.CoordinatorLayout>
|
@ -7,18 +7,11 @@
|
|||||||
android:minHeight="88dp">
|
android:minHeight="88dp">
|
||||||
|
|
||||||
|
|
||||||
<android.support.constraint.Guideline
|
|
||||||
android:id="@+id/guideline4"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
app:layout_constraintGuide_begin="99dp" />
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/itemImage"
|
android:id="@+id/itemImage"
|
||||||
android:layout_width="88dp"
|
android:layout_width="88dp"
|
||||||
android:layout_height="88dp"
|
android:layout_height="88dp"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/guideline4"
|
app:layout_constraintBottom_toBottomOf="@+id/actionBar"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
@ -26,24 +19,21 @@
|
|||||||
android:id="@+id/title"
|
android:id="@+id/title"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:ellipsize="end"
|
||||||
android:fontFamily="sans-serif"
|
android:fontFamily="sans-serif"
|
||||||
android:gravity="start"
|
android:gravity="start"
|
||||||
android:maxLines="3"
|
android:maxLines="3"
|
||||||
android:ellipsize="end"
|
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:textAllCaps="false"
|
android:textAllCaps="false"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/sourceTitleAndDate"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
app:layout_constraintStart_toEndOf="@+id/itemImage"
|
app:layout_constraintStart_toEndOf="@+id/itemImage"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_bias="0.0"
|
|
||||||
tools:text="Titre" />
|
tools:text="Titre" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
@ -53,13 +43,15 @@
|
|||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
android:gravity="start"
|
android:gravity="start"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/guideline4"
|
app:layout_constraintBottom_toBottomOf="@+id/actionBar"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
app:layout_constraintStart_toEndOf="@+id/itemImage"
|
app:layout_constraintStart_toEndOf="@+id/itemImage"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/title"
|
||||||
tools:text="Google Actualité Il y a 5h" />
|
tools:text="Google Actualité Il y a 5h" />
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
@ -71,8 +63,6 @@
|
|||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/guideline4"
|
|
||||||
app:layout_constraintVertical_bias="1.0"
|
|
||||||
tools:visibility="visible">
|
tools:visibility="visible">
|
||||||
|
|
||||||
<com.like.LikeButton
|
<com.like.LikeButton
|
||||||
|
17
app/src/main/res/menu/reader_menu.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/unsave"
|
||||||
|
android:icon="@drawable/heart_on"
|
||||||
|
android:title="@string/remove_to_favs_reader"
|
||||||
|
android:visible="true"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/save"
|
||||||
|
android:icon="@drawable/heart_off"
|
||||||
|
android:title="@string/add_to_favs_reader"
|
||||||
|
android:visible="true"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
</menu>
|
@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:tools="http://schemas.android.com/tools"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<item
|
<item
|
||||||
|
10
app/src/main/res/menu/settings_theme.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/clear"
|
||||||
|
android:icon="@drawable/ic_history"
|
||||||
|
android:title="@string/drawer_action_clear"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
</menu>
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
<!--Generated by crowdin.com-->
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<string name="app_name">"Reader für Selfoss"</string>
|
<string name="app_name">"Reader für selfoss"</string>
|
||||||
<string name="title_activity_login">"Anmelden"</string>
|
<string name="title_activity_login">"Anmelden"</string>
|
||||||
<string name="prompt_password">"Passwort"</string>
|
<string name="prompt_password">"Passwort"</string>
|
||||||
<string name="prompt_http_password">"HTTP Passwort"</string>
|
<string name="prompt_http_password">"HTTP Passwort"</string>
|
||||||
@ -33,7 +33,7 @@
|
|||||||
<string name="cant_get_read">"Gelese Artikel können nicht abgerufen werden"</string>
|
<string name="cant_get_read">"Gelese Artikel können nicht abgerufen werden"</string>
|
||||||
<string name="nothing_here">"Keine Einträge vorhanden"</string>
|
<string name="nothing_here">"Keine Einträge vorhanden"</string>
|
||||||
<string name="tab_new">"Neu"</string>
|
<string name="tab_new">"Neu"</string>
|
||||||
<string name="tab_read">"All"</string>
|
<string name="tab_read">"Alle"</string>
|
||||||
<string name="tab_favs">"Favoriten"</string>
|
<string name="tab_favs">"Favoriten"</string>
|
||||||
<string name="action_about">"Über"</string>
|
<string name="action_about">"Über"</string>
|
||||||
<string name="marked_as_read">"Artikel gelesen"</string>
|
<string name="marked_as_read">"Artikel gelesen"</string>
|
||||||
@ -138,7 +138,7 @@
|
|||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Debug</string>
|
||||||
<string name="self_hosted_cert_switch">Verwenden Sie einen selbst gehostetes Zertifikat?</string>
|
<string name="self_hosted_cert_switch">Verwenden Sie einen selbst gehostetes Zertifikat?</string>
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
||||||
<string name="pref_selfoss_category">Selfoss Api</string>
|
<string name="pref_selfoss_category">selfoss API</string>
|
||||||
<string name="pref_api_items_number_title">Loaded items number</string>
|
<string name="pref_api_items_number_title">Loaded items number</string>
|
||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">No log when marking an item as read</string>
|
||||||
@ -153,9 +153,18 @@
|
|||||||
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Übersetzung</string>
|
<string name="translation">Übersetzung</string>
|
||||||
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
|
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
|
||||||
<string name="drawer_report_bug">Report a bug</string>
|
<string name="drawer_report_bug">Melde einen Fehler</string>
|
||||||
<string name="items_number_should_be_number">The items number should be an integer.</string>
|
<string name="items_number_should_be_number">The items number should be an integer.</string>
|
||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Im Browser öffnen</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Teilen</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Zu Favoriten hinzufügen</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,161 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--Generated by crowdin.com-->
|
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
<string name="app_name">"Reader for Selfoss"</string>
|
|
||||||
<string name="title_activity_login">"Log in"</string>
|
|
||||||
<string name="prompt_password">"Password"</string>
|
|
||||||
<string name="prompt_http_password">"HTTP Password"</string>
|
|
||||||
<string name="action_sign_in">"Go"</string>
|
|
||||||
<string name="error_invalid_password">"Password not long enough"</string>
|
|
||||||
<string name="error_field_required">"Field required"</string>
|
|
||||||
<string name="prompt_url">"Url"</string>
|
|
||||||
<string name="withLoginSwitch">"Login required ?"</string>
|
|
||||||
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
|
|
||||||
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
|
|
||||||
<string name="prompt_login">"Username"</string>
|
|
||||||
<string name="prompt_http_login">"HTTP Username"</string>
|
|
||||||
<string name="label_share">"Share"</string>
|
|
||||||
<string name="readAll">"Read all"</string>
|
|
||||||
<string name="action_disconnect">"Disconnect"</string>
|
|
||||||
<string name="title_activity_settings">"Settings"</string>
|
|
||||||
<string name="pref_header_general">"General"</string>
|
|
||||||
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string>
|
|
||||||
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
|
|
||||||
<string name="add_source_hint_url">"Link"</string>
|
|
||||||
<string name="add_source_hint_name">"Name"</string>
|
|
||||||
<string name="add_source">"Add a source"</string>
|
|
||||||
<string name="add_source_save">"Save"</string>
|
|
||||||
<string name="wrong_infos">"Check your details again."</string>
|
|
||||||
<string name="all_posts_not_read">"All posts weren't read"</string>
|
|
||||||
<string name="all_posts_read">"All posts were read"</string>
|
|
||||||
<string name="cant_get_favs">"Can't get favorites"</string>
|
|
||||||
<string name="cant_get_new_elements">"Can't get new articles"</string>
|
|
||||||
<string name="cant_get_read">"Can't get read articles"</string>
|
|
||||||
<string name="nothing_here">"Nothing here"</string>
|
|
||||||
<string name="tab_new">"New"</string>
|
|
||||||
<string name="tab_read">"All"</string>
|
|
||||||
<string name="tab_favs">"Favorites"</string>
|
|
||||||
<string name="action_about">"About"</string>
|
|
||||||
<string name="marked_as_read">"Item read"</string>
|
|
||||||
<string name="undo_string">"Undo"</string>
|
|
||||||
<string name="addStringNoUrl">"Log in to add sources."</string>
|
|
||||||
<string name="cant_get_sources">"Can't get sources list."</string>
|
|
||||||
<string name="cant_create_source">"Can't create source."</string>
|
|
||||||
<string name="cant_get_spouts">"Can't get spouts list."</string>
|
|
||||||
<string name="form_not_complete">"The form is not complete"</string>
|
|
||||||
<string name="pref_header_links">"Links"</string>
|
|
||||||
<string name="issue_tracker_link">"Issue Tracker"</string>
|
|
||||||
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
|
|
||||||
<string name="warning_wrong_url">"WARNING"</string>
|
|
||||||
<string name="pref_switch_card_view_title">"Card View"</string>
|
|
||||||
<string name="cant_mark_favortie">"Can't mark article as favorite"</string>
|
|
||||||
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
|
|
||||||
<string name="share">"Share"</string>
|
|
||||||
<string name="rating_prompt_title">"Enjoying the app ?"</string>
|
|
||||||
<string name="rating_prompt_yes">"Yes !"</string>
|
|
||||||
<string name="rating_prompt_no">"Not really …"</string>
|
|
||||||
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
|
|
||||||
<string name="rating_prompt_feedback_yes">"OK !"</string>
|
|
||||||
<string name="rating_prompt_feedback_no">"Not now."</string>
|
|
||||||
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
|
|
||||||
<string name="rating_prompt_rating_yes">"Sure !"</string>
|
|
||||||
<string name="rating_prompt_rating_no">"Not right now."</string>
|
|
||||||
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
|
|
||||||
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
|
|
||||||
<string name="switch_unread_count_title">"Display unread count"</string>
|
|
||||||
<string name="display_all_counts_title">"Display count for favorite and read"</string>
|
|
||||||
<string name="menu_share_the_app">"Invite friends"</string>
|
|
||||||
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string>
|
|
||||||
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string>
|
|
||||||
<string name="invitation_cta">"Try the app"</string>
|
|
||||||
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
|
|
||||||
<string name="pref_general_internal_browser_title">"Open links inside the app"</string>
|
|
||||||
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
|
|
||||||
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
|
|
||||||
<string name="prefer_article_viewer_title">"Use the article viewer"</string>
|
|
||||||
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
|
|
||||||
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
|
|
||||||
<string name="pref_general_category_links">"Link handling"</string>
|
|
||||||
<string name="pref_general_category_displaying">"Displaying"</string>
|
|
||||||
<string name="pref_general_category_actions">"Actions"</string>
|
|
||||||
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
|
|
||||||
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
|
|
||||||
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string>
|
|
||||||
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string>
|
|
||||||
<string name="menu_home_refresh">"Update remote"</string>
|
|
||||||
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
|
|
||||||
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
|
|
||||||
<string name="refresh_in_progress">"Refresh in progress"</string>
|
|
||||||
<string name="new_apk_available_title">"A new APK is available."</string>
|
|
||||||
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string>
|
|
||||||
<string name="new_apk_available_get">"Download now"</string>
|
|
||||||
<string name="new_apk_available_no">"Ignore version"</string>
|
|
||||||
<string name="intro_hello_title">"Hi there !"</string>
|
|
||||||
<string name="intro_hello_message">"Thanks for downloading the app !"</string>
|
|
||||||
<string name="intro_needs_selfoss_title">"Before you start…"</string>
|
|
||||||
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string>
|
|
||||||
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string>
|
|
||||||
<string name="intro_all_set_title">"All set !"</string>
|
|
||||||
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string>
|
|
||||||
<string name="card_height_title">Full height cards</string>
|
|
||||||
<string name="card_height_on">Cards height will adjust to its content</string>
|
|
||||||
<string name="card_height_off">Card height will be fixed</string>
|
|
||||||
<string name="source_code">Source code</string>
|
|
||||||
<string name="cant_mark_read">Can\'t mark article as read</string>
|
|
||||||
<string name="drawer_error_loading_tags">Error loading tags…</string>
|
|
||||||
<string name="drawer_error_loading_sources">Error loading sources…</string>
|
|
||||||
<string name="drawer_item_filters">Filters</string>
|
|
||||||
<string name="drawer_action_clear">clear</string>
|
|
||||||
<string name="drawer_item_tags">Tags</string>
|
|
||||||
<string name="drawer_item_sources">Sources</string>
|
|
||||||
<string name="drawer_action_edit">edit</string>
|
|
||||||
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string>
|
|
||||||
<string name="no_tags_loaded">No tags loaded</string>
|
|
||||||
<string name="no_sources_loaded">No sources loaded</string>
|
|
||||||
<string name="drawer_loading">Loading …</string>
|
|
||||||
<string name="menu_home_search">Search</string>
|
|
||||||
<string name="can_delete_source">Can\'t delete the source…</string>
|
|
||||||
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
|
|
||||||
<string name="pref_header_theme">Themes</string>
|
|
||||||
<string name="default_theme">Default</string>
|
|
||||||
<string name="teal_orange_theme">Teal/Orange/Light</string>
|
|
||||||
<string name="cyan_pink_theme">Cyan/Pink/Light</string>
|
|
||||||
<string name="grey_orange_theme">Grey/Orange/Light</string>
|
|
||||||
<string name="blue_amber_theme">Blue/Amber/Light</string>
|
|
||||||
<string name="indigo_pink_theme">Indigo/Pink/Light</string>
|
|
||||||
<string name="red_teal_theme">Red/Teal/Light</string>
|
|
||||||
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string>
|
|
||||||
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string>
|
|
||||||
<string name="default_dark_theme">Default/Dark</string>
|
|
||||||
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string>
|
|
||||||
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
|
||||||
<string name="pref_header_debug">Debug</string>
|
|
||||||
<string name="login_debug_title">Activate to log login errors</string>
|
|
||||||
<string name="login_debug_on">Any error on the login page will be logged</string>
|
|
||||||
<string name="login_debug_off">No log on the login page</string>
|
|
||||||
<string name="login_menu_debug">Debug</string>
|
|
||||||
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
|
||||||
<string name="pref_selfoss_category">Selfoss Api</string>
|
|
||||||
<string name="pref_api_items_number_title">Loaded items number</string>
|
|
||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
|
||||||
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
|
||||||
<string name="summary_debug_identifier">Debug identifier</string>
|
|
||||||
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
|
||||||
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
|
|
||||||
<string name="display_header_drawer_title">Account header</string>
|
|
||||||
<string name="login_everything_title">Logging every api calls</string>
|
|
||||||
<string name="login_everything_on">This will log every api call for debug purpose.</string>
|
|
||||||
<string name="login_everything_off">No api call will be logged</string>
|
|
||||||
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
|
||||||
<string name="translation">Translation</string>
|
|
||||||
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
|
|
||||||
<string name="drawer_report_bug">Report a bug</string>
|
|
||||||
<string name="items_number_should_be_number">The items number should be an integer.</string>
|
|
||||||
<string name="reader_action_more">Read more</string>
|
|
||||||
<string name="reader_action_open">Open in browser</string>
|
|
||||||
<string name="reader_action_share">Share</string>
|
|
||||||
</resources>
|
|
@ -1,161 +1,170 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
<!--Generated by crowdin.com-->
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<string name="app_name">"Reader for Selfoss"</string>
|
<string name="app_name">"Lector para Selfoss"</string>
|
||||||
<string name="title_activity_login">"Log in"</string>
|
<string name="title_activity_login">"Iniciar sesión"</string>
|
||||||
<string name="prompt_password">"Password"</string>
|
<string name="prompt_password">"Contraseña"</string>
|
||||||
<string name="prompt_http_password">"HTTP Password"</string>
|
<string name="prompt_http_password">"Contraseña HTTP"</string>
|
||||||
<string name="action_sign_in">"Go"</string>
|
<string name="action_sign_in">"Empezar"</string>
|
||||||
<string name="error_invalid_password">"Password not long enough"</string>
|
<string name="error_invalid_password">"La contraseña no es suficientemente larga"</string>
|
||||||
<string name="error_field_required">"Field required"</string>
|
<string name="error_field_required">"Campo requerido"</string>
|
||||||
<string name="prompt_url">"Url"</string>
|
<string name="prompt_url">"Url"</string>
|
||||||
<string name="withLoginSwitch">"Login required ?"</string>
|
<string name="withLoginSwitch">"Inicio de sesión requerido ?"</string>
|
||||||
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
|
<string name="withHttpLoginSwitch">"Inicio de sesión HTTP requerido ?"</string>
|
||||||
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
|
<string name="login_url_problem">"Oops. Puede que necesite añadir un \"/\" al final de la url."</string>
|
||||||
<string name="prompt_login">"Username"</string>
|
<string name="prompt_login">"Nombre de usuario"</string>
|
||||||
<string name="prompt_http_login">"HTTP Username"</string>
|
<string name="prompt_http_login">"Nombre de usuario HTTP"</string>
|
||||||
<string name="label_share">"Share"</string>
|
<string name="label_share">"Compartir"</string>
|
||||||
<string name="readAll">"Read all"</string>
|
<string name="readAll">"Leer todo"</string>
|
||||||
<string name="action_disconnect">"Disconnect"</string>
|
<string name="action_disconnect">"Desconectar"</string>
|
||||||
<string name="title_activity_settings">"Settings"</string>
|
<string name="title_activity_settings">"Configuración"</string>
|
||||||
<string name="pref_header_general">"General"</string>
|
<string name="pref_header_general">"General"</string>
|
||||||
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string>
|
<string name="pref_switch_actions_tap_title">"Acción tocar en los artículos"</string>
|
||||||
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
|
<string name="add_source_hint_tags">"Etiqueta1, Etiqueta2, Etiqueta3"</string>
|
||||||
<string name="add_source_hint_url">"Link"</string>
|
<string name="add_source_hint_url">"Enlace"</string>
|
||||||
<string name="add_source_hint_name">"Name"</string>
|
<string name="add_source_hint_name">"Nombre"</string>
|
||||||
<string name="add_source">"Add a source"</string>
|
<string name="add_source">"Añadir una fuente"</string>
|
||||||
<string name="add_source_save">"Save"</string>
|
<string name="add_source_save">"Guardar"</string>
|
||||||
<string name="wrong_infos">"Check your details again."</string>
|
<string name="wrong_infos">"Revise sus datos de nuevo."</string>
|
||||||
<string name="all_posts_not_read">"All posts weren't read"</string>
|
<string name="all_posts_not_read">"No todas las publicaciones fueron leídas"</string>
|
||||||
<string name="all_posts_read">"All posts were read"</string>
|
<string name="all_posts_read">"Todas las publicaciones fueron leídas"</string>
|
||||||
<string name="cant_get_favs">"Can't get favorites"</string>
|
<string name="cant_get_favs">"No se pueden obtener favoritos"</string>
|
||||||
<string name="cant_get_new_elements">"Can't get new articles"</string>
|
<string name="cant_get_new_elements">"No puede recibir nuevos artículos"</string>
|
||||||
<string name="cant_get_read">"Can't get read articles"</string>
|
<string name="cant_get_read">"No puede recibir artículos leídos"</string>
|
||||||
<string name="nothing_here">"Nothing here"</string>
|
<string name="nothing_here">"Nada aquí"</string>
|
||||||
<string name="tab_new">"New"</string>
|
<string name="tab_new">"Nuevo"</string>
|
||||||
<string name="tab_read">"All"</string>
|
<string name="tab_read">"Todo"</string>
|
||||||
<string name="tab_favs">"Favorites"</string>
|
<string name="tab_favs">"Favoritos"</string>
|
||||||
<string name="action_about">"About"</string>
|
<string name="action_about">"Acerca de"</string>
|
||||||
<string name="marked_as_read">"Item read"</string>
|
<string name="marked_as_read">"Artículo leído"</string>
|
||||||
<string name="undo_string">"Undo"</string>
|
<string name="undo_string">"Deshacer"</string>
|
||||||
<string name="addStringNoUrl">"Log in to add sources."</string>
|
<string name="addStringNoUrl">"Iniciar sesión para añadir fuentes."</string>
|
||||||
<string name="cant_get_sources">"Can't get sources list."</string>
|
<string name="cant_get_sources">"No se puede obtener la lista de fuentes."</string>
|
||||||
<string name="cant_create_source">"Can't create source."</string>
|
<string name="cant_create_source">"No se puede crear la fuente."</string>
|
||||||
<string name="cant_get_spouts">"Can't get spouts list."</string>
|
<string name="cant_get_spouts">"No se puede obtener la lista de fuentes."</string>
|
||||||
<string name="form_not_complete">"The form is not complete"</string>
|
<string name="form_not_complete">"El formulario no está completo"</string>
|
||||||
<string name="pref_header_links">"Links"</string>
|
<string name="pref_header_links">"Enlaces"</string>
|
||||||
<string name="issue_tracker_link">"Issue Tracker"</string>
|
<string name="issue_tracker_link">"Rastreador de Incidencias"</string>
|
||||||
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
|
<string name="issue_tracker_summary">"Reportar un error o solicitar una nueva función"</string>
|
||||||
<string name="warning_wrong_url">"WARNING"</string>
|
<string name="warning_wrong_url">"ADVERTENCIA"</string>
|
||||||
<string name="pref_switch_card_view_title">"Card View"</string>
|
<string name="pref_switch_card_view_title">"Vista de la tarjeta"</string>
|
||||||
<string name="cant_mark_favortie">"Can't mark article as favorite"</string>
|
<string name="cant_mark_favortie">"No puede marcar el artículo como favorito"</string>
|
||||||
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
|
<string name="cant_unmark_favortie">"No se puede quitar el artículo de favoritos"</string>
|
||||||
<string name="share">"Share"</string>
|
<string name="share">"Compartir"</string>
|
||||||
<string name="rating_prompt_title">"Enjoying the app ?"</string>
|
<string name="rating_prompt_title">"¿Disfrutando la aplicación?"</string>
|
||||||
<string name="rating_prompt_yes">"Yes !"</string>
|
<string name="rating_prompt_yes">"¡Sí!"</string>
|
||||||
<string name="rating_prompt_no">"Not really …"</string>
|
<string name="rating_prompt_no">"La verdad es que no…"</string>
|
||||||
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
|
<string name="rating_prompt_feedback_title">"¿Puede decirnos por qué?"</string>
|
||||||
<string name="rating_prompt_feedback_yes">"OK !"</string>
|
<string name="rating_prompt_feedback_yes">"¡Vale!"</string>
|
||||||
<string name="rating_prompt_feedback_no">"Not now."</string>
|
<string name="rating_prompt_feedback_no">"Ahora no."</string>
|
||||||
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
|
<string name="rating_prompt_rating_title">"¡Excelente! ¿Puede valorarnos en la tienda?"</string>
|
||||||
<string name="rating_prompt_rating_yes">"Sure !"</string>
|
<string name="rating_prompt_rating_yes">"¡Claro!"</string>
|
||||||
<string name="rating_prompt_rating_no">"Not right now."</string>
|
<string name="rating_prompt_rating_no">"No en este momento."</string>
|
||||||
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
|
<string name="rating_prompt_thanks">"¡Gracias, sus comentarios ayudan a mejorar la aplicación!"</string>
|
||||||
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
|
<string name="switch_unread_count">"Mostrar el recuento no leído como una insignia de la barra inferior."</string>
|
||||||
<string name="switch_unread_count_title">"Display unread count"</string>
|
<string name="switch_unread_count_title">"Mostrar recuento no leído"</string>
|
||||||
<string name="display_all_counts_title">"Display count for favorite and read"</string>
|
<string name="display_all_counts_title">"Mostrar recuento de favoritos y leídos"</string>
|
||||||
<string name="menu_share_the_app">"Invite friends"</string>
|
<string name="menu_share_the_app">"Invitar amigos"</string>
|
||||||
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string>
|
<string name="invitation_title">"¡Prueba esta aplicación para tu contenido RSS de Selfoss!"</string>
|
||||||
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string>
|
<string name="invitation_message">"Yo uso esta aplicación para mi contenido RSS de Selfoss. ¡Te puede gusta también!"</string>
|
||||||
<string name="invitation_cta">"Try the app"</string>
|
<string name="invitation_cta">"Probar la aplicación"</string>
|
||||||
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
|
<string name="text_wrong_url">"Parece estar tratando de utilizar una dirección URL inválida. Asegúrese de que sea correcta y si el problema persiste, póngase en contacto conmigo (mediante el enlace de contacto de la tienda). Tenga en cuenta que la aplicación necesita utilizar Selfoss. No se puede acceder al contenido RSS sin él."</string>
|
||||||
<string name="pref_general_internal_browser_title">"Open links inside the app"</string>
|
<string name="pref_general_internal_browser_title">"Abrir enlaces dentro de la aplicación"</string>
|
||||||
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
|
<string name="pref_general_internal_browser_on">"Los artículos se abrirán dentro de la aplicación"</string>
|
||||||
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
|
<string name="pref_general_internal_browser_off">"Los artículos se abrirán con tu navegador predeterminado"</string>
|
||||||
<string name="prefer_article_viewer_title">"Use the article viewer"</string>
|
<string name="prefer_article_viewer_title">"Utilizar el visor de artículo"</string>
|
||||||
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
|
<string name="prefer_article_viewer_on">"Se usará el visor de artículos en lugar del navegador interno"</string>
|
||||||
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
|
<string name="prefer_article_viewer_off">"Se utilizará el navegador interno en lugar del visor de artículo"</string>
|
||||||
<string name="pref_general_category_links">"Link handling"</string>
|
<string name="pref_general_category_links">"Control de enlaces"</string>
|
||||||
<string name="pref_general_category_displaying">"Displaying"</string>
|
<string name="pref_general_category_displaying">"Mostrando"</string>
|
||||||
<string name="pref_general_category_actions">"Actions"</string>
|
<string name="pref_general_category_actions">"Acciones"</string>
|
||||||
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
|
<string name="pref_switch_card_view_on">"Los artículos se mostrarán como tarjetas"</string>
|
||||||
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
|
<string name="pref_switch_card_view_off">"Los artículos se mostrarán como una lista"</string>
|
||||||
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string>
|
<string name="pref_switch_actions_tap_on">"Muestra la barra de acción debajo del artículo"</string>
|
||||||
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string>
|
<string name="pref_switch_actions_tap_off">"Al seleccionar un artículo se abrirá en el navegador seleccionado"</string>
|
||||||
<string name="menu_home_refresh">"Update remote"</string>
|
<string name="menu_home_refresh">"Actualizar remoto"</string>
|
||||||
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
|
<string name="refresh_success_response">"Se actualizó el remoto, ahora puede recargar la lista de artículos"</string>
|
||||||
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
|
<string name="refresh_failer_message">"La actualización no funcionó, inténtalo más tarde o compruebe los registros de selfoss."</string>
|
||||||
<string name="refresh_in_progress">"Refresh in progress"</string>
|
<string name="refresh_in_progress">"Actualización en progreso"</string>
|
||||||
<string name="new_apk_available_title">"A new APK is available."</string>
|
<string name="new_apk_available_title">"Una nueva versión está disponible."</string>
|
||||||
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string>
|
<string name="new_apk_available_message">"Un APK nuevo está disponible para descarga en el repositorio oficial."</string>
|
||||||
<string name="new_apk_available_get">"Download now"</string>
|
<string name="new_apk_available_get">"Descargar ahora"</string>
|
||||||
<string name="new_apk_available_no">"Ignore version"</string>
|
<string name="new_apk_available_no">"Ignorar versión"</string>
|
||||||
<string name="intro_hello_title">"Hi there !"</string>
|
<string name="intro_hello_title">"¡Hola!"</string>
|
||||||
<string name="intro_hello_message">"Thanks for downloading the app !"</string>
|
<string name="intro_hello_message">"¡Gracias por descargar la aplicación!"</string>
|
||||||
<string name="intro_needs_selfoss_title">"Before you start…"</string>
|
<string name="intro_needs_selfoss_title">"Antes de empezar…"</string>
|
||||||
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string>
|
<string name="intro_needs_selfoss_message">"No se puede utilizar la aplicación sin una instancia de Selfoss."</string>
|
||||||
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string>
|
<string name="intro_needs_selfoss_link">"¿Qué es Selfoss?"</string>
|
||||||
<string name="intro_all_set_title">"All set !"</string>
|
<string name="intro_all_set_title">"¡Todo listo!"</string>
|
||||||
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string>
|
<string name="intro_all_set_message">"Estás listo para utilizar la aplicación. No olvides ir a la página de configuración para configurar su aplicación, y donde usted encontrará algunos enlaces útiles."</string>
|
||||||
<string name="card_height_title">Full height cards</string>
|
<string name="card_height_title">Tarjetas de altura completas</string>
|
||||||
<string name="card_height_on">Cards height will adjust to its content</string>
|
<string name="card_height_on">Altura de tarjetas se ajustará a su contenido</string>
|
||||||
<string name="card_height_off">Card height will be fixed</string>
|
<string name="card_height_off">Se fijará la altura de la tarjeta</string>
|
||||||
<string name="source_code">Source code</string>
|
<string name="source_code">Código fuente</string>
|
||||||
<string name="cant_mark_read">Can\'t mark article as read</string>
|
<string name="cant_mark_read">No puede marcar el artículo como leído</string>
|
||||||
<string name="drawer_error_loading_tags">Error loading tags…</string>
|
<string name="drawer_error_loading_tags">Error al cargar etiquetas…</string>
|
||||||
<string name="drawer_error_loading_sources">Error loading sources…</string>
|
<string name="drawer_error_loading_sources">Error al cargar fuentes…</string>
|
||||||
<string name="drawer_item_filters">Filters</string>
|
<string name="drawer_item_filters">Filtros</string>
|
||||||
<string name="drawer_action_clear">clear</string>
|
<string name="drawer_action_clear">limpiar</string>
|
||||||
<string name="drawer_item_tags">Tags</string>
|
<string name="drawer_item_tags">Etiquetas</string>
|
||||||
<string name="drawer_item_sources">Sources</string>
|
<string name="drawer_item_sources">Fuentes</string>
|
||||||
<string name="drawer_action_edit">edit</string>
|
<string name="drawer_action_edit">editar</string>
|
||||||
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string>
|
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">No se pudieron guardar en caché los datos de su cajón</string>
|
||||||
<string name="no_tags_loaded">No tags loaded</string>
|
<string name="no_tags_loaded">No hay etiquetas cargadas</string>
|
||||||
<string name="no_sources_loaded">No sources loaded</string>
|
<string name="no_sources_loaded">No hay fuentes cargadas</string>
|
||||||
<string name="drawer_loading">Loading …</string>
|
<string name="drawer_loading">Cargando…</string>
|
||||||
<string name="menu_home_search">Search</string>
|
<string name="menu_home_search">Buscar</string>
|
||||||
<string name="can_delete_source">Can\'t delete the source…</string>
|
<string name="can_delete_source">No se puede eliminar la fuente…</string>
|
||||||
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
|
<string name="base_url_error">Hubo un problema al intentar comunicarse con su instancia de Selfoss. Si el problema persiste, póngase en contacto conmigo.</string>
|
||||||
<string name="pref_header_theme">Themes</string>
|
<string name="pref_header_theme">Temas</string>
|
||||||
<string name="default_theme">Default</string>
|
<string name="default_theme">Predeterminado</string>
|
||||||
<string name="teal_orange_theme">Teal/Orange/Light</string>
|
<string name="teal_orange_theme">Turquesa/Naranja/Claro</string>
|
||||||
<string name="cyan_pink_theme">Cyan/Pink/Light</string>
|
<string name="cyan_pink_theme">Cian/Rosa/Claro</string>
|
||||||
<string name="grey_orange_theme">Grey/Orange/Light</string>
|
<string name="grey_orange_theme">Gris/Naranja/Claro</string>
|
||||||
<string name="blue_amber_theme">Blue/Amber/Light</string>
|
<string name="blue_amber_theme">Azul/Ámbar/Claro</string>
|
||||||
<string name="indigo_pink_theme">Indigo/Pink/Light</string>
|
<string name="indigo_pink_theme">Índigo/Rosa/Claro</string>
|
||||||
<string name="red_teal_theme">Red/Teal/Light</string>
|
<string name="red_teal_theme">Rojo/Turquesa/Claro</string>
|
||||||
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string>
|
<string name="teal_orange_dark_theme">Turquesa/Naranja/Oscuro</string>
|
||||||
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string>
|
<string name="cyan_pink_dark_theme">Cian/Rosa/Oscuro</string>
|
||||||
<string name="default_dark_theme">Default/Dark</string>
|
<string name="default_dark_theme">Predeterminado/Oscuro</string>
|
||||||
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string>
|
<string name="grey_orange_dark_theme">Gris/Naranja/Oscuro</string>
|
||||||
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
<string name="blue_amber_dark_theme">Azul/Ámbar/Oscuro</string>
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
<string name="indigo_pink_dark_theme">Índigo/Rosa/Oscuro</string>
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
<string name="red_teal_dark_theme">Rojo/Turquesa/Oscuro</string>
|
||||||
<string name="pref_header_debug">Debug</string>
|
<string name="pref_header_debug">Depurar</string>
|
||||||
<string name="login_debug_title">Activate to log login errors</string>
|
<string name="login_debug_title">Activar para registrar errores de inicio de sesión</string>
|
||||||
<string name="login_debug_on">Any error on the login page will be logged</string>
|
<string name="login_debug_on">Cualquier error en la página de inicio de sesión se registrará</string>
|
||||||
<string name="login_debug_off">No log on the login page</string>
|
<string name="login_debug_off">No hay registro en la página de inicio de sesión</string>
|
||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Depurar</string>
|
||||||
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
<string name="self_hosted_cert_switch">Utilizando un certificado alojado propiamente ?</string>
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
<string name="self_signed_cert_warning">Por razones de seguridad, los certificados propios no son compatibles por defecto. Activando esto, no seré responsable de cualquier problema de seguridad que encuentre.</string>
|
||||||
<string name="pref_selfoss_category">Selfoss Api</string>
|
<string name="pref_selfoss_category">Api de Selfoss</string>
|
||||||
<string name="pref_api_items_number_title">Loaded items number</string>
|
<string name="pref_api_items_number_title">Número de artículos cargados</string>
|
||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">¿Leer los artículos que aparecen como no leídos?</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">Sin registro al marcar un elemento como leído</string>
|
||||||
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
<string name="read_debug_on">Llamadas a la Api se registrarán al marcar un artículo como leído</string>
|
||||||
<string name="summary_debug_identifier">Debug identifier</string>
|
<string name="summary_debug_identifier">Identificador de depuración</string>
|
||||||
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
<string name="unique_id_to_clipboard">Identificador copiado a su portapapeles</string>
|
||||||
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
|
<string name="display_header_drawer_summary">Mostrar una cabecera con la url de instancia de selfoss en el cajón lateral.</string>
|
||||||
<string name="display_header_drawer_title">Account header</string>
|
<string name="display_header_drawer_title">Cabecera de cuenta</string>
|
||||||
<string name="login_everything_title">Logging every api calls</string>
|
<string name="login_everything_title">Registrando todas las llamadas a la api</string>
|
||||||
<string name="login_everything_on">This will log every api call for debug purpose.</string>
|
<string name="login_everything_on">Esto registrará cada llamada a la api para propósito de depuración.</string>
|
||||||
<string name="login_everything_off">No api call will be logged</string>
|
<string name="login_everything_off">Ninguna llamada de api se registrará</string>
|
||||||
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Cargar más artículos en desplazamiento</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Traducción</string>
|
||||||
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
|
<string name="cant_open_invalid_url">La url del elemento no es válida. Estoy buscando resolver este problema para que la aplicación no colapse.</string>
|
||||||
<string name="drawer_report_bug">Report a bug</string>
|
<string name="drawer_report_bug">Reportar un error</string>
|
||||||
<string name="items_number_should_be_number">The items number should be an integer.</string>
|
<string name="items_number_should_be_number">El número de artículos debe ser un número entero.</string>
|
||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Leer más</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Abrir en el navegador</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Compartir</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Marcar artículos como leidos al desplazarse entre ellos.</string>
|
||||||
|
<string name="add_to_favs_reader">Añadir a Favoritos</string>
|
||||||
|
<string name="remove_to_favs_reader">Eliminar de favoritos</string>
|
||||||
|
<string name="pref_content_reader_font_size">Tamaño de la fuente</string>
|
||||||
|
<string name="pref_header_viewer">Visor de artículos</string>
|
||||||
|
<string name="refresh_dialog_message">Esto actualizará su instancia de Selfoss.</string>
|
||||||
|
<string name="markall_dialog_message">Esto marcará todos los artículos como leídos.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Marcar como leído al arrastrar</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">No marca artículos como leídos al arrastrar.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -43,8 +43,8 @@
|
|||||||
<string name="cant_create_source">"Impossible de créer la source."</string>
|
<string name="cant_create_source">"Impossible de créer la source."</string>
|
||||||
<string name="cant_get_spouts">"Impossible de récupérer vos Spouts pour rajouter des sources"</string>
|
<string name="cant_get_spouts">"Impossible de récupérer vos Spouts pour rajouter des sources"</string>
|
||||||
<string name="form_not_complete">"Il manque des données. Terminez le formulaire."</string>
|
<string name="form_not_complete">"Il manque des données. Terminez le formulaire."</string>
|
||||||
<string name="pref_header_links">"Liens utils"</string>
|
<string name="pref_header_links">"Liens utiles"</string>
|
||||||
<string name="issue_tracker_link">"Suivie des problèmes"</string>
|
<string name="issue_tracker_link">"Suivi des problèmes"</string>
|
||||||
<string name="issue_tracker_summary">"Pour signaler un bug ou demander une nouvelle fonctionnalité"</string>
|
<string name="issue_tracker_summary">"Pour signaler un bug ou demander une nouvelle fonctionnalité"</string>
|
||||||
<string name="warning_wrong_url">"ATTENTION"</string>
|
<string name="warning_wrong_url">"ATTENTION"</string>
|
||||||
<string name="pref_switch_card_view_title">"Card View"</string>
|
<string name="pref_switch_card_view_title">"Card View"</string>
|
||||||
@ -68,7 +68,7 @@
|
|||||||
<string name="invitation_title">"Essaye cette application pour les flux RSS Selfoss !"</string>
|
<string name="invitation_title">"Essaye cette application pour les flux RSS Selfoss !"</string>
|
||||||
<string name="invitation_message">"J'utilise cette applications pour mon flux RSS Selfoss. Tu aimeras peut être !"</string>
|
<string name="invitation_message">"J'utilise cette applications pour mon flux RSS Selfoss. Tu aimeras peut être !"</string>
|
||||||
<string name="invitation_cta">"Essayer maintenant"</string>
|
<string name="invitation_cta">"Essayer maintenant"</string>
|
||||||
<string name="text_wrong_url">"Vous semblez essayer de vous connceter avec une URL invalide. Assurez-vous que c'est la bonne, et si le problème persiste, contactez-moi via le lien du play store. Notez aussi que l'application ne peut fonctionner sans l'application web Selfoss. Vous ne pouvez pas utiliser l'application pour accéder directement aux flux RSS."</string>
|
<string name="text_wrong_url">"Vous semblez essayer de vous connecter avec une URL invalide. Assurez-vous que c'est la bonne, et si le problème persiste, contactez-moi via le lien du play store. Notez aussi que l'application ne peut fonctionner sans l'application web Selfoss. Vous ne pouvez pas utiliser l'application pour accéder directement aux flux RSS."</string>
|
||||||
<string name="pref_general_internal_browser_title">"Ouvrir les liens dans l'application"</string>
|
<string name="pref_general_internal_browser_title">"Ouvrir les liens dans l'application"</string>
|
||||||
<string name="pref_general_internal_browser_on">"Les articles s'ouvriront dans l'application"</string>
|
<string name="pref_general_internal_browser_on">"Les articles s'ouvriront dans l'application"</string>
|
||||||
<string name="pref_general_internal_browser_off">"Les articles s'ouvriront dans votre naviguateur par défaut"</string>
|
<string name="pref_general_internal_browser_off">"Les articles s'ouvriront dans votre naviguateur par défaut"</string>
|
||||||
@ -81,7 +81,7 @@
|
|||||||
<string name="pref_switch_card_view_on">"Les articles seront affichés en forme de carte"</string>
|
<string name="pref_switch_card_view_on">"Les articles seront affichés en forme de carte"</string>
|
||||||
<string name="pref_switch_card_view_off">"Les articles seront affichés en liste"</string>
|
<string name="pref_switch_card_view_off">"Les articles seront affichés en liste"</string>
|
||||||
<string name="pref_switch_actions_tap_on">"Afficher la barre d'action sous l'article"</string>
|
<string name="pref_switch_actions_tap_on">"Afficher la barre d'action sous l'article"</string>
|
||||||
<string name="pref_switch_actions_tap_off">"Le clique sur un article l'ouvrira dans le naviguateur selectionné"</string>
|
<string name="pref_switch_actions_tap_off">"Le clic sur un article l'ouvrira dans le navigateur sélectionné"</string>
|
||||||
<string name="menu_home_refresh">"Mettre à jour"</string>
|
<string name="menu_home_refresh">"Mettre à jour"</string>
|
||||||
<string name="refresh_success_response">"Mise à jour effectuée."</string>
|
<string name="refresh_success_response">"Mise à jour effectuée."</string>
|
||||||
<string name="refresh_failer_message">"La mise à jour n'a pas fonctionné. Vérifiez vos logs selfoss."</string>
|
<string name="refresh_failer_message">"La mise à jour n'a pas fonctionné. Vérifiez vos logs selfoss."</string>
|
||||||
@ -132,12 +132,12 @@
|
|||||||
<string name="indigo_pink_dark_theme">Indigo/Rose/Foncé</string>
|
<string name="indigo_pink_dark_theme">Indigo/Rose/Foncé</string>
|
||||||
<string name="red_teal_dark_theme">Rouge/Sarcelle/Foncé</string>
|
<string name="red_teal_dark_theme">Rouge/Sarcelle/Foncé</string>
|
||||||
<string name="pref_header_debug">Debug</string>
|
<string name="pref_header_debug">Debug</string>
|
||||||
<string name="login_debug_title">Activez pour logguer toutes les erreurs de connexion</string>
|
<string name="login_debug_title">Activez pour loguer toutes les erreurs de connexion</string>
|
||||||
<string name="login_debug_on">Toutes les erreurs de connexion vont être loguées</string>
|
<string name="login_debug_on">Toutes les erreurs de connexion vont être loguées</string>
|
||||||
<string name="login_debug_off">Aucune erreur de connexion ne sera loguée</string>
|
<string name="login_debug_off">Aucune erreur de connexion ne sera loguée</string>
|
||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Debug</string>
|
||||||
<string name="self_hosted_cert_switch">Certificat auto-signé ?</string>
|
<string name="self_hosted_cert_switch">Certificat auto-signé ?</string>
|
||||||
<string name="self_signed_cert_warning">Pour des raisons de sécurités, les certificats auto-signés sont désactivés par défaut. En les activant, je ne serais pas responsable de quelconques problèmes de sécurité rencontrés.</string>
|
<string name="self_signed_cert_warning">Pour des raisons de sécurité, les certificats auto-signés sont désactivés par défaut. En les activant, je ne serais pas responsable de quelconques problèmes de sécurité rencontrés.</string>
|
||||||
<string name="pref_selfoss_category">Api Selfoss</string>
|
<string name="pref_selfoss_category">Api Selfoss</string>
|
||||||
<string name="pref_api_items_number_title">Nombre d\'articles chargés</string>
|
<string name="pref_api_items_number_title">Nombre d\'articles chargés</string>
|
||||||
<string name="read_debug_title">Des articles lus marqués comme non lus ?</string>
|
<string name="read_debug_title">Des articles lus marqués comme non lus ?</string>
|
||||||
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Lire plus</string>
|
<string name="reader_action_more">Lire plus</string>
|
||||||
<string name="reader_action_open">Ouvrir</string>
|
<string name="reader_action_open">Ouvrir</string>
|
||||||
<string name="reader_action_share">Partager</string>
|
<string name="reader_action_share">Partager</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Marquer les articles comme lus à la navigation dans le lecteur d\'article.</string>
|
||||||
|
<string name="add_to_favs_reader">Ajouter aux favoris</string>
|
||||||
|
<string name="remove_to_favs_reader">Supprimer des favoris</string>
|
||||||
|
<string name="pref_content_reader_font_size">Taille du texte du contenu du lecteur d\'articles</string>
|
||||||
|
<string name="pref_header_viewer">Lecteur d\'articles</string>
|
||||||
|
<string name="refresh_dialog_message">En validant, votre instance Selfoss sera mise à jour.</string>
|
||||||
|
<string name="markall_dialog_message">Marquer tous les éléments comme lus ?</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Marquer comme lu à la navigation.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Ne pas marquer les articles comme lus à la navigation.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -2,122 +2,122 @@
|
|||||||
<!--Generated by crowdin.com-->
|
<!--Generated by crowdin.com-->
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<string name="app_name">"Reader for Selfoss"</string>
|
<string name="app_name">"Reader for Selfoss"</string>
|
||||||
<string name="title_activity_login">"Log in"</string>
|
<string name="title_activity_login">"Masuk"</string>
|
||||||
<string name="prompt_password">"Password"</string>
|
<string name="prompt_password">"Kata sandi"</string>
|
||||||
<string name="prompt_http_password">"HTTP Password"</string>
|
<string name="prompt_http_password">"Kata sandi HTTP"</string>
|
||||||
<string name="action_sign_in">"Go"</string>
|
<string name="action_sign_in">"Mulai"</string>
|
||||||
<string name="error_invalid_password">"Password not long enough"</string>
|
<string name="error_invalid_password">"Kata sandinya tidak cukup panjang"</string>
|
||||||
<string name="error_field_required">"Field required"</string>
|
<string name="error_field_required">"Kolom wajib diisi"</string>
|
||||||
<string name="prompt_url">"Url"</string>
|
<string name="prompt_url">"URL"</string>
|
||||||
<string name="withLoginSwitch">"Login required ?"</string>
|
<string name="withLoginSwitch">"Harus masuk?"</string>
|
||||||
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
|
<string name="withHttpLoginSwitch">"Otentikasi HTTP diperlukan?"</string>
|
||||||
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
|
<string name="login_url_problem">"Ups. Anda mungkin harus menambahkan \"/\" di akhir url."</string>
|
||||||
<string name="prompt_login">"Username"</string>
|
<string name="prompt_login">"Nama pengguna"</string>
|
||||||
<string name="prompt_http_login">"HTTP Username"</string>
|
<string name="prompt_http_login">"Nama pengguna HTTP"</string>
|
||||||
<string name="label_share">"Share"</string>
|
<string name="label_share">"Bagikan"</string>
|
||||||
<string name="readAll">"Read all"</string>
|
<string name="readAll">"Baca semua"</string>
|
||||||
<string name="action_disconnect">"Disconnect"</string>
|
<string name="action_disconnect">"Putuskan sambungan"</string>
|
||||||
<string name="title_activity_settings">"Settings"</string>
|
<string name="title_activity_settings">"Pengaturan"</string>
|
||||||
<string name="pref_header_general">"General"</string>
|
<string name="pref_header_general">"Umum"</string>
|
||||||
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string>
|
<string name="pref_switch_actions_tap_title">"Pilih tindakan pada artikel"</string>
|
||||||
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
|
<string name="add_source_hint_tags">"Tag1, Tag2, Tag 3"</string>
|
||||||
<string name="add_source_hint_url">"Link"</string>
|
<string name="add_source_hint_url">"Tautan"</string>
|
||||||
<string name="add_source_hint_name">"Name"</string>
|
<string name="add_source_hint_name">"Nama"</string>
|
||||||
<string name="add_source">"Add a source"</string>
|
<string name="add_source">"Tambahkan sumber"</string>
|
||||||
<string name="add_source_save">"Save"</string>
|
<string name="add_source_save">"Simpan"</string>
|
||||||
<string name="wrong_infos">"Check your details again."</string>
|
<string name="wrong_infos">"Periksa kembali detail Anda."</string>
|
||||||
<string name="all_posts_not_read">"All posts weren't read"</string>
|
<string name="all_posts_not_read">"Semua pos belum dibaca"</string>
|
||||||
<string name="all_posts_read">"All posts were read"</string>
|
<string name="all_posts_read">"Semua pos sudah dibaca"</string>
|
||||||
<string name="cant_get_favs">"Can't get favorites"</string>
|
<string name="cant_get_favs">"Gagal menuju favorit"</string>
|
||||||
<string name="cant_get_new_elements">"Can't get new articles"</string>
|
<string name="cant_get_new_elements">"Gagal ke artikel baru"</string>
|
||||||
<string name="cant_get_read">"Can't get read articles"</string>
|
<string name="cant_get_read">"Gagal ke artikel yang dibaca"</string>
|
||||||
<string name="nothing_here">"Nothing here"</string>
|
<string name="nothing_here">"Tidak ada di sini"</string>
|
||||||
<string name="tab_new">"New"</string>
|
<string name="tab_new">"Baru"</string>
|
||||||
<string name="tab_read">"All"</string>
|
<string name="tab_read">"Semua"</string>
|
||||||
<string name="tab_favs">"Favorites"</string>
|
<string name="tab_favs">"Favorit"</string>
|
||||||
<string name="action_about">"About"</string>
|
<string name="action_about">"Tentang"</string>
|
||||||
<string name="marked_as_read">"Item read"</string>
|
<string name="marked_as_read">"Membaca item"</string>
|
||||||
<string name="undo_string">"Undo"</string>
|
<string name="undo_string">"Urung"</string>
|
||||||
<string name="addStringNoUrl">"Log in to add sources."</string>
|
<string name="addStringNoUrl">"Masuk untuk menambah sumber."</string>
|
||||||
<string name="cant_get_sources">"Can't get sources list."</string>
|
<string name="cant_get_sources">"Tidak bisa mendapatkan daftar sumber."</string>
|
||||||
<string name="cant_create_source">"Can't create source."</string>
|
<string name="cant_create_source">"Tidak dapat membuat sumber."</string>
|
||||||
<string name="cant_get_spouts">"Can't get spouts list."</string>
|
<string name="cant_get_spouts">"Tidak bisa masuk ke daftar Spouts."</string>
|
||||||
<string name="form_not_complete">"The form is not complete"</string>
|
<string name="form_not_complete">"Formulirnya belum selesai"</string>
|
||||||
<string name="pref_header_links">"Links"</string>
|
<string name="pref_header_links">"Tautan"</string>
|
||||||
<string name="issue_tracker_link">"Issue Tracker"</string>
|
<string name="issue_tracker_link">"Pelacak Masalah"</string>
|
||||||
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
|
<string name="issue_tracker_summary">"Laporkan bug atau meminta fitur baru"</string>
|
||||||
<string name="warning_wrong_url">"WARNING"</string>
|
<string name="warning_wrong_url">"PERINGATAN"</string>
|
||||||
<string name="pref_switch_card_view_title">"Card View"</string>
|
<string name="pref_switch_card_view_title">"Tampilan Kartu"</string>
|
||||||
<string name="cant_mark_favortie">"Can't mark article as favorite"</string>
|
<string name="cant_mark_favortie">"Tidak dapat menandai artikel sebagai favorit"</string>
|
||||||
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
|
<string name="cant_unmark_favortie">"Tidak dapat melepas item dari favorit"</string>
|
||||||
<string name="share">"Share"</string>
|
<string name="share">"Bagikan"</string>
|
||||||
<string name="rating_prompt_title">"Enjoying the app ?"</string>
|
<string name="rating_prompt_title">"Suka aplikasi ini?"</string>
|
||||||
<string name="rating_prompt_yes">"Yes !"</string>
|
<string name="rating_prompt_yes">"Ya !"</string>
|
||||||
<string name="rating_prompt_no">"Not really …"</string>
|
<string name="rating_prompt_no">"Tidak suka …"</string>
|
||||||
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
|
<string name="rating_prompt_feedback_title">"Bisakah Anda memberitahu kami alasannya?"</string>
|
||||||
<string name="rating_prompt_feedback_yes">"OK !"</string>
|
<string name="rating_prompt_feedback_yes">"Oke !"</string>
|
||||||
<string name="rating_prompt_feedback_no">"Not now."</string>
|
<string name="rating_prompt_feedback_no">"Tidak sekarang."</string>
|
||||||
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
|
<string name="rating_prompt_rating_title">"Bagus! Dapatkah Anda memberi nilai kami di Store ?"</string>
|
||||||
<string name="rating_prompt_rating_yes">"Sure !"</string>
|
<string name="rating_prompt_rating_yes">"Tentu saja !"</string>
|
||||||
<string name="rating_prompt_rating_no">"Not right now."</string>
|
<string name="rating_prompt_rating_no">"Jangan sekarang."</string>
|
||||||
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
|
<string name="rating_prompt_thanks">"Terima kasih, umpan balik Anda membantu pengembangan aplikasi !"</string>
|
||||||
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
|
<string name="switch_unread_count">"Tampilkan jumlah item yang belum dibaca di bilah bawah."</string>
|
||||||
<string name="switch_unread_count_title">"Display unread count"</string>
|
<string name="switch_unread_count_title">"Tampilkan jumlah item yang belum dibaca"</string>
|
||||||
<string name="display_all_counts_title">"Display count for favorite and read"</string>
|
<string name="display_all_counts_title">"Tampilkan jumlah item untuk favorit dan sudah dibaca"</string>
|
||||||
<string name="menu_share_the_app">"Invite friends"</string>
|
<string name="menu_share_the_app">"Undang teman"</string>
|
||||||
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string>
|
<string name="invitation_title">"Coba mengggunakan aplikasi ini untuk umpan RSS Selfoss Anda !"</string>
|
||||||
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string>
|
<string name="invitation_message">"Saya menggunakan aplikasi ini untuk umpan RSS Selfoss saya. Anda akan menyukainya juga!"</string>
|
||||||
<string name="invitation_cta">"Try the app"</string>
|
<string name="invitation_cta">"Coba aplikasi"</string>
|
||||||
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
|
<string name="text_wrong_url">"Sepertinya Anda mencoba menggunakan URL yang tidak valid. Pastikan itu benar, jika masalah terus berlanjut, hubungi saya (melalui link kontak toko). Harap dicatat bahwa aplikasi ini mengharuskan Anda menggunakan Selfoss. Tanpa itu, Anda tidak bisa mengakses umpan RSS."</string>
|
||||||
<string name="pref_general_internal_browser_title">"Open links inside the app"</string>
|
<string name="pref_general_internal_browser_title">"Buka tautan dalam aplikasi"</string>
|
||||||
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
|
<string name="pref_general_internal_browser_on">"Artikel akan dibuka di dalam aplikasi"</string>
|
||||||
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
|
<string name="pref_general_internal_browser_off">"Artikel akan dibuka dalam peramban bawaan Anda"</string>
|
||||||
<string name="prefer_article_viewer_title">"Use the article viewer"</string>
|
<string name="prefer_article_viewer_title">"Gunakan pratinjau artikel"</string>
|
||||||
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
|
<string name="prefer_article_viewer_on">"Lihat artikel di penampil daripada peramban internal"</string>
|
||||||
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
|
<string name="prefer_article_viewer_off">"Gunakan peramban internal dan bukan penampil artikel"</string>
|
||||||
<string name="pref_general_category_links">"Link handling"</string>
|
<string name="pref_general_category_links">"Pengolahan tautan"</string>
|
||||||
<string name="pref_general_category_displaying">"Displaying"</string>
|
<string name="pref_general_category_displaying">"Tampilan"</string>
|
||||||
<string name="pref_general_category_actions">"Actions"</string>
|
<string name="pref_general_category_actions">"Tindakan"</string>
|
||||||
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
|
<string name="pref_switch_card_view_on">"Artikel ini akan ditampilkan dalam bentuk kartu"</string>
|
||||||
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
|
<string name="pref_switch_card_view_off">"Artikel ini akan ditampilkan sebagai daftar"</string>
|
||||||
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string>
|
<string name="pref_switch_actions_tap_on">"Bilah tindakan ditampilkan di bawah artikel"</string>
|
||||||
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string>
|
<string name="pref_switch_actions_tap_off">"Saat memilih artikel akan terbuka di peramban pilihan Anda"</string>
|
||||||
<string name="menu_home_refresh">"Update remote"</string>
|
<string name="menu_home_refresh">"Pemutakhiran jarak jauh"</string>
|
||||||
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
|
<string name="refresh_success_response">"Selfoss sedang diperbarui, kini Anda bisa menyegarkan daftar artikel"</string>
|
||||||
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
|
<string name="refresh_failer_message">"Pembaruan tidak berhasil, coba lagi atau periksa log Selfoss."</string>
|
||||||
<string name="refresh_in_progress">"Refresh in progress"</string>
|
<string name="refresh_in_progress">"Dlam proses menyegarkan"</string>
|
||||||
<string name="new_apk_available_title">"A new APK is available."</string>
|
<string name="new_apk_available_title">"APK baru sudah tersedia."</string>
|
||||||
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string>
|
<string name="new_apk_available_message">"APK baru sudah tersedia untuk diunduh di gerai resmi."</string>
|
||||||
<string name="new_apk_available_get">"Download now"</string>
|
<string name="new_apk_available_get">"Unduh sekarang"</string>
|
||||||
<string name="new_apk_available_no">"Ignore version"</string>
|
<string name="new_apk_available_no">"Abaikan versi"</string>
|
||||||
<string name="intro_hello_title">"Hi there !"</string>
|
<string name="intro_hello_title">"Hai !"</string>
|
||||||
<string name="intro_hello_message">"Thanks for downloading the app !"</string>
|
<string name="intro_hello_message">"Terima kasih telah mengunduh aplikasi ini !"</string>
|
||||||
<string name="intro_needs_selfoss_title">"Before you start…"</string>
|
<string name="intro_needs_selfoss_title">"Sebelum Anda mulai…"</string>
|
||||||
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string>
|
<string name="intro_needs_selfoss_message">"Anda tidak dapat menggunakan aplikasi ini tanpa menjalankan Selfoss."</string>
|
||||||
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string>
|
<string name="intro_needs_selfoss_link">"Apa itu Selfoss ?"</string>
|
||||||
<string name="intro_all_set_title">"All set !"</string>
|
<string name="intro_all_set_title">"Selesai !"</string>
|
||||||
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string>
|
<string name="intro_all_set_message">"Kamu sudah siap Jangan lupa atur aplikasi konfigurasi halaman, Anda juga bisa menemukan beberapa tautan yang berguna disana."</string>
|
||||||
<string name="card_height_title">Full height cards</string>
|
<string name="card_height_title">Peta tinggi penuh</string>
|
||||||
<string name="card_height_on">Cards height will adjust to its content</string>
|
<string name="card_height_on">Tinggi kartu akan disesuaikan dengan konten</string>
|
||||||
<string name="card_height_off">Card height will be fixed</string>
|
<string name="card_height_off">Ukuran kartu akan tetap</string>
|
||||||
<string name="source_code">Source code</string>
|
<string name="source_code">Kode sumber</string>
|
||||||
<string name="cant_mark_read">Can\'t mark article as read</string>
|
<string name="cant_mark_read">Tidak dapat menandai artikel sebagai telah dibaca</string>
|
||||||
<string name="drawer_error_loading_tags">Error loading tags…</string>
|
<string name="drawer_error_loading_tags">Kesalahan saat memuat tag…</string>
|
||||||
<string name="drawer_error_loading_sources">Error loading sources…</string>
|
<string name="drawer_error_loading_sources">Kesalahan saat memuat sumber…</string>
|
||||||
<string name="drawer_item_filters">Filters</string>
|
<string name="drawer_item_filters">Filter</string>
|
||||||
<string name="drawer_action_clear">clear</string>
|
<string name="drawer_action_clear">kosongkan</string>
|
||||||
<string name="drawer_item_tags">Tags</string>
|
<string name="drawer_item_tags">Tag</string>
|
||||||
<string name="drawer_item_sources">Sources</string>
|
<string name="drawer_item_sources">Sumber</string>
|
||||||
<string name="drawer_action_edit">edit</string>
|
<string name="drawer_action_edit">suntung</string>
|
||||||
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string>
|
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Data dalam tembolok tidak dapat diambil</string>
|
||||||
<string name="no_tags_loaded">No tags loaded</string>
|
<string name="no_tags_loaded">Tidak ada tag yang dimuat</string>
|
||||||
<string name="no_sources_loaded">No sources loaded</string>
|
<string name="no_sources_loaded">Tak ada sumber yang dimuat</string>
|
||||||
<string name="drawer_loading">Loading …</string>
|
<string name="drawer_loading">Memuat …</string>
|
||||||
<string name="menu_home_search">Search</string>
|
<string name="menu_home_search">Cari</string>
|
||||||
<string name="can_delete_source">Can\'t delete the source…</string>
|
<string name="can_delete_source">Tidak dapat menghapus sumber…</string>
|
||||||
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
|
<string name="base_url_error">Ada masalah saat berkomunikasi dengan Selfoss Anda. Jika masalah berlanjut, tolong hubungi saya.</string>
|
||||||
<string name="pref_header_theme">Themes</string>
|
<string name="pref_header_theme">Tema</string>
|
||||||
<string name="default_theme">Default</string>
|
<string name="default_theme">Bawaan</string>
|
||||||
<string name="teal_orange_theme">Teal/Orange/Light</string>
|
<string name="teal_orange_theme">Teal/Orange/Light</string>
|
||||||
<string name="cyan_pink_theme">Cyan/Pink/Light</string>
|
<string name="cyan_pink_theme">Cyan/Pink/Light</string>
|
||||||
<string name="grey_orange_theme">Grey/Orange/Light</string>
|
<string name="grey_orange_theme">Grey/Orange/Light</string>
|
||||||
@ -125,37 +125,46 @@
|
|||||||
<string name="indigo_pink_theme">Indigo/Pink/Light</string>
|
<string name="indigo_pink_theme">Indigo/Pink/Light</string>
|
||||||
<string name="red_teal_theme">Red/Teal/Light</string>
|
<string name="red_teal_theme">Red/Teal/Light</string>
|
||||||
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string>
|
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string>
|
||||||
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string>
|
<string name="cyan_pink_dark_theme">Cyan/Pink/Gelap</string>
|
||||||
<string name="default_dark_theme">Default/Dark</string>
|
<string name="default_dark_theme">Bawaan/Gelap</string>
|
||||||
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string>
|
<string name="grey_orange_dark_theme">Grey/Orange/Gelap</string>
|
||||||
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
<string name="blue_amber_dark_theme">Blue/Amber/Gelap</string>
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
<string name="indigo_pink_dark_theme">Indigo/Pink/Gelap</string>
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
<string name="red_teal_dark_theme">Red/Teal/Gelap</string>
|
||||||
<string name="pref_header_debug">Debug</string>
|
<string name="pref_header_debug">Debug</string>
|
||||||
<string name="login_debug_title">Activate to log login errors</string>
|
<string name="login_debug_title">Aktifkan untuk mencatat semua kesalahan koneksi</string>
|
||||||
<string name="login_debug_on">Any error on the login page will be logged</string>
|
<string name="login_debug_on">Semua kesalahan koneksi akan dicatat</string>
|
||||||
<string name="login_debug_off">No log on the login page</string>
|
<string name="login_debug_off">Kesalahan pada halaman masuk</string>
|
||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Debug</string>
|
||||||
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
<string name="self_hosted_cert_switch">Sertifikat yang ditandatangani sendiri?</string>
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
<string name="self_signed_cert_warning">Untuk alasan keamanan, sertifikat yang ditandatangani sendiri tidak didukung secara bawaan. Jika Anda mengaktifkan item ini, saya tidak akan bertanggung jawab atas masalah keamanan yang Anda hadapi.</string>
|
||||||
<string name="pref_selfoss_category">Selfoss Api</string>
|
<string name="pref_selfoss_category">Selfoss Api</string>
|
||||||
<string name="pref_api_items_number_title">Loaded items number</string>
|
<string name="pref_api_items_number_title">Item nomor dimuat</string>
|
||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">Baca artikel yang ini sebagai belum dibaca ?</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">Tidak ada catatan saat item ditandai sebagai telah dibaca</string>
|
||||||
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
<string name="read_debug_on">Panggilan api dicatat saat item ditandai sebagai telah dibaca</string>
|
||||||
<string name="summary_debug_identifier">Debug identifier</string>
|
<string name="summary_debug_identifier">Identifikasi debug</string>
|
||||||
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
<string name="unique_id_to_clipboard">Salin pengenal ke papan klip Anda</string>
|
||||||
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
|
<string name="display_header_drawer_summary">Kop dengan alamat link Selfoss ditampilkan di laci lateral.</string>
|
||||||
<string name="display_header_drawer_title">Account header</string>
|
<string name="display_header_drawer_title">Kop akun</string>
|
||||||
<string name="login_everything_title">Logging every api calls</string>
|
<string name="login_everything_title">Catat setiap panggilan api</string>
|
||||||
<string name="login_everything_on">This will log every api call for debug purpose.</string>
|
<string name="login_everything_on">Untuk debug program, ini akan mencatat setiap panggilan api.</string>
|
||||||
<string name="login_everything_off">No api call will be logged</string>
|
<string name="login_everything_off">Tidak ada panggilan api yang akan dicatat</string>
|
||||||
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Muat lebih banyak artikel saat membalik halaman</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Terjemahan</string>
|
||||||
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
|
<string name="cant_open_invalid_url">Alamat tautan proyek tidak valid. Saya mencoba memecahkan masalah ini untuk menghindari aplikasi berhenti.</string>
|
||||||
<string name="drawer_report_bug">Report a bug</string>
|
<string name="drawer_report_bug">Laporkan bug</string>
|
||||||
<string name="items_number_should_be_number">The items number should be an integer.</string>
|
<string name="items_number_should_be_number">Jumlah item harus berupa bilangan bulat.</string>
|
||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Baca lebih lanjut</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Buka di peramban</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Bagikan</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
<string name="cant_get_read">"Ophalen reeds gelezen artikelen mislukt"</string>
|
<string name="cant_get_read">"Ophalen reeds gelezen artikelen mislukt"</string>
|
||||||
<string name="nothing_here">"Niets gevonden"</string>
|
<string name="nothing_here">"Niets gevonden"</string>
|
||||||
<string name="tab_new">"Nieuw"</string>
|
<string name="tab_new">"Nieuw"</string>
|
||||||
<string name="tab_read">"All"</string>
|
<string name="tab_read">"Alle"</string>
|
||||||
<string name="tab_favs">"Favorieten"</string>
|
<string name="tab_favs">"Favorieten"</string>
|
||||||
<string name="action_about">"Over"</string>
|
<string name="action_about">"Over"</string>
|
||||||
<string name="marked_as_read">"Artikel gelezen"</string>
|
<string name="marked_as_read">"Artikel gelezen"</string>
|
||||||
@ -100,62 +100,71 @@
|
|||||||
<string name="card_height_title">Volledige hoogte kaarten</string>
|
<string name="card_height_title">Volledige hoogte kaarten</string>
|
||||||
<string name="card_height_on">Hoogte aanpassen aan de hand van kaartinhoud</string>
|
<string name="card_height_on">Hoogte aanpassen aan de hand van kaartinhoud</string>
|
||||||
<string name="card_height_off">Vaste hoogte</string>
|
<string name="card_height_off">Vaste hoogte</string>
|
||||||
<string name="source_code">Source code</string>
|
<string name="source_code">Broncode</string>
|
||||||
<string name="cant_mark_read">Impossible de marquer l\'article comme lu</string>
|
<string name="cant_mark_read">Impossible de marquer l\'article comme lu</string>
|
||||||
<string name="drawer_error_loading_tags">Error loading tags…</string>
|
<string name="drawer_error_loading_tags">Fout bij het laden van tags…</string>
|
||||||
<string name="drawer_error_loading_sources">Error loading sources…</string>
|
<string name="drawer_error_loading_sources">Fout bij laden van bronnen…</string>
|
||||||
<string name="drawer_item_filters">Filters</string>
|
<string name="drawer_item_filters">Filters</string>
|
||||||
<string name="drawer_action_clear">clear</string>
|
<string name="drawer_action_clear">wissen</string>
|
||||||
<string name="drawer_item_tags">Tags</string>
|
<string name="drawer_item_tags">Tags</string>
|
||||||
<string name="drawer_item_sources">Sources</string>
|
<string name="drawer_item_sources">Bronnen</string>
|
||||||
<string name="drawer_action_edit">edit</string>
|
<string name="drawer_action_edit">bewerken</string>
|
||||||
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string>
|
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">De gegevens in uw opslagruimte kunnen niet in de cache worden opgeslagen</string>
|
||||||
<string name="no_tags_loaded">No tags loaded</string>
|
<string name="no_tags_loaded">Geen tags geladen</string>
|
||||||
<string name="no_sources_loaded">No sources loaded</string>
|
<string name="no_sources_loaded">Geen bronnen geladen</string>
|
||||||
<string name="drawer_loading">Loading …</string>
|
<string name="drawer_loading">Bezig met laden …</string>
|
||||||
<string name="menu_home_search">Zoeken</string>
|
<string name="menu_home_search">Zoeken</string>
|
||||||
<string name="can_delete_source">Can\'t delete the source…</string>
|
<string name="can_delete_source">Kan de bron niet verwijderen…</string>
|
||||||
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
|
<string name="base_url_error">Er was een probleem bij het communiceren met uw Selfoss Instance. Als het probleem blijft, neem dan contact met mij op.</string>
|
||||||
<string name="pref_header_theme">Themes</string>
|
<string name="pref_header_theme">Thema \'s</string>
|
||||||
<string name="default_theme">Default</string>
|
<string name="default_theme">Standaard</string>
|
||||||
<string name="teal_orange_theme">Teal/Orange/Light</string>
|
<string name="teal_orange_theme">Groenblauw/Oranje/Licht</string>
|
||||||
<string name="cyan_pink_theme">Cyan/Pink/Light</string>
|
<string name="cyan_pink_theme">Cyaan/Roze/Licht</string>
|
||||||
<string name="grey_orange_theme">Grey/Orange/Light</string>
|
<string name="grey_orange_theme">Grijs/Oranje/Licht</string>
|
||||||
<string name="blue_amber_theme">Blue/Amber/Light</string>
|
<string name="blue_amber_theme">Blauw/Amber/Licht</string>
|
||||||
<string name="indigo_pink_theme">Indigo/Pink/Light</string>
|
<string name="indigo_pink_theme">Indigo/Roze/Licht</string>
|
||||||
<string name="red_teal_theme">Red/Teal/Light</string>
|
<string name="red_teal_theme">Rood/Groenblauwl/Licht</string>
|
||||||
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string>
|
<string name="teal_orange_dark_theme">Groenblauw/Oranje/Donker</string>
|
||||||
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string>
|
<string name="cyan_pink_dark_theme">Cyaan/Roze/Donker</string>
|
||||||
<string name="default_dark_theme">Default/Dark</string>
|
<string name="default_dark_theme">Standaard/Donker</string>
|
||||||
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string>
|
<string name="grey_orange_dark_theme">Grijs/Oranje/Donker</string>
|
||||||
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
<string name="blue_amber_dark_theme">Blauw/Amber/Donker</string>
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
<string name="indigo_pink_dark_theme">Indigo/Roze/Donker</string>
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
<string name="red_teal_dark_theme">Rood/Groenbauw/Donker</string>
|
||||||
<string name="pref_header_debug">Debug</string>
|
<string name="pref_header_debug">Fout opsporen</string>
|
||||||
<string name="login_debug_title">Activate to log login errors</string>
|
<string name="login_debug_title">Activeer om login-fouten te loggen</string>
|
||||||
<string name="login_debug_on">Any error on the login page will be logged</string>
|
<string name="login_debug_on">Elke fout op de inlogpagina wordt gelogd</string>
|
||||||
<string name="login_debug_off">No log on the login page</string>
|
<string name="login_debug_off">Geen log op de inlogpagina</string>
|
||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Fout opsporen</string>
|
||||||
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
<string name="self_hosted_cert_switch">Gebruik een zelf gehost certificaat?</string>
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
<string name="self_signed_cert_warning">Vanwege veiligheidsredenen worden zelfondertekende certificaten niet standaard ondersteund. Door dit te activeren, ben ik niet verantwoordelijk voor beveiligingsproblemen die u tegenkomt.</string>
|
||||||
<string name="pref_selfoss_category">Selfoss Api</string>
|
<string name="pref_selfoss_category">Selfoss Api</string>
|
||||||
<string name="pref_api_items_number_title">Loaded items number</string>
|
<string name="pref_api_items_number_title">Geladen items nummer</string>
|
||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">Gelezen artikelen verschijnen als ongelezen?</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">Geen logboek bij het markeren van een artikel als gelezen</string>
|
||||||
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
<string name="read_debug_on">Api-oproepen zullen gelogd worden wanneer een artikel als gelezen wordt gemarkeerd</string>
|
||||||
<string name="summary_debug_identifier">Debug identifier</string>
|
<string name="summary_debug_identifier">ID voor foutopsporing</string>
|
||||||
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
<string name="unique_id_to_clipboard">ID naar uw klembord gekopieerd</string>
|
||||||
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
|
<string name="display_header_drawer_summary">Laat een koptekst weergeven met de url van de selfoss instantie in de zijlade.</string>
|
||||||
<string name="display_header_drawer_title">Account header</string>
|
<string name="display_header_drawer_title">Account titel</string>
|
||||||
<string name="login_everything_title">Logging every api calls</string>
|
<string name="login_everything_title">Elke api-oproepen loggen</string>
|
||||||
<string name="login_everything_on">This will log every api call for debug purpose.</string>
|
<string name="login_everything_on">Hiermee wordt elke api oproepen gelogt voor foutopsporingsdoeleinden.</string>
|
||||||
<string name="login_everything_off">No api call will be logged</string>
|
<string name="login_everything_off">Geen api-oproep wordt gelogt</string>
|
||||||
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Laad meer artikelen door te bladeren</string>
|
||||||
<string name="translation">Vertaling</string>
|
<string name="translation">Vertaling</string>
|
||||||
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
|
<string name="cant_open_invalid_url">De URL is ongeldig. Ik probeer dit probleem op te lossen, zodat de toepassing niet wordt afgesloten.</string>
|
||||||
<string name="drawer_report_bug">Report a bug</string>
|
<string name="drawer_report_bug">Een fout melden</string>
|
||||||
<string name="items_number_should_be_number">The items number should be an integer.</string>
|
<string name="items_number_should_be_number">Het aantal items moet een geheel getal zijn.</string>
|
||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Lees meer</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Openen in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Delen</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Leia mais</string>
|
<string name="reader_action_more">Leia mais</string>
|
||||||
<string name="reader_action_open">Abrir no navegador</string>
|
<string name="reader_action_open">Abrir no navegador</string>
|
||||||
<string name="reader_action_share">Compartilhar</string>
|
<string name="reader_action_share">Compartilhar</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Se esta configuração estiver ativada, os artigos serão marcados como lidos ao deslizar para a esquerda e para a direita no leitor do artigo.</string>
|
||||||
|
<string name="add_to_favs_reader">Adicionar aos favoritos</string>
|
||||||
|
<string name="remove_to_favs_reader">Remover dos favoritos</string>
|
||||||
|
<string name="pref_content_reader_font_size">Tamanho da fonte do conteúdo do leitor de artigos</string>
|
||||||
|
<string name="pref_header_viewer">Visualizador de artigos</string>
|
||||||
|
<string name="refresh_dialog_message">Isso atualizará sua instância do Selfoss.</string>
|
||||||
|
<string name="markall_dialog_message">Isso marcará todos os itens como lidos.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,161 +1,170 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--Generated by crowdin.com-->
|
<!--Generated by crowdin.com-->
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<string name="app_name">"Reader for Selfoss"</string>
|
<string name="app_name">"Leitor para Selfoss"</string>
|
||||||
<string name="title_activity_login">"Log in"</string>
|
<string name="title_activity_login">"Iniciar sessão"</string>
|
||||||
<string name="prompt_password">"Password"</string>
|
<string name="prompt_password">"Palavra passe"</string>
|
||||||
<string name="prompt_http_password">"HTTP Password"</string>
|
<string name="prompt_http_password">"Senha HTTP"</string>
|
||||||
<string name="action_sign_in">"Go"</string>
|
<string name="action_sign_in">"Ir"</string>
|
||||||
<string name="error_invalid_password">"Password not long enough"</string>
|
<string name="error_invalid_password">"Senha não é longa o suficiente"</string>
|
||||||
<string name="error_field_required">"Field required"</string>
|
<string name="error_field_required">"Campo obrigatório"</string>
|
||||||
<string name="prompt_url">"Url"</string>
|
<string name="prompt_url">"Url"</string>
|
||||||
<string name="withLoginSwitch">"Login required ?"</string>
|
<string name="withLoginSwitch">"É necessário fazer login?"</string>
|
||||||
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
|
<string name="withHttpLoginSwitch">"É necessário fazer login on HTTP?"</string>
|
||||||
<string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string>
|
<string name="login_url_problem">"Uups. Você pode precisar adicionar uma \"/\" no final da url."</string>
|
||||||
<string name="prompt_login">"Username"</string>
|
<string name="prompt_login">"Nome do usuário"</string>
|
||||||
<string name="prompt_http_login">"HTTP Username"</string>
|
<string name="prompt_http_login">"Nome de utilizador HTTP"</string>
|
||||||
<string name="label_share">"Share"</string>
|
<string name="label_share">"Compartilhar"</string>
|
||||||
<string name="readAll">"Read all"</string>
|
<string name="readAll">"Ler tudo"</string>
|
||||||
<string name="action_disconnect">"Disconnect"</string>
|
<string name="action_disconnect">"Desligar"</string>
|
||||||
<string name="title_activity_settings">"Settings"</string>
|
<string name="title_activity_settings">"Configurações"</string>
|
||||||
<string name="pref_header_general">"General"</string>
|
<string name="pref_header_general">"Geral"</string>
|
||||||
<string name="pref_switch_actions_tap_title">"Tap action on the articles"</string>
|
<string name="pref_switch_actions_tap_title">"Toque em ação sobre os artigos"</string>
|
||||||
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
|
<string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string>
|
||||||
<string name="add_source_hint_url">"Link"</string>
|
<string name="add_source_hint_url">"Link"</string>
|
||||||
<string name="add_source_hint_name">"Name"</string>
|
<string name="add_source_hint_name">"Nome"</string>
|
||||||
<string name="add_source">"Add a source"</string>
|
<string name="add_source">"Adicionar uma fonte"</string>
|
||||||
<string name="add_source_save">"Save"</string>
|
<string name="add_source_save">"Salvar"</string>
|
||||||
<string name="wrong_infos">"Check your details again."</string>
|
<string name="wrong_infos">"Verifique seus dados novamente."</string>
|
||||||
<string name="all_posts_not_read">"All posts weren't read"</string>
|
<string name="all_posts_not_read">"Todas as postagens não foram lidas"</string>
|
||||||
<string name="all_posts_read">"All posts were read"</string>
|
<string name="all_posts_read">"Todas as postagens foram lidas"</string>
|
||||||
<string name="cant_get_favs">"Can't get favorites"</string>
|
<string name="cant_get_favs">"Não é possível obter favoritos"</string>
|
||||||
<string name="cant_get_new_elements">"Can't get new articles"</string>
|
<string name="cant_get_new_elements">"Não é possível obter novos artigos"</string>
|
||||||
<string name="cant_get_read">"Can't get read articles"</string>
|
<string name="cant_get_read">"Não é possível ler artigos"</string>
|
||||||
<string name="nothing_here">"Nothing here"</string>
|
<string name="nothing_here">"Nada aqui"</string>
|
||||||
<string name="tab_new">"New"</string>
|
<string name="tab_new">"Novo"</string>
|
||||||
<string name="tab_read">"All"</string>
|
<string name="tab_read">"Tudo"</string>
|
||||||
<string name="tab_favs">"Favorites"</string>
|
<string name="tab_favs">"Favoritos"</string>
|
||||||
<string name="action_about">"About"</string>
|
<string name="action_about">"Sobre"</string>
|
||||||
<string name="marked_as_read">"Item read"</string>
|
<string name="marked_as_read">"Item lido"</string>
|
||||||
<string name="undo_string">"Undo"</string>
|
<string name="undo_string">"Desfazer"</string>
|
||||||
<string name="addStringNoUrl">"Log in to add sources."</string>
|
<string name="addStringNoUrl">"Logar para adicionar fontes."</string>
|
||||||
<string name="cant_get_sources">"Can't get sources list."</string>
|
<string name="cant_get_sources">"Não é possível obter a lista de fontes."</string>
|
||||||
<string name="cant_create_source">"Can't create source."</string>
|
<string name="cant_create_source">"Não é possível criar a fonte."</string>
|
||||||
<string name="cant_get_spouts">"Can't get spouts list."</string>
|
<string name="cant_get_spouts">"Não é possível obter a lista de bicos."</string>
|
||||||
<string name="form_not_complete">"The form is not complete"</string>
|
<string name="form_not_complete">"O formulário não está completo"</string>
|
||||||
<string name="pref_header_links">"Links"</string>
|
<string name="pref_header_links">"Links"</string>
|
||||||
<string name="issue_tracker_link">"Issue Tracker"</string>
|
<string name="issue_tracker_link">"Rastreador de problemas"</string>
|
||||||
<string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string>
|
<string name="issue_tracker_summary">"Relatar um bug ou pedir um novo recurso"</string>
|
||||||
<string name="warning_wrong_url">"WARNING"</string>
|
<string name="warning_wrong_url">"AVISO"</string>
|
||||||
<string name="pref_switch_card_view_title">"Card View"</string>
|
<string name="pref_switch_card_view_title">"Vista de cartão"</string>
|
||||||
<string name="cant_mark_favortie">"Can't mark article as favorite"</string>
|
<string name="cant_mark_favortie">"Não é possível marcar o artigo como favorito"</string>
|
||||||
<string name="cant_unmark_favortie">"Can't remove item from favorite"</string>
|
<string name="cant_unmark_favortie">"Não pode remover o item do favorito"</string>
|
||||||
<string name="share">"Share"</string>
|
<string name="share">"Compartilhar"</string>
|
||||||
<string name="rating_prompt_title">"Enjoying the app ?"</string>
|
<string name="rating_prompt_title">"Gosta da aplicação?"</string>
|
||||||
<string name="rating_prompt_yes">"Yes !"</string>
|
<string name="rating_prompt_yes">"Sim!"</string>
|
||||||
<string name="rating_prompt_no">"Not really …"</string>
|
<string name="rating_prompt_no">"Não realmente…"</string>
|
||||||
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
|
<string name="rating_prompt_feedback_title">"Pode nos dizer por que?"</string>
|
||||||
<string name="rating_prompt_feedback_yes">"OK !"</string>
|
<string name="rating_prompt_feedback_yes">"Okey!"</string>
|
||||||
<string name="rating_prompt_feedback_no">"Not now."</string>
|
<string name="rating_prompt_feedback_no">"Agora não."</string>
|
||||||
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
|
<string name="rating_prompt_rating_title">"Legal! Você pode classificar-na loja?"</string>
|
||||||
<string name="rating_prompt_rating_yes">"Sure !"</string>
|
<string name="rating_prompt_rating_yes">"Claro!"</string>
|
||||||
<string name="rating_prompt_rating_no">"Not right now."</string>
|
<string name="rating_prompt_rating_no">"Agora não."</string>
|
||||||
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
|
<string name="rating_prompt_thanks">"Obrigado, seu feedback ajudar a realçar o app!"</string>
|
||||||
<string name="switch_unread_count">"Display the unread count as a badge for the bottom bar."</string>
|
<string name="switch_unread_count">"Exibir a contagem não lida como um emblema para a barra inferior."</string>
|
||||||
<string name="switch_unread_count_title">"Display unread count"</string>
|
<string name="switch_unread_count_title">"Exibir a contagem não lida"</string>
|
||||||
<string name="display_all_counts_title">"Display count for favorite and read"</string>
|
<string name="display_all_counts_title">"Exibir a contagem para o favorito e leitura"</string>
|
||||||
<string name="menu_share_the_app">"Invite friends"</string>
|
<string name="menu_share_the_app">"Convidar amigos"</string>
|
||||||
<string name="invitation_title">"Try this app for your Selfoss RSS feeds !"</string>
|
<string name="invitation_title">"Tente este aplicativo para seus Selfoss RSS feeds!"</string>
|
||||||
<string name="invitation_message">"I use this app for my Selfoss RSS feeds. You may like it too !"</string>
|
<string name="invitation_message">"Eu uso este app para meus Selfoss RSS feeds. Você pode gostar também!"</string>
|
||||||
<string name="invitation_cta">"Try the app"</string>
|
<string name="invitation_cta">"Tente o aplicativo"</string>
|
||||||
<string name="text_wrong_url">"You seem to be trying to use an invalid URL. Make sure it is correct, and if the problem persists, contact me (via the store contact link). Please note that the app needs you to be using Selfoss. You can't access RSS feeds without it."</string>
|
<string name="text_wrong_url">"Você parece estar tentando usar um URL inválido. Certifique-se de que está correto, e se o problema persistir, entre em contato comigo (através do link de contato da loja). Por favor, note que o aplicativo precisa que você esteja usando o Selfoss. Você não pode acessar feeds RSS sem ele."</string>
|
||||||
<string name="pref_general_internal_browser_title">"Open links inside the app"</string>
|
<string name="pref_general_internal_browser_title">"Abrir links dentro do app"</string>
|
||||||
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
|
<string name="pref_general_internal_browser_on">"Artigos serão aberto dentro do aplicativo"</string>
|
||||||
<string name="pref_general_internal_browser_off">"Articles will open with your default browser"</string>
|
<string name="pref_general_internal_browser_off">"Artigos serão aberto com o seu navegador padrão"</string>
|
||||||
<string name="prefer_article_viewer_title">"Use the article viewer"</string>
|
<string name="prefer_article_viewer_title">"Use o Visualizador de artigo"</string>
|
||||||
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
|
<string name="prefer_article_viewer_on">"Vai usar o Visualizador de artigo em vez do navegador interno"</string>
|
||||||
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
|
<string name="prefer_article_viewer_off">"Vai usar o navegador interno em vez do Visualizador de artigo"</string>
|
||||||
<string name="pref_general_category_links">"Link handling"</string>
|
<string name="pref_general_category_links">"Manipulação de ligações"</string>
|
||||||
<string name="pref_general_category_displaying">"Displaying"</string>
|
<string name="pref_general_category_displaying">"Mostrando"</string>
|
||||||
<string name="pref_general_category_actions">"Actions"</string>
|
<string name="pref_general_category_actions">"Ações"</string>
|
||||||
<string name="pref_switch_card_view_on">"The articles will be displayed as cards"</string>
|
<string name="pref_switch_card_view_on">"Os artigos serão exibidos como cartões"</string>
|
||||||
<string name="pref_switch_card_view_off">"The articles will be displayed as a list"</string>
|
<string name="pref_switch_card_view_off">"Os artigos serão exibidos como lista"</string>
|
||||||
<string name="pref_switch_actions_tap_on">"Displays the action bar under the article"</string>
|
<string name="pref_switch_actions_tap_on">"Exibe a barra de ação sob o artigo"</string>
|
||||||
<string name="pref_switch_actions_tap_off">"When selecting an article it will open in your selected browser"</string>
|
<string name="pref_switch_actions_tap_off">"Ao selecionar um artigo, ele será aberto no seu navegador selecionado"</string>
|
||||||
<string name="menu_home_refresh">"Update remote"</string>
|
<string name="menu_home_refresh">"Atualização remota"</string>
|
||||||
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
|
<string name="refresh_success_response">"O remoto é atualizado, você agora pode recarregar a lista de artigos"</string>
|
||||||
<string name="refresh_failer_message">"The update didn't work, try again later, or check your selfoss logs."</string>
|
<string name="refresh_failer_message">"A atualização não funcionar, tente novamente mais tarde ou verifique seus logs de selfoss."</string>
|
||||||
<string name="refresh_in_progress">"Refresh in progress"</string>
|
<string name="refresh_in_progress">"Atualização em curso"</string>
|
||||||
<string name="new_apk_available_title">"A new APK is available."</string>
|
<string name="new_apk_available_title">"Está disponível um novo APK."</string>
|
||||||
<string name="new_apk_available_message">"A new APK is available to download on the official repository."</string>
|
<string name="new_apk_available_message">"Um APK novo está disponível para download no repositório oficial."</string>
|
||||||
<string name="new_apk_available_get">"Download now"</string>
|
<string name="new_apk_available_get">"Fazer download agora"</string>
|
||||||
<string name="new_apk_available_no">"Ignore version"</string>
|
<string name="new_apk_available_no">"Ignorar esta versão"</string>
|
||||||
<string name="intro_hello_title">"Hi there !"</string>
|
<string name="intro_hello_title">"Olá ai!"</string>
|
||||||
<string name="intro_hello_message">"Thanks for downloading the app !"</string>
|
<string name="intro_hello_message">"Obrigado por baixar o aplicativo!"</string>
|
||||||
<string name="intro_needs_selfoss_title">"Before you start…"</string>
|
<string name="intro_needs_selfoss_title">"Antes de começar…"</string>
|
||||||
<string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string>
|
<string name="intro_needs_selfoss_message">"Você não pode usar o app sem uma instância de Selfoss."</string>
|
||||||
<string name="intro_needs_selfoss_link">"What is Selfoss ?"</string>
|
<string name="intro_needs_selfoss_link">"O que é Selfoss?"</string>
|
||||||
<string name="intro_all_set_title">"All set !"</string>
|
<string name="intro_all_set_title">"Tudo configurado!"</string>
|
||||||
<string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string>
|
<string name="intro_all_set_message">"Você está pronto para usar o app. não se esqueça de ir para a página de configurações para configurar o seu aplicativo, e onde você encontrará alguns links úteis."</string>
|
||||||
<string name="card_height_title">Full height cards</string>
|
<string name="card_height_title">Cartões de altura total</string>
|
||||||
<string name="card_height_on">Cards height will adjust to its content</string>
|
<string name="card_height_on">Altura de cartas irá ajustar ao seu conteúdo</string>
|
||||||
<string name="card_height_off">Card height will be fixed</string>
|
<string name="card_height_off">Altura do cartão será corrigida</string>
|
||||||
<string name="source_code">Source code</string>
|
<string name="source_code">Código fonte</string>
|
||||||
<string name="cant_mark_read">Can\'t mark article as read</string>
|
<string name="cant_mark_read">Não pode marcar o artigo como lido</string>
|
||||||
<string name="drawer_error_loading_tags">Error loading tags…</string>
|
<string name="drawer_error_loading_tags">Erro ao carregar etiquetas…</string>
|
||||||
<string name="drawer_error_loading_sources">Error loading sources…</string>
|
<string name="drawer_error_loading_sources">Erro ao carregar fontes…</string>
|
||||||
<string name="drawer_item_filters">Filters</string>
|
<string name="drawer_item_filters">Filtros</string>
|
||||||
<string name="drawer_action_clear">clear</string>
|
<string name="drawer_action_clear">limpar</string>
|
||||||
<string name="drawer_item_tags">Tags</string>
|
<string name="drawer_item_tags">Etiquetas</string>
|
||||||
<string name="drawer_item_sources">Sources</string>
|
<string name="drawer_item_sources">Fontes</string>
|
||||||
<string name="drawer_action_edit">edit</string>
|
<string name="drawer_action_edit">editar</string>
|
||||||
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string>
|
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Não armazenar em cache dados sua gaveta</string>
|
||||||
<string name="no_tags_loaded">No tags loaded</string>
|
<string name="no_tags_loaded">Não tags carregado</string>
|
||||||
<string name="no_sources_loaded">No sources loaded</string>
|
<string name="no_sources_loaded">Não há fontes carregadas</string>
|
||||||
<string name="drawer_loading">Loading …</string>
|
<string name="drawer_loading">A carregar…</string>
|
||||||
<string name="menu_home_search">Search</string>
|
<string name="menu_home_search">Buscar</string>
|
||||||
<string name="can_delete_source">Can\'t delete the source…</string>
|
<string name="can_delete_source">Não é possível excluir a fonte…</string>
|
||||||
<string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string>
|
<string name="base_url_error">Houve um problema ao tentar se comunicar com sua instância de Selfoss. Se o problema persistir, por favor entre em contato comigo.</string>
|
||||||
<string name="pref_header_theme">Themes</string>
|
<string name="pref_header_theme">Temas</string>
|
||||||
<string name="default_theme">Default</string>
|
<string name="default_theme">Predefinição</string>
|
||||||
<string name="teal_orange_theme">Teal/Orange/Light</string>
|
<string name="teal_orange_theme">Verde-azulado/laranja/Luz</string>
|
||||||
<string name="cyan_pink_theme">Cyan/Pink/Light</string>
|
<string name="cyan_pink_theme">Ciano/rosa/luz</string>
|
||||||
<string name="grey_orange_theme">Grey/Orange/Light</string>
|
<string name="grey_orange_theme">Cinza/laranja/luz</string>
|
||||||
<string name="blue_amber_theme">Blue/Amber/Light</string>
|
<string name="blue_amber_theme">Azul/âmbar/luz</string>
|
||||||
<string name="indigo_pink_theme">Indigo/Pink/Light</string>
|
<string name="indigo_pink_theme">Índigo/rosa/luz</string>
|
||||||
<string name="red_teal_theme">Red/Teal/Light</string>
|
<string name="red_teal_theme">Vermelha/verde-azulado/Luz</string>
|
||||||
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string>
|
<string name="teal_orange_dark_theme">Verde-azulado/laranja/escuro</string>
|
||||||
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string>
|
<string name="cyan_pink_dark_theme">Ciano/rosa/escura</string>
|
||||||
<string name="default_dark_theme">Default/Dark</string>
|
<string name="default_dark_theme">Padrão/escuro</string>
|
||||||
<string name="grey_orange_dark_theme">Grey/Orange/Dark</string>
|
<string name="grey_orange_dark_theme">Cinza/laranja/Escuro</string>
|
||||||
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
<string name="blue_amber_dark_theme">Azul/âmbar/escuro</string>
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
<string name="indigo_pink_dark_theme">Índigo/rosa/escura</string>
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
<string name="red_teal_dark_theme">Verde-azulado/vermelho/escuro</string>
|
||||||
<string name="pref_header_debug">Debug</string>
|
<string name="pref_header_debug">Depurar</string>
|
||||||
<string name="login_debug_title">Activate to log login errors</string>
|
<string name="login_debug_title">Ativar para registrar erros de logon</string>
|
||||||
<string name="login_debug_on">Any error on the login page will be logged</string>
|
<string name="login_debug_on">Qualquer erro na página de login será registrado</string>
|
||||||
<string name="login_debug_off">No log on the login page</string>
|
<string name="login_debug_off">Não há registro na página de login</string>
|
||||||
<string name="login_menu_debug">Debug</string>
|
<string name="login_menu_debug">Depurar</string>
|
||||||
<string name="self_hosted_cert_switch">Using a self hosted certificate ?</string>
|
<string name="self_hosted_cert_switch">Usando um certificado hospedado?</string>
|
||||||
<string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string>
|
<string name="self_signed_cert_warning">Devido a razões de segurança, auto certificados auto-assinados não são suportados por padrão. Ao activar isto, eu não vou ser responsável de qualquer problema de segurança que você encontrar.</string>
|
||||||
<string name="pref_selfoss_category">Selfoss Api</string>
|
<string name="pref_selfoss_category">Api de Selfoss</string>
|
||||||
<string name="pref_api_items_number_title">Loaded items number</string>
|
<string name="pref_api_items_number_title">Número de itens carregados</string>
|
||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">Leia artigos aparecem como não lidas?</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">Sem log quando marcar um item como lido</string>
|
||||||
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
<string name="read_debug_on">Chamadas de Api serão registradas quando marcar um artigo como lido</string>
|
||||||
<string name="summary_debug_identifier">Debug identifier</string>
|
<string name="summary_debug_identifier">Depurar o identificador</string>
|
||||||
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
<string name="unique_id_to_clipboard">Identificador de copiados para a área de transferência</string>
|
||||||
<string name="display_header_drawer_summary">Display a header with the selfoss instance url on the lateral drawer.</string>
|
<string name="display_header_drawer_summary">Exibir um cabeçalho com o url de instância de selfoss na gaveta lateral.</string>
|
||||||
<string name="display_header_drawer_title">Account header</string>
|
<string name="display_header_drawer_title">Cabeçalho de conta</string>
|
||||||
<string name="login_everything_title">Logging every api calls</string>
|
<string name="login_everything_title">Logando todas as chamadas api</string>
|
||||||
<string name="login_everything_on">This will log every api call for debug purpose.</string>
|
<string name="login_everything_on">Isto irá registrar todas as chamadas de api para fins de depuração.</string>
|
||||||
<string name="login_everything_off">No api call will be logged</string>
|
<string name="login_everything_off">Nenhuma chamada de api será registrada</string>
|
||||||
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Carregar mais artigos no pergaminho</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Tradução</string>
|
||||||
<string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string>
|
<string name="cant_open_invalid_url">A url do item é inválido. Eu estou olhando para resolver esta questão, para que o app não vai falhar.</string>
|
||||||
<string name="drawer_report_bug">Report a bug</string>
|
<string name="drawer_report_bug">Reportar falha</string>
|
||||||
<string name="items_number_should_be_number">The items number should be an integer.</string>
|
<string name="items_number_should_be_number">O número de itens deve ser um número inteiro.</string>
|
||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Ler mais</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Abrir no browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Compartilhar</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Artigos de marca como lida quando passar entre artigos.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Daha fazlasını görüntüle</string>
|
<string name="reader_action_more">Daha fazlasını görüntüle</string>
|
||||||
<string name="reader_action_open">Tarayıcıda aç</string>
|
<string name="reader_action_open">Tarayıcıda aç</string>
|
||||||
<string name="reader_action_share">Paylaş</string>
|
<string name="reader_action_share">Paylaş</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">阅读更多</string>
|
<string name="reader_action_more">阅读更多</string>
|
||||||
<string name="reader_action_open">在浏览器中打开</string>
|
<string name="reader_action_open">在浏览器中打开</string>
|
||||||
<string name="reader_action_share">分享</string>
|
<string name="reader_action_share">分享</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">切换文章时将文章标记为已读。</string>
|
||||||
|
<string name="add_to_favs_reader">添加到收藏</string>
|
||||||
|
<string name="remove_to_favs_reader">从收藏中移除</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -158,4 +158,13 @@
|
|||||||
<string name="reader_action_more">阅读更多</string>
|
<string name="reader_action_more">阅读更多</string>
|
||||||
<string name="reader_action_open">在浏览器中打开</string>
|
<string name="reader_action_open">在浏览器中打开</string>
|
||||||
<string name="reader_action_share">分享</string>
|
<string name="reader_action_share">分享</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -11,4 +11,13 @@
|
|||||||
<color name="refresh_progress_2">@color/colorAccent</color>
|
<color name="refresh_progress_2">@color/colorAccent</color>
|
||||||
<color name="refresh_progress_3">@color/pink</color>
|
<color name="refresh_progress_3">@color/pink</color>
|
||||||
<color name="background_grey">#FFe4e4e4</color>
|
<color name="background_grey">#FFe4e4e4</color>
|
||||||
|
|
||||||
|
<color name="dark_webview">#FF303030</color>
|
||||||
|
<color name="dark_webview_text">@color/md_white_1000</color>
|
||||||
|
<color name="light_webview">@color/md_grey_50</color>
|
||||||
|
<color name="light_webview_text">@color/md_grey_900</color>
|
||||||
|
|
||||||
|
<color name="cardBackgroundColor">#FFFFFFFF</color>
|
||||||
|
<color name="materialDrawerHeaderSelectionText">@color/md_grey_900</color>
|
||||||
|
<color name="darkBackground">#FF303030</color>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -161,4 +161,13 @@
|
|||||||
<string name="reader_action_more">Read more</string>
|
<string name="reader_action_more">Read more</string>
|
||||||
<string name="reader_action_open">Open in browser</string>
|
<string name="reader_action_open">Open in browser</string>
|
||||||
<string name="reader_action_share">Share</string>
|
<string name="reader_action_share">Share</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_on">Mark articles as read when swiping between articles.</string>
|
||||||
|
<string name="add_to_favs_reader">Add to favorites</string>
|
||||||
|
<string name="remove_to_favs_reader">Remove from favorites</string>
|
||||||
|
<string name="pref_content_reader_font_size">Article reader content font size</string>
|
||||||
|
<string name="pref_header_viewer">Article viewer</string>
|
||||||
|
<string name="refresh_dialog_message">This will refresh your Selfoss instance.</string>
|
||||||
|
<string name="markall_dialog_message">This will mark all the items as read.</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll">Mark as read on swipe</string>
|
||||||
|
<string name="pref_switch_actions_pager_scroll_off">Don\'t mark articles as read when swiping.</string>
|
||||||
</resources>
|
</resources>
|
@ -43,182 +43,6 @@
|
|||||||
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>-->
|
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>-->
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
<style name="NoBarBlueAmber" parent="MaterialDrawerTheme.Light">
|
|
||||||
<item name="colorPrimary">@color/md_blue_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_blue_700</item>
|
|
||||||
<item name="colorAccent">@color/md_amber_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_amber_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/white</item>
|
|
||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarBlueAmberDark" parent="MaterialDrawerTheme">
|
|
||||||
<item name="colorPrimary">@color/md_blue_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_blue_700</item>
|
|
||||||
<item name="colorAccent">@color/md_amber_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_amber_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/md_grey_800</item>
|
|
||||||
<item name="android:colorBackground">#303030</item>
|
|
||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarGreyOrange" parent="MaterialDrawerTheme.Light">
|
|
||||||
<item name="colorPrimary">@color/md_blue_grey_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_blue_grey_700</item>
|
|
||||||
<item name="colorAccent">@color/md_deep_orange_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_deep_orange_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/white</item>
|
|
||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarGreyOrangeDark" parent="MaterialDrawerTheme">
|
|
||||||
<item name="colorPrimary">@color/md_blue_grey_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_blue_grey_700</item>
|
|
||||||
<item name="colorAccent">@color/md_deep_orange_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_deep_orange_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/md_grey_800</item>
|
|
||||||
<item name="android:colorBackground">#303030</item>
|
|
||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarIndigoPink" parent="MaterialDrawerTheme.Light">
|
|
||||||
<item name="colorPrimary">@color/md_indigo_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_indigo_700</item>
|
|
||||||
<item name="colorAccent">@color/md_pink_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_pink_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/white</item>
|
|
||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarIndigoPinkDark" parent="MaterialDrawerTheme">
|
|
||||||
<item name="colorPrimary">@color/md_indigo_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_indigo_700</item>
|
|
||||||
<item name="colorAccent">@color/md_pink_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_pink_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/md_grey_800</item>
|
|
||||||
<item name="android:colorBackground">#303030</item>
|
|
||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarRedTeal" parent="MaterialDrawerTheme.Light">
|
|
||||||
<item name="colorPrimary">@color/md_red_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_red_700</item>
|
|
||||||
<item name="colorAccent">@color/md_teal_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_teal_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/white</item>
|
|
||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarRedTealDark" parent="MaterialDrawerTheme">
|
|
||||||
<item name="colorPrimary">@color/md_red_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_red_700</item>
|
|
||||||
<item name="colorAccent">@color/md_teal_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_teal_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/md_grey_800</item>
|
|
||||||
<item name="android:colorBackground">#303030</item>
|
|
||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarCyanPink" parent="MaterialDrawerTheme.Light">
|
|
||||||
<item name="colorPrimary">@color/md_cyan_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_cyan_700</item>
|
|
||||||
<item name="colorAccent">@color/md_pink_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_pink_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/white</item>
|
|
||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarCyanPinkDark" parent="MaterialDrawerTheme">
|
|
||||||
<item name="colorPrimary">@color/md_cyan_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_cyan_700</item>
|
|
||||||
<item name="colorAccent">@color/md_pink_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_pink_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/md_grey_800</item>
|
|
||||||
<item name="android:colorBackground">#303030</item>
|
|
||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
<style name="NoBarTealOrange" parent="MaterialDrawerTheme.Light">
|
|
||||||
<item name="colorPrimary">@color/md_teal_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_teal_700</item>
|
|
||||||
<item name="colorAccent">@color/md_orange_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_orange_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/white</item>
|
|
||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="NoBarTealOrangeDark" parent="MaterialDrawerTheme">
|
|
||||||
<item name="colorPrimary">@color/md_teal_500</item>
|
|
||||||
<item name="colorPrimaryDark">@color/md_teal_700</item>
|
|
||||||
<item name="colorAccent">@color/md_orange_500</item>
|
|
||||||
<item name="colorAccentDark">@color/md_orange_700</item>
|
|
||||||
<item name="cardBackgroundColor">@color/md_grey_800</item>
|
|
||||||
<item name="android:colorBackground">#303030</item>
|
|
||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
|
||||||
|
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="Theme.App.Light" parent="Theme.IssueReporter.Light.DarkActionBar">
|
<style name="Theme.App.Light" parent="Theme.IssueReporter.Light.DarkActionBar">
|
||||||
<item name="colorPrimary">@color/colorPrimary</item>
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||||
|
@ -1,11 +1,5 @@
|
|||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<!--<SwitchPreference
|
|
||||||
android:defaultValue="false"
|
|
||||||
android:key="preferred_browser"
|
|
||||||
android:summary="@string/pref_switch_browser"
|
|
||||||
android:title="@string/pref_switch_browser_title"/>-->
|
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/pref_selfoss_category">
|
android:title="@string/pref_selfoss_category">
|
||||||
|
|
||||||
@ -39,6 +33,7 @@
|
|||||||
android:summaryOff="@string/prefer_article_viewer_off"
|
android:summaryOff="@string/prefer_article_viewer_off"
|
||||||
android:summaryOn="@string/prefer_article_viewer_on"
|
android:summaryOn="@string/prefer_article_viewer_on"
|
||||||
android:title="@string/prefer_article_viewer_title" />
|
android:title="@string/prefer_article_viewer_title" />
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/pref_general_category_displaying">
|
android:title="@string/pref_general_category_displaying">
|
||||||
|
|
||||||
|
@ -5,13 +5,19 @@
|
|||||||
android:icon="@drawable/ic_settings_black_24dp"
|
android:icon="@drawable/ic_settings_black_24dp"
|
||||||
android:title="@string/pref_header_general"/>
|
android:title="@string/pref_header_general"/>
|
||||||
|
|
||||||
|
|
||||||
|
<header
|
||||||
|
android:fragment="apps.amine.bou.readerforselfoss.settings.SettingsActivity$ArticleViewerPreferenceFragment"
|
||||||
|
android:icon="@drawable/ic_chrome_reader_mode_black_24"
|
||||||
|
android:title="@string/pref_header_viewer"/>
|
||||||
|
|
||||||
<header
|
<header
|
||||||
android:fragment="apps.amine.bou.readerforselfoss.settings.SettingsActivity$DebugPreferenceFragment"
|
android:fragment="apps.amine.bou.readerforselfoss.settings.SettingsActivity$DebugPreferenceFragment"
|
||||||
android:icon="@drawable/ic_bug_report"
|
android:icon="@drawable/ic_bug_report"
|
||||||
android:title="@string/pref_header_debug"/>
|
android:title="@string/pref_header_debug"/>
|
||||||
|
|
||||||
<header
|
<header
|
||||||
android:id="@+id/theme_change"
|
android:fragment="apps.amine.bou.readerforselfoss.settings.SettingsActivity$ThemePreferenceFragment"
|
||||||
android:icon="@drawable/ic_color_lens_black_24dp"
|
android:icon="@drawable/ic_color_lens_black_24dp"
|
||||||
android:title="@string/pref_header_theme"/>
|
android:title="@string/pref_header_theme"/>
|
||||||
|
|
||||||
|
29
app/src/main/res/xml/pref_theme.xml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<!-- TODO translate this file -->
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="dark_theme"
|
||||||
|
android:title="Dark theme" />
|
||||||
|
|
||||||
|
<com.jrummyapps.android.colorpicker.ColorPreference
|
||||||
|
android:defaultValue="@color/colorPrimary"
|
||||||
|
android:key="color_primary"
|
||||||
|
android:title="Primary color"/>
|
||||||
|
|
||||||
|
<com.jrummyapps.android.colorpicker.ColorPreference
|
||||||
|
android:defaultValue="@color/colorPrimaryDark"
|
||||||
|
android:key="color_primary_dark"
|
||||||
|
android:title="Primary dark color"/>
|
||||||
|
|
||||||
|
<com.jrummyapps.android.colorpicker.ColorPreference
|
||||||
|
android:defaultValue="@color/colorAccent"
|
||||||
|
android:key="color_accent"
|
||||||
|
android:title="Accent color"/>
|
||||||
|
|
||||||
|
<com.jrummyapps.android.colorpicker.ColorPreference
|
||||||
|
android:defaultValue="@color/colorAccentDark"
|
||||||
|
android:key="color_accent_dark"
|
||||||
|
android:title="Accent dark color"/>
|
||||||
|
</PreferenceScreen>
|
16
app/src/main/res/xml/pref_viewer.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="mark_on_scroll"
|
||||||
|
android:summaryOff="@string/pref_switch_actions_pager_scroll_off"
|
||||||
|
android:summaryOn="@string/pref_switch_actions_pager_scroll_on"
|
||||||
|
android:title="@string/pref_switch_actions_pager_scroll" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:defaultValue="14"
|
||||||
|
android:inputType="number"
|
||||||
|
android:key="reader_font_size"
|
||||||
|
android:selectAllOnFocus="true"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:title="@string/pref_content_reader_font_size" />
|
||||||
|
</PreferenceScreen>
|
11
build.gradle
@ -1,7 +1,7 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.1.60'
|
ext.kotlin_version = '1.2.31'
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
google()
|
google()
|
||||||
@ -10,15 +10,12 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.0.1'
|
classpath 'com.android.tools.build:gradle:3.1.1'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
classpath 'com.google.gms:google-services:3.1.1'
|
classpath 'com.google.gms:google-services:3.1.1'
|
||||||
|
|
||||||
// Not the official version https://stackoverflow.com/questions/46525040/sonarqube-android-not-working-for-gradle-3-0-0/46813528#46813528
|
|
||||||
classpath "com.github.Shusshu:sonar-scanner-gradle:feature~support-android-gradle-3-SNAPSHOT"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,9 +38,9 @@ project.ext.preDexLibs = !project.hasProperty('disablePreDex')
|
|||||||
|
|
||||||
subprojects {
|
subprojects {
|
||||||
project.plugins.whenPluginAdded { plugin ->
|
project.plugins.whenPluginAdded { plugin ->
|
||||||
if ("com.android.build.gradle.AppPlugin".equals(plugin.class.name)) {
|
if ("com.android.build.gradle.AppPlugin" == plugin.class.name) {
|
||||||
project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs
|
project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs
|
||||||
} else if ("com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)) {
|
} else if ("com.android.build.gradle.LibraryPlugin" == plugin.class.name) {
|
||||||
project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs
|
project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
docs/_config.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
theme: jekyll-theme-cayman
|
||||||
|
plugins:
|
||||||
|
- jekyll-redirect-from
|
BIN
docs/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
docs/images/icon.png
Normal file
After Width: | Height: | Size: 294 KiB |
95
docs/index.html
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
---
|
||||||
|
redirect_from: "/ReaderforSelfoss/"
|
||||||
|
---
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Reader for Selfoss</title>
|
||||||
|
<meta name="description" content="A Selfoss RSS Reader">
|
||||||
|
<meta name="keywords" content="rss,feed,reader,android,free,app,play,store,selfoss,download,opensource,code,kotlin">
|
||||||
|
<meta name="author" content="Amine Bouabdallaoui">
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
|
||||||
|
<link rel="icon" href="images/favicon.ico" type="image/x-icon">
|
||||||
|
<style type="text/css">
|
||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
#main {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: #00bfa5;
|
||||||
|
color: #ffffff;
|
||||||
|
text-align: center;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
#container {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
#logo {
|
||||||
|
height: 100px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
#links {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
#store img {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
#links iframe {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script async defer src="https://buttons.github.io/buttons.js"></script>
|
||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||||
|
|
||||||
|
ga('create', 'UA-102547516-1', 'auto');
|
||||||
|
ga('send', 'pageview');
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||||||
|
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||||||
|
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||||||
|
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||||||
|
})(window,document,'script','dataLayer','GTM-5R5LR4V');</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body id="main">
|
||||||
|
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5R5LR4V"
|
||||||
|
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
||||||
|
|
||||||
|
<div id="container" itemscope itemtype="http://schema.org/SoftwareApplication">
|
||||||
|
<div id="titles"><h1 itemprop="name">Reader For Selfoss</h1><h2>A new <span itemprop="operatingSystem">Android</span> Selfoss RSS reader</h2></div>
|
||||||
|
<div>
|
||||||
|
<img src="images/icon.png" id="logo" itemprop="image">
|
||||||
|
</div>
|
||||||
|
<div id="links">
|
||||||
|
<a itemprop="downloadUrl" id="store" href='https://play.google.com/store/apps/details?id=apps.amine.bou.readerforselfoss&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png'/></a>
|
||||||
|
|
||||||
|
|
||||||
|
<a class="github-button" href="https://github.com/aminecmi/readerforselfoss" data-size="large" aria-label="Star aminecmi/readerforselfoss on GitHub">Star</a>
|
||||||
|
</div>
|
||||||
|
<meta itemprop="url" content="https://github.com/aminecmi/readerforselfoss">
|
||||||
|
<meta itemprop="applicationCategory" content="News & Magazines">
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -15,3 +15,5 @@ org.gradle.jvmargs=-Xmx1536m
|
|||||||
# This option should only be used with decoupled projects. More details, visit
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
# org.gradle.parallel=true
|
# org.gradle.parallel=true
|
||||||
|
org.gradle.caching=true
|
||||||
|
android.enableD8=true
|