Compare commits
	
		
			23 Commits
		
	
	
		
			v171901010
			...
			v171905137
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | f48f6ed788 | ||
|  | e517803bd8 | ||
|  | 3eaf390790 | ||
|  | 6de54d63e6 | ||
|  | dd7a2f476b | ||
|  | 1485cc05f4 | ||
|  | d1dad3e61a | ||
|  | e5024b0420 | ||
|  | 9b01692c55 | ||
|  | 33aa587d36 | ||
|  | 12e0766803 | ||
|  | a8721ad7a4 | ||
|  | bc5e882894 | ||
|  | e3460322b1 | ||
|  | 7e3288a076 | ||
|  | ddc754ec25 | ||
|  | 134a0766d6 | ||
|  | 69da932ab5 | ||
|  | 592fb6328a | ||
|  | a0aead6491 | ||
|  | 722b6cc06d | ||
|  | 6d7c4b40f6 | ||
|  | f538ed39fc | 
							
								
								
									
										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,39 +80,34 @@ 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.0' | ||||
|     implementation 'androidx.multidex:multidex:2.0.1' | ||||
|  | ||||
|     // About | ||||
|     implementation('com.mikepenz:aboutlibraries:6.2.0@aar') { | ||||
|     implementation('com.mikepenz:aboutlibraries:6.0.0@aar') { | ||||
|         transitive = true | ||||
|     } | ||||
|  | ||||
| @@ -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,9 +126,6 @@ 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' | ||||
|  | ||||
| @@ -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")) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| } | ||||
| @@ -1,5 +1,6 @@ | ||||
| package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| @@ -85,10 +86,12 @@ class AddSourceActivity : AppCompatActivity() { | ||||
|  | ||||
|         try { | ||||
|             val prefs = PreferenceManager.getDefaultSharedPreferences(this) | ||||
|             val settings = | ||||
|                 getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) | ||||
|             api = SelfossApi( | ||||
|                 this, | ||||
|                 this@AddSourceActivity, | ||||
|                 prefs.getBoolean("isSelfSignedCert", false), | ||||
|                 settings.getBoolean("isSelfSignedCert", false), | ||||
|                 prefs.getString("api_timeout", "-1").toLong(), | ||||
|                 prefs.getBoolean("should_log_everything", false) | ||||
|             ) | ||||
|   | ||||
| @@ -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, | ||||
| @@ -247,14 +235,18 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|                     val i = items.elementAtOrNull(position) | ||||
|  | ||||
|                     if (i != null) { | ||||
|                         val adapter = recyclerView.adapter | ||||
|                         val adapter = recyclerView.adapter as ItemsAdapter<*> | ||||
|  | ||||
|                         when (adapter) { | ||||
|                             is ItemCardAdapter -> adapter.handleItemAtIndex(position) | ||||
|                             is ItemListAdapter -> adapter.handleItemAtIndex(position) | ||||
|                         val wasItemUnread = adapter.unreadItemStatusAtIndex(position) | ||||
|  | ||||
|                         adapter.handleItemAtIndex(position) | ||||
|  | ||||
|                         if (wasItemUnread) { | ||||
|                             badgeNew-- | ||||
|                         } else { | ||||
|                             badgeNew++ | ||||
|                         } | ||||
|  | ||||
|                         badgeNew-- | ||||
|                         reloadBadgeContent() | ||||
|  | ||||
|                         val tagHashes = i.tags.tags.split(",").map { it.longHash() } | ||||
| @@ -515,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 { | ||||
| @@ -617,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_round) | ||||
|                         } | ||||
|                         drawer.addItem(item) | ||||
|  | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| @@ -1348,12 +1352,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|                                         ).show() | ||||
|                                         tabNewBadge.removeBadge() | ||||
|  | ||||
|  | ||||
|                                         tagsBadge = itemsByTag.map { | ||||
|                                             (it.key to ((tagsBadge[it.key] ?: it.value) - it.value)) | ||||
|                                         }.toMap() | ||||
|  | ||||
|                                         reloadTagsBadges() | ||||
|                                         handleDrawerItems() | ||||
|  | ||||
|                                         getElementsAccordingToTab() | ||||
|                                     } else { | ||||
|   | ||||
| @@ -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( | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.SharedPreferences | ||||
| import android.graphics.drawable.ColorDrawable | ||||
| import android.os.Build | ||||
| @@ -27,6 +28,7 @@ import apps.amine.bou.readerforselfoss.persistence.migrations.MIGRATION_2_3 | ||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | ||||
| import apps.amine.bou.readerforselfoss.themes.Toppings | ||||
| import apps.amine.bou.readerforselfoss.transformers.DepthPageTransformer | ||||
| import apps.amine.bou.readerforselfoss.utils.Config | ||||
| import apps.amine.bou.readerforselfoss.utils.maybeHandleSilentException | ||||
| import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible | ||||
| import apps.amine.bou.readerforselfoss.utils.persistence.toEntity | ||||
| @@ -94,6 +96,9 @@ class ReaderActivity : AppCompatActivity() { | ||||
|         supportActionBar?.setDisplayHomeAsUpEnabled(true) | ||||
|         supportActionBar?.setDisplayShowHomeEnabled(true) | ||||
|  | ||||
|         val settings = | ||||
|             getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) | ||||
|  | ||||
|         prefs = PreferenceManager.getDefaultSharedPreferences(this) | ||||
|         editor = prefs.edit() | ||||
|  | ||||
| @@ -105,7 +110,7 @@ class ReaderActivity : AppCompatActivity() { | ||||
|         api = SelfossApi( | ||||
|             this, | ||||
|             this@ReaderActivity, | ||||
|             prefs.getBoolean("isSelfSignedCert", false), | ||||
|             settings.getBoolean("isSelfSignedCert", false), | ||||
|             prefs.getString("api_timeout", "-1").toLong(), | ||||
|             prefs.getBoolean("should_log_everything", false) | ||||
|         ) | ||||
| @@ -206,7 +211,7 @@ class ReaderActivity : AppCompatActivity() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     override fun onSaveInstanceState(oldInstanceState: Bundle?) { | ||||
|     override fun onSaveInstanceState(oldInstanceState: Bundle) { | ||||
|         super.onSaveInstanceState(oldInstanceState) | ||||
|         oldInstanceState!!.clear() | ||||
|     } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.content.res.ColorStateList | ||||
| import android.os.Build | ||||
| @@ -13,6 +14,7 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.Source | ||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | ||||
| import apps.amine.bou.readerforselfoss.themes.Toppings | ||||
| import apps.amine.bou.readerforselfoss.utils.Config | ||||
| import apps.amine.bou.readerforselfoss.utils.network.isNetworkAccessible | ||||
| import com.ftinc.scoop.Scoop | ||||
| import kotlinx.android.synthetic.main.activity_sources.* | ||||
| @@ -54,12 +56,14 @@ class SourcesActivity : AppCompatActivity() { | ||||
|         super.onResume() | ||||
|         val mLayoutManager = LinearLayoutManager(this) | ||||
|  | ||||
|         val settings = | ||||
|             getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) | ||||
|         val prefs = PreferenceManager.getDefaultSharedPreferences(this) | ||||
|  | ||||
|         val api = SelfossApi( | ||||
|             this, | ||||
|             this@SourcesActivity, | ||||
|             prefs.getBoolean("isSelfSignedCert", false), | ||||
|             settings.getBoolean("isSelfSignedCert", false), | ||||
|             prefs.getString("api_timeout", "-1").toLong(), | ||||
|             prefs.getBoolean("should_log_everything", false) | ||||
|         ) | ||||
|   | ||||
| @@ -132,15 +132,17 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte | ||||
|     } | ||||
|  | ||||
|     fun handleItemAtIndex(position: Int) { | ||||
|         val i = items[position] | ||||
|  | ||||
|         if (i.unread) { | ||||
|         if (unreadItemStatusAtIndex(position)) { | ||||
|             readItemAtIndex(position) | ||||
|         } else { | ||||
|             unreadItemAtIndex(position) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun unreadItemStatusAtIndex(position: Int): Boolean { | ||||
|         return items[position].unread | ||||
|     } | ||||
|  | ||||
|     private fun readItemAtIndex(position: Int) { | ||||
|         val i = items[position] | ||||
|         items.remove(i) | ||||
|   | ||||
| @@ -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 | ||||
| @@ -127,7 +126,13 @@ class ArticleFragment : Fragment() { | ||||
|             font = prefs.getString("reader_font", "") | ||||
|             if (font.isNotEmpty()) { | ||||
|                 resId = context!!.resources.getIdentifier(font, "font", context!!.packageName) | ||||
|                 typeface = ResourcesCompat.getFont(context!!, resId)!! | ||||
|                 typeface = try { | ||||
|                     ResourcesCompat.getFont(context!!, resId)!! | ||||
|                 } catch (e: java.lang.Exception) { | ||||
|                     // ACRA.getErrorReporter().maybeHandleSilentException(Throwable("Font loading issue: ${e.message}"), context!!) | ||||
|                     // Just to be sure | ||||
|                     null | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             refreshAlignment() | ||||
| @@ -494,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> | ||||
| @@ -36,7 +36,7 @@ | ||||
|     <string name="tab_favs">"收藏夹"</string> | ||||
|     <string name="action_about">"关于我们"</string> | ||||
|     <string name="marked_as_read">"已读"</string> | ||||
|     <string name="marked_as_unread">"Item unread"</string> | ||||
|     <string name="marked_as_unread">"未讀項目"</string> | ||||
|     <string name="undo_string">"撤销"</string> | ||||
|     <string name="addStringNoUrl">"登录以添加数据源。"</string> | ||||
|     <string name="cant_get_sources">"无法获取数据列表。"</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.2.51' | ||||
|         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.2.1' | ||||
|         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 @@ | ||||
| #Tue Sep 25 20:41:54 CEST 2018 | ||||
| #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.6-all.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip | ||||
|   | ||||
		Reference in New Issue
	
	Block a user