Compare commits
58 Commits
Author | SHA1 | Date | |
---|---|---|---|
080d52893e | |||
b02334a8d4 | |||
27118add22 | |||
2a6f98a1e8 | |||
1f67f2fdee | |||
ebf4d294a8 | |||
4a4dbacc95 | |||
687839b5f8 | |||
8fb339034f | |||
8e9fd9c985 | |||
72400f71c0 | |||
1151587951 | |||
abcd500045 | |||
beda24e736 | |||
37b2c5c2df | |||
7b5246ebf1 | |||
d6d5e72f48 | |||
fa8e88d489 | |||
1ef2da9f76 | |||
1ebd894be7 | |||
a9c493d105 | |||
f833d73fab | |||
9e6602f114 | |||
3bdfef9f8b | |||
6f7f475a6b | |||
8fc5fab67b | |||
6927e92396 | |||
c7470396d7 | |||
f21570e2e4 | |||
51f406e20c | |||
9e3fde744e | |||
ccf406ae68 | |||
bc78d1e079 | |||
d151eb261e | |||
0856598cd9 | |||
f0563efc62 | |||
84dfa9a8a5 | |||
8e25489cca | |||
198f95e1ca | |||
7e02fe89ea | |||
819356412c | |||
deb789bc1b | |||
133ba74548 | |||
1461e32643 | |||
f400c3d9ac | |||
7e595a4f74 | |||
18c9c499b2 | |||
24ae115ed4 | |||
7f345558cd | |||
57177cc910 | |||
cea258bc21 | |||
ed9b1c8ba7 | |||
5a79fd89e9 | |||
42a130db08 | |||
320a8d19de | |||
5721506007 | |||
803e8cb2f4 | |||
98492fd0c0 |
4
.github/CONTRIBUTING.md
vendored
@ -10,7 +10,7 @@ Please read the guidelines before contributing, and follow them (or try to) when
|
|||||||
|
|
||||||
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 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/labels/help%20wanted) 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)
|
||||||
|
|
||||||
### What I can't help you with.
|
### What I can't help you with.
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ Always check if the web version of your instance is working.
|
|||||||
* 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.
|
||||||
* Follow the used coding style [the official one](https://kotlinlang.org/docs/reference/coding-conventions.html) ([some idoms for reference](http://kotlinlang.org/docs/reference/idioms.html)) with more to come.
|
* Follow the used coding style [the android koding style](https://android.github.io/kotlin-guides/style.html) ([some idoms for reference](http://kotlinlang.org/docs/reference/idioms.html)) with more to come.
|
||||||
* Try as much as possible to write a test for your feature, and if you do so, run it, and make it work.
|
* Try as much as possible to write a test for your feature, and if you do so, run it, and make it work.
|
||||||
* Always check your changes and discard the ones that are irrelevant to your feature or bugfix.
|
* Always check your changes and discard the ones that are irrelevant to your feature or bugfix.
|
||||||
* Have meaningful commit messages.
|
* Have meaningful commit messages.
|
||||||
|
84
CHANGELOG.md
@ -1,3 +1,85 @@
|
|||||||
|
**1.5.4.16**
|
||||||
|
|
||||||
|
- Fixing list view displaying issues.
|
||||||
|
|
||||||
|
- Endless scroll is not in beta anymore.
|
||||||
|
|
||||||
|
**1.5.4.15**
|
||||||
|
|
||||||
|
- Fixed an issue with the sources list.
|
||||||
|
|
||||||
|
**1.5.4.14**
|
||||||
|
|
||||||
|
- Fixing infinite scroll trying to load more items when there are no more.
|
||||||
|
|
||||||
|
**1.5.4.13**
|
||||||
|
|
||||||
|
- Displaying the right number of items.
|
||||||
|
|
||||||
|
- Fixing infinite scroll remaining issues. Should be stable enough.
|
||||||
|
|
||||||
|
**1.5.4.12**
|
||||||
|
|
||||||
|
- Fixed fab and toolbar issue (#113)
|
||||||
|
|
||||||
|
- Fixed links clickable (#114)
|
||||||
|
|
||||||
|
- Changed the link colors in the article viewer
|
||||||
|
|
||||||
|
**1.5.4.11**
|
||||||
|
|
||||||
|
- Hiding FABs on scroll.
|
||||||
|
|
||||||
|
- Closing #109 (code cleaning)
|
||||||
|
|
||||||
|
- Hiding fabs on scroll (#101)
|
||||||
|
|
||||||
|
**1.5.4.10**
|
||||||
|
|
||||||
|
- Displaying a loader when "reading more" in the article viewer.
|
||||||
|
|
||||||
|
- Displaying the thumbnail instead of icon on the article viewer.
|
||||||
|
|
||||||
|
- Scrolling to top when loading content with the "read more" button.
|
||||||
|
|
||||||
|
**1.5.4.09**
|
||||||
|
|
||||||
|
- Using the kotlin wrapper for the material drawer (see #98 for more details).
|
||||||
|
|
||||||
|
- Updated support libraries
|
||||||
|
|
||||||
|
- Changed the Floating Action Button to the support library version.
|
||||||
|
|
||||||
|
- New reader activity action bar #103.
|
||||||
|
|
||||||
|
**1.5.4.08**
|
||||||
|
|
||||||
|
- Thanks @jrafaelsantana for translating the whole app in Brazilian Portuguese.
|
||||||
|
|
||||||
|
**1.5.4.07**
|
||||||
|
|
||||||
|
- Loading more items on swipe too.
|
||||||
|
|
||||||
|
- Fixed popup menu style. User may need to reselect the theme.
|
||||||
|
|
||||||
|
- Disabled reporting marking items as read if there isn't an issue.
|
||||||
|
|
||||||
|
**1.5.4.05/06**
|
||||||
|
|
||||||
|
- Translation fix.
|
||||||
|
|
||||||
|
**1.5.4.04**
|
||||||
|
|
||||||
|
- Fixing an issue with marking items as read (something related to an old version of selfoss).
|
||||||
|
|
||||||
|
**1.5.4.03**
|
||||||
|
|
||||||
|
- Trying to fix some issue with pre-launch reports. Reverted because it seems to be related to the dev console side.
|
||||||
|
|
||||||
|
**1.5.4.02**
|
||||||
|
|
||||||
|
- Fixing full height cards issue.
|
||||||
|
|
||||||
**1.5.4.01**
|
**1.5.4.01**
|
||||||
|
|
||||||
- Removed the "apk downloaded from outside of playstore" message.
|
- Removed the "apk downloaded from outside of playstore" message.
|
||||||
@ -327,4 +409,4 @@ _Updates_
|
|||||||
|
|
||||||
**1.3.3.4**
|
**1.3.3.4**
|
||||||
|
|
||||||
...
|
...
|
||||||
|
@ -22,3 +22,5 @@ Check the [Contribution guide](https://github.com/aminecmi/ReaderforSelfoss/blob
|
|||||||
- [Check what changed](https://github.com/aminecmi/ReaderforSelfoss/blob/master/CHANGELOG.md)
|
- [Check what changed](https://github.com/aminecmi/ReaderforSelfoss/blob/master/CHANGELOG.md)
|
||||||
- [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)
|
||||||
|
- [Ask for help](https://gitter.im/amine-bou/ReaderForSelfoss)
|
||||||
|
@ -31,6 +31,8 @@ apply plugin: 'io.fabric'
|
|||||||
|
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
maven {
|
maven {
|
||||||
url 'https://maven.fabric.io/public'
|
url 'https://maven.fabric.io/public'
|
||||||
@ -38,12 +40,12 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 26
|
compileSdkVersion 27
|
||||||
buildToolsVersion '26.0.2'
|
buildToolsVersion '27.0.0'
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "apps.amine.bou.readerforselfoss"
|
applicationId "apps.amine.bou.readerforselfoss"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 26
|
targetSdkVersion 27
|
||||||
versionCode versionCodeFromGit()
|
versionCode versionCodeFromGit()
|
||||||
versionName versionNameFromGit()
|
versionName versionNameFromGit()
|
||||||
|
|
||||||
@ -107,13 +109,13 @@ dependencies {
|
|||||||
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
||||||
|
|
||||||
// Android Support
|
// Android Support
|
||||||
compile 'com.android.support:appcompat-v7:26.1.0'
|
compile 'com.android.support:appcompat-v7:27.0.0'
|
||||||
compile 'com.android.support:design:26.1.0'
|
compile 'com.android.support:design:27.0.0'
|
||||||
compile 'com.android.support:recyclerview-v7:26.1.0'
|
compile 'com.android.support:recyclerview-v7:27.0.0'
|
||||||
compile 'com.android.support:support-v4:26.1.0'
|
compile 'com.android.support:support-v4:27.0.0'
|
||||||
compile 'com.android.support:support-vector-drawable:26.1.0'
|
compile 'com.android.support:support-vector-drawable:27.0.0'
|
||||||
compile 'com.android.support:customtabs:26.1.0'
|
compile 'com.android.support:customtabs:27.0.0'
|
||||||
compile 'com.android.support:cardview-v7:26.1.0'
|
compile 'com.android.support:cardview-v7:27.0.0'
|
||||||
compile 'com.android.support.constraint:constraint-layout:1.0.2'
|
compile 'com.android.support.constraint:constraint-layout:1.0.2'
|
||||||
|
|
||||||
// Firebase + crashlytics
|
// Firebase + crashlytics
|
||||||
@ -131,7 +133,7 @@ dependencies {
|
|||||||
compile 'agency.tango.android:material-intro-screen:0.0.5'
|
compile 'agency.tango.android:material-intro-screen:0.0.5'
|
||||||
|
|
||||||
// About
|
// About
|
||||||
compile('com.mikepenz:aboutlibraries:5.9.7@aar') {
|
compile('com.mikepenz:aboutlibraries:6.0.0@aar') {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +145,6 @@ dependencies {
|
|||||||
|
|
||||||
// Material-ish things
|
// Material-ish things
|
||||||
compile 'com.ashokvarma.android:bottom-navigation-bar:2.0.3'
|
compile 'com.ashokvarma.android:bottom-navigation-bar:2.0.3'
|
||||||
compile 'com.melnykov:floatingactionbutton:1.3.0'
|
|
||||||
compile 'com.github.jd-alexander:LikeButton:0.2.1'
|
compile 'com.github.jd-alexander:LikeButton:0.2.1'
|
||||||
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
|
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
|
||||||
compile 'org.sufficientlysecure:html-textview:3.5'
|
compile 'org.sufficientlysecure:html-textview:3.5'
|
||||||
@ -159,9 +160,7 @@ dependencies {
|
|||||||
compile 'com.klinkerapps:drag-dismiss-activity:1.5.0'
|
compile 'com.klinkerapps:drag-dismiss-activity:1.5.0'
|
||||||
|
|
||||||
// Drawer
|
// Drawer
|
||||||
compile('com.mikepenz:materialdrawer:5.9.5@aar') {
|
implementation 'co.zsmb:materialdrawer-kt:1.2.1'
|
||||||
transitive = true
|
|
||||||
}
|
|
||||||
compile 'com.anupcowkur:reservoir:3.1.0'
|
compile 'com.anupcowkur:reservoir:3.1.0'
|
||||||
|
|
||||||
// Themes
|
// Themes
|
||||||
@ -169,6 +168,8 @@ dependencies {
|
|||||||
|
|
||||||
// Github issues reporter
|
// Github issues reporter
|
||||||
compile 'com.heinrichreimersoftware:android-issue-reporter:1.3.1'
|
compile 'com.heinrichreimersoftware:android-issue-reporter:1.3.1'
|
||||||
|
|
||||||
|
compile 'com.github.rubensousa:floatingtoolbar:1.5.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
|
@ -32,18 +32,18 @@ class LoginActivityEspressoTest {
|
|||||||
@Rule @JvmField
|
@Rule @JvmField
|
||||||
val rule = ActivityTestRule(LoginActivity::class.java, true, false)
|
val rule = ActivityTestRule(LoginActivity::class.java, true, false)
|
||||||
|
|
||||||
lateinit var context: Context
|
private lateinit var context: Context
|
||||||
lateinit var url: String
|
private lateinit var url: String
|
||||||
lateinit var username: String
|
private lateinit var username: String
|
||||||
lateinit var password: String
|
private lateinit var password: String
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
context = InstrumentationRegistry.getInstrumentation().targetContext
|
context = InstrumentationRegistry.getInstrumentation().targetContext
|
||||||
val editor =
|
val editor =
|
||||||
context
|
context
|
||||||
.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
.edit()
|
.edit()
|
||||||
editor.clear()
|
editor.clear()
|
||||||
editor.commit()
|
editor.commit()
|
||||||
|
|
||||||
@ -77,12 +77,12 @@ class LoginActivityEspressoTest {
|
|||||||
fun wrongLoginUrl() {
|
fun wrongLoginUrl() {
|
||||||
rule.launchActivity(Intent())
|
rule.launchActivity(Intent())
|
||||||
|
|
||||||
onView(withId(R.id.login_progress))
|
onView(withId(R.id.loginProgress))
|
||||||
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
|
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
|
||||||
|
|
||||||
onView(withId(R.id.url)).perform(click()).perform(typeText("WRONGURL"))
|
onView(withId(R.id.urlView)).perform(click()).perform(typeText("WRONGURL"))
|
||||||
|
|
||||||
onView(withId(R.id.email_sign_in_button)).perform(click())
|
onView(withId(R.id.signInButton)).perform(click())
|
||||||
|
|
||||||
onView(withId(R.id.urlLayout)).check(matches(isHintOrErrorEnabled()))
|
onView(withId(R.id.urlLayout)).check(matches(isHintOrErrorEnabled()))
|
||||||
}
|
}
|
||||||
@ -94,24 +94,24 @@ class LoginActivityEspressoTest {
|
|||||||
|
|
||||||
rule.launchActivity(Intent())
|
rule.launchActivity(Intent())
|
||||||
|
|
||||||
onView(withId(R.id.url)).perform(click()).perform(typeText(url), closeSoftKeyboard())
|
onView(withId(R.id.urlView)).perform(click()).perform(typeText(url), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.withLogin)).perform(click())
|
onView(withId(R.id.withLogin)).perform(click())
|
||||||
|
|
||||||
onView(withId(R.id.email_sign_in_button)).perform(click())
|
onView(withId(R.id.signInButton)).perform(click())
|
||||||
|
|
||||||
onView(withId(R.id.loginLayout)).check(matches(isHintOrErrorEnabled()))
|
onView(withId(R.id.loginLayout)).check(matches(isHintOrErrorEnabled()))
|
||||||
onView(withId(R.id.passwordLayout)).check(matches(isHintOrErrorEnabled()))
|
onView(withId(R.id.passwordLayout)).check(matches(isHintOrErrorEnabled()))
|
||||||
|
|
||||||
onView(withId(R.id.login)).perform(click()).perform(typeText(username), closeSoftKeyboard())
|
onView(withId(R.id.loginView)).perform(click()).perform(typeText(username), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.passwordLayout)).check(matches(isHintOrErrorEnabled()))
|
onView(withId(R.id.passwordLayout)).check(matches(isHintOrErrorEnabled()))
|
||||||
|
|
||||||
onView(withId(R.id.email_sign_in_button)).perform(click())
|
onView(withId(R.id.signInButton)).perform(click())
|
||||||
|
|
||||||
onView(withId(R.id.passwordLayout)).check(
|
onView(withId(R.id.passwordLayout)).check(
|
||||||
matches(
|
matches(
|
||||||
isHintOrErrorEnabled())
|
isHintOrErrorEnabled())
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -121,15 +121,15 @@ class LoginActivityEspressoTest {
|
|||||||
|
|
||||||
rule.launchActivity(Intent())
|
rule.launchActivity(Intent())
|
||||||
|
|
||||||
onView(withId(R.id.url)).perform(click()).perform(typeText(url), closeSoftKeyboard())
|
onView(withId(R.id.urlView)).perform(click()).perform(typeText(url), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.withLogin)).perform(click())
|
onView(withId(R.id.withLogin)).perform(click())
|
||||||
|
|
||||||
onView(withId(R.id.login)).perform(click()).perform(typeText(username), closeSoftKeyboard())
|
onView(withId(R.id.loginView)).perform(click()).perform(typeText(username), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.password)).perform(click()).perform(typeText("WRONGPASS"), closeSoftKeyboard())
|
onView(withId(R.id.passwordView)).perform(click()).perform(typeText("WRONGPASS"), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.email_sign_in_button)).perform(click())
|
onView(withId(R.id.signInButton)).perform(click())
|
||||||
|
|
||||||
onView(withId(R.id.urlLayout)).check(matches(isHintOrErrorEnabled()))
|
onView(withId(R.id.urlLayout)).check(matches(isHintOrErrorEnabled()))
|
||||||
onView(withId(R.id.loginLayout)).check(matches(isHintOrErrorEnabled()))
|
onView(withId(R.id.loginLayout)).check(matches(isHintOrErrorEnabled()))
|
||||||
@ -142,15 +142,15 @@ class LoginActivityEspressoTest {
|
|||||||
|
|
||||||
rule.launchActivity(Intent())
|
rule.launchActivity(Intent())
|
||||||
|
|
||||||
onView(withId(R.id.url)).perform(click()).perform(typeText(url), closeSoftKeyboard())
|
onView(withId(R.id.urlView)).perform(click()).perform(typeText(url), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.withLogin)).perform(click())
|
onView(withId(R.id.withLogin)).perform(click())
|
||||||
|
|
||||||
onView(withId(R.id.login)).perform(click()).perform(typeText(username), closeSoftKeyboard())
|
onView(withId(R.id.loginView)).perform(click()).perform(typeText(username), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.password)).perform(click()).perform(typeText(password), closeSoftKeyboard())
|
onView(withId(R.id.passwordView)).perform(click()).perform(typeText(password), closeSoftKeyboard())
|
||||||
|
|
||||||
onView(withId(R.id.email_sign_in_button)).perform(click())
|
onView(withId(R.id.signInButton)).perform(click())
|
||||||
|
|
||||||
intended(hasComponent(HomeActivity::class.java.name))
|
intended(hasComponent(HomeActivity::class.java.name))
|
||||||
|
|
||||||
|
@ -65,8 +65,7 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name=".ReaderActivity"
|
android:name=".ReaderActivity">
|
||||||
android:theme="@style/DragDismissTheme">
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
|
@ -5,20 +5,24 @@ import android.os.Bundle
|
|||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.constraint.ConstraintLayout
|
import android.support.constraint.ConstraintLayout
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.support.v7.widget.Toolbar
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.*
|
import android.widget.AdapterView
|
||||||
|
import android.widget.ArrayAdapter
|
||||||
import retrofit2.Call
|
import android.widget.EditText
|
||||||
import retrofit2.Callback
|
import android.widget.ProgressBar
|
||||||
import retrofit2.Response
|
import android.widget.Spinner
|
||||||
|
import android.widget.TextView
|
||||||
|
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.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
|
||||||
|
import kotlinx.android.synthetic.main.activity_add_source.*
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.Callback
|
||||||
|
import retrofit2.Response
|
||||||
|
|
||||||
|
|
||||||
class AddSourceActivity : AppCompatActivity() {
|
class AddSourceActivity : AppCompatActivity() {
|
||||||
@ -29,40 +33,43 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
Scoop.getInstance().apply(this)
|
||||||
setContentView(R.layout.activity_add_source)
|
setContentView(R.layout.activity_add_source)
|
||||||
val toolbar: Toolbar = findViewById(R.id.toolbar)
|
|
||||||
setSupportActionBar(toolbar)
|
setSupportActionBar(toolbar)
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
supportActionBar?.setDisplayShowHomeEnabled(true)
|
supportActionBar?.setDisplayShowHomeEnabled(true)
|
||||||
|
|
||||||
val mProgress: ProgressBar = findViewById(R.id.progress)
|
|
||||||
val mForm: ConstraintLayout = findViewById(R.id.formContainer)
|
|
||||||
val mNameInput: EditText = findViewById(R.id.nameInput)
|
|
||||||
val mSourceUri: EditText = findViewById(R.id.sourceUri)
|
|
||||||
val mTags: EditText = findViewById(R.id.tags)
|
|
||||||
val mSpoutsSpinner: Spinner = findViewById(R.id.spoutsSpinner)
|
|
||||||
val mSaveBtn: Button = findViewById(R.id.saveBtn)
|
|
||||||
var api: SelfossApi? = null
|
var api: SelfossApi? = null
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
api = SelfossApi(this, this@AddSourceActivity, prefs.getBoolean("isSelfSignedCert", false), prefs.getBoolean("should_log_everything", false))
|
api = SelfossApi(
|
||||||
|
this,
|
||||||
|
this@AddSourceActivity,
|
||||||
|
prefs.getBoolean("isSelfSignedCert", false),
|
||||||
|
prefs.getBoolean("should_log_everything", false)
|
||||||
|
)
|
||||||
} catch (e: IllegalArgumentException) {
|
} catch (e: IllegalArgumentException) {
|
||||||
mustLoginToAddSource()
|
mustLoginToAddSource()
|
||||||
}
|
}
|
||||||
|
|
||||||
val intent = intent
|
maybeGetDetailsFromIntentSharing(intent, sourceUri, nameInput)
|
||||||
if (Intent.ACTION_SEND == intent.action && "text/plain" == intent.type) {
|
|
||||||
mSourceUri.setText(intent.getStringExtra(Intent.EXTRA_TEXT))
|
saveBtn.setOnClickListener {
|
||||||
mNameInput.setText(intent.getStringExtra(Intent.EXTRA_TITLE))
|
handleSaveSource(tags, nameInput.text.toString(), sourceUri.text.toString(), api!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
mSaveBtn.setOnClickListener {
|
val config = Config(this)
|
||||||
handleSaveSource(mTags, mNameInput.text.toString(), mSourceUri.text.toString(), api!!)
|
|
||||||
|
if (config.baseUrl.isEmpty() || !config.baseUrl.isBaseUrlValid()) {
|
||||||
|
mustLoginToAddSource()
|
||||||
|
} else {
|
||||||
|
handleSpoutsSpinner(spoutsSpinner, api, progress, formContainer)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleSpoutsSpinner(spoutsSpinner: Spinner, api: SelfossApi?, mProgress: ProgressBar, formContainer: ConstraintLayout) {
|
||||||
val spoutsKV = HashMap<String, String>()
|
val spoutsKV = HashMap<String, String>()
|
||||||
mSpoutsSpinner.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) {
|
||||||
val spoutName = (view as TextView).text.toString()
|
val spoutName = (view as TextView).text.toString()
|
||||||
mSpoutsValue = spoutsKV[spoutName]
|
mSpoutsValue = spoutsKV[spoutName]
|
||||||
@ -73,48 +80,48 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val config = Config(this)
|
var items: Map<String, Spout>
|
||||||
|
api!!.spouts().enqueue(object : Callback<Map<String, Spout>> {
|
||||||
|
override fun onResponse(call: Call<Map<String, Spout>>, response: Response<Map<String, Spout>>) {
|
||||||
|
if (response.body() != null) {
|
||||||
|
items = response.body()!!
|
||||||
|
|
||||||
if (config.baseUrl.isEmpty() || !config.baseUrl.isBaseUrlValid()) {
|
val itemsStrings = items.map { it.value.name }
|
||||||
mustLoginToAddSource()
|
for ((key, value) in items) {
|
||||||
} else {
|
spoutsKV.put(value.name, key)
|
||||||
|
|
||||||
var items: Map<String, Spout>
|
|
||||||
api!!.spouts().enqueue(object : Callback<Map<String, Spout>> {
|
|
||||||
override fun onResponse(call: Call<Map<String, Spout>>, response: Response<Map<String, Spout>>) {
|
|
||||||
if (response.body() != null) {
|
|
||||||
items = response.body()!!
|
|
||||||
|
|
||||||
val itemsStrings = items.map { it.value.name }
|
|
||||||
for ((key, value) in items) {
|
|
||||||
spoutsKV.put(value.name, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
mProgress.visibility = View.GONE
|
|
||||||
mForm.visibility = View.VISIBLE
|
|
||||||
|
|
||||||
val spinnerArrayAdapter =
|
|
||||||
ArrayAdapter(
|
|
||||||
this@AddSourceActivity,
|
|
||||||
android.R.layout.simple_spinner_item,
|
|
||||||
itemsStrings)
|
|
||||||
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
|
||||||
mSpoutsSpinner.adapter = spinnerArrayAdapter
|
|
||||||
|
|
||||||
} else {
|
|
||||||
handleProblemWithSpouts()
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(call: Call<Map<String, Spout>>, t: Throwable) {
|
mProgress.visibility = View.GONE
|
||||||
|
formContainer.visibility = View.VISIBLE
|
||||||
|
|
||||||
|
val spinnerArrayAdapter =
|
||||||
|
ArrayAdapter(
|
||||||
|
this@AddSourceActivity,
|
||||||
|
android.R.layout.simple_spinner_item,
|
||||||
|
itemsStrings)
|
||||||
|
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
||||||
|
spoutsSpinner.adapter = spinnerArrayAdapter
|
||||||
|
|
||||||
|
} else {
|
||||||
handleProblemWithSpouts()
|
handleProblemWithSpouts()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleProblemWithSpouts() {
|
override fun onFailure(call: Call<Map<String, Spout>>, t: Throwable) {
|
||||||
Toast.makeText(this@AddSourceActivity, R.string.cant_get_spouts, Toast.LENGTH_SHORT).show()
|
handleProblemWithSpouts()
|
||||||
mProgress.visibility = View.GONE
|
}
|
||||||
}
|
|
||||||
})
|
private fun handleProblemWithSpouts() {
|
||||||
|
Toast.makeText(this@AddSourceActivity, R.string.cant_get_spouts, Toast.LENGTH_SHORT).show()
|
||||||
|
mProgress.visibility = View.GONE
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun maybeGetDetailsFromIntentSharing(intent: Intent, sourceUri: EditText, nameInput: EditText) {
|
||||||
|
if (Intent.ACTION_SEND == intent.action && "text/plain" == intent.type) {
|
||||||
|
sourceUri.setText(intent.getStringExtra(Intent.EXTRA_TEXT))
|
||||||
|
nameInput.setText(intent.getStringExtra(Intent.EXTRA_TITLE))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,17 +132,19 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleSaveSource(mTags: EditText, title: String, url: String, api: SelfossApi) {
|
private fun handleSaveSource(tags: EditText, title: String, url: String, api: SelfossApi) {
|
||||||
|
|
||||||
if (title.isEmpty() || url.isEmpty() || mSpoutsValue == null || mSpoutsValue!!.isEmpty()) {
|
val sourceDetailsAvailable = title.isEmpty() || url.isEmpty() || mSpoutsValue == null || mSpoutsValue!!.isEmpty()
|
||||||
|
|
||||||
|
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()
|
||||||
} else {
|
} else {
|
||||||
api.createSource(
|
api.createSource(
|
||||||
title,
|
title,
|
||||||
url,
|
url,
|
||||||
mSpoutsValue!!,
|
mSpoutsValue!!,
|
||||||
mTags.text.toString(),
|
tags.text.toString(),
|
||||||
""
|
""
|
||||||
).enqueue(object : Callback<SuccessResponse> {
|
).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
||||||
if (response.body() != null && response.body()!!.isSuccess) {
|
if (response.body() != null && response.body()!!.isSuccess) {
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
package apps.amine.bou.readerforselfoss
|
package apps.amine.bou.readerforselfoss
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.preference.PreferenceManager
|
|
||||||
import android.view.View
|
|
||||||
|
|
||||||
import agency.tango.materialintroscreen.MaterialIntroActivity
|
import agency.tango.materialintroscreen.MaterialIntroActivity
|
||||||
import agency.tango.materialintroscreen.MessageButtonBehaviour
|
import agency.tango.materialintroscreen.MessageButtonBehaviour
|
||||||
import agency.tango.materialintroscreen.SlideFragmentBuilder
|
import agency.tango.materialintroscreen.SlideFragmentBuilder
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.preference.PreferenceManager
|
||||||
import android.support.v7.app.AppCompatDelegate
|
import android.support.v7.app.AppCompatDelegate
|
||||||
|
import android.view.View
|
||||||
|
|
||||||
|
|
||||||
class IntroActivity : MaterialIntroActivity() {
|
class IntroActivity : MaterialIntroActivity() {
|
||||||
|
@ -6,7 +6,6 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.support.design.widget.TextInputLayout
|
|
||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.support.v7.widget.Toolbar
|
import android.support.v7.widget.Toolbar
|
||||||
@ -15,7 +14,8 @@ import android.view.Menu
|
|||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.widget.*
|
import android.widget.TextView
|
||||||
|
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.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
@ -28,6 +28,8 @@ import com.mikepenz.aboutlibraries.LibsBuilder
|
|||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
|
import kotlinx.android.synthetic.main.activity_login.*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class LoginActivity : AppCompatActivity() {
|
class LoginActivity : AppCompatActivity() {
|
||||||
@ -39,14 +41,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private lateinit var settings: SharedPreferences
|
private lateinit var settings: SharedPreferences
|
||||||
private lateinit var editor: SharedPreferences.Editor
|
private lateinit var editor: SharedPreferences.Editor
|
||||||
private lateinit var mFirebaseAnalytics: FirebaseAnalytics
|
private lateinit var firebaseAnalytics: FirebaseAnalytics
|
||||||
private lateinit var mUrlView: EditText
|
|
||||||
private lateinit var mLoginView: TextView
|
|
||||||
private lateinit var mHTTPLoginView: TextView
|
|
||||||
private lateinit var mProgressView: View
|
|
||||||
private lateinit var mPasswordView: EditText
|
|
||||||
private lateinit var mHTTPPasswordView: EditText
|
|
||||||
private lateinit var mLoginFormView: View
|
|
||||||
private lateinit var userIdentifier: String
|
private lateinit var userIdentifier: String
|
||||||
private var logErrors: Boolean = false
|
private var logErrors: Boolean = false
|
||||||
|
|
||||||
@ -57,24 +52,14 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
Scoop.getInstance().apply(this)
|
Scoop.getInstance().apply(this)
|
||||||
setContentView(R.layout.activity_login)
|
setContentView(R.layout.activity_login)
|
||||||
|
|
||||||
val toolbar: Toolbar = findViewById(R.id.toolbar)
|
|
||||||
setSupportActionBar(toolbar)
|
setSupportActionBar(toolbar)
|
||||||
|
|
||||||
if (intent.getBooleanExtra("baseUrlFail", false)) {
|
handleBaseUrlFail()
|
||||||
val alertDialog = AlertDialog.Builder(this).create()
|
|
||||||
alertDialog.setTitle(getString(R.string.warning_wrong_url))
|
|
||||||
alertDialog.setMessage(getString(R.string.base_url_error))
|
|
||||||
alertDialog.setButton(
|
|
||||||
AlertDialog.BUTTON_NEUTRAL,
|
|
||||||
"OK",
|
|
||||||
{ dialog, _ -> dialog.dismiss() })
|
|
||||||
alertDialog.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
userIdentifier = settings.getString("unique_id", "")
|
userIdentifier = settings.getString("unique_id", "")
|
||||||
logErrors = settings.getBoolean("loging_debug", false)
|
logErrors = settings.getBoolean("login_debug", false)
|
||||||
|
|
||||||
editor = settings.edit()
|
editor = settings.edit()
|
||||||
|
|
||||||
@ -82,56 +67,57 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
goToMain()
|
goToMain()
|
||||||
}
|
}
|
||||||
|
|
||||||
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this)
|
firebaseAnalytics = FirebaseAnalytics.getInstance(this)
|
||||||
mUrlView = findViewById(R.id.url)
|
|
||||||
mLoginView = findViewById(R.id.login)
|
|
||||||
mHTTPLoginView = findViewById(R.id.httpLogin)
|
|
||||||
mPasswordView = findViewById(R.id.password)
|
|
||||||
mHTTPPasswordView = findViewById(R.id.httpPassword)
|
|
||||||
mLoginFormView = findViewById(R.id.login_form)
|
|
||||||
mProgressView = findViewById(R.id.login_progress)
|
|
||||||
|
|
||||||
val mSwitch: Switch = findViewById(R.id.withLogin)
|
handleActions()
|
||||||
val mHTTPSwitch: Switch = findViewById(R.id.withHttpLogin)
|
}
|
||||||
val mLoginLayout: TextInputLayout = findViewById(R.id.loginLayout)
|
|
||||||
val mHTTPLoginLayout: TextInputLayout = findViewById(R.id.httpLoginInput)
|
|
||||||
val mPasswordLayout: TextInputLayout = findViewById(R.id.passwordLayout)
|
|
||||||
val mHTTPPasswordLayout: TextInputLayout = findViewById(R.id.httpPasswordInput)
|
|
||||||
val mEmailSignInButton: Button = findViewById(R.id.email_sign_in_button)
|
|
||||||
val selfHostedSwitch: Switch = findViewById(R.id.withSelfhostedCert)
|
|
||||||
val warningTextview: TextView = findViewById(R.id.warningText)
|
|
||||||
|
|
||||||
selfHostedSwitch.setOnCheckedChangeListener {_, b ->
|
private fun handleActions() {
|
||||||
|
|
||||||
|
withSelfhostedCert.setOnCheckedChangeListener { _, b ->
|
||||||
isWithSelfSignedCert = !isWithSelfSignedCert
|
isWithSelfSignedCert = !isWithSelfSignedCert
|
||||||
val visi: Int = if (b) View.VISIBLE else View.GONE
|
val visi: Int = if (b) View.VISIBLE else View.GONE
|
||||||
|
|
||||||
warningTextview.visibility = visi
|
warningText.visibility = visi
|
||||||
}
|
}
|
||||||
|
|
||||||
mPasswordView.setOnEditorActionListener(TextView.OnEditorActionListener { _, id, _ ->
|
passwordView.setOnEditorActionListener(TextView.OnEditorActionListener { _, id, _ ->
|
||||||
if (id == R.id.login || id == EditorInfo.IME_NULL) {
|
if (id == R.id.loginView || id == EditorInfo.IME_NULL) {
|
||||||
attemptLogin()
|
attemptLogin()
|
||||||
return@OnEditorActionListener true
|
return@OnEditorActionListener true
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
})
|
})
|
||||||
|
|
||||||
mEmailSignInButton.setOnClickListener { attemptLogin() }
|
signInButton.setOnClickListener { attemptLogin() }
|
||||||
|
|
||||||
mSwitch.setOnCheckedChangeListener { _, b ->
|
withLogin.setOnCheckedChangeListener { _, b ->
|
||||||
isWithLogin = !isWithLogin
|
isWithLogin = !isWithLogin
|
||||||
val visi: Int = if (b) View.VISIBLE else View.GONE
|
val visi: Int = if (b) View.VISIBLE else View.GONE
|
||||||
|
|
||||||
mLoginLayout.visibility = visi
|
loginLayout.visibility = visi
|
||||||
mPasswordLayout.visibility = visi
|
passwordLayout.visibility = visi
|
||||||
}
|
}
|
||||||
|
|
||||||
mHTTPSwitch.setOnCheckedChangeListener { _, b ->
|
withHttpLogin.setOnCheckedChangeListener { _, b ->
|
||||||
isWithHTTPLogin = !isWithHTTPLogin
|
isWithHTTPLogin = !isWithHTTPLogin
|
||||||
val visi: Int = if (b) View.VISIBLE else View.GONE
|
val visi: Int = if (b) View.VISIBLE else View.GONE
|
||||||
|
|
||||||
mHTTPLoginLayout.visibility = visi
|
httpLoginInput.visibility = visi
|
||||||
mHTTPPasswordLayout.visibility = visi
|
httpPasswordInput.visibility = visi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleBaseUrlFail() {
|
||||||
|
if (intent.getBooleanExtra("baseUrlFail", false)) {
|
||||||
|
val alertDialog = AlertDialog.Builder(this).create()
|
||||||
|
alertDialog.setTitle(getString(R.string.warning_wrong_url))
|
||||||
|
alertDialog.setMessage(getString(R.string.base_url_error))
|
||||||
|
alertDialog.setButton(
|
||||||
|
AlertDialog.BUTTON_NEUTRAL,
|
||||||
|
"OK",
|
||||||
|
{ dialog, _ -> dialog.dismiss() })
|
||||||
|
alertDialog.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,25 +130,25 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
private fun attemptLogin() {
|
private fun attemptLogin() {
|
||||||
|
|
||||||
// Reset errors.
|
// Reset errors.
|
||||||
mUrlView.error = null
|
urlView.error = null
|
||||||
mLoginView.error = null
|
loginView.error = null
|
||||||
mHTTPLoginView.error = null
|
httpLoginView.error = null
|
||||||
mPasswordView.error = null
|
passwordView.error = null
|
||||||
mHTTPPasswordView.error = null
|
httpPasswordView.error = null
|
||||||
|
|
||||||
// Store values at the time of the login attempt.
|
// Store values at the time of the login attempt.
|
||||||
val url = mUrlView.text.toString()
|
val url = urlView.text.toString()
|
||||||
val login = mLoginView.text.toString()
|
val login = loginView.text.toString()
|
||||||
val httpLogin = mHTTPLoginView.text.toString()
|
val httpLogin = httpLoginView.text.toString()
|
||||||
val password = mPasswordView.text.toString()
|
val password = passwordView.text.toString()
|
||||||
val httpPassword = mHTTPPasswordView.text.toString()
|
val httpPassword = httpPasswordView.text.toString()
|
||||||
|
|
||||||
var cancel = false
|
var cancel = false
|
||||||
var focusView: View? = null
|
var focusView: View? = null
|
||||||
|
|
||||||
if (!url.isBaseUrlValid()) {
|
if (!url.isBaseUrlValid()) {
|
||||||
mUrlView.error = getString(R.string.login_url_problem)
|
urlView.error = getString(R.string.login_url_problem)
|
||||||
focusView = mUrlView
|
focusView = urlView
|
||||||
cancel = true
|
cancel = true
|
||||||
inValidCount++
|
inValidCount++
|
||||||
if (inValidCount == 3) {
|
if (inValidCount == 3) {
|
||||||
@ -170,9 +156,9 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
alertDialog.setTitle(getString(R.string.warning_wrong_url))
|
alertDialog.setTitle(getString(R.string.warning_wrong_url))
|
||||||
alertDialog.setMessage(getString(R.string.text_wrong_url))
|
alertDialog.setMessage(getString(R.string.text_wrong_url))
|
||||||
alertDialog.setButton(
|
alertDialog.setButton(
|
||||||
AlertDialog.BUTTON_NEUTRAL,
|
AlertDialog.BUTTON_NEUTRAL,
|
||||||
"OK",
|
"OK",
|
||||||
{ dialog, _ -> dialog.dismiss() })
|
{ dialog, _ -> dialog.dismiss() })
|
||||||
alertDialog.show()
|
alertDialog.show()
|
||||||
inValidCount = 0
|
inValidCount = 0
|
||||||
}
|
}
|
||||||
@ -180,14 +166,14 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
if (isWithLogin || isWithHTTPLogin) {
|
if (isWithLogin || isWithHTTPLogin) {
|
||||||
if (TextUtils.isEmpty(password)) {
|
if (TextUtils.isEmpty(password)) {
|
||||||
mPasswordView.error = getString(R.string.error_invalid_password)
|
passwordView.error = getString(R.string.error_invalid_password)
|
||||||
focusView = mPasswordView
|
focusView = passwordView
|
||||||
cancel = true
|
cancel = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TextUtils.isEmpty(login)) {
|
if (TextUtils.isEmpty(login)) {
|
||||||
mLoginView.error = getString(R.string.error_field_required)
|
loginView.error = getString(R.string.error_field_required)
|
||||||
focusView = mLoginView
|
focusView = loginView
|
||||||
cancel = true
|
cancel = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -214,11 +200,11 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
editor.remove("password")
|
editor.remove("password")
|
||||||
editor.remove("httpPassword")
|
editor.remove("httpPassword")
|
||||||
editor.apply()
|
editor.apply()
|
||||||
mUrlView.error = getString(R.string.wrong_infos)
|
urlView.error = getString(R.string.wrong_infos)
|
||||||
mLoginView.error = getString(R.string.wrong_infos)
|
loginView.error = getString(R.string.wrong_infos)
|
||||||
mPasswordView.error = getString(R.string.wrong_infos)
|
passwordView.error = getString(R.string.wrong_infos)
|
||||||
mHTTPLoginView.error = getString(R.string.wrong_infos)
|
httpLoginView.error = getString(R.string.wrong_infos)
|
||||||
mHTTPPasswordView.error = getString(R.string.wrong_infos)
|
httpPasswordView.error = getString(R.string.wrong_infos)
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
|
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
|
||||||
@ -230,7 +216,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
||||||
if (response.body() != null && response.body()!!.isSuccess) {
|
if (response.body() != null && response.body()!!.isSuccess) {
|
||||||
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.LOGIN, Bundle())
|
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.LOGIN, Bundle())
|
||||||
goToMain()
|
goToMain()
|
||||||
} else {
|
} else {
|
||||||
preferenceError(Exception("No response body..."))
|
preferenceError(Exception("No response body..."))
|
||||||
@ -244,40 +230,38 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Shows the progress UI and hides the login form.
|
|
||||||
*/
|
|
||||||
private fun showProgress(show: Boolean) {
|
private fun showProgress(show: Boolean) {
|
||||||
val shortAnimTime = resources.getInteger(android.R.integer.config_shortAnimTime)
|
val shortAnimTime = resources.getInteger(android.R.integer.config_shortAnimTime)
|
||||||
|
|
||||||
mLoginFormView.visibility = if (show) View.GONE else View.VISIBLE
|
loginForm.visibility = if (show) View.GONE else View.VISIBLE
|
||||||
mLoginFormView
|
loginForm
|
||||||
.animate()
|
.animate()
|
||||||
.setDuration(shortAnimTime.toLong())
|
.setDuration(shortAnimTime.toLong())
|
||||||
.alpha(
|
.alpha(
|
||||||
if (show) 0F else 1F
|
if (show) 0F else 1F
|
||||||
).setListener(object : AnimatorListenerAdapter() {
|
).setListener(object : AnimatorListenerAdapter() {
|
||||||
override fun onAnimationEnd(animation: Animator) {
|
override fun onAnimationEnd(animation: Animator) {
|
||||||
mLoginFormView.visibility = if (show) View.GONE else View.VISIBLE
|
loginForm.visibility = if (show) View.GONE else View.VISIBLE
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
mProgressView.visibility = if (show) View.VISIBLE else View.GONE
|
loginProgress.visibility = if (show) View.VISIBLE else View.GONE
|
||||||
mProgressView
|
loginProgress
|
||||||
.animate()
|
.animate()
|
||||||
.setDuration(shortAnimTime.toLong())
|
.setDuration(shortAnimTime.toLong())
|
||||||
.alpha(
|
.alpha(
|
||||||
if (show) 1F else 0F
|
if (show) 1F else 0F
|
||||||
).setListener(object : AnimatorListenerAdapter() {
|
).setListener(object : AnimatorListenerAdapter() {
|
||||||
override fun onAnimationEnd(animation: Animator) {
|
override fun onAnimationEnd(animation: Animator) {
|
||||||
mProgressView.visibility = if (show) View.VISIBLE else View.GONE
|
loginProgress.visibility = if (show) View.VISIBLE else View.GONE
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
menuInflater.inflate(R.menu.login_menu, menu)
|
menuInflater.inflate(R.menu.login_menu, menu)
|
||||||
menu.findItem(R.id.loging_debug).isChecked = logErrors
|
menu.findItem(R.id.login_debug).isChecked = logErrors
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,17 +269,17 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.about -> {
|
R.id.about -> {
|
||||||
LibsBuilder()
|
LibsBuilder()
|
||||||
.withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR)
|
.withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR)
|
||||||
.withAboutIconShown(true)
|
.withAboutIconShown(true)
|
||||||
.withAboutVersionShown(true)
|
.withAboutVersionShown(true)
|
||||||
.start(this)
|
.start(this)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
R.id.loging_debug -> {
|
R.id.login_debug -> {
|
||||||
val newState = !item.isChecked
|
val newState = !item.isChecked
|
||||||
item.isChecked = newState
|
item.isChecked = newState
|
||||||
logErrors = newState
|
logErrors = newState
|
||||||
editor.putBoolean("loging_debug", newState)
|
editor.putBoolean("login_debug", newState)
|
||||||
editor.apply()
|
editor.apply()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -1,114 +1,190 @@
|
|||||||
package apps.amine.bou.readerforselfoss
|
package apps.amine.bou.readerforselfoss
|
||||||
|
|
||||||
|
import android.content.SharedPreferences
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.view.LayoutInflater
|
import android.support.customtabs.CustomTabsIntent
|
||||||
|
import android.support.design.widget.FloatingActionButton
|
||||||
|
import android.support.v4.widget.NestedScrollView
|
||||||
|
import android.support.v7.app.AppCompatActivity
|
||||||
|
import android.text.Html
|
||||||
|
import android.text.method.LinkMovementMethod
|
||||||
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.ImageButton
|
|
||||||
import android.widget.ImageView
|
|
||||||
import android.widget.TextView
|
|
||||||
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
||||||
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
||||||
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.isEmptyOrNullOrNullString
|
||||||
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 com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.request.RequestOptions
|
import com.bumptech.glide.request.RequestOptions
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
import com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
||||||
import org.sufficientlysecure.htmltextview.HtmlHttpImageGetter
|
import org.sufficientlysecure.htmltextview.HtmlHttpImageGetter
|
||||||
import org.sufficientlysecure.htmltextview.HtmlTextView
|
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
import xyz.klinker.android.drag_dismiss.activity.DragDismissActivity
|
import kotlinx.android.synthetic.main.activity_reader.*
|
||||||
|
|
||||||
|
|
||||||
class ReaderActivity : DragDismissActivity() {
|
class ReaderActivity : AppCompatActivity() {
|
||||||
private lateinit var mCustomTabActivityHelper: CustomTabActivityHelper
|
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 onStart() {
|
|
||||||
super.onStart()
|
|
||||||
mCustomTabActivityHelper.bindCustomTabsService(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStop() {
|
override fun onStop() {
|
||||||
super.onStop()
|
super.onStop()
|
||||||
mCustomTabActivityHelper.unbindCustomTabsService(this)
|
mCustomTabActivityHelper.unbindCustomTabsService(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateContent(inflater: LayoutInflater, parent: ViewGroup, savedInstanceState: Bundle?): View {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
Scoop.getInstance().apply(this)
|
||||||
val v = inflater.inflate(R.layout.activity_reader, parent, false)
|
setContentView(R.layout.activity_reader)
|
||||||
showProgressBar()
|
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
|
|
||||||
val image: ImageView = v.findViewById(R.id.imageView)
|
url = intent.getStringExtra("url")
|
||||||
val source: TextView = v.findViewById(R.id.source)
|
contentText = intent.getStringExtra("content")
|
||||||
val title: TextView = v.findViewById(R.id.title)
|
contentTitle = intent.getStringExtra("title")
|
||||||
val content: HtmlTextView = v.findViewById(R.id.content)
|
contentImage = intent.getStringExtra("image")
|
||||||
val url = intent.getStringExtra("url")
|
contentSource = intent.getStringExtra("source")
|
||||||
val parser = MercuryApi(BuildConfig.MERCURY_KEY, prefs.getBoolean("should_log_everything", false))
|
|
||||||
val browserBtn: ImageButton = v.findViewById(R.id.browserBtn)
|
|
||||||
val shareBtn: ImageButton = v.findViewById(R.id.shareBtn)
|
|
||||||
|
|
||||||
|
fab = findViewById(R.id.fab)
|
||||||
|
val mFloatingToolbar: FloatingToolbar = findViewById(R.id.floatingToolbar)
|
||||||
|
mFloatingToolbar.attachFab(fab)
|
||||||
|
|
||||||
val customTabsIntent = this@ReaderActivity.buildCustomTabsIntent()
|
val customTabsIntent = this@ReaderActivity.buildCustomTabsIntent()
|
||||||
mCustomTabActivityHelper = CustomTabActivityHelper()
|
mCustomTabActivityHelper = CustomTabActivityHelper()
|
||||||
mCustomTabActivityHelper.bindCustomTabsService(this)
|
mCustomTabActivityHelper.bindCustomTabsService(this)
|
||||||
|
|
||||||
|
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
|
||||||
|
mFloatingToolbar.setClickListener(object : FloatingToolbar.ItemClickListener {
|
||||||
|
override fun onItemClick(item: MenuItem) {
|
||||||
|
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?) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getContentFromMercury(customTabsIntent: CustomTabsIntent, 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> {
|
parser.parseUrl(url).enqueue(object : Callback<ParsedContent> {
|
||||||
override fun onResponse(call: Call<ParsedContent>, response: Response<ParsedContent>) {
|
override fun onResponse(call: Call<ParsedContent>, response: Response<ParsedContent>) {
|
||||||
if (response.body() != null && response.body()!!.content != null && response.body()!!.content.isNotEmpty()) {
|
if (response.body() != null && response.body()!!.content != null && response.body()!!.content.isNotEmpty()) {
|
||||||
source.text = response.body()!!.domain
|
source.text = response.body()!!.domain
|
||||||
title.text = response.body()!!.title
|
titleView.text = response.body()!!.title
|
||||||
|
this@ReaderActivity.url = response.body()!!.url
|
||||||
|
|
||||||
if (response.body()!!.content != null && !response.body()!!.content.isEmpty()) {
|
if (response.body()!!.content != null && !response.body()!!.content.isEmpty()) {
|
||||||
try {
|
tryToHandleHtml(response.body()!!.content, customTabsIntent, prefs)
|
||||||
content.setHtml(response.body()!!.content, HtmlHttpImageGetter(content, null, true))
|
|
||||||
} catch (e: IndexOutOfBoundsException) {
|
|
||||||
openInBrowserAfterFailing()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty())
|
|
||||||
|
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty()) {
|
||||||
|
imageView.visibility = View.VISIBLE
|
||||||
Glide
|
Glide
|
||||||
.with(baseContext)
|
.with(baseContext)
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.load(response.body()!!.lead_image_url)
|
.load(response.body()!!.lead_image_url)
|
||||||
.apply(RequestOptions.fitCenterTransform())
|
.apply(RequestOptions.fitCenterTransform())
|
||||||
.into(image)
|
.into(imageView)
|
||||||
|
} else {
|
||||||
shareBtn.setOnClickListener {
|
imageView.visibility = View.GONE
|
||||||
this@ReaderActivity.shareLink(response.body()!!.url)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
browserBtn.setOnClickListener {
|
nestedScrollView.scrollTo(0, 0)
|
||||||
this@ReaderActivity.openItemUrl(
|
|
||||||
response.body()!!.url,
|
|
||||||
customTabsIntent,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
this@ReaderActivity)
|
|
||||||
}
|
|
||||||
|
|
||||||
hideProgressBar()
|
progressBar.visibility = View.GONE
|
||||||
} else openInBrowserAfterFailing()
|
} else openInBrowserAfterFailing(customTabsIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(call: Call<ParsedContent>, t: Throwable) = openInBrowserAfterFailing()
|
override fun onFailure(call: Call<ParsedContent>, t: Throwable) = openInBrowserAfterFailing(customTabsIntent)
|
||||||
|
|
||||||
private fun openInBrowserAfterFailing() {
|
|
||||||
this@ReaderActivity.openItemUrl(
|
|
||||||
url,
|
|
||||||
customTabsIntent,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
this@ReaderActivity
|
|
||||||
)
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
return v
|
}
|
||||||
|
|
||||||
|
private fun tryToHandleHtml(c: String, customTabsIntent: CustomTabsIntent, prefs: SharedPreferences) {
|
||||||
|
try {
|
||||||
|
content.text = Html.fromHtml(c, HtmlHttpImageGetter(content, null, true), null)
|
||||||
|
|
||||||
|
//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) {
|
||||||
|
progressBar.visibility = View.GONE
|
||||||
|
this@ReaderActivity.openItemUrl(
|
||||||
|
url,
|
||||||
|
contentText,
|
||||||
|
contentImage,
|
||||||
|
contentTitle,
|
||||||
|
contentSource,
|
||||||
|
customTabsIntent,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
this@ReaderActivity
|
||||||
|
)
|
||||||
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,37 +5,36 @@ import android.os.Bundle
|
|||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.support.v7.widget.LinearLayoutManager
|
import android.support.v7.widget.LinearLayoutManager
|
||||||
import android.support.v7.widget.RecyclerView
|
|
||||||
import android.support.v7.widget.Toolbar
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
|
||||||
import com.melnykov.fab.FloatingActionButton
|
|
||||||
import retrofit2.Call
|
|
||||||
import retrofit2.Callback
|
|
||||||
import retrofit2.Response
|
|
||||||
|
|
||||||
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 com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.Callback
|
||||||
|
import retrofit2.Response
|
||||||
|
import kotlinx.android.synthetic.main.activity_sources.*
|
||||||
|
|
||||||
class SourcesActivity : AppCompatActivity() {
|
class SourcesActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
Scoop.getInstance().apply(this)
|
||||||
setContentView(R.layout.activity_sources)
|
setContentView(R.layout.activity_sources)
|
||||||
val toolbar: Toolbar = findViewById(R.id.toolbar)
|
|
||||||
setSupportActionBar(toolbar)
|
setSupportActionBar(toolbar)
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
supportActionBar?.setDisplayShowHomeEnabled(true)
|
supportActionBar?.setDisplayShowHomeEnabled(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onStop() {
|
||||||
|
super.onStop()
|
||||||
|
recyclerView.clearOnScrollListeners()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
val mFab: FloatingActionButton = findViewById(R.id.fab)
|
|
||||||
val mRecyclerView: RecyclerView = findViewById(R.id.activity_sources)
|
|
||||||
val mLayoutManager = LinearLayoutManager(this)
|
val mLayoutManager = LinearLayoutManager(this)
|
||||||
|
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
@ -43,9 +42,8 @@ class SourcesActivity : AppCompatActivity() {
|
|||||||
val api = SelfossApi(this, this@SourcesActivity, prefs.getBoolean("isSelfSignedCert", false), prefs.getBoolean("should_log_everything", false))
|
val api = SelfossApi(this, this@SourcesActivity, prefs.getBoolean("isSelfSignedCert", false), prefs.getBoolean("should_log_everything", false))
|
||||||
var items: ArrayList<Sources> = ArrayList()
|
var items: ArrayList<Sources> = ArrayList()
|
||||||
|
|
||||||
mFab.attachToRecyclerView(mRecyclerView)
|
recyclerView.setHasFixedSize(true)
|
||||||
mRecyclerView.setHasFixedSize(true)
|
recyclerView.layoutManager = mLayoutManager
|
||||||
mRecyclerView.layoutManager = mLayoutManager
|
|
||||||
|
|
||||||
api.sources.enqueue(object : Callback<List<Sources>> {
|
api.sources.enqueue(object : Callback<List<Sources>> {
|
||||||
override fun onResponse(call: Call<List<Sources>>, response: Response<List<Sources>>) {
|
override fun onResponse(call: Call<List<Sources>>, response: Response<List<Sources>>) {
|
||||||
@ -53,7 +51,7 @@ class SourcesActivity : AppCompatActivity() {
|
|||||||
items = response.body() as ArrayList<Sources>
|
items = response.body() as ArrayList<Sources>
|
||||||
}
|
}
|
||||||
val mAdapter = SourcesListAdapter(this@SourcesActivity, items, api)
|
val mAdapter = SourcesListAdapter(this@SourcesActivity, items, api)
|
||||||
mRecyclerView.adapter = mAdapter
|
recyclerView.adapter = mAdapter
|
||||||
mAdapter.notifyDataSetChanged()
|
mAdapter.notifyDataSetChanged()
|
||||||
if (items.isEmpty()) Toast.makeText(this@SourcesActivity, R.string.nothing_here, Toast.LENGTH_SHORT).show()
|
if (items.isEmpty()) Toast.makeText(this@SourcesActivity, R.string.nothing_here, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
@ -63,7 +61,7 @@ class SourcesActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
mFab.setOnClickListener {
|
fab.setOnClickListener {
|
||||||
startActivity(Intent(this@SourcesActivity, AddSourceActivity::class.java))
|
startActivity(Intent(this@SourcesActivity, AddSourceActivity::class.java))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,40 +3,40 @@ 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.graphics.Color
|
||||||
import android.support.constraint.ConstraintLayout
|
|
||||||
import android.support.design.widget.Snackbar
|
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.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageButton
|
|
||||||
import android.widget.ImageView
|
|
||||||
import android.widget.ImageView.ScaleType
|
import android.widget.ImageView.ScaleType
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable
|
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator
|
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import com.like.LikeButton
|
|
||||||
import com.like.OnLikeListener
|
|
||||||
import retrofit2.Call
|
|
||||||
import retrofit2.Callback
|
|
||||||
import retrofit2.Response
|
|
||||||
|
|
||||||
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.themes.AppColors
|
||||||
import apps.amine.bou.readerforselfoss.utils.*
|
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
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.bitmapFitCenter
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.openInBrowserAsNewTask
|
||||||
|
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.succeeded
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
||||||
|
import com.amulyakhare.textdrawable.TextDrawable
|
||||||
|
import com.amulyakhare.textdrawable.util.ColorGenerator
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
import kotlin.collections.ArrayList
|
import com.like.LikeButton
|
||||||
|
import com.like.OnLikeListener
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.Callback
|
||||||
|
import retrofit2.Response
|
||||||
|
import kotlinx.android.synthetic.main.card_item.view.*
|
||||||
|
|
||||||
class ItemCardAdapter(private val app: Activity,
|
class ItemCardAdapter(private val app: Activity,
|
||||||
private val items: ArrayList<Item>,
|
private val items: ArrayList<Item>,
|
||||||
@ -60,32 +60,32 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
val itm = items[position]
|
val itm = items[position]
|
||||||
|
|
||||||
|
|
||||||
holder.saveBtn.isLiked = itm.starred
|
holder.mView.favButton.isLiked = itm.starred
|
||||||
holder.title.text = Html.fromHtml(itm.title)
|
holder.mView.title.text = Html.fromHtml(itm.title)
|
||||||
|
|
||||||
holder.sourceTitleAndDate.text = itm.sourceAndDateText()
|
holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText()
|
||||||
|
|
||||||
if (itm.getThumbnail(c).isEmpty()) {
|
if (itm.getThumbnail(c).isEmpty()) {
|
||||||
Glide.with(c).clear(holder.itemImage)
|
Glide.with(c).clear(holder.mView.itemImage)
|
||||||
holder.itemImage.setImageDrawable(null)
|
holder.mView.itemImage.setImageDrawable(null)
|
||||||
} else {
|
} else {
|
||||||
c.bitmapCenterCrop(itm.getThumbnail(c), holder.itemImage)
|
c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itm.getIcon(c).isEmpty()) {
|
if (itm.getIcon(c).isEmpty()) {
|
||||||
val color = generator.getColor(itm.sourcetitle)
|
val color = generator.getColor(itm.sourcetitle)
|
||||||
|
|
||||||
val drawable =
|
val drawable =
|
||||||
TextDrawable
|
TextDrawable
|
||||||
.builder()
|
.builder()
|
||||||
.round()
|
.round()
|
||||||
.build(itm.sourcetitle.toTextDrawableString(), color)
|
.build(itm.sourcetitle.toTextDrawableString(), color)
|
||||||
holder.sourceImage.setImageDrawable(drawable)
|
holder.mView.sourceImage.setImageDrawable(drawable)
|
||||||
} else {
|
} else {
|
||||||
c.circularBitmapDrawable(itm.getIcon(c), holder.sourceImage)
|
c.circularBitmapDrawable(itm.getIcon(c), holder.mView.sourceImage)
|
||||||
}
|
}
|
||||||
|
|
||||||
holder.saveBtn.isLiked = itm.starred
|
holder.mView.favButton.isLiked = itm.starred
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int {
|
||||||
@ -125,15 +125,15 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
|
|
||||||
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
||||||
if (debugReadingItems) {
|
if (!response.succeeded() && debugReadingItems) {
|
||||||
val message =
|
val message =
|
||||||
"message: ${response.message()} " +
|
"message: ${response.message()} " +
|
||||||
"response isSuccess: ${response.isSuccessful} " +
|
"response isSuccess: ${response.isSuccessful} " +
|
||||||
"response code: ${response.code()} " +
|
"response code: ${response.code()} " +
|
||||||
"response message: ${response.message()} " +
|
"response message: ${response.message()} " +
|
||||||
"response errorBody: ${response.errorBody()?.string()} " +
|
"response errorBody: ${response.errorBody()?.string()} " +
|
||||||
"body success: ${response.body()?.success} " +
|
"body success: ${response.body()?.success} " +
|
||||||
"body isSuccess: ${response.body()?.isSuccess}"
|
"body isSuccess: ${response.body()?.isSuccess}"
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
||||||
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
@ -159,14 +159,6 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
}
|
}
|
||||||
|
|
||||||
inner class ViewHolder(val mView: CardView) : RecyclerView.ViewHolder(mView) {
|
inner class ViewHolder(val mView: CardView) : RecyclerView.ViewHolder(mView) {
|
||||||
lateinit var saveBtn: LikeButton
|
|
||||||
lateinit var browserBtn: ImageButton
|
|
||||||
lateinit var shareBtn: ImageButton
|
|
||||||
lateinit var itemImage: ImageView
|
|
||||||
lateinit var sourceImage: ImageView
|
|
||||||
lateinit var title: TextView
|
|
||||||
lateinit var sourceTitleAndDate: TextView
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
mView.setCardBackgroundColor(appColors.cardBackground)
|
mView.setCardBackgroundColor(appColors.cardBackground)
|
||||||
handleClickListeners()
|
handleClickListeners()
|
||||||
@ -174,27 +166,20 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleClickListeners() {
|
private fun handleClickListeners() {
|
||||||
sourceImage = mView.findViewById(R.id.sourceImage)
|
|
||||||
itemImage = mView.findViewById(R.id.itemImage)
|
|
||||||
title = mView.findViewById(R.id.title)
|
|
||||||
sourceTitleAndDate = mView.findViewById(R.id.sourceTitleAndDate)
|
|
||||||
saveBtn = mView.findViewById(R.id.favButton)
|
|
||||||
shareBtn = mView.findViewById(R.id.shareBtn)
|
|
||||||
browserBtn = mView.findViewById(R.id.browserBtn)
|
|
||||||
|
|
||||||
if (!fullHeightCards) {
|
if (!fullHeightCards) {
|
||||||
itemImage.maxHeight = c.resources.getDimension(R.dimen.card_image_max_height).toInt()
|
mView.itemImage.maxHeight = c.resources.getDimension(R.dimen.card_image_max_height).toInt()
|
||||||
itemImage.scaleType = ScaleType.CENTER_CROP
|
mView.itemImage.scaleType = ScaleType.CENTER_CROP
|
||||||
}
|
}
|
||||||
|
|
||||||
saveBtn.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]
|
||||||
api.starrItem(id).enqueue(object : Callback<SuccessResponse> {
|
api.starrItem(id).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
saveBtn.isLiked = false
|
mView.favButton.isLiked = false
|
||||||
Toast.makeText(c, R.string.cant_mark_favortie, Toast.LENGTH_SHORT).show()
|
Toast.makeText(c, R.string.cant_mark_favortie, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -206,18 +191,18 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
saveBtn.isLiked = true
|
mView.favButton.isLiked = true
|
||||||
Toast.makeText(c, R.string.cant_unmark_favortie, Toast.LENGTH_SHORT).show()
|
Toast.makeText(c, R.string.cant_unmark_favortie, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
shareBtn.setOnClickListener {
|
mView.shareBtn.setOnClickListener {
|
||||||
c.shareLink(items[adapterPosition].getLinkDecoded())
|
c.shareLink(items[adapterPosition].getLinkDecoded())
|
||||||
}
|
}
|
||||||
|
|
||||||
browserBtn.setOnClickListener {
|
mView.browserBtn.setOnClickListener {
|
||||||
c.openInBrowserAsNewTask(items[adapterPosition])
|
c.openInBrowserAsNewTask(items[adapterPosition])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,10 +213,14 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
|
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
||||||
customTabsIntent,
|
items[adapterPosition].content,
|
||||||
internalBrowser,
|
items[adapterPosition].getThumbnail(c),
|
||||||
articleViewer,
|
items[adapterPosition].title,
|
||||||
app)
|
items[adapterPosition].sourceAndDateText(),
|
||||||
|
customTabsIntent,
|
||||||
|
internalBrowser,
|
||||||
|
articleViewer,
|
||||||
|
app)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,28 +12,32 @@ 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.*
|
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.utils.buildCustomTabsIntent
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.openInBrowserAsNewTask
|
||||||
|
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.succeeded
|
||||||
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 retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
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.utils.*
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
|
||||||
import com.crashlytics.android.Crashlytics
|
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
import kotlinx.android.synthetic.main.list_item.view.*
|
||||||
|
|
||||||
class ItemListAdapter(private val app: Activity,
|
class ItemListAdapter(private val app: Activity,
|
||||||
private val items: ArrayList<Item>,
|
private val items: ArrayList<Item>,
|
||||||
@ -57,27 +61,27 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
val itm = items[position]
|
val itm = items[position]
|
||||||
|
|
||||||
|
|
||||||
holder.saveBtn.isLiked = itm.starred
|
holder.mView.favButton.isLiked = itm.starred
|
||||||
holder.title.text = Html.fromHtml(itm.title)
|
holder.mView.title.text = Html.fromHtml(itm.title)
|
||||||
|
|
||||||
holder.sourceTitleAndDate.text = itm.sourceAndDateText()
|
holder.mView.sourceTitleAndDate.text = itm.sourceAndDateText()
|
||||||
|
|
||||||
if (itm.getThumbnail(c).isEmpty()) {
|
if (itm.getThumbnail(c).isEmpty()) {
|
||||||
val sizeInInt = 46
|
val sizeInInt = 46
|
||||||
val sizeInDp = TypedValue.applyDimension(
|
val sizeInDp = TypedValue.applyDimension(
|
||||||
TypedValue.COMPLEX_UNIT_DIP, sizeInInt.toFloat(), c.resources
|
TypedValue.COMPLEX_UNIT_DIP, sizeInInt.toFloat(), c.resources
|
||||||
.displayMetrics).toInt()
|
.displayMetrics).toInt()
|
||||||
|
|
||||||
val marginInInt = 16
|
val marginInInt = 16
|
||||||
val marginInDp = TypedValue.applyDimension(
|
val marginInDp = TypedValue.applyDimension(
|
||||||
TypedValue.COMPLEX_UNIT_DIP, marginInInt.toFloat(), c.resources
|
TypedValue.COMPLEX_UNIT_DIP, marginInInt.toFloat(), c.resources
|
||||||
.displayMetrics).toInt()
|
.displayMetrics).toInt()
|
||||||
|
|
||||||
val params = holder.sourceImage.layoutParams as ViewGroup.MarginLayoutParams
|
val params = holder.mView.itemImage.layoutParams as ViewGroup.MarginLayoutParams
|
||||||
params.height = sizeInDp
|
params.height = sizeInDp
|
||||||
params.width = sizeInDp
|
params.width = sizeInDp
|
||||||
params.setMargins(marginInDp, 0, 0, 0)
|
params.setMargins(marginInDp, 0, 0, 0)
|
||||||
holder.sourceImage.layoutParams = params
|
holder.mView.itemImage.layoutParams = params
|
||||||
|
|
||||||
if (itm.getIcon(c).isEmpty()) {
|
if (itm.getIcon(c).isEmpty()) {
|
||||||
val color = generator.getColor(itm.sourcetitle)
|
val color = generator.getColor(itm.sourcetitle)
|
||||||
@ -89,17 +93,17 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
val builder = TextDrawable.builder().round()
|
val builder = TextDrawable.builder().round()
|
||||||
|
|
||||||
val drawable = builder.build(textDrawable.toString(), color)
|
val drawable = builder.build(textDrawable.toString(), color)
|
||||||
holder.sourceImage.setImageDrawable(drawable)
|
holder.mView.itemImage.setImageDrawable(drawable)
|
||||||
} else {
|
} else {
|
||||||
c.circularBitmapDrawable(itm.getIcon(c), holder.sourceImage)
|
c.circularBitmapDrawable(itm.getIcon(c), holder.mView.itemImage)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
c.bitmapCenterCrop(itm.getThumbnail(c), holder.sourceImage)
|
c.bitmapCenterCrop(itm.getThumbnail(c), holder.mView.itemImage)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bars[position]) holder.actionBar.visibility = View.VISIBLE else holder.actionBar.visibility = View.GONE
|
if (bars[position]) holder.mView.actionBar.visibility = View.VISIBLE else holder.mView.actionBar.visibility = View.GONE
|
||||||
|
|
||||||
holder.saveBtn.isLiked = itm.starred
|
holder.mView.favButton.isLiked = itm.starred
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = items.size
|
override fun getItemCount(): Int = items.size
|
||||||
@ -138,15 +142,15 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
|
|
||||||
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
api.markItem(i.id).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
||||||
if (debugReadingItems) {
|
if (!response.succeeded() && debugReadingItems) {
|
||||||
val message =
|
val message =
|
||||||
"message: ${response.message()} " +
|
"message: ${response.message()} " +
|
||||||
"response isSuccess: ${response.isSuccessful} " +
|
"response isSuccess: ${response.isSuccessful} " +
|
||||||
"response code: ${response.code()} " +
|
"response code: ${response.code()} " +
|
||||||
"response message: ${response.message()} " +
|
"response message: ${response.message()} " +
|
||||||
"response errorBody: ${response.errorBody()?.string()} " +
|
"response errorBody: ${response.errorBody()?.string()} " +
|
||||||
"body success: ${response.body()?.success} " +
|
"body success: ${response.body()?.success} " +
|
||||||
"body isSuccess: ${response.body()?.isSuccess}"
|
"body isSuccess: ${response.body()?.isSuccess}"
|
||||||
Crashlytics.setUserIdentifier(userIdentifier)
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
||||||
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
@ -172,13 +176,6 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
}
|
}
|
||||||
|
|
||||||
inner class ViewHolder(val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
|
inner class ViewHolder(val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
|
||||||
lateinit var saveBtn: LikeButton
|
|
||||||
lateinit var browserBtn: ImageButton
|
|
||||||
lateinit var shareBtn: ImageButton
|
|
||||||
lateinit var actionBar: RelativeLayout
|
|
||||||
lateinit var sourceImage: ImageView
|
|
||||||
lateinit var title: TextView
|
|
||||||
lateinit var sourceTitleAndDate: TextView
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
handleClickListeners()
|
handleClickListeners()
|
||||||
@ -186,23 +183,15 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleClickListeners() {
|
private fun handleClickListeners() {
|
||||||
actionBar = mView.findViewById(R.id.actionBar)
|
|
||||||
sourceImage = mView.findViewById(R.id.itemImage)
|
|
||||||
title = mView.findViewById(R.id.title)
|
|
||||||
sourceTitleAndDate = mView.findViewById(R.id.sourceTitleAndDate)
|
|
||||||
saveBtn = mView.findViewById(R.id.favButton)
|
|
||||||
shareBtn = mView.findViewById(R.id.shareBtn)
|
|
||||||
browserBtn = mView.findViewById(R.id.browserBtn)
|
|
||||||
|
|
||||||
|
mView.favButton.setOnLikeListener(object : OnLikeListener {
|
||||||
saveBtn.setOnLikeListener(object : OnLikeListener {
|
|
||||||
override fun liked(likeButton: LikeButton) {
|
override fun liked(likeButton: LikeButton) {
|
||||||
val (id) = items[adapterPosition]
|
val (id) = items[adapterPosition]
|
||||||
api.starrItem(id).enqueue(object : Callback<SuccessResponse> {
|
api.starrItem(id).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
saveBtn.isLiked = false
|
mView.favButton.isLiked = false
|
||||||
Toast.makeText(c, R.string.cant_mark_favortie, Toast.LENGTH_SHORT).show()
|
Toast.makeText(c, R.string.cant_mark_favortie, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -214,18 +203,18 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {}
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
saveBtn.isLiked = true
|
mView.favButton.isLiked = true
|
||||||
Toast.makeText(c, R.string.cant_unmark_favortie, Toast.LENGTH_SHORT).show()
|
Toast.makeText(c, R.string.cant_unmark_favortie, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
shareBtn.setOnClickListener {
|
mView.shareBtn.setOnClickListener {
|
||||||
c.shareLink(items[adapterPosition].getLinkDecoded())
|
c.shareLink(items[adapterPosition].getLinkDecoded())
|
||||||
}
|
}
|
||||||
|
|
||||||
browserBtn.setOnClickListener {
|
mView.browserBtn.setOnClickListener {
|
||||||
c.openInBrowserAsNewTask(items[adapterPosition])
|
c.openInBrowserAsNewTask(items[adapterPosition])
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -240,10 +229,14 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
if (!clickBehavior) {
|
if (!clickBehavior) {
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
||||||
customTabsIntent,
|
items[adapterPosition].content,
|
||||||
internalBrowser,
|
items[adapterPosition].getThumbnail(c),
|
||||||
articleViewer,
|
items[adapterPosition].title,
|
||||||
app)
|
items[adapterPosition].sourceAndDateText(),
|
||||||
|
customTabsIntent,
|
||||||
|
internalBrowser,
|
||||||
|
articleViewer,
|
||||||
|
app)
|
||||||
}
|
}
|
||||||
mView.setOnLongClickListener {
|
mView.setOnLongClickListener {
|
||||||
actionBarShowHide()
|
actionBarShowHide()
|
||||||
@ -253,10 +246,14 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
mView.setOnClickListener { actionBarShowHide() }
|
mView.setOnClickListener { actionBarShowHide() }
|
||||||
mView.setOnLongClickListener {
|
mView.setOnLongClickListener {
|
||||||
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
||||||
customTabsIntent,
|
items[adapterPosition].content,
|
||||||
internalBrowser,
|
items[adapterPosition].getThumbnail(c),
|
||||||
articleViewer,
|
items[adapterPosition].title,
|
||||||
app)
|
items[adapterPosition].sourceAndDateText(),
|
||||||
|
customTabsIntent,
|
||||||
|
internalBrowser,
|
||||||
|
articleViewer,
|
||||||
|
app)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -264,7 +261,11 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
|
|
||||||
private fun actionBarShowHide() {
|
private fun actionBarShowHide() {
|
||||||
bars[adapterPosition] = true
|
bars[adapterPosition] = true
|
||||||
if (actionBar.visibility == View.GONE) actionBar.visibility = View.VISIBLE else actionBar.visibility = View.GONE
|
if (mView.actionBar.visibility == View.GONE) {
|
||||||
|
mView.actionBar.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
mView.actionBar.visibility = View.GONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,19 +10,18 @@ import android.widget.Button
|
|||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable
|
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator
|
|
||||||
import retrofit2.Call
|
|
||||||
import retrofit2.Callback
|
|
||||||
import retrofit2.Response
|
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R
|
import apps.amine.bou.readerforselfoss.R
|
||||||
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.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
||||||
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
||||||
|
import com.amulyakhare.textdrawable.TextDrawable
|
||||||
|
import com.amulyakhare.textdrawable.util.ColorGenerator
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.Callback
|
||||||
|
import retrofit2.Response
|
||||||
|
import kotlinx.android.synthetic.main.source_list_item.view.*
|
||||||
|
|
||||||
|
|
||||||
class SourcesListAdapter(private val app: Activity,
|
class SourcesListAdapter(private val app: Activity,
|
||||||
@ -43,34 +42,27 @@ class SourcesListAdapter(private val app: Activity,
|
|||||||
val color = generator.getColor(itm.title)
|
val color = generator.getColor(itm.title)
|
||||||
|
|
||||||
val drawable =
|
val drawable =
|
||||||
TextDrawable
|
TextDrawable
|
||||||
.builder()
|
.builder()
|
||||||
.round()
|
.round()
|
||||||
.build(itm.title.toTextDrawableString(), color)
|
.build(itm.title.toTextDrawableString(), color)
|
||||||
holder.sourceImage.setImageDrawable(drawable)
|
holder.mView.itemImage.setImageDrawable(drawable)
|
||||||
} else {
|
} else {
|
||||||
c.circularBitmapDrawable(itm.getIcon(c), holder.sourceImage)
|
c.circularBitmapDrawable(itm.getIcon(c), holder.mView.itemImage)
|
||||||
}
|
}
|
||||||
|
|
||||||
holder.sourceTitle.text = itm.title
|
holder.mView.sourceTitle.text = itm.title
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int = items.size
|
||||||
return items.size
|
|
||||||
}
|
|
||||||
|
|
||||||
inner class ViewHolder(internal val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
|
inner class ViewHolder(internal val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
|
||||||
lateinit var sourceImage: ImageView
|
|
||||||
lateinit var sourceTitle: TextView
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
||||||
handleClickListeners()
|
handleClickListeners()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleClickListeners() {
|
private fun handleClickListeners() {
|
||||||
sourceImage = mView.findViewById(R.id.itemImage)
|
|
||||||
sourceTitle = mView.findViewById(R.id.sourceTitle)
|
|
||||||
|
|
||||||
val deleteBtn: Button = mView.findViewById(R.id.deleteBtn)
|
val deleteBtn: Button = mView.findViewById(R.id.deleteBtn)
|
||||||
|
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package apps.amine.bou.readerforselfoss.api.selfoss
|
package apps.amine.bou.readerforselfoss.api.selfoss
|
||||||
|
|
||||||
import java.lang.reflect.Type
|
|
||||||
|
|
||||||
import com.google.gson.JsonParseException
|
|
||||||
import com.google.gson.JsonDeserializationContext
|
import com.google.gson.JsonDeserializationContext
|
||||||
import com.google.gson.JsonElement
|
|
||||||
import com.google.gson.JsonDeserializer
|
import com.google.gson.JsonDeserializer
|
||||||
|
import com.google.gson.JsonElement
|
||||||
|
import com.google.gson.JsonParseException
|
||||||
|
import java.lang.reflect.Type
|
||||||
|
|
||||||
|
|
||||||
internal class BooleanTypeAdapter : JsonDeserializer<Boolean> {
|
internal class BooleanTypeAdapter : JsonDeserializer<Boolean> {
|
||||||
|
@ -2,8 +2,8 @@ package apps.amine.bou.readerforselfoss.api.selfoss
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.getUnsafeHttpClient
|
||||||
import com.burgstaller.okhttp.AuthenticationCacheInterceptor
|
import com.burgstaller.okhttp.AuthenticationCacheInterceptor
|
||||||
import com.burgstaller.okhttp.CachingAuthenticatorDecorator
|
import com.burgstaller.okhttp.CachingAuthenticatorDecorator
|
||||||
import com.burgstaller.okhttp.DispatchingAuthenticator
|
import com.burgstaller.okhttp.DispatchingAuthenticator
|
||||||
@ -13,18 +13,13 @@ import com.burgstaller.okhttp.digest.Credentials
|
|||||||
import com.burgstaller.okhttp.digest.DigestAuthenticator
|
import com.burgstaller.okhttp.digest.DigestAuthenticator
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.logging.HttpLoggingInterceptor
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Retrofit
|
import retrofit2.Retrofit
|
||||||
import retrofit2.converter.gson.GsonConverterFactory
|
import retrofit2.converter.gson.GsonConverterFactory
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.getUnsafeHttpClient
|
|
||||||
import okhttp3.logging.HttpLoggingInterceptor
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// codebeat:disable[ARITY,TOO_MANY_FUNCTIONS]
|
|
||||||
class SelfossApi(c: Context, callingActivity: Activity, isWithSelfSignedCert: Boolean, shouldLog: Boolean) {
|
class SelfossApi(c: Context, callingActivity: Activity, isWithSelfSignedCert: Boolean, shouldLog: Boolean) {
|
||||||
|
|
||||||
private lateinit var service: SelfossService
|
private lateinit var service: SelfossService
|
||||||
@ -148,5 +143,3 @@ class SelfossApi(c: Context, callingActivity: Activity, isWithSelfSignedCert: Bo
|
|||||||
service.createSource(title, url, spout, tags, filter, userName, password)
|
service.createSource(title, url, spout, tags, filter, userName, password)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// codebeat:enable[ARITY,TOO_MANY_FUNCTIONS]
|
|
@ -55,6 +55,7 @@ data class Sources(@SerializedName("id") val id: String,
|
|||||||
data class Item(@SerializedName("id") val id: String,
|
data class Item(@SerializedName("id") val id: String,
|
||||||
@SerializedName("datetime") val datetime: String,
|
@SerializedName("datetime") val datetime: String,
|
||||||
@SerializedName("title") val title: String,
|
@SerializedName("title") val title: String,
|
||||||
|
@SerializedName("content") val content: String,
|
||||||
@SerializedName("unread") val unread: Boolean,
|
@SerializedName("unread") val unread: Boolean,
|
||||||
@SerializedName("starred") val starred: Boolean,
|
@SerializedName("starred") val starred: Boolean,
|
||||||
@SerializedName("thumbnail") val thumbnail: String,
|
@SerializedName("thumbnail") val thumbnail: String,
|
||||||
@ -72,15 +73,16 @@ data class Item(@SerializedName("id") val id: String,
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor(source: Parcel) : this(
|
constructor(source: Parcel) : this(
|
||||||
id = source.readString(),
|
id = source.readString(),
|
||||||
datetime = source.readString(),
|
datetime = source.readString(),
|
||||||
title = source.readString(),
|
title = source.readString(),
|
||||||
unread = 0.toByte() != source.readByte(),
|
content = source.readString(),
|
||||||
starred = 0.toByte() != source.readByte(),
|
unread = 0.toByte() != source.readByte(),
|
||||||
thumbnail = source.readString(),
|
starred = 0.toByte() != source.readByte(),
|
||||||
icon = source.readString(),
|
thumbnail = source.readString(),
|
||||||
link = source.readString(),
|
icon = source.readString(),
|
||||||
sourcetitle = source.readString()
|
link = source.readString(),
|
||||||
|
sourcetitle = source.readString()
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun describeContents() = 0
|
override fun describeContents() = 0
|
||||||
@ -89,6 +91,7 @@ data class Item(@SerializedName("id") val id: String,
|
|||||||
dest.writeString(id)
|
dest.writeString(id)
|
||||||
dest.writeString(datetime)
|
dest.writeString(datetime)
|
||||||
dest.writeString(title)
|
dest.writeString(title)
|
||||||
|
dest.writeString(content)
|
||||||
dest.writeByte((if (unread) 1 else 0))
|
dest.writeByte((if (unread) 1 else 0))
|
||||||
dest.writeByte((if (starred) 1 else 0))
|
dest.writeByte((if (starred) 1 else 0))
|
||||||
dest.writeString(thumbnail)
|
dest.writeString(thumbnail)
|
||||||
|
@ -5,17 +5,18 @@ import retrofit2.http.DELETE
|
|||||||
import retrofit2.http.Field
|
import retrofit2.http.Field
|
||||||
import retrofit2.http.FormUrlEncoded
|
import retrofit2.http.FormUrlEncoded
|
||||||
import retrofit2.http.GET
|
import retrofit2.http.GET
|
||||||
|
import retrofit2.http.Headers
|
||||||
import retrofit2.http.POST
|
import retrofit2.http.POST
|
||||||
import retrofit2.http.Path
|
import retrofit2.http.Path
|
||||||
import retrofit2.http.Query
|
import retrofit2.http.Query
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// codebeat:disable[ARITY]
|
|
||||||
internal interface SelfossService {
|
internal interface SelfossService {
|
||||||
|
|
||||||
@GET("login")
|
@GET("login")
|
||||||
fun loginToSelfoss(@Query("username") username: String, @Query("password") password: String): Call<SuccessResponse>
|
fun loginToSelfoss(@Query("username") username: String, @Query("password") password: String): Call<SuccessResponse>
|
||||||
|
|
||||||
|
|
||||||
@GET("items")
|
@GET("items")
|
||||||
fun getItems(@Query("type") type: String,
|
fun getItems(@Query("type") type: String,
|
||||||
@Query("tag") tag: String?,
|
@Query("tag") tag: String?,
|
||||||
@ -26,17 +27,21 @@ internal interface SelfossService {
|
|||||||
@Query("items") items: Int,
|
@Query("items") items: Int,
|
||||||
@Query("offset") offset: Int): Call<List<Item>>
|
@Query("offset") offset: Int): Call<List<Item>>
|
||||||
|
|
||||||
|
|
||||||
|
@Headers("Content-Type: application/x-www-form-urlencoded")
|
||||||
@POST("mark/{id}")
|
@POST("mark/{id}")
|
||||||
fun markAsRead(@Path("id") id: String,
|
fun markAsRead(@Path("id") id: String,
|
||||||
@Query("username") username: String,
|
@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<SuccessResponse>
|
@Query("password") password: String): Call<SuccessResponse>
|
||||||
|
|
||||||
|
|
||||||
|
@Headers("Content-Type: application/x-www-form-urlencoded")
|
||||||
@POST("unmark/{id}")
|
@POST("unmark/{id}")
|
||||||
fun unmarkAsRead(@Path("id") id: String,
|
fun unmarkAsRead(@Path("id") id: String,
|
||||||
@Query("username") username: String,
|
@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<SuccessResponse>
|
@Query("password") password: String): Call<SuccessResponse>
|
||||||
|
|
||||||
|
|
||||||
@FormUrlEncoded
|
@FormUrlEncoded
|
||||||
@POST("mark")
|
@POST("mark")
|
||||||
fun markAllAsRead(@Field("ids[]") ids: List<String>,
|
fun markAllAsRead(@Field("ids[]") ids: List<String>,
|
||||||
@ -44,12 +49,14 @@ internal interface SelfossService {
|
|||||||
@Query("password") password: String): Call<SuccessResponse>
|
@Query("password") password: String): Call<SuccessResponse>
|
||||||
|
|
||||||
|
|
||||||
|
@Headers("Content-Type: application/x-www-form-urlencoded")
|
||||||
@POST("starr/{id}")
|
@POST("starr/{id}")
|
||||||
fun starr(@Path("id") id: String,
|
fun starr(@Path("id") id: String,
|
||||||
@Query("username") username: String,
|
@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<SuccessResponse>
|
@Query("password") password: String): Call<SuccessResponse>
|
||||||
|
|
||||||
|
|
||||||
|
@Headers("Content-Type: application/x-www-form-urlencoded")
|
||||||
@POST("unstarr/{id}")
|
@POST("unstarr/{id}")
|
||||||
fun unstarr(@Path("id") id: String,
|
fun unstarr(@Path("id") id: String,
|
||||||
@Query("username") username: String,
|
@Query("username") username: String,
|
||||||
@ -70,10 +77,12 @@ internal interface SelfossService {
|
|||||||
fun update(@Query("username") username: String,
|
fun update(@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<String>
|
@Query("password") password: String): Call<String>
|
||||||
|
|
||||||
|
|
||||||
@GET("sources/spouts")
|
@GET("sources/spouts")
|
||||||
fun spouts(@Query("username") username: String,
|
fun spouts(@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<Map<String, Spout>>
|
@Query("password") password: String): Call<Map<String, Spout>>
|
||||||
|
|
||||||
|
|
||||||
@GET("sources/list")
|
@GET("sources/list")
|
||||||
fun sources(@Query("username") username: String,
|
fun sources(@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<List<Sources>>
|
@Query("password") password: String): Call<List<Sources>>
|
||||||
@ -84,6 +93,7 @@ internal interface SelfossService {
|
|||||||
@Query("username") username: String,
|
@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<SuccessResponse>
|
@Query("password") password: String): Call<SuccessResponse>
|
||||||
|
|
||||||
|
|
||||||
@FormUrlEncoded
|
@FormUrlEncoded
|
||||||
@POST("source")
|
@POST("source")
|
||||||
fun createSource(@Field("title") title: String,
|
fun createSource(@Field("title") title: String,
|
||||||
@ -94,4 +104,3 @@ internal interface SelfossService {
|
|||||||
@Query("username") username: String,
|
@Query("username") username: String,
|
||||||
@Query("password") password: String): Call<SuccessResponse>
|
@Query("password") password: String): Call<SuccessResponse>
|
||||||
}
|
}
|
||||||
// codebeat:disable[ARITY]
|
|
@ -24,7 +24,7 @@ import com.ftinc.scoop.Scoop;
|
|||||||
* 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 {
|
public abstract class AppCompatPreferenceActivity extends PreferenceActivity { //NOSONAR
|
||||||
|
|
||||||
private AppCompatDelegate mDelegate;
|
private AppCompatDelegate mDelegate;
|
||||||
|
|
||||||
@ -116,6 +116,7 @@ public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
|
|||||||
getDelegate().onDestroy();
|
getDelegate().onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void invalidateOptionsMenu() {
|
public void invalidateOptionsMenu() {
|
||||||
getDelegate().invalidateOptionsMenu();
|
getDelegate().invalidateOptionsMenu();
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
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;
|
||||||
@ -16,17 +18,15 @@ import android.preference.Preference;
|
|||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
import android.preference.Preference.OnPreferenceClickListener;
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.SwitchPreference;
|
|
||||||
import android.support.v7.app.ActionBar;
|
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.preference.SwitchPreference;
|
||||||
|
import android.support.v7.app.ActionBar;
|
||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
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.utils.Config;
|
import apps.amine.bou.readerforselfoss.utils.Config;
|
||||||
@ -44,7 +44,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 {
|
public class SettingsActivity extends AppCompatPreferenceActivity { //NOSONAR
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
@ -126,6 +126,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
* This method stops fragment injection in malicious applications.
|
* This method stops fragment injection in malicious applications.
|
||||||
* Make sure to deny any unknown fragments here.
|
* Make sure to deny any unknown fragments here.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
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)
|
||||||
@ -166,7 +167,9 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
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();
|
||||||
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.utils
|
||||||
|
|
||||||
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
|
import retrofit2.Response
|
||||||
|
|
||||||
|
fun Response<SuccessResponse>.succeeded(): Boolean =
|
||||||
|
this.code() === 200 && this.body() != null && this.body()!!.isSuccess
|
@ -5,11 +5,8 @@ import android.content.Intent
|
|||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
|
|
||||||
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
|
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R
|
import apps.amine.bou.readerforselfoss.R
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
|
||||||
|
|
||||||
|
|
||||||
fun String?.isEmptyOrNullOrNullString(): Boolean =
|
fun String?.isEmptyOrNullOrNullString(): Boolean =
|
||||||
|
@ -50,7 +50,49 @@ fun Context.buildCustomTabsIntent(): CustomTabsIntent {
|
|||||||
return intentBuilder.build()
|
return intentBuilder.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Context.openItemUrlInternally(linkDecoded: String,
|
||||||
|
content: String,
|
||||||
|
image: String,
|
||||||
|
title: String,
|
||||||
|
source: String,
|
||||||
|
customTabsIntent: CustomTabsIntent,
|
||||||
|
articleViewer: Boolean,
|
||||||
|
app: Activity) {
|
||||||
|
if (articleViewer) {
|
||||||
|
val intent = Intent(this, ReaderActivity::class.java)
|
||||||
|
|
||||||
|
/*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)
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
CustomTabActivityHelper.openCustomTab(app, customTabsIntent, Uri.parse(linkDecoded)
|
||||||
|
) { _, uri ->
|
||||||
|
val intent = Intent(Intent.ACTION_VIEW, uri)
|
||||||
|
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
startActivity(intent)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
openInBrowser(linkDecoded, app)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun Context.openItemUrl(linkDecoded: String,
|
fun Context.openItemUrl(linkDecoded: String,
|
||||||
|
content: String,
|
||||||
|
image: String,
|
||||||
|
title: String,
|
||||||
|
source: String,
|
||||||
customTabsIntent: CustomTabsIntent,
|
customTabsIntent: CustomTabsIntent,
|
||||||
internalBrowser: Boolean,
|
internalBrowser: Boolean,
|
||||||
articleViewer: Boolean,
|
articleViewer: Boolean,
|
||||||
@ -62,29 +104,7 @@ fun Context.openItemUrl(linkDecoded: String,
|
|||||||
if (!internalBrowser) {
|
if (!internalBrowser) {
|
||||||
openInBrowser(linkDecoded, app)
|
openInBrowser(linkDecoded, app)
|
||||||
} else {
|
} else {
|
||||||
if (articleViewer) {
|
this.openItemUrlInternally(linkDecoded, content, image, title, source, customTabsIntent, articleViewer, app)
|
||||||
val intent = Intent(this, ReaderActivity::class.java)
|
|
||||||
|
|
||||||
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)
|
|
||||||
app.startActivity(intent)
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
CustomTabActivityHelper.openCustomTab(app, customTabsIntent, Uri.parse(linkDecoded)
|
|
||||||
) { _, uri ->
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW, uri)
|
|
||||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
|
||||||
startActivity(intent)
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
openInBrowser(linkDecoded, app)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -96,7 +116,7 @@ private fun openInBrowser(linkDecoded: String, app: Activity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun String.isUrlValid(): Boolean =
|
fun String.isUrlValid(): Boolean =
|
||||||
HttpUrl.parse(this) != null && Patterns.WEB_URL.matcher(this).matches()
|
HttpUrl.parse(this) != null && Patterns.WEB_URL.matcher(this).matches()
|
||||||
|
|
||||||
fun String.isBaseUrlValid(): Boolean {
|
fun String.isBaseUrlValid(): Boolean {
|
||||||
val baseUrl = HttpUrl.parse(this)
|
val baseUrl = HttpUrl.parse(this)
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.support.design.widget.CoordinatorLayout
|
||||||
|
import android.support.design.widget.FloatingActionButton
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.View
|
||||||
|
|
||||||
|
class ScrollAwareFABBehavior(context: Context, attrs: AttributeSet) : CoordinatorLayout.Behavior<FloatingActionButton>() {
|
||||||
|
|
||||||
|
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton,
|
||||||
|
directTargetChild: View, target: View, nestedScrollAxes: Int): Boolean {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout,
|
||||||
|
child: FloatingActionButton,
|
||||||
|
target: View, dxConsumed: Int, dyConsumed: Int,
|
||||||
|
dxUnconsumed: Int, dyUnconsumed: Int) {
|
||||||
|
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed)
|
||||||
|
if (dyConsumed > 0 && child.visibility == View.VISIBLE) {
|
||||||
|
child.hide(object : FloatingActionButton.OnVisibilityChangedListener() {
|
||||||
|
override fun onHidden(fab: FloatingActionButton?) {
|
||||||
|
super.onHidden(fab)
|
||||||
|
fab!!.visibility = View.INVISIBLE
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
} else if (dyConsumed < 0 && child.visibility != View.VISIBLE) {
|
||||||
|
child.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,8 @@
|
|||||||
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;
|
||||||
@ -8,8 +11,6 @@ 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.
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
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;
|
||||||
@ -9,10 +13,8 @@ import android.net.Uri;
|
|||||||
import android.support.customtabs.CustomTabsService;
|
import android.support.customtabs.CustomTabsService;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.helpers.KeepAliveService;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import apps.amine.bou.readerforselfoss.utils.customtabs.helpers.KeepAliveService;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("ALL")
|
||||||
class CustomTabsHelper {
|
class CustomTabsHelper {
|
||||||
@ -101,7 +103,7 @@ class CustomTabsHelper {
|
|||||||
List<ResolveInfo> handlers = pm.queryIntentActivities(
|
List<ResolveInfo> handlers = pm.queryIntentActivities(
|
||||||
intent,
|
intent,
|
||||||
PackageManager.GET_RESOLVED_FILTER);
|
PackageManager.GET_RESOLVED_FILTER);
|
||||||
if (handlers == null || handlers.size() == 0) {
|
if (handlers == null || handlers.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (ResolveInfo resolveInfo : handlers) {
|
for (ResolveInfo resolveInfo : handlers) {
|
||||||
|
@ -1,11 +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
|
||||||
|
@ -5,14 +5,11 @@ import android.support.annotation.LayoutRes
|
|||||||
import android.support.annotation.StringRes
|
import android.support.annotation.StringRes
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import apps.amine.bou.readerforselfoss.R
|
||||||
import com.mikepenz.materialdrawer.holder.BadgeStyle
|
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
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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("")
|
||||||
|
@ -6,8 +6,8 @@ import apps.amine.bou.readerforselfoss.utils.getUnsafeHttpClient
|
|||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.GlideBuilder
|
import com.bumptech.glide.GlideBuilder
|
||||||
import com.bumptech.glide.Registry
|
import com.bumptech.glide.Registry
|
||||||
import com.bumptech.glide.module.GlideModule
|
|
||||||
import com.bumptech.glide.load.model.GlideUrl
|
import com.bumptech.glide.load.model.GlideUrl
|
||||||
|
import com.bumptech.glide.module.GlideModule
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
|
||||||
|
|
||||||
|
BIN
app/src/main/res/drawable-hdpi/ic_add.png
Normal file
After Width: | Height: | Size: 134 B |
Before Width: | Height: | Size: 124 B |
BIN
app/src/main/res/drawable-hdpi/ic_chrome_reader_mode.png
Normal file
After Width: | Height: | Size: 216 B |
BIN
app/src/main/res/drawable-hdpi/ic_open_in_browser.png
Normal file
After Width: | Height: | Size: 204 B |
BIN
app/src/main/res/drawable-mdpi/ic_add.png
Normal file
After Width: | Height: | Size: 116 B |
Before Width: | Height: | Size: 86 B |
BIN
app/src/main/res/drawable-mdpi/ic_chrome_reader_mode.png
Normal file
After Width: | Height: | Size: 136 B |
BIN
app/src/main/res/drawable-mdpi/ic_open_in_browser.png
Normal file
After Width: | Height: | Size: 157 B |
BIN
app/src/main/res/drawable-xhdpi/ic_add.png
Normal file
After Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 108 B |
BIN
app/src/main/res/drawable-xhdpi/ic_chrome_reader_mode.png
Normal file
After Width: | Height: | Size: 171 B |
BIN
app/src/main/res/drawable-xhdpi/ic_open_in_browser.png
Normal file
After Width: | Height: | Size: 230 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_add.png
Normal file
After Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 114 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_chrome_reader_mode.png
Normal file
After Width: | Height: | Size: 263 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_open_in_browser.png
Normal file
After Width: | Height: | Size: 318 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_add.png
Normal file
After Width: | Height: | Size: 500 B |
Before Width: | Height: | Size: 119 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_chrome_reader_mode.png
Normal file
After Width: | Height: | Size: 296 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_open_in_browser.png
Normal file
After Width: | Height: | Size: 408 B |
@ -15,7 +15,8 @@
|
|||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
app:theme="@style/ToolBarStyle" />
|
app:theme="@style/ToolBarStyle"
|
||||||
|
app:popupTheme="?attr/toolbarPopupTheme" />
|
||||||
|
|
||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<com.github.stkent.amplify.prompt.DefaultLayoutPromptView
|
<com.github.stkent.amplify.prompt.DefaultLayoutPromptView
|
||||||
android:id="@+id/prompt_view"
|
android:id="@+id/promptView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:prompt_view_user_opinion_question_title="@string/rating_prompt_title"
|
app:prompt_view_user_opinion_question_title="@string/rating_prompt_title"
|
||||||
@ -34,7 +34,7 @@
|
|||||||
android:id="@+id/coordLayout"
|
android:id="@+id/coordLayout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_below="@id/prompt_view">
|
android:layout_below="@id/promptView">
|
||||||
|
|
||||||
<android.support.design.widget.CoordinatorLayout
|
<android.support.design.widget.CoordinatorLayout
|
||||||
android:id="@+id/intern_coordLayout"
|
android:id="@+id/intern_coordLayout"
|
||||||
@ -51,10 +51,11 @@
|
|||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
<android.support.v7.widget.Toolbar
|
<android.support.v7.widget.Toolbar
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolBar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
app:theme="@style/ToolBarStyle" />
|
app:theme="@style/ToolBarStyle"
|
||||||
|
app:popupTheme="?attr/toolbarPopupTheme" />
|
||||||
|
|
||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
@ -88,7 +89,7 @@
|
|||||||
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/my_recycler_view"
|
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"
|
||||||
|
@ -14,7 +14,8 @@
|
|||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
app:theme="@style/ToolBarStyle" />
|
app:theme="@style/ToolBarStyle"
|
||||||
|
app:popupTheme="?attr/toolbarPopupTheme" />
|
||||||
|
|
||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@ -27,7 +28,7 @@
|
|||||||
android:paddingTop="@dimen/activity_vertical_margin">
|
android:paddingTop="@dimen/activity_vertical_margin">
|
||||||
<!-- Login progress -->
|
<!-- Login progress -->
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
android:id="@+id/login_progress"
|
android:id="@+id/loginProgress"
|
||||||
style="?android:attr/progressBarStyleLarge"
|
style="?android:attr/progressBarStyleLarge"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -35,7 +36,7 @@
|
|||||||
android:visibility="gone"/>
|
android:visibility="gone"/>
|
||||||
|
|
||||||
<ScrollView
|
<ScrollView
|
||||||
android:id="@+id/login_form"
|
android:id="@+id/loginForm"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
@ -51,14 +52,13 @@
|
|||||||
>
|
>
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/url"
|
android:id="@+id/urlView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/prompt_url"
|
android:hint="@string/prompt_url"
|
||||||
android:imeOptions="actionUnspecified"
|
android:imeOptions="actionUnspecified"
|
||||||
android:inputType="textUri"
|
android:inputType="textUri"
|
||||||
android:maxLines="1"
|
android:maxLines="1" />
|
||||||
/>
|
|
||||||
|
|
||||||
</android.support.design.widget.TextInputLayout>
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
@ -76,13 +76,12 @@
|
|||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
|
|
||||||
<AutoCompleteTextView
|
<AutoCompleteTextView
|
||||||
android:id="@+id/login"
|
android:id="@+id/loginView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/prompt_login"
|
android:hint="@string/prompt_login"
|
||||||
android:inputType="text"
|
android:inputType="text"
|
||||||
android:maxLines="1"
|
android:maxLines="1" />
|
||||||
/>
|
|
||||||
|
|
||||||
</android.support.design.widget.TextInputLayout>
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
@ -93,13 +92,12 @@
|
|||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/password"
|
android:id="@+id/passwordView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/prompt_password"
|
android:hint="@string/prompt_password"
|
||||||
android:inputType="textPassword"
|
android:inputType="textPassword"
|
||||||
android:maxLines="1"
|
android:maxLines="1" />
|
||||||
/>
|
|
||||||
|
|
||||||
</android.support.design.widget.TextInputLayout>
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
@ -117,7 +115,7 @@
|
|||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/httpLogin"
|
android:id="@+id/httpLoginView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/prompt_http_login" />
|
android:hint="@string/prompt_http_login" />
|
||||||
@ -130,11 +128,11 @@
|
|||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/httpPassword"
|
android:id="@+id/httpPasswordView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="textPassword"
|
android:hint="@string/prompt_http_password"
|
||||||
android:hint="@string/prompt_http_password" />
|
android:inputType="textPassword" />
|
||||||
</android.support.design.widget.TextInputLayout>
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
<Switch
|
<Switch
|
||||||
@ -152,7 +150,7 @@
|
|||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/email_sign_in_button"
|
android:id="@+id/signInButton"
|
||||||
style="?android:textAppearanceSmall"
|
style="?android:textAppearanceSmall"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -1,126 +1,148 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<android.support.constraint.ConstraintLayout
|
<android.support.design.widget.CoordinatorLayout
|
||||||
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"
|
||||||
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.ReaderActivity"
|
|
||||||
android:background="?android:attr/windowBackground">
|
|
||||||
|
|
||||||
<ImageView
|
<android.support.v4.widget.NestedScrollView
|
||||||
android:id="@+id/imageView"
|
android:id="@+id/nestedScrollView"
|
||||||
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/title"
|
|
||||||
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" />
|
|
||||||
|
|
||||||
<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/title"
|
|
||||||
tools:text="Some text @android:string/fingerprint_icon_content_description" />
|
|
||||||
|
|
||||||
<android.support.constraint.ConstraintLayout
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="35dp"
|
android:layout_height="match_parent">
|
||||||
android:layout_marginBottom="0dp"
|
|
||||||
android:layout_marginEnd="0dp"
|
<android.support.constraint.ConstraintLayout
|
||||||
android:layout_marginRight="16dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_height="match_parent">
|
||||||
android:background="#BBBBBB"
|
|
||||||
|
<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_height="wrap_content"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
android:layout_gravity="end|bottom|right">
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/content"
|
|
||||||
app:layout_constraintVertical_bias="1.0">
|
|
||||||
|
|
||||||
<ImageButton
|
<com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
||||||
android:id="@+id/browserBtn"
|
android:id="@+id/floatingToolbar"
|
||||||
android:layout_width="35dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="35dp"
|
android:layout_height="?attr/actionBarSize"
|
||||||
android:layout_centerVertical="true"
|
android:layout_gravity="bottom"
|
||||||
|
app:floatingItemBackground="?attr/colorAccent"
|
||||||
|
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_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_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp"
|
android:layout_marginRight="16dp"
|
||||||
android:layout_toLeftOf="@+id/shareBtn"
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
android:layout_toStartOf="@+id/shareBtn"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
android:adjustViewBounds="true"
|
android:src="@drawable/ic_add"
|
||||||
android:background="@android:color/transparent"
|
app:backgroundTint="?attr/colorAccent"
|
||||||
android:elevation="5dp"
|
app:fabSize="mini"
|
||||||
android:padding="4dp"
|
app:rippleColor="?attr/colorAccentDark" />
|
||||||
android:scaleType="centerCrop"
|
</FrameLayout>
|
||||||
android:src="@drawable/ic_open_in_browser_black_24dp"
|
|
||||||
android:tint="@android:color/black"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/shareBtn"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
|
||||||
|
|
||||||
<ImageButton
|
<FrameLayout
|
||||||
android:id="@+id/shareBtn"
|
android:id="@+id/progressBar"
|
||||||
android:layout_width="35dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="35dp"
|
android:layout_height="match_parent"
|
||||||
android:adjustViewBounds="true"
|
android:visibility="gone"
|
||||||
android:background="@android:color/transparent"
|
android:animateLayoutChanges="true"
|
||||||
android:elevation="5dp"
|
android:alpha="0.8"
|
||||||
android:padding="4dp"
|
android:background="@color/black"
|
||||||
android:scaleType="centerCrop"
|
android:clickable="false">
|
||||||
android:src="@drawable/ic_share_black_24dp"
|
|
||||||
android:tint="@android:color/black"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/browserBtn"
|
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
<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>
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<RelativeLayout
|
<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"
|
||||||
@ -16,28 +16,25 @@
|
|||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
app:theme="@style/ToolBarStyle" />
|
app:theme="@style/ToolBarStyle"
|
||||||
|
app:popupTheme="?attr/toolbarPopupTheme" />
|
||||||
|
|
||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
<android.support.v7.widget.RecyclerView
|
<android.support.v7.widget.RecyclerView
|
||||||
android:id="@+id/activity_sources"
|
android:id="@+id/recyclerView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
</android.support.v7.widget.RecyclerView>
|
</android.support.v7.widget.RecyclerView>
|
||||||
|
|
||||||
<com.melnykov.fab.FloatingActionButton
|
<android.support.design.widget.FloatingActionButton
|
||||||
android:id="@+id/fab"
|
android:id="@+id/fab"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="end|bottom|right"
|
android:layout_gravity="end|bottom|right"
|
||||||
android:src="@drawable/ic_add_black_24dp"
|
android:src="@drawable/ic_add"
|
||||||
android:tint="?android:textColorPrimary"
|
|
||||||
fab:fab_colorNormal="?attr/colorAccent"
|
|
||||||
fab:fab_colorPressed="?attr/colorAccentDark"
|
|
||||||
fab:fab_colorRipple="@color/pink"
|
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
android:layout_alignParentBottom="true"
|
android:layout_alignParentBottom="true"
|
||||||
@ -45,5 +42,6 @@
|
|||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_marginBottom="16dp"
|
android:layout_marginBottom="16dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginRight="16dp"/>
|
android:layout_marginRight="16dp"
|
||||||
</RelativeLayout>
|
app:layout_behavior="apps.amine.bou.readerforselfoss.utils.ScrollAwareFABBehavior" />
|
||||||
|
</android.support.design.widget.CoordinatorLayout>
|
||||||
|
@ -1,55 +1,66 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<android.support.constraint.ConstraintLayout
|
<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"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
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"
|
||||||
android:src="@color/about_libraries_accent"
|
app:layout_constraintBottom_toTopOf="@+id/guideline4"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/actionBar"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
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_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:fontFamily="sans-serif"
|
android:fontFamily="sans-serif"
|
||||||
android:gravity="start"
|
android:gravity="start"
|
||||||
|
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_constraintHorizontal_bias="0.0"
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
app:layout_constraintLeft_toRightOf="@+id/itemImage"
|
app:layout_constraintStart_toEndOf="@+id/itemImage"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintVertical_bias="0.0"
|
||||||
tools:text="Titre" />
|
tools:text="Titre" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/sourceTitleAndDate"
|
android:id="@+id/sourceTitleAndDate"
|
||||||
android:textSize="14sp"
|
android:layout_width="0dp"
|
||||||
tools:text="Google Actualité Il y a 5h"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:gravity="start"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/title"
|
android:textSize="14sp"
|
||||||
android:layout_marginTop="8dp"
|
app:layout_constraintBottom_toTopOf="@+id/guideline4"
|
||||||
app:layout_constraintLeft_toLeftOf="@+id/title"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
android:gravity="start" />
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/itemImage"
|
||||||
|
tools:text="Google Actualité Il y a 5h" />
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
android:id="@+id/actionBar"
|
android:id="@+id/actionBar"
|
||||||
@ -58,9 +69,11 @@
|
|||||||
android:background="#BBBBBB"
|
android:background="#BBBBBB"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/sourceTitleAndDate">
|
app:layout_constraintTop_toTopOf="@+id/guideline4"
|
||||||
|
app:layout_constraintVertical_bias="1.0"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
<com.like.LikeButton
|
<com.like.LikeButton
|
||||||
android:id="@+id/favButton"
|
android:id="@+id/favButton"
|
||||||
@ -68,7 +81,6 @@
|
|||||||
android:layout_height="35dp"
|
android:layout_height="35dp"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
|
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginRight="8dp"
|
||||||
@ -110,7 +122,7 @@
|
|||||||
android:padding="4dp"
|
android:padding="4dp"
|
||||||
android:scaleType="centerCrop"
|
android:scaleType="centerCrop"
|
||||||
android:src="@drawable/ic_open_in_browser_black_24dp" />
|
android:src="@drawable/ic_open_in_browser_black_24dp" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
</android.support.constraint.ConstraintLayout>
|
@ -9,6 +9,7 @@
|
|||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?attr/actionBarSize"
|
android:layout_height="?attr/actionBarSize"
|
||||||
app:theme="@style/ToolBarStyle" />
|
app:theme="@style/ToolBarStyle"
|
||||||
|
app:popupTheme="?attr/toolbarPopupTheme" />
|
||||||
|
|
||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
@ -3,7 +3,7 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/loging_debug"
|
android:id="@+id/login_debug"
|
||||||
android:checkable="true"
|
android:checkable="true"
|
||||||
android:checked="false"
|
android:checked="false"
|
||||||
android:icon="@drawable/ic_bug_report"
|
android:icon="@drawable/ic_bug_report"
|
||||||
|
25
app/src/main/res/menu/reader_toolbar.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/more_action"
|
||||||
|
android:icon="@drawable/ic_chrome_reader_mode"
|
||||||
|
android:title="@string/reader_action_more"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/open_action"
|
||||||
|
android:icon="@drawable/ic_open_in_browser"
|
||||||
|
android:iconTint="@color/white"
|
||||||
|
android:title="@string/reader_action_open"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/share_action"
|
||||||
|
android:icon="@drawable/ic_share_white_24dp"
|
||||||
|
android:title="@string/reader_action_share"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
</menu>
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) 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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -6,20 +6,20 @@
|
|||||||
<string name="prompt_password">"Mot de passe"</string>
|
<string name="prompt_password">"Mot de passe"</string>
|
||||||
<string name="prompt_http_password">"Mot de passe HTTP"</string>
|
<string name="prompt_http_password">"Mot de passe HTTP"</string>
|
||||||
<string name="action_sign_in">"Valider"</string>
|
<string name="action_sign_in">"Valider"</string>
|
||||||
<string name="error_invalid_password">"Mot de passe pas assez lent"</string>
|
<string name="error_invalid_password">"Mot de passe trop court"</string>
|
||||||
<string name="error_field_required">"Champ requis"</string>
|
<string name="error_field_required">"Champ requis"</string>
|
||||||
<string name="prompt_url">"Url Selfoss"</string>
|
<string name="prompt_url">"Url Selfoss"</string>
|
||||||
<string name="withLoginSwitch">"Avec login ?"</string>
|
<string name="withLoginSwitch">"Avec login ?"</string>
|
||||||
<string name="withHttpLoginSwitch">"Avec login HTTP ?"</string>
|
<string name="withHttpLoginSwitch">"Avec login HTTP ?"</string>
|
||||||
<string name="login_url_problem">"Petit soucis. Il manque peut être un / à la fin ?"</string>
|
<string name="login_url_problem">"Petit souci. Il manque peut être un / à la fin ?"</string>
|
||||||
<string name="prompt_login">"Utilisateur"</string>
|
<string name="prompt_login">"Utilisateur"</string>
|
||||||
<string name="prompt_http_login">"Utilisateur HTTP"</string>
|
<string name="prompt_http_login">"Utilisateur HTTP"</string>
|
||||||
<string name="label_share">"Partager"</string>
|
<string name="label_share">"Partager"</string>
|
||||||
<string name="readAll">"Tout lire"</string>
|
<string name="readAll">"Tout lire"</string>
|
||||||
<string name="action_disconnect">"Déconnecter"</string>
|
<string name="action_disconnect">"Déconnecter"</string>
|
||||||
<string name="title_activity_settings">"Paramètres"</string>
|
<string name="title_activity_settings">"Paramètres"</string>
|
||||||
<string name="pref_header_general">"General"</string>
|
<string name="pref_header_general">"Général"</string>
|
||||||
<string name="pref_switch_actions_tap_title">"Action du clique sur un article"</string>
|
<string name="pref_switch_actions_tap_title">"Action du clic sur un article"</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">"Lien"</string>
|
<string name="add_source_hint_url">"Lien"</string>
|
||||||
<string name="add_source_hint_name">"Nom"</string>
|
<string name="add_source_hint_name">"Nom"</string>
|
||||||
@ -101,20 +101,20 @@
|
|||||||
<string name="card_height_on">La taille de la carte s\'adaptera au contenu</string>
|
<string name="card_height_on">La taille de la carte s\'adaptera au contenu</string>
|
||||||
<string name="card_height_off">La taille de la carte sera fixe</string>
|
<string name="card_height_off">La taille de la carte sera fixe</string>
|
||||||
<string name="source_code">Code source</string>
|
<string name="source_code">Code source</string>
|
||||||
<string name="cant_mark_read">Kan het artikel niet als gelezen markeren</string>
|
<string name="cant_mark_read">Impossible de marquer l\'article comme lu</string>
|
||||||
<string name="drawer_error_loading_tags">Erreur lors du chargement des tags…</string>
|
<string name="drawer_error_loading_tags">Erreur lors du chargement des tags…</string>
|
||||||
<string name="drawer_error_loading_sources">Erreur lors du chargement des sources…</string>
|
<string name="drawer_error_loading_sources">Erreur lors du chargement des sources…</string>
|
||||||
<string name="drawer_item_filters">Filtres</string>
|
<string name="drawer_item_filters">Filtres</string>
|
||||||
<string name="drawer_action_clear">raz</string>
|
<string name="drawer_action_clear">raz</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">Sources</string>
|
||||||
<string name="drawer_action_edit">editer</string>
|
<string name="drawer_action_edit">éditer</string>
|
||||||
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Impossible de mettre en cache les filtres pour le drawer</string>
|
<string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Impossible de mettre en cache les filtres pour le drawer</string>
|
||||||
<string name="no_tags_loaded">Pas de tags chargés</string>
|
<string name="no_tags_loaded">Pas de tags chargés</string>
|
||||||
<string name="no_sources_loaded">Pas de sources chargés</string>
|
<string name="no_sources_loaded">Pas de sources chargés</string>
|
||||||
<string name="drawer_loading">Chargement …</string>
|
<string name="drawer_loading">Chargement …</string>
|
||||||
<string name="menu_home_search">Rechercher</string>
|
<string name="menu_home_search">Rechercher</string>
|
||||||
<string name="can_delete_source">Can\'t delete the source…</string>
|
<string name="can_delete_source">Impossible de supprimer la source…</string>
|
||||||
<string name="base_url_error">Il y a eu un souci lors de la communication avec votre instance Selfoss. Si le problèmes persiste, contactez-moi pour trouver une solution.</string>
|
<string name="base_url_error">Il y a eu un souci lors de la communication avec votre instance Selfoss. Si le problèmes persiste, contactez-moi pour trouver une solution.</string>
|
||||||
<string name="pref_header_theme">Thèmes</string>
|
<string name="pref_header_theme">Thèmes</string>
|
||||||
<string name="default_theme">Par défaut</string>
|
<string name="default_theme">Par défaut</string>
|
||||||
@ -132,7 +132,7 @@
|
|||||||
<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 loguer toutes les erreurs de conexion</string>
|
<string name="login_debug_title">Activez pour logguer 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>
|
||||||
@ -142,7 +142,7 @@
|
|||||||
<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>
|
||||||
<string name="read_debug_off">Aucun log quand un article est marqué comme lu</string>
|
<string name="read_debug_off">Aucun log quand un article est marqué comme lu</string>
|
||||||
<string name="read_debug_on">Les appels API vont être logués lorsequ\'un article est marqué comme lu</string>
|
<string name="read_debug_on">Les appels API vont être logués lorsqu\'un article est marqué comme lu</string>
|
||||||
<string name="summary_debug_identifier">Identifiant de debug</string>
|
<string name="summary_debug_identifier">Identifiant de debug</string>
|
||||||
<string name="unique_id_to_clipboard">Texte copié</string>
|
<string name="unique_id_to_clipboard">Texte copié</string>
|
||||||
<string name="display_header_drawer_summary">Afficher une entête avec l\'url de votre instance de Selfoss en haut du drawer lateral.</string>
|
<string name="display_header_drawer_summary">Afficher une entête avec l\'url de votre instance de Selfoss en haut du drawer lateral.</string>
|
||||||
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Log de tous les appels à l\'API</string>
|
<string name="login_everything_title">Log de tous les appels à l\'API</string>
|
||||||
<string name="login_everything_on">Tous les appels à l\'API vont êtres logués</string>
|
<string name="login_everything_on">Tous les appels à l\'API vont êtres logués</string>
|
||||||
<string name="login_everything_off">Aucun appel à l\'API ne sera logué</string>
|
<string name="login_everything_off">Aucun appel à l\'API ne sera logué</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Charger plus d\'articles au scroll</string>
|
<string name="pref_general_infinite_loading_title">Charger plus d\'articles au scroll</string>
|
||||||
<string name="translation">Traduction</string>
|
<string name="translation">Traduction</string>
|
||||||
<string name="cant_open_invalid_url">L’url de l’élément n’est pas valide. En attendant la résolution du problème, le lien ne s\'ouvrira pas.</string>
|
<string name="cant_open_invalid_url">L’url de l’élément n’est pas valide. En attendant la résolution du problème, le lien ne s\'ouvrira pas.</string>
|
||||||
<string name="drawer_report_bug">Signaler un bug</string>
|
<string name="drawer_report_bug">Signaler un bug</string>
|
||||||
|
<string name="items_number_should_be_number">Le nombre d\'articles doit être un entier.</string>
|
||||||
|
<string name="reader_action_more">Lire plus</string>
|
||||||
|
<string name="reader_action_open">Ouvrir</string>
|
||||||
|
<string name="reader_action_share">Partager</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</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">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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -2,156 +2,160 @@
|
|||||||
<!--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">"Entrar"</string>
|
||||||
<string name="prompt_password">"Password"</string>
|
<string name="prompt_password">"Senha"</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">"Vamos lá"</string>
|
||||||
<string name="error_invalid_password">"Password not long enough"</string>
|
<string name="error_invalid_password">"Senha muito pequena"</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 o login ?"</string>
|
||||||
<string name="withHttpLoginSwitch">"HTTP Login required ?"</string>
|
<string name="withHttpLoginSwitch">"É necessário o login 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">"Oops. Talvez você precise adicionar uma \"/\" no final da url."</string>
|
||||||
<string name="prompt_login">"Username"</string>
|
<string name="prompt_login">"Usuário"</string>
|
||||||
<string name="prompt_http_login">"HTTP Username"</string>
|
<string name="prompt_http_login">"Usuário HTTP"</string>
|
||||||
<string name="label_share">"Share"</string>
|
<string name="label_share">"Compartilhar"</string>
|
||||||
<string name="readAll">"Read all"</string>
|
<string name="readAll">"Ler todos"</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">"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">"Ação de tocar nos 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 os detalhes novamente."</string>
|
||||||
<string name="all_posts_not_read">"All posts weren't read"</string>
|
<string name="all_posts_not_read">"Nenhum post foi lido"</string>
|
||||||
<string name="all_posts_read">"All posts were read"</string>
|
<string name="all_posts_read">"Todos os posts foram lidos"</string>
|
||||||
<string name="cant_get_favs">"Can't get favorites"</string>
|
<string name="cant_get_favs">"Não consigo obter os favoritos"</string>
|
||||||
<string name="cant_get_new_elements">"Can't get new articles"</string>
|
<string name="cant_get_new_elements">"Não consigo obter novos artigos"</string>
|
||||||
<string name="cant_get_read">"Can't get read articles"</string>
|
<string name="cant_get_read">"Não consigo 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">"Todos"</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">"Faça login 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 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 spouts."</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">"Informe um erro ou peça um novo recurso"</string>
|
||||||
<string name="warning_wrong_url">"WARNING"</string>
|
<string name="warning_wrong_url">"ATENÇÃO"</string>
|
||||||
<string name="pref_switch_card_view_title">"Card View"</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_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 é possível 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">"Aproveitando o app ?"</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">"Na verdade não …"</string>
|
||||||
<string name="rating_prompt_feedback_title">"Can you tell us why ?"</string>
|
<string name="rating_prompt_feedback_title">"Você pode nos dizer o porquê ?"</string>
|
||||||
<string name="rating_prompt_feedback_yes">"OK !"</string>
|
<string name="rating_prompt_feedback_yes">"OK !"</string>
|
||||||
<string name="rating_prompt_feedback_no">"Not now."</string>
|
<string name="rating_prompt_feedback_no">"Não agora."</string>
|
||||||
<string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string>
|
<string name="rating_prompt_rating_title">"Ótimo ! Você pode nos avaliar na loja ?"</string>
|
||||||
<string name="rating_prompt_rating_yes">"Sure !"</string>
|
<string name="rating_prompt_rating_yes">"Com certeza !"</string>
|
||||||
<string name="rating_prompt_rating_no">"Not right now."</string>
|
<string name="rating_prompt_rating_no">"Não agora."</string>
|
||||||
<string name="rating_prompt_thanks">"Thanks, your feedback help enhance the app !"</string>
|
<string name="rating_prompt_thanks">"Obrigado, seu comentário ajuda a melhorar 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 de artigos não lidos como um badge na barra inferior."</string>
|
||||||
<string name="switch_unread_count_title">"Display unread count"</string>
|
<string name="switch_unread_count_title">"Exibir contagem de artigos não lidos"</string>
|
||||||
<string name="display_all_counts_title">"Display count for favorite and read"</string>
|
<string name="display_all_counts_title">"Exibir contagem de lidos e favoritos"</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">"Experimente este aplicativo para seus feeds RSS do 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">"Eu uso o app para o visualizar meu feed RSS do Selfoss. Você vai gostar também !"</string>
|
||||||
<string name="invitation_cta">"Try the app"</string>
|
<string name="invitation_cta">"Experimente 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">"Parece que você está tentando utilizar uma URL inválida. 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 aplicativo"</string>
|
||||||
<string name="pref_general_internal_browser_on">"Articles will open inside the app"</string>
|
<string name="pref_general_internal_browser_on">"Os artigos serão abertos 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">"Os artigos serão abertos com 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 artigos"</string>
|
||||||
<string name="prefer_article_viewer_on">"Will use the article viewer instead of the internal browser"</string>
|
<string name="prefer_article_viewer_on">"Usará o visualizador de artigos em vez do navegador"</string>
|
||||||
<string name="prefer_article_viewer_off">"Will use the internal browser instead of the article viewer"</string>
|
<string name="prefer_article_viewer_off">"Utilizará o navegador em vez do visualizador de artigos"</string>
|
||||||
<string name="pref_general_category_links">"Link handeling"</string>
|
<string name="pref_general_category_links">"Manipulação de links"</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 no formato de cards"</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 em 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">"Atualizar controle remoto"</string>
|
||||||
<string name="refresh_success_response">"The remote is updated, you can now reload the articles list"</string>
|
<string name="refresh_success_response">"O controle remoto foi atualizado, agora você 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 funcionou, tente novamente mais tarde ou verifique seus logs do Selfoss."</string>
|
||||||
<string name="refresh_in_progress">"Refresh in progress"</string>
|
<string name="refresh_in_progress">"Atualização em progresso"</string>
|
||||||
<string name="new_apk_available_title">"A new APK is available."</string>
|
<string name="new_apk_available_title">"Um novo APK está disponível."</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 novo APK 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">"Baixar agora"</string>
|
||||||
<string name="new_apk_available_no">"Ignore version"</string>
|
<string name="new_apk_available_no">"Ignorar"</string>
|
||||||
<string name="intro_hello_title">"Hi there !"</string>
|
<string name="intro_hello_title">"Olá !"</string>
|
||||||
<string name="intro_hello_message">"Thanks for downloading the app !"</string>
|
<string name="intro_hello_message">"Obrigado por baixar o app !"</string>
|
||||||
<string name="intro_needs_selfoss_title">"Before you start…"</string>
|
<string name="intro_needs_selfoss_title">"Antes que você comece…"</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 aplicativo sem uma instância do 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 pronto !"</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 aplicativo. Não se esqueça de acessar a página de configurações para configurar seu aplicativo e onde você encontrará alguns links úteis."</string>
|
||||||
<string name="card_height_title">Full height cards</string>
|
<string name="card_height_title">Cards com altura total</string>
|
||||||
<string name="card_height_on">Cards height will adjust to its content</string>
|
<string name="card_height_on">Cards com altura ajustáveis de acordo com o conteúdo</string>
|
||||||
<string name="card_height_off">Card height will be fixed</string>
|
<string name="card_height_off">Cards com altura de tamanho fixo</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 é possível 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 as tags…</string>
|
||||||
<string name="drawer_error_loading_sources">Error loading sources…</string>
|
<string name="drawer_error_loading_sources">Erro ao carregar as 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">Tags</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 foi possível recuperar os dados em cache</string>
|
||||||
<string name="no_tags_loaded">No tags loaded</string>
|
<string name="no_tags_loaded">Nenhuma tag carregada</string>
|
||||||
<string name="no_sources_loaded">No sources loaded</string>
|
<string name="no_sources_loaded">Nenhuma fonte carregada</string>
|
||||||
<string name="drawer_loading">Loading …</string>
|
<string name="drawer_loading">Carregando …</string>
|
||||||
<string name="menu_home_search">Search</string>
|
<string name="menu_home_search">Procurar</string>
|
||||||
<string name="can_delete_source">Can\'t delete the source…</string>
|
<string name="can_delete_source">Não foi possível apagar 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 o seu Selfoss. Se o problema persistir, 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">Padrão</string>
|
||||||
<string name="teal_orange_theme">Teal/Orange/Light</string>
|
<string name="teal_orange_theme">Cerceta/Laranja/Claro</string>
|
||||||
<string name="cyan_pink_theme">Cyan/Pink/Light</string>
|
<string name="cyan_pink_theme">Ciano/Rosa/Claro</string>
|
||||||
<string name="grey_orange_theme">Grey/Orange/Light</string>
|
<string name="grey_orange_theme">Cinza/Laranja/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">Vermelho/Cerceta/Claro</string>
|
||||||
<string name="teal_orange_dark_theme">Teal/Orange/Dark</string>
|
<string name="teal_orange_dark_theme">Cerceta/Laranja/Escuro</string>
|
||||||
<string name="cyan_pink_dark_theme">Cyan/Pink/Dark</string>
|
<string name="cyan_pink_dark_theme">Ciano/Rosa/Escuro</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/Escuro</string>
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
<string name="red_teal_dark_theme">Vermelho/Âmbar/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 login</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">Nenhum 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 autônomo ?</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 motivos de segurança, certificados autônomos não são suportados por padrão. Ao ativar, não serei responsável por qualquer problema de segurança que você encontre.</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">Quantidade de itens carregados</string>
|
||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">Ler os artigos que aparecem como não lidos ?</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">Nenhum registro ao 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">As chamadas Api serão registradas ao marcar um artigo como lido</string>
|
||||||
<string name="summary_debug_identifier">Debug identifier</string>
|
<string name="summary_debug_identifier">Identificador de depuração</string>
|
||||||
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
<string name="unique_id_to_clipboard">Identificador copiado 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 da instância do Selfoss na barra lateral.</string>
|
||||||
<string name="display_header_drawer_title">Account header</string>
|
<string name="display_header_drawer_title">Cabeçalho da conta</string>
|
||||||
<string name="login_everything_title">Logging every api calls</string>
|
<string name="login_everything_title">Registrando todas as chamadas a api</string>
|
||||||
<string name="login_everything_on">This will log every api call for debug purpose.</string>
|
<string name="login_everything_on">Isso registrará todas as chamadas 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 a api será registrada</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Carregar mais artigos ao realizar o scroll</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Traduções</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 está inválida. Estou tentando resolver esse problema para que o aplicativo não encerre.</string>
|
||||||
<string name="drawer_report_bug">Report a bug</string>
|
<string name="drawer_report_bug">Reportar erro</string>
|
||||||
|
<string name="items_number_should_be_number">O número dos itens deve ser um número inteiro.</string>
|
||||||
|
<string name="reader_action_more">Leia mais</string>
|
||||||
|
<string name="reader_action_open">Abrir no navegador</string>
|
||||||
|
<string name="reader_action_share">Compartilhar</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -150,8 +150,12 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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">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>
|
</resources>
|
||||||
|
@ -151,10 +151,14 @@
|
|||||||
<string name="login_everything_title">Logging every api calls</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_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="login_everything_off">No api call will be logged</string>
|
||||||
<string name="pref_general_infinite_loading_title">(BETA) Load more articles on scroll</string>
|
<string name="pref_general_infinite_loading_title">Load more articles on scroll</string>
|
||||||
<string name="translation">Translation</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="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="report_github_user" translatable="false">aminecmi</string>
|
<string name="report_github_user" translatable="false">aminecmi</string>
|
||||||
<string name="report_github_repo" translatable="false">ReaderforSelfoss</string>
|
<string name="report_github_repo" translatable="false">ReaderforSelfoss</string>
|
||||||
<string name="drawer_report_bug">Report a bug</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>
|
</resources>
|
@ -14,6 +14,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarDark" parent="MaterialDrawerTheme">
|
<style name="NoBarDark" parent="MaterialDrawerTheme">
|
||||||
@ -27,6 +29,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- ToolBar -->
|
<!-- ToolBar -->
|
||||||
@ -50,6 +54,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarBlueAmberDark" parent="MaterialDrawerTheme">
|
<style name="NoBarBlueAmberDark" parent="MaterialDrawerTheme">
|
||||||
@ -63,6 +69,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarGreyOrange" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarGreyOrange" parent="MaterialDrawerTheme.Light">
|
||||||
@ -75,6 +83,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarGreyOrangeDark" parent="MaterialDrawerTheme">
|
<style name="NoBarGreyOrangeDark" parent="MaterialDrawerTheme">
|
||||||
@ -88,6 +98,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarIndigoPink" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarIndigoPink" parent="MaterialDrawerTheme.Light">
|
||||||
@ -100,6 +112,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarIndigoPinkDark" parent="MaterialDrawerTheme">
|
<style name="NoBarIndigoPinkDark" parent="MaterialDrawerTheme">
|
||||||
@ -113,6 +127,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarRedTeal" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarRedTeal" parent="MaterialDrawerTheme.Light">
|
||||||
@ -125,6 +141,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarRedTealDark" parent="MaterialDrawerTheme">
|
<style name="NoBarRedTealDark" parent="MaterialDrawerTheme">
|
||||||
@ -138,6 +156,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarCyanPink" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarCyanPink" parent="MaterialDrawerTheme.Light">
|
||||||
@ -150,6 +170,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarCyanPinkDark" parent="MaterialDrawerTheme">
|
<style name="NoBarCyanPinkDark" parent="MaterialDrawerTheme">
|
||||||
@ -163,6 +185,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
@ -176,6 +200,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarTealOrangeDark" parent="MaterialDrawerTheme">
|
<style name="NoBarTealOrangeDark" parent="MaterialDrawerTheme">
|
||||||
@ -189,6 +215,8 @@
|
|||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
|
|
||||||
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.App.Light" parent="Theme.IssueReporter.Light.DarkActionBar">
|
<style name="Theme.App.Light" parent="Theme.IssueReporter.Light.DarkActionBar">
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="loging_debug"
|
android:key="login_debug"
|
||||||
android:summaryOff="@string/login_debug_off"
|
android:summaryOff="@string/login_debug_off"
|
||||||
android:summaryOn="@string/login_debug_on"
|
android:summaryOn="@string/login_debug_on"
|
||||||
android:title="@string/login_debug_title" />
|
android:title="@string/login_debug_title" />
|
||||||
|
@ -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.51'
|
ext.kotlin_version = '1.1.60'
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
google()
|
google()
|
||||||
@ -10,12 +10,12 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.0.0'
|
classpath 'com.android.tools.build:gradle:3.0.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.0'
|
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
|
// 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"
|
classpath "com.github.Shusshu:sonar-scanner-gradle:feature~support-android-gradle-3-SNAPSHOT"
|
||||||
|