Compare commits
	
		
			16 Commits
		
	
	
		
			v171901015
			...
			v171905137
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					84f1ab12cf | ||
| 
						 | 
					f48f6ed788 | ||
| 
						 | 
					e517803bd8 | ||
| 
						 | 
					3eaf390790 | ||
| 
						 | 
					6de54d63e6 | ||
| 
						 | 
					dd7a2f476b | ||
| 
						 | 
					1485cc05f4 | ||
| 
						 | 
					d1dad3e61a | ||
| 
						 | 
					e5024b0420 | ||
| 
						 | 
					9b01692c55 | ||
| 
						 | 
					33aa587d36 | ||
| 
						 | 
					12e0766803 | ||
| 
						 | 
					a8721ad7a4 | ||
| 
						 | 
					bc5e882894 | ||
| 
						 | 
					e3460322b1 | ||
| 
						 | 
					7e3288a076 | 
							
								
								
									
										17
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								README.md
									
									
									
									
									
								
							@@ -1,20 +1,10 @@
 | 
			
		||||
# ReaderForSelfoss
 | 
			
		||||
# ReaderForSelfoss **(Only available from F-Droid)**
 | 
			
		||||
 | 
			
		||||
[](https://join.slack.com/t/readerforselfoss/shared_invite/enQtMjkyNzc3NjM2Mjc1LTUzZTZhOGM5YjQ1MTI5MWZiODRjMjE1ZDBmMzQxZmQ3NWZhYTNhMTBjNGEwNmE2ZGFjODU5NjUxZjBkMWJmMDQ) [](https://jenkins.amine-bou.fr/job/ReaderForSelfoss/) [](https://www.codetriage.com/aminecmi/readerforselfoss) [](https://crowdin.com/project/readerforselfoss)
 | 
			
		||||
[](https://crowdin.com/project/readerforselfoss)
 | 
			
		||||
 | 
			
		||||
It's an RSS Reader for Android, that **only** works with [Selfoss](https://selfoss.aditu.de/)
 | 
			
		||||
 | 
			
		||||
<a href='https://play.google.com/store/apps/details?id=apps.amine.bou.readerforselfoss'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="100"/></a> <a href="https://f-droid.org/packages/apps.amine.bou.readerforselfoss"><img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="100"></a>
 | 
			
		||||
 | 
			
		||||
Also, the last APK built from source is available [here](https://jenkins.amine-bou.fr/job/ReaderForSelfoss/lastSuccessfulBuild/artifact/SignApksBuilder-out/selfoss-key/selfoss/app-githubConfig-release-unsigned.apk/app-githubConfig-release.apk).
 | 
			
		||||
 | 
			
		||||
## Join the alpha channel
 | 
			
		||||
 | 
			
		||||
**Keep in mind, it could be instable, but you'll have the new updates faster**
 | 
			
		||||
 | 
			
		||||
- First, join the google [group](https://groups.google.com/d/forum/reader-for-selfoss-alpha-testing).
 | 
			
		||||
- Then, join the [alpha channel](https://play.google.com/apps/testing/apps.amine.bou.readerforselfoss) of the app.
 | 
			
		||||
- You'll be able to update the app for the current alpha version.
 | 
			
		||||
<a href="https://f-droid.org/packages/apps.amine.bou.readerforselfoss"><img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="100"></a>
 | 
			
		||||
 | 
			
		||||
## Want to help ?
 | 
			
		||||
 | 
			
		||||
@@ -30,4 +20,3 @@ Also, the last APK built from source is available [here](https://jenkins.amine-b
 | 
			
		||||
- [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)
 | 
			
		||||
- [Help translation the app](https://crowdin.com/project/readerforselfoss)
 | 
			
		||||
- [Ask for help](https://join.slack.com/t/readerforselfoss/shared_invite/enQtMjkyNzc3NjM2Mjc1LTUzZTZhOGM5YjQ1MTI5MWZiODRjMjE1ZDBmMzQxZmQ3NWZhYTNhMTBjNGEwNmE2ZGFjODU5NjUxZjBkMWJmMDQ)
 | 
			
		||||
 
 | 
			
		||||
@@ -72,9 +72,6 @@ android {
 | 
			
		||||
                    'proguard-rules.pro'
 | 
			
		||||
        }
 | 
			
		||||
        debug {
 | 
			
		||||
            buildConfigField "String", "LOGIN_URL", appLoginUrl
 | 
			
		||||
            buildConfigField "String", "LOGIN_USERNAME", appLoginUsername
 | 
			
		||||
            buildConfigField "String", "LOGIN_PASSWORD", appLoginPassword
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    flavorDimensions "build"
 | 
			
		||||
@@ -83,33 +80,28 @@ android {
 | 
			
		||||
            versionNameSuffix '-github'
 | 
			
		||||
            dimension "build"
 | 
			
		||||
        }
 | 
			
		||||
        storeConfig {
 | 
			
		||||
            // As jenkins publishes to alpha first, this is the default suffix now.
 | 
			
		||||
            versionNameSuffix '-store'
 | 
			
		||||
            dimension "build"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    // Testing
 | 
			
		||||
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-beta02'
 | 
			
		||||
    androidTestImplementation 'androidx.test:runner:1.1.0-beta02'
 | 
			
		||||
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-beta01'
 | 
			
		||||
    androidTestImplementation 'androidx.test:runner:1.2.0-beta01'
 | 
			
		||||
    // Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
 | 
			
		||||
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.1.0-beta02'
 | 
			
		||||
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0-beta01'
 | 
			
		||||
    // Espresso-intents for validation and stubbing of Intents
 | 
			
		||||
    androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0-beta02'
 | 
			
		||||
    androidTestImplementation 'androidx.test.espresso:espresso-intents:3.2.0-beta01'
 | 
			
		||||
    implementation fileTree(include: ['*.jar'], dir: 'libs')
 | 
			
		||||
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
 | 
			
		||||
    // Android Support
 | 
			
		||||
    implementation "androidx.appcompat:appcompat:$android_version"
 | 
			
		||||
    implementation "com.google.android.material:material:$android_version"
 | 
			
		||||
    implementation "androidx.recyclerview:recyclerview:$android_version"
 | 
			
		||||
    implementation "androidx.appcompat:appcompat:$androidx_version"
 | 
			
		||||
    implementation "com.google.android.material:material:1.1.0-alpha06"
 | 
			
		||||
    implementation "androidx.recyclerview:recyclerview:1.1.0-alpha05"
 | 
			
		||||
    implementation "androidx.legacy:legacy-support-v4:$android_version"
 | 
			
		||||
    implementation "androidx.vectordrawable:vectordrawable:$android_version"
 | 
			
		||||
    implementation "androidx.vectordrawable:vectordrawable:1.1.0-beta01"
 | 
			
		||||
    implementation "androidx.browser:browser:$android_version"
 | 
			
		||||
    implementation "androidx.cardview:cardview:$android_version"
 | 
			
		||||
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
 | 
			
		||||
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha5'
 | 
			
		||||
 | 
			
		||||
    //multidex
 | 
			
		||||
    implementation 'androidx.multidex:multidex:2.0.1'
 | 
			
		||||
@@ -126,7 +118,7 @@ dependencies {
 | 
			
		||||
    implementation 'com.burgstaller:okhttp-digest:1.12'
 | 
			
		||||
 | 
			
		||||
    // Material-ish things
 | 
			
		||||
    implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5'
 | 
			
		||||
    implementation 'com.ashokvarma.android:bottom-navigation-bar:2.1.0'
 | 
			
		||||
    implementation 'com.github.jd-alexander:LikeButton:0.2.3'
 | 
			
		||||
    implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
 | 
			
		||||
 | 
			
		||||
@@ -134,11 +126,8 @@ dependencies {
 | 
			
		||||
    implementation 'com.github.bumptech.glide:glide:4.1.1'
 | 
			
		||||
    implementation 'com.github.bumptech.glide:okhttp3-integration:4.1.1'
 | 
			
		||||
 | 
			
		||||
    // Asking politely users to rate the app
 | 
			
		||||
    implementation 'com.github.stkent:amplify:2.2.0'
 | 
			
		||||
 | 
			
		||||
    // Drawer
 | 
			
		||||
    implementation 'co.zsmb:materialdrawer-kt:2.0.1'
 | 
			
		||||
    implementation 'co.zsmb:materialdrawer-kt:2.0.2'
 | 
			
		||||
 | 
			
		||||
    // Themes
 | 
			
		||||
    implementation 'com.52inc:scoops:1.0.0'
 | 
			
		||||
@@ -148,11 +137,11 @@ dependencies {
 | 
			
		||||
    // Pager
 | 
			
		||||
    implementation 'me.relex:circleindicator:2.0.0@aar'
 | 
			
		||||
 | 
			
		||||
    implementation 'androidx.core:core-ktx:1.0.0'
 | 
			
		||||
    implementation 'androidx.core:core-ktx:1.1.0-beta01'
 | 
			
		||||
 | 
			
		||||
    // Crash
 | 
			
		||||
    implementation 'ch.acra:acra-http:5.2.1'
 | 
			
		||||
    implementation 'ch.acra:acra-dialog:5.2.1'
 | 
			
		||||
    implementation 'ch.acra:acra-http:5.3.0'
 | 
			
		||||
    implementation 'ch.acra:acra-dialog:5.3.0'
 | 
			
		||||
 | 
			
		||||
    implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
 | 
			
		||||
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
 | 
			
		||||
@@ -161,21 +150,4 @@ dependencies {
 | 
			
		||||
    kapt "androidx.room:room-compiler:$room_version"
 | 
			
		||||
 | 
			
		||||
    implementation "android.arch.work:work-runtime-ktx:$work_version"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
afterEvaluate {
 | 
			
		||||
    initAppLoginPropertiesIfNeeded()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
def initAppLoginPropertiesIfNeeded() {
 | 
			
		||||
    def propertiesFile = file(System.getProperty("user.home") + '/.gradle/gradle.properties')
 | 
			
		||||
    if (!propertiesFile.exists()) {
 | 
			
		||||
        def commentMessage = "This is autogenerated local property from system environment to prevent key to be committed to source control."
 | 
			
		||||
        ant.propertyfile(file: System.getProperty("user.home") + "/.gradle/gradle.properties", comment: commentMessage) {
 | 
			
		||||
            entry(key: "appLoginUrl", value: System.getProperty("appLoginUrl"))
 | 
			
		||||
            entry(key: "appLoginUsername", value: System.getProperty("appLoginUsername"))
 | 
			
		||||
            entry(key: "appLoginPassword", value: System.getProperty("appLoginPassword"))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -4,24 +4,21 @@ import android.content.Context
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.graphics.drawable.BitmapDrawable
 | 
			
		||||
import android.graphics.drawable.GradientDrawable
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.preference.PreferenceManager
 | 
			
		||||
import androidx.core.view.MenuItemCompat
 | 
			
		||||
import androidx.appcompat.app.AlertDialog
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.recyclerview.widget.DividerItemDecoration
 | 
			
		||||
import androidx.recyclerview.widget.GridLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import androidx.appcompat.widget.SearchView
 | 
			
		||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.ItemTouchHelper
 | 
			
		||||
import android.view.Menu
 | 
			
		||||
import android.view.MenuItem
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import androidx.appcompat.app.AlertDialog
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.appcompat.widget.SearchView
 | 
			
		||||
import androidx.core.view.MenuItemCompat
 | 
			
		||||
import androidx.recyclerview.widget.*
 | 
			
		||||
import androidx.room.Room
 | 
			
		||||
import androidx.work.Constraints
 | 
			
		||||
import androidx.work.ExistingPeriodicWorkPolicy
 | 
			
		||||
@@ -30,12 +27,7 @@ import androidx.work.WorkManager
 | 
			
		||||
import apps.amine.bou.readerforselfoss.adapters.ItemCardAdapter
 | 
			
		||||
import apps.amine.bou.readerforselfoss.adapters.ItemListAdapter
 | 
			
		||||
import apps.amine.bou.readerforselfoss.adapters.ItemsAdapter
 | 
			
		||||
import apps.amine.bou.readerforselfoss.api.selfoss.Item
 | 
			
		||||
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
 | 
			
		||||
import apps.amine.bou.readerforselfoss.api.selfoss.Source
 | 
			
		||||
import apps.amine.bou.readerforselfoss.api.selfoss.Stats
 | 
			
		||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
 | 
			
		||||
import apps.amine.bou.readerforselfoss.api.selfoss.Tag
 | 
			
		||||
import apps.amine.bou.readerforselfoss.api.selfoss.*
 | 
			
		||||
import apps.amine.bou.readerforselfoss.background.LoadingWorker
 | 
			
		||||
import apps.amine.bou.readerforselfoss.persistence.database.AppDatabase
 | 
			
		||||
import apps.amine.bou.readerforselfoss.persistence.entities.ActionEntity
 | 
			
		||||
@@ -48,7 +40,6 @@ import apps.amine.bou.readerforselfoss.utils.Config
 | 
			
		||||
import apps.amine.bou.readerforselfoss.utils.bottombar.maybeShow
 | 
			
		||||
import apps.amine.bou.readerforselfoss.utils.bottombar.removeBadge
 | 
			
		||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
 | 
			
		||||
import apps.amine.bou.readerforselfoss.utils.drawer.CustomUrlPrimaryDrawerItem
 | 
			
		||||
import apps.amine.bou.readerforselfoss.utils.flattenTags
 | 
			
		||||
import apps.amine.bou.readerforselfoss.utils.longHash
 | 
			
		||||
import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException
 | 
			
		||||
@@ -63,8 +54,8 @@ import co.zsmb.materialdrawerkt.draweritems.profile.profile
 | 
			
		||||
import com.ashokvarma.bottomnavigation.BottomNavigationBar
 | 
			
		||||
import com.ashokvarma.bottomnavigation.BottomNavigationItem
 | 
			
		||||
import com.ashokvarma.bottomnavigation.TextBadgeItem
 | 
			
		||||
import com.bumptech.glide.Glide
 | 
			
		||||
import com.ftinc.scoop.Scoop
 | 
			
		||||
import com.github.stkent.amplify.tracking.Amplify
 | 
			
		||||
import com.mikepenz.aboutlibraries.Libs
 | 
			
		||||
import com.mikepenz.aboutlibraries.LibsBuilder
 | 
			
		||||
import com.mikepenz.materialdrawer.Drawer
 | 
			
		||||
@@ -173,9 +164,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
 | 
			
		||||
        handleThemeBinding()
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(toolBar)
 | 
			
		||||
        if (savedInstanceState == null) {
 | 
			
		||||
            Amplify.getSharedInstance().promptIfReady(promptView)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        db = Room.databaseBuilder(
 | 
			
		||||
            applicationContext,
 | 
			
		||||
@@ -519,7 +507,9 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    val filteredTags = maybeTags.filterNot { hiddenTags.contains(it.tag) }
 | 
			
		||||
                    val filteredTags = maybeTags
 | 
			
		||||
                        .filterNot { hiddenTags.contains(it.tag) }
 | 
			
		||||
                        .sortedBy { it.unread == 0 }
 | 
			
		||||
                    tagsBadge = filteredTags.map {
 | 
			
		||||
                        val gd = GradientDrawable()
 | 
			
		||||
                        val color = try {
 | 
			
		||||
@@ -621,18 +611,28 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    for (tag in maybeSources) {
 | 
			
		||||
                        drawer.addItem(
 | 
			
		||||
                            CustomUrlPrimaryDrawerItem()
 | 
			
		||||
                        val item = PrimaryDrawerItem()
 | 
			
		||||
                                .withName(tag.title)
 | 
			
		||||
                                .withIdentifier(tag.id.toLong())
 | 
			
		||||
                                .withIcon(tag.getIcon(this@HomeActivity))
 | 
			
		||||
                                .withOnDrawerItemClickListener { _, _, _ ->
 | 
			
		||||
                                    allItems = ArrayList()
 | 
			
		||||
                                    maybeSourceFilter = tag
 | 
			
		||||
                                    getElementsAccordingToTab()
 | 
			
		||||
                                    false
 | 
			
		||||
                                }
 | 
			
		||||
                        )
 | 
			
		||||
                        if (tag.getIcon(this@HomeActivity).isNotBlank()) {
 | 
			
		||||
                            thread {
 | 
			
		||||
                                try {
 | 
			
		||||
                                    item.withIcon(BitmapDrawable(resources, Glide.with(this@HomeActivity).asBitmap().load(tag.getIcon(this@HomeActivity)).submit(100, 100).get()))
 | 
			
		||||
                                } catch (e: Exception) {
 | 
			
		||||
                                    ACRA.getErrorReporter().maybeHandleSilentException(e, this@HomeActivity)
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        } else {
 | 
			
		||||
                            item.withIcon(R.mipmap.ic_launcher)
 | 
			
		||||
                        }
 | 
			
		||||
                        drawer.addItem(item)
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -14,9 +14,6 @@ import apps.amine.bou.readerforselfoss.utils.glide.loadMaybeBasicAuth
 | 
			
		||||
import com.bumptech.glide.Glide
 | 
			
		||||
import com.bumptech.glide.request.RequestOptions
 | 
			
		||||
import com.ftinc.scoop.Scoop
 | 
			
		||||
import com.github.stkent.amplify.feedback.DefaultEmailFeedbackCollector
 | 
			
		||||
import com.github.stkent.amplify.feedback.GooglePlayStoreFeedbackCollector
 | 
			
		||||
import com.github.stkent.amplify.tracking.Amplify
 | 
			
		||||
import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
 | 
			
		||||
import com.mikepenz.materialdrawer.util.DrawerImageLoader
 | 
			
		||||
import org.acra.ACRA
 | 
			
		||||
@@ -25,7 +22,6 @@ import org.acra.annotation.AcraCore
 | 
			
		||||
import org.acra.annotation.AcraDialog
 | 
			
		||||
import org.acra.annotation.AcraHttpSender
 | 
			
		||||
import org.acra.sender.HttpSender
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
import java.util.UUID.randomUUID
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -48,7 +44,6 @@ class MyApp : MultiDexApplication() {
 | 
			
		||||
    override fun onCreate() {
 | 
			
		||||
        super.onCreate()
 | 
			
		||||
        config = Config(baseContext)
 | 
			
		||||
        initAmplify()
 | 
			
		||||
 | 
			
		||||
        val prefs = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
 | 
			
		||||
        if (prefs.getString("unique_id", "").isEmpty()) {
 | 
			
		||||
@@ -91,13 +86,6 @@ class MyApp : MultiDexApplication() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun initAmplify() {
 | 
			
		||||
        Amplify.initSharedInstance(this)
 | 
			
		||||
            .setPositiveFeedbackCollectors(GooglePlayStoreFeedbackCollector())
 | 
			
		||||
            .setCriticalFeedbackCollectors(DefaultEmailFeedbackCollector(Config.feedbackEmail))
 | 
			
		||||
            .applyAllDefaultRules()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun initDrawerImageLoader() {
 | 
			
		||||
        DrawerImageLoader.init(object : AbstractDrawerImageLoader() {
 | 
			
		||||
            override fun set(
 | 
			
		||||
 
 | 
			
		||||
@@ -211,7 +211,7 @@ class ReaderActivity : AppCompatActivity() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onSaveInstanceState(oldInstanceState: Bundle?) {
 | 
			
		||||
    override fun onSaveInstanceState(oldInstanceState: Bundle) {
 | 
			
		||||
        super.onSaveInstanceState(oldInstanceState)
 | 
			
		||||
        oldInstanceState!!.clear()
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,10 @@ import com.burgstaller.okhttp.digest.CachingAuthenticator
 | 
			
		||||
import com.burgstaller.okhttp.digest.Credentials
 | 
			
		||||
import com.burgstaller.okhttp.digest.DigestAuthenticator
 | 
			
		||||
import com.google.gson.GsonBuilder
 | 
			
		||||
import okhttp3.Interceptor
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
import okhttp3.logging.HttpLoggingInterceptor
 | 
			
		||||
import retrofit2.Call
 | 
			
		||||
import retrofit2.Retrofit
 | 
			
		||||
@@ -62,6 +65,17 @@ class SelfossApi(
 | 
			
		||||
            .maybeWithSelfSigned(isWithSelfSignedCert)
 | 
			
		||||
            .authenticator(CachingAuthenticatorDecorator(this, authCache))
 | 
			
		||||
            .addInterceptor(AuthenticationCacheInterceptor(authCache))
 | 
			
		||||
            .addInterceptor(object: Interceptor {
 | 
			
		||||
                override fun intercept(chain: Interceptor.Chain): Response {
 | 
			
		||||
                    val request: Request = chain.request()
 | 
			
		||||
                    val response: Response = chain.proceed(request)
 | 
			
		||||
 | 
			
		||||
                    if (response.code() == 408) {
 | 
			
		||||
                        return response
 | 
			
		||||
                    }
 | 
			
		||||
                    return response
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
 
 | 
			
		||||
@@ -130,7 +130,7 @@ class LoadingWorker(val context: Context, params: WorkerParameters) : Worker(con
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return Result.SUCCESS
 | 
			
		||||
        return Result.success()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun <T> doAndReportOnFail(call: Call<T>, action: ActionEntity) {
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,6 @@ import apps.amine.bou.readerforselfoss.utils.succeeded
 | 
			
		||||
import com.bumptech.glide.Glide
 | 
			
		||||
import com.bumptech.glide.request.RequestOptions
 | 
			
		||||
import com.github.rubensousa.floatingtoolbar.FloatingToolbar
 | 
			
		||||
import kotlinx.android.synthetic.main.fragment_article.*
 | 
			
		||||
import kotlinx.android.synthetic.main.fragment_article.view.*
 | 
			
		||||
import org.acra.ACRA
 | 
			
		||||
import retrofit2.Call
 | 
			
		||||
@@ -130,7 +129,7 @@ class ArticleFragment : Fragment() {
 | 
			
		||||
                typeface = try {
 | 
			
		||||
                    ResourcesCompat.getFont(context!!, resId)!!
 | 
			
		||||
                } catch (e: java.lang.Exception) {
 | 
			
		||||
                    ACRA.getErrorReporter().maybeHandleSilentException(Throwable("Font loading issue: ${e.message}"), context!!)
 | 
			
		||||
                    // ACRA.getErrorReporter().maybeHandleSilentException(Throwable("Font loading issue: ${e.message}"), context!!)
 | 
			
		||||
                    // Just to be sure
 | 
			
		||||
                    null
 | 
			
		||||
                }
 | 
			
		||||
@@ -500,6 +499,13 @@ class ArticleFragment : Fragment() {
 | 
			
		||||
                |        word-break: break-word;
 | 
			
		||||
                |        overflow:hidden;
 | 
			
		||||
                |        line-height: 1.5em;
 | 
			
		||||
                |        background-color: $stringBackgroundColor;
 | 
			
		||||
                |      }
 | 
			
		||||
                |      body, html {
 | 
			
		||||
                |        background-color: $stringBackgroundColor !important;
 | 
			
		||||
                |        border-color: $stringBackgroundColor  !important;
 | 
			
		||||
                |        padding: 0 !important;
 | 
			
		||||
                |        margin: 0 !important;
 | 
			
		||||
                |      }
 | 
			
		||||
                |      a, pre, code {
 | 
			
		||||
                |        text-align: $textAlignment;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,112 +0,0 @@
 | 
			
		||||
/* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomUrlBasePrimaryDrawerItem.java */
 | 
			
		||||
package apps.amine.bou.readerforselfoss.utils.drawer
 | 
			
		||||
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import androidx.annotation.ColorInt
 | 
			
		||||
import androidx.annotation.ColorRes
 | 
			
		||||
import androidx.annotation.StringRes
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
 | 
			
		||||
import com.mikepenz.materialdrawer.holder.ColorHolder
 | 
			
		||||
import com.mikepenz.materialdrawer.holder.ImageHolder
 | 
			
		||||
import com.mikepenz.materialdrawer.holder.StringHolder
 | 
			
		||||
import com.mikepenz.materialdrawer.model.BaseDrawerItem
 | 
			
		||||
import com.mikepenz.materialdrawer.util.DrawerImageLoader
 | 
			
		||||
import com.mikepenz.materialdrawer.util.DrawerUIUtils
 | 
			
		||||
import com.mikepenz.materialize.util.UIUtils
 | 
			
		||||
 | 
			
		||||
abstract class CustomUrlBasePrimaryDrawerItem<T, VH : RecyclerView.ViewHolder> :
 | 
			
		||||
    BaseDrawerItem<T, VH>() {
 | 
			
		||||
    fun withIcon(url: String): T {
 | 
			
		||||
        this.icon = ImageHolder(url)
 | 
			
		||||
        return this as T
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun withIcon(uri: Uri): T {
 | 
			
		||||
        this.icon = ImageHolder(uri)
 | 
			
		||||
        return this as T
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var description: StringHolder? = null
 | 
			
		||||
        private set
 | 
			
		||||
    var descriptionTextColor: ColorHolder? = null
 | 
			
		||||
        private set
 | 
			
		||||
 | 
			
		||||
    fun withDescription(description: String): T {
 | 
			
		||||
        this.description = StringHolder(description)
 | 
			
		||||
        return this as T
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun withDescription(@StringRes descriptionRes: Int): T {
 | 
			
		||||
        this.description = StringHolder(descriptionRes)
 | 
			
		||||
        return this as T
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun withDescriptionTextColor(@ColorInt color: Int): T {
 | 
			
		||||
        this.descriptionTextColor = ColorHolder.fromColor(color)
 | 
			
		||||
        return this as T
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun withDescriptionTextColorRes(@ColorRes colorRes: Int): T {
 | 
			
		||||
        this.descriptionTextColor = ColorHolder.fromColorRes(colorRes)
 | 
			
		||||
        return this as T
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * a helper method to have the logic for all secondaryDrawerItems only once
 | 
			
		||||
 | 
			
		||||
     * @param viewHolder
 | 
			
		||||
     */
 | 
			
		||||
    protected fun bindViewHelper(viewHolder: CustomBaseViewHolder) {
 | 
			
		||||
        val ctx = viewHolder.itemView.context
 | 
			
		||||
 | 
			
		||||
        //set the identifier from the drawerItem here. It can be used to run tests
 | 
			
		||||
        viewHolder.itemView.id = hashCode()
 | 
			
		||||
 | 
			
		||||
        //set the item selected if it is
 | 
			
		||||
        viewHolder.itemView.isSelected = isSelected
 | 
			
		||||
 | 
			
		||||
        //get the correct color for the background
 | 
			
		||||
        val selectedColor = getSelectedColor(ctx)
 | 
			
		||||
        //get the correct color for the text
 | 
			
		||||
        val color = getColor(ctx)
 | 
			
		||||
        val selectedTextColor = getSelectedTextColor(ctx)
 | 
			
		||||
        //get the correct color for the icon
 | 
			
		||||
        val iconColor = getIconColor(ctx)
 | 
			
		||||
        val selectedIconColor = getSelectedIconColor(ctx)
 | 
			
		||||
 | 
			
		||||
        //set the background for the item
 | 
			
		||||
        UIUtils.setBackground(
 | 
			
		||||
            viewHolder.view,
 | 
			
		||||
            UIUtils.getSelectableBackground(ctx, selectedColor, true)
 | 
			
		||||
        )
 | 
			
		||||
        //set the text for the name
 | 
			
		||||
        StringHolder.applyTo(this.getName(), viewHolder.name)
 | 
			
		||||
        //set the text for the description or hide
 | 
			
		||||
        StringHolder.applyToOrHide(this.description, viewHolder.description)
 | 
			
		||||
 | 
			
		||||
        //set the colors for textViews
 | 
			
		||||
        viewHolder.name.setTextColor(getTextColorStateList(color, selectedTextColor))
 | 
			
		||||
        //set the description text color
 | 
			
		||||
        ColorHolder.applyToOr(
 | 
			
		||||
            descriptionTextColor,
 | 
			
		||||
            viewHolder.description,
 | 
			
		||||
            getTextColorStateList(color, selectedTextColor)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        //define the typeface for our textViews
 | 
			
		||||
        if (getTypeface() != null) {
 | 
			
		||||
            viewHolder.name.typeface = getTypeface()
 | 
			
		||||
            viewHolder.description.typeface = getTypeface()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //we make sure we reset the image first before setting the new one in case there is an empty one
 | 
			
		||||
        DrawerImageLoader.getInstance().cancelImage(viewHolder.icon)
 | 
			
		||||
        viewHolder.icon.setImageBitmap(null)
 | 
			
		||||
        //get the drawables for our icon and set it
 | 
			
		||||
        ImageHolder.applyTo(icon, viewHolder.icon, "customUrlItem")
 | 
			
		||||
 | 
			
		||||
        //for android API 17 --> Padding not applied via xml
 | 
			
		||||
        DrawerUIUtils.setDrawerVerticalPadding(viewHolder.view)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,94 +0,0 @@
 | 
			
		||||
/* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomUrlPrimaryDrawerItem.java */
 | 
			
		||||
package apps.amine.bou.readerforselfoss.utils.drawer
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.LayoutRes
 | 
			
		||||
import androidx.annotation.StringRes
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import apps.amine.bou.readerforselfoss.R
 | 
			
		||||
import com.mikepenz.materialdrawer.holder.BadgeStyle
 | 
			
		||||
import com.mikepenz.materialdrawer.holder.StringHolder
 | 
			
		||||
import com.mikepenz.materialdrawer.model.interfaces.ColorfulBadgeable
 | 
			
		||||
 | 
			
		||||
class CustomUrlPrimaryDrawerItem :
 | 
			
		||||
    CustomUrlBasePrimaryDrawerItem<CustomUrlPrimaryDrawerItem, CustomUrlPrimaryDrawerItem.ViewHolder>(),
 | 
			
		||||
    ColorfulBadgeable<CustomUrlPrimaryDrawerItem> {
 | 
			
		||||
    protected var mBadge: StringHolder = StringHolder("")
 | 
			
		||||
    protected var mBadgeStyle = BadgeStyle()
 | 
			
		||||
 | 
			
		||||
    override fun withBadge(badge: StringHolder): CustomUrlPrimaryDrawerItem {
 | 
			
		||||
        this.mBadge = badge
 | 
			
		||||
        return this
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun withBadge(badge: String): CustomUrlPrimaryDrawerItem {
 | 
			
		||||
        this.mBadge = StringHolder(badge)
 | 
			
		||||
        return this
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun withBadge(@StringRes badgeRes: Int): CustomUrlPrimaryDrawerItem {
 | 
			
		||||
        this.mBadge = StringHolder(badgeRes)
 | 
			
		||||
        return this
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun withBadgeStyle(badgeStyle: BadgeStyle): CustomUrlPrimaryDrawerItem {
 | 
			
		||||
        this.mBadgeStyle = badgeStyle
 | 
			
		||||
        return this
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getBadge(): StringHolder {
 | 
			
		||||
        return mBadge
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getBadgeStyle(): BadgeStyle {
 | 
			
		||||
        return mBadgeStyle
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getType(): Int {
 | 
			
		||||
        return R.id.material_drawer_item_custom_url_item
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @LayoutRes
 | 
			
		||||
    override fun getLayoutRes(): Int {
 | 
			
		||||
        return R.layout.material_drawer_item_primary
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindView(viewHolder: ViewHolder, payloads: List<*>?) {
 | 
			
		||||
        super.bindView(viewHolder, payloads)
 | 
			
		||||
 | 
			
		||||
        val ctx = viewHolder.itemView.context
 | 
			
		||||
 | 
			
		||||
        //bind the basic view parts
 | 
			
		||||
        bindViewHelper(viewHolder)
 | 
			
		||||
 | 
			
		||||
        //set the text for the badge or hide
 | 
			
		||||
        val badgeVisible = StringHolder.applyToOrHide(mBadge, viewHolder.badge)
 | 
			
		||||
        //style the badge if it is visible
 | 
			
		||||
        if (badgeVisible) {
 | 
			
		||||
            mBadgeStyle.style(
 | 
			
		||||
                viewHolder.badge,
 | 
			
		||||
                getTextColorStateList(getColor(ctx), getSelectedTextColor(ctx))
 | 
			
		||||
            )
 | 
			
		||||
            viewHolder.badgeContainer.visibility = View.VISIBLE
 | 
			
		||||
        } else {
 | 
			
		||||
            viewHolder.badgeContainer.visibility = View.GONE
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //define the typeface for our textViews
 | 
			
		||||
        if (getTypeface() != null) {
 | 
			
		||||
            viewHolder.badge.typeface = getTypeface()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required)
 | 
			
		||||
        onPostBindView(this, viewHolder.itemView)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getViewHolder(v: View): ViewHolder {
 | 
			
		||||
        return ViewHolder(v)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class ViewHolder(view: View) : CustomBaseViewHolder(view) {
 | 
			
		||||
        val badgeContainer: View = view.findViewById(R.id.material_drawer_badge_container)
 | 
			
		||||
        val badge: TextView = view.findViewById(R.id.material_drawer_badge)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 20 KiB  | 
@@ -8,33 +8,10 @@
 | 
			
		||||
    android:fitsSystemWindows="true"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto">
 | 
			
		||||
 | 
			
		||||
    <com.github.stkent.amplify.prompt.DefaultLayoutPromptView
 | 
			
		||||
        android:id="@+id/promptView"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:prompt_view_user_opinion_question_title="@string/rating_prompt_title"
 | 
			
		||||
        app:prompt_view_user_opinion_question_positive_button_label="@string/rating_prompt_yes"
 | 
			
		||||
        app:prompt_view_user_opinion_question_negative_button_label="@string/rating_prompt_no"
 | 
			
		||||
        app:prompt_view_positive_feedback_question_title="@string/rating_prompt_rating_title"
 | 
			
		||||
        app:prompt_view_positive_feedback_question_positive_button_label="@string/rating_prompt_rating_yes"
 | 
			
		||||
        app:prompt_view_positive_feedback_question_negative_button_label="@string/rating_prompt_rating_no"
 | 
			
		||||
        app:prompt_view_critical_feedback_question_title="@string/rating_prompt_feedback_title"
 | 
			
		||||
        app:prompt_view_critical_feedback_question_positive_button_label="@string/rating_prompt_feedback_yes"
 | 
			
		||||
        app:prompt_view_critical_feedback_question_negative_button_label="@string/rating_prompt_feedback_no"
 | 
			
		||||
        app:prompt_view_thanks_title="@string/rating_prompt_thanks"
 | 
			
		||||
        app:prompt_view_positive_button_background_color="@color/colorPrimary"
 | 
			
		||||
        app:prompt_view_positive_button_text_color="@color/white"
 | 
			
		||||
        app:prompt_view_positive_button_border_color="@color/colorPrimary"
 | 
			
		||||
        app:prompt_view_negative_button_background_color="@color/colorAccent"
 | 
			
		||||
        app:prompt_view_negative_button_border_color="@color/white"
 | 
			
		||||
        app:prompt_view_background_color="?attr/colorAccent"
 | 
			
		||||
        app:prompt_view_thanks_display_time_ms="2000"/>
 | 
			
		||||
 | 
			
		||||
    <androidx.coordinatorlayout.widget.CoordinatorLayout
 | 
			
		||||
        android:id="@+id/coordLayout"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:layout_below="@id/promptView">
 | 
			
		||||
        android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
        <androidx.coordinatorlayout.widget.CoordinatorLayout
 | 
			
		||||
            android:id="@+id/intern_coordLayout"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,15 +4,15 @@
 | 
			
		||||
    <string name="app_name">"Selfoss 阅读器"</string>
 | 
			
		||||
    <string name="title_activity_login">"登录"</string>
 | 
			
		||||
    <string name="prompt_password">"密码"</string>
 | 
			
		||||
    <string name="prompt_http_password">"HTTP 密码"</string>
 | 
			
		||||
    <string name="prompt_http_password">"HTTP 密碼"</string>
 | 
			
		||||
    <string name="action_sign_in">"转至"</string>
 | 
			
		||||
    <string name="error_invalid_password">"密码不够长"</string>
 | 
			
		||||
    <string name="error_field_required">"必填字段"</string>
 | 
			
		||||
    <string name="error_field_required">"欄位必填"</string>
 | 
			
		||||
    <string name="prompt_url">"网址"</string>
 | 
			
		||||
    <string name="withLoginSwitch">"需要登录?"</string>
 | 
			
		||||
    <string name="withLoginSwitch">"需要登入?"</string>
 | 
			
		||||
    <string name="withHttpLoginSwitch">"请先登录网站"</string>
 | 
			
		||||
    <string name="login_url_problem">"哎呀。您可能需要在网址的末尾添加一个 \"/\"。"</string>
 | 
			
		||||
    <string name="prompt_login">"用户名"</string>
 | 
			
		||||
    <string name="prompt_login">"使用者名稱"</string>
 | 
			
		||||
    <string name="prompt_http_login">"HTTP 用户名"</string>
 | 
			
		||||
    <string name="label_share">"分享"</string>
 | 
			
		||||
    <string name="readAll">"全部阅读"</string>
 | 
			
		||||
 
 | 
			
		||||
@@ -13,11 +13,11 @@
 | 
			
		||||
    <color name="background_grey">#FFe4e4e4</color>
 | 
			
		||||
 | 
			
		||||
    <color name="dark_webview">#FF303030</color>
 | 
			
		||||
    <color name="dark_webview_text">@color/md_white_1000</color>
 | 
			
		||||
    <color name="light_webview">@color/md_grey_50</color>
 | 
			
		||||
    <color name="light_webview_text">@color/md_grey_900</color>
 | 
			
		||||
    <color name="dark_webview_text">#FFFFFF</color>
 | 
			
		||||
    <color name="light_webview">#FAFAFA</color>
 | 
			
		||||
    <color name="light_webview_text">#212121</color>
 | 
			
		||||
 | 
			
		||||
    <color name="cardBackgroundColor">#FFFFFFFF</color>
 | 
			
		||||
    <color name="materialDrawerHeaderSelectionText">@color/md_grey_900</color>
 | 
			
		||||
    <color name="materialDrawerHeaderSelectionText">#212121</color>
 | 
			
		||||
    <color name="darkBackground">#FF303030</color>
 | 
			
		||||
</resources>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <item name="material_drawer_item_custom_url_item" type="id" />
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										11
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								build.gradle
									
									
									
									
									
								
							@@ -2,11 +2,12 @@
 | 
			
		||||
 | 
			
		||||
buildscript {
 | 
			
		||||
    ext {
 | 
			
		||||
        kotlin_version = '1.3.0'
 | 
			
		||||
        kotlin_version = '1.3.31'
 | 
			
		||||
        android_version = '1.0.0'
 | 
			
		||||
        lifecycle_version = '2.0.0'
 | 
			
		||||
        room_version = '2.1.0-alpha01'
 | 
			
		||||
        work_version = "1.0.0-alpha10"
 | 
			
		||||
        androidx_version = '1.1.0-alpha05'
 | 
			
		||||
        lifecycle_version = '2.2.0-alpha01'
 | 
			
		||||
        room_version = '2.1.0-beta01'
 | 
			
		||||
        work_version = '1.0.1'
 | 
			
		||||
    }
 | 
			
		||||
    repositories {
 | 
			
		||||
        google()
 | 
			
		||||
@@ -16,7 +17,7 @@ buildscript {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath 'com.android.tools.build:gradle:3.3.0'
 | 
			
		||||
        classpath 'com.android.tools.build:gradle:3.4.1'
 | 
			
		||||
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -55,27 +55,10 @@ redirect_from: "/ReaderforSelfoss/"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <script async defer src="https://buttons.github.io/buttons.js"></script>
 | 
			
		||||
        <script>
 | 
			
		||||
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
 | 
			
		||||
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
 | 
			
		||||
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
 | 
			
		||||
          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
 | 
			
		||||
 | 
			
		||||
          ga('create', 'UA-102547516-1', 'auto');
 | 
			
		||||
          ga('send', 'pageview');
 | 
			
		||||
 | 
			
		||||
        </script>
 | 
			
		||||
        <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
 | 
			
		||||
            new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
 | 
			
		||||
            j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
 | 
			
		||||
            'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
 | 
			
		||||
            })(window,document,'script','dataLayer','GTM-5R5LR4V');</script>
 | 
			
		||||
 | 
			
		||||
      
 | 
			
		||||
    </head>
 | 
			
		||||
 | 
			
		||||
    <body id="main">
 | 
			
		||||
        <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5R5LR4V"
 | 
			
		||||
        height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
 | 
			
		||||
 | 
			
		||||
        <div id="container" itemscope itemtype="http://schema.org/SoftwareApplication">
 | 
			
		||||
            <div id="titles"><h1 itemprop="name">Reader For Selfoss</h1><h2>A new <span itemprop="operatingSystem">Android</span> Selfoss RSS reader</h2></div>
 | 
			
		||||
@@ -83,7 +66,6 @@ redirect_from: "/ReaderforSelfoss/"
 | 
			
		||||
                <img src="images/icon.png" id="logo" itemprop="image">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="links">
 | 
			
		||||
                <a itemprop="downloadUrl" id="store" href='https://play.google.com/store/apps/details?id=apps.amine.bou.readerforselfoss&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png'/></a>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                <a class="github-button" href="https://github.com/aminecmi/readerforselfoss" data-size="large" aria-label="Star aminecmi/readerforselfoss on GitHub">Star</a>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
#Mon Jan 14 20:50:06 CET 2019
 | 
			
		||||
#Fri May 17 18:15:21 CEST 2019
 | 
			
		||||
distributionBase=GRADLE_USER_HOME
 | 
			
		||||
distributionPath=wrapper/dists
 | 
			
		||||
zipStoreBase=GRADLE_USER_HOME
 | 
			
		||||
zipStorePath=wrapper/dists
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
 | 
			
		||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user