Compare commits
	
		
			20 Commits
		
	
	
		
			v161809253
			...
			v161810286
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 3b6891c84a | ||
|  | 4901e7174c | ||
|  | 8d70e68fe2 | ||
|  | d3e1527b70 | ||
|  | 0c201301f2 | ||
|  | 6090590f24 | ||
|  | 06b88c783d | ||
|  | bb75ebf635 | ||
|  | 7d7d0014be | ||
|  | b3f8d44794 | ||
|  | 29d1e38340 | ||
|  | 2be872e61e | ||
|  | 377c5518f7 | ||
|  | 21be7357b5 | ||
|  | d47ba2c820 | ||
|  | a64b14614a | ||
|  | 6a88192e77 | ||
|  | aa7c630818 | ||
|  | 7fb54f14c7 | ||
|  | 3d709c02b7 | 
| @@ -24,6 +24,8 @@ def versionNameFromGit() { | ||||
|     return gitVersion() | ||||
| } | ||||
|  | ||||
| apply plugin: 'kotlin-kapt' | ||||
|  | ||||
| apply plugin: 'com.android.application' | ||||
|  | ||||
| apply plugin: 'kotlin-android' | ||||
| @@ -36,7 +38,7 @@ android { | ||||
|         targetCompatibility JavaVersion.VERSION_1_8 | ||||
|     } | ||||
|     compileSdkVersion 28 | ||||
|     buildToolsVersion '28.0.2' | ||||
|     buildToolsVersion '28.0.3' | ||||
|     defaultConfig { | ||||
|         applicationId "apps.amine.bou.readerforselfoss" | ||||
|         minSdkVersion 16 | ||||
| @@ -53,7 +55,7 @@ android { | ||||
|         vectorDrawables.useSupportLibrary = true | ||||
|  | ||||
|         // tests | ||||
|         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | ||||
|         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||
|     } | ||||
|     buildTypes { | ||||
|         release { | ||||
| @@ -85,32 +87,32 @@ android { | ||||
|  | ||||
| dependencies { | ||||
|     // Testing | ||||
|     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' | ||||
|     androidTestImplementation 'com.android.support.test:runner:1.0.1' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-beta02' | ||||
|     androidTestImplementation 'androidx.test:runner:1.1.0-beta02' | ||||
|     // Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource | ||||
|     androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.1' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.1.0-beta02' | ||||
|     // Espresso-intents for validation and stubbing of Intents | ||||
|     androidTestImplementation 'com.android.support.test.espresso:espresso-intents:3.0.1' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0-beta02' | ||||
|     implementation fileTree(include: ['*.jar'], dir: 'libs') | ||||
|     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" | ||||
|     // Android Support | ||||
|     implementation "com.android.support:appcompat-v7:$android_version" | ||||
|     implementation "com.android.support:design:$android_version" | ||||
|     implementation "com.android.support:recyclerview-v7:$android_version" | ||||
|     implementation "com.android.support:support-v4:$android_version" | ||||
|     implementation "com.android.support:support-vector-drawable:$android_version" | ||||
|     implementation "com.android.support:customtabs:$android_version" | ||||
|     implementation "com.android.support:cardview-v7:$android_version" | ||||
|     implementation 'com.android.support.constraint:constraint-layout:1.1.0' | ||||
|     implementation "androidx.appcompat:appcompat:$android_version" | ||||
|     implementation "com.google.android.material:material:$android_version" | ||||
|     implementation "androidx.recyclerview:recyclerview:$android_version" | ||||
|     implementation "androidx.legacy:legacy-support-v4:$android_version" | ||||
|     implementation "androidx.vectordrawable:vectordrawable:$android_version" | ||||
|     implementation "androidx.browser:browser:$android_version" | ||||
|     implementation "androidx.cardview:cardview:$android_version" | ||||
|     implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' | ||||
|  | ||||
|     //multidex | ||||
|     implementation 'com.android.support:multidex:1.0.3' | ||||
|     implementation 'androidx.multidex:multidex:2.0.0' | ||||
|  | ||||
|     // Intro | ||||
|     implementation 'agency.tango.android:material-intro-screen:0.0.5' | ||||
|  | ||||
|     // About | ||||
|     implementation('com.mikepenz:aboutlibraries:6.0.0@aar') { | ||||
|     implementation('com.mikepenz:aboutlibraries:6.2.0@aar') { | ||||
|         transitive = true | ||||
|     } | ||||
|  | ||||
| @@ -121,8 +123,8 @@ dependencies { | ||||
|     implementation 'com.burgstaller:okhttp-digest:1.12' | ||||
|  | ||||
|     // Material-ish things | ||||
|     implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.3' | ||||
|     implementation 'com.github.jd-alexander:LikeButton:0.2.1' | ||||
|     implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5' | ||||
|     implementation 'com.github.jd-alexander:LikeButton:0.2.3' | ||||
|     implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' | ||||
|  | ||||
|     // glide | ||||
| @@ -130,25 +132,30 @@ dependencies { | ||||
|     implementation 'com.github.bumptech.glide:okhttp3-integration:4.1.1' | ||||
|  | ||||
|     // Asking politely users to rate the app | ||||
|     implementation 'com.github.stkent:amplify:2.1.0' | ||||
|     implementation 'com.github.stkent:amplify:2.2.0' | ||||
|  | ||||
|     // Drawer | ||||
|     implementation 'co.zsmb:materialdrawer-kt:1.3.5' | ||||
|     implementation 'com.anupcowkur:reservoir:3.1.0' | ||||
|     implementation 'co.zsmb:materialdrawer-kt:2.0.1' | ||||
|  | ||||
|     // Themes | ||||
|     implementation 'com.52inc:scoops:1.0.0' | ||||
|     implementation 'com.jrummyapps:colorpicker:2.1.7' | ||||
|     implementation 'com.jaredrummler:colorpicker:1.0.2' | ||||
|     implementation 'com.github.rubensousa:floatingtoolbar:1.5.1' | ||||
|  | ||||
|     // Pager | ||||
|     implementation 'me.relex:circleindicator:1.2.2@aar' | ||||
|     implementation 'me.relex:circleindicator:2.0.0@aar' | ||||
|  | ||||
|     implementation 'androidx.core:core-ktx:0.3' | ||||
|     implementation 'androidx.core:core-ktx:1.0.0' | ||||
|  | ||||
|     // Crash | ||||
|     implementation 'ch.acra:acra-http:5.1.3' | ||||
|     implementation 'ch.acra:acra-dialog:5.1.3' | ||||
|  | ||||
|     implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version" | ||||
|     implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" | ||||
|  | ||||
|     implementation "androidx.room:room-runtime:$room_version" | ||||
|     kapt "androidx.room:room-compiler:$room_version" | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -2,27 +2,27 @@ package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.support.test.InstrumentationRegistry | ||||
| import android.support.test.espresso.Espresso.onView | ||||
| import android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu | ||||
| import android.support.test.espresso.action.ViewActions.click | ||||
| import android.support.test.espresso.action.ViewActions.closeSoftKeyboard | ||||
| import android.support.test.espresso.action.ViewActions.pressBack | ||||
| import android.support.test.espresso.action.ViewActions.pressKey | ||||
| import android.support.test.espresso.action.ViewActions.typeText | ||||
| import android.support.test.espresso.assertion.ViewAssertions.matches | ||||
| import android.support.test.espresso.contrib.DrawerActions | ||||
| import android.support.test.espresso.intent.Intents | ||||
| import android.support.test.espresso.intent.Intents.intended | ||||
| import android.support.test.espresso.intent.Intents.times | ||||
| import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import android.support.test.espresso.matcher.ViewMatchers.isDisplayed | ||||
| import android.support.test.espresso.matcher.ViewMatchers.isRoot | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withContentDescription | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withId | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withText | ||||
| import android.support.test.rule.ActivityTestRule | ||||
| import android.support.test.runner.AndroidJUnit4 | ||||
| import androidx.test.InstrumentationRegistry | ||||
| import androidx.test.espresso.Espresso.onView | ||||
| import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu | ||||
| import androidx.test.espresso.action.ViewActions.click | ||||
| import androidx.test.espresso.action.ViewActions.closeSoftKeyboard | ||||
| import androidx.test.espresso.action.ViewActions.pressBack | ||||
| import androidx.test.espresso.action.ViewActions.pressKey | ||||
| import androidx.test.espresso.action.ViewActions.typeText | ||||
| import androidx.test.espresso.assertion.ViewAssertions.matches | ||||
| import androidx.test.espresso.contrib.DrawerActions | ||||
| import androidx.test.espresso.intent.Intents | ||||
| import androidx.test.espresso.intent.Intents.intended | ||||
| import androidx.test.espresso.intent.Intents.times | ||||
| import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import androidx.test.espresso.matcher.ViewMatchers.isDisplayed | ||||
| import androidx.test.espresso.matcher.ViewMatchers.isRoot | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withContentDescription | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withId | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withText | ||||
| import androidx.test.rule.ActivityTestRule | ||||
| import androidx.test.runner.AndroidJUnit4 | ||||
| import android.view.KeyEvent | ||||
| import apps.amine.bou.readerforselfoss.utils.Config | ||||
| import org.junit.After | ||||
|   | ||||
| @@ -2,19 +2,19 @@ package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.support.test.InstrumentationRegistry.getInstrumentation | ||||
| import android.support.test.espresso.Espresso.onView | ||||
| import android.support.test.espresso.action.ViewActions.click | ||||
| import android.support.test.espresso.assertion.ViewAssertions.matches | ||||
| import android.support.test.espresso.intent.Intents | ||||
| import android.support.test.espresso.intent.Intents.intended | ||||
| import android.support.test.espresso.intent.Intents.times | ||||
| import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import android.support.test.espresso.matcher.ViewMatchers.isDisplayed | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withId | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withText | ||||
| import android.support.test.rule.ActivityTestRule | ||||
| import android.support.test.runner.AndroidJUnit4 | ||||
| import androidx.test.InstrumentationRegistry.getInstrumentation | ||||
| import androidx.test.espresso.Espresso.onView | ||||
| import androidx.test.espresso.action.ViewActions.click | ||||
| import androidx.test.espresso.assertion.ViewAssertions.matches | ||||
| import androidx.test.espresso.intent.Intents | ||||
| import androidx.test.espresso.intent.Intents.intended | ||||
| import androidx.test.espresso.intent.Intents.times | ||||
| import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import androidx.test.espresso.matcher.ViewMatchers.isDisplayed | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withId | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withText | ||||
| import androidx.test.rule.ActivityTestRule | ||||
| import androidx.test.runner.AndroidJUnit4 | ||||
| import apps.amine.bou.readerforselfoss.utils.Config | ||||
| import org.junit.After | ||||
| import org.junit.Before | ||||
|   | ||||
| @@ -2,25 +2,25 @@ package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.support.test.InstrumentationRegistry | ||||
| import android.support.test.espresso.Espresso.onView | ||||
| import android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu | ||||
| import android.support.test.espresso.action.ViewActions.click | ||||
| import android.support.test.espresso.action.ViewActions.closeSoftKeyboard | ||||
| import android.support.test.espresso.action.ViewActions.pressBack | ||||
| import android.support.test.espresso.action.ViewActions.typeText | ||||
| import android.support.test.espresso.assertion.ViewAssertions.matches | ||||
| import android.support.test.espresso.intent.Intents | ||||
| import android.support.test.espresso.intent.Intents.intended | ||||
| import android.support.test.espresso.intent.Intents.times | ||||
| import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import android.support.test.espresso.matcher.ViewMatchers | ||||
| import android.support.test.espresso.matcher.ViewMatchers.isRoot | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withId | ||||
| import android.support.test.espresso.matcher.ViewMatchers.withText | ||||
| import android.support.test.rule.ActivityTestRule | ||||
| import android.support.test.runner.AndroidJUnit4 | ||||
| import androidx.test.InstrumentationRegistry | ||||
| import androidx.test.espresso.Espresso.onView | ||||
| import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu | ||||
| import androidx.test.espresso.action.ViewActions.click | ||||
| import androidx.test.espresso.action.ViewActions.closeSoftKeyboard | ||||
| import androidx.test.espresso.action.ViewActions.pressBack | ||||
| import androidx.test.espresso.action.ViewActions.typeText | ||||
| import androidx.test.espresso.assertion.ViewAssertions.matches | ||||
| import androidx.test.espresso.intent.Intents | ||||
| import androidx.test.espresso.intent.Intents.intended | ||||
| import androidx.test.espresso.intent.Intents.times | ||||
| import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import androidx.test.espresso.matcher.ViewMatchers | ||||
| import androidx.test.espresso.matcher.ViewMatchers.isRoot | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withId | ||||
| import androidx.test.espresso.matcher.ViewMatchers.withText | ||||
| import androidx.test.rule.ActivityTestRule | ||||
| import androidx.test.runner.AndroidJUnit4 | ||||
| import apps.amine.bou.readerforselfoss.utils.Config | ||||
| import com.mikepenz.aboutlibraries.ui.LibsActivity | ||||
| import org.junit.After | ||||
|   | ||||
| @@ -3,13 +3,13 @@ package apps.amine.bou.readerforselfoss | ||||
| import android.content.Intent | ||||
| import android.content.SharedPreferences | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.test.InstrumentationRegistry.getInstrumentation | ||||
| import android.support.test.espresso.intent.Intents | ||||
| import android.support.test.espresso.intent.Intents.intended | ||||
| import android.support.test.espresso.intent.Intents.times | ||||
| import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import android.support.test.rule.ActivityTestRule | ||||
| import android.support.test.runner.AndroidJUnit4 | ||||
| import androidx.test.InstrumentationRegistry.getInstrumentation | ||||
| import androidx.test.espresso.intent.Intents | ||||
| import androidx.test.espresso.intent.Intents.intended | ||||
| import androidx.test.espresso.intent.Intents.times | ||||
| import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent | ||||
| import androidx.test.rule.ActivityTestRule | ||||
| import androidx.test.runner.AndroidJUnit4 | ||||
| import org.junit.After | ||||
|  | ||||
| import org.junit.Before | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.support.design.widget.TextInputLayout | ||||
| import android.support.test.espresso.matcher.ViewMatchers | ||||
| import com.google.android.material.textfield.TextInputLayout | ||||
| import androidx.test.espresso.matcher.ViewMatchers | ||||
| import android.view.View | ||||
| import org.hamcrest.Description | ||||
| import org.hamcrest.Matcher | ||||
|   | ||||
| @@ -4,8 +4,8 @@ import android.content.Intent | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.constraint.ConstraintLayout | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import androidx.constraintlayout.widget.ConstraintLayout | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import android.view.View | ||||
| import android.widget.AdapterView | ||||
| import android.widget.ArrayAdapter | ||||
|   | ||||
| @@ -9,29 +9,32 @@ import android.net.Uri | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.v4.view.MenuItemCompat | ||||
| import android.support.v7.app.AlertDialog | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import android.support.v7.widget.DividerItemDecoration | ||||
| import android.support.v7.widget.GridLayoutManager | ||||
| import android.support.v7.widget.RecyclerView | ||||
| import android.support.v7.widget.SearchView | ||||
| import android.support.v7.widget.StaggeredGridLayoutManager | ||||
| import android.support.v7.widget.helper.ItemTouchHelper | ||||
| 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.util.Log | ||||
| import android.view.Menu | ||||
| import android.view.MenuItem | ||||
| import android.view.View | ||||
| import android.widget.Toast | ||||
| import androidx.room.Room | ||||
| import androidx.room.RoomDatabase | ||||
| 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.Sources | ||||
| 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.persistence.database.AppDatabase | ||||
| import apps.amine.bou.readerforselfoss.settings.SettingsActivity | ||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | ||||
| import apps.amine.bou.readerforselfoss.themes.Toppings | ||||
| @@ -42,14 +45,13 @@ 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.persistence.toEntity | ||||
| import apps.amine.bou.readerforselfoss.utils.persistence.toView | ||||
| import co.zsmb.materialdrawerkt.builders.accountHeader | ||||
| import co.zsmb.materialdrawerkt.builders.drawer | ||||
| import co.zsmb.materialdrawerkt.builders.footer | ||||
| import co.zsmb.materialdrawerkt.draweritems.badgeable.primaryItem | ||||
| import co.zsmb.materialdrawerkt.draweritems.profile.profile | ||||
| import com.anupcowkur.reservoir.Reservoir | ||||
| import com.anupcowkur.reservoir.ReservoirGetCallback | ||||
| import com.anupcowkur.reservoir.ReservoirPutCallback | ||||
| import com.ashokvarma.bottomnavigation.BottomNavigationBar | ||||
| import com.ashokvarma.bottomnavigation.BottomNavigationItem | ||||
| import com.ashokvarma.bottomnavigation.TextBadgeItem | ||||
| @@ -65,9 +67,12 @@ import com.mikepenz.materialdrawer.model.DividerDrawerItem | ||||
| import com.mikepenz.materialdrawer.model.PrimaryDrawerItem | ||||
| import com.mikepenz.materialdrawer.model.SecondaryDrawerItem | ||||
| import kotlinx.android.synthetic.main.activity_home.* | ||||
| import kotlinx.android.synthetic.main.fragment_article.* | ||||
| import retrofit2.Call | ||||
| import retrofit2.Callback | ||||
| import retrofit2.Response | ||||
| import kotlin.concurrent.thread | ||||
|  | ||||
| class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|  | ||||
|     private val MENU_PREFERENCES = 12302 | ||||
| @@ -94,7 +99,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|     private var itemsNumber: Int = 200 | ||||
|     private var elementsShown: Int = 0 | ||||
|     private var maybeTagFilter: Tag? = null | ||||
|     private var maybeSourceFilter: Sources? = null | ||||
|     private var maybeSourceFilter: Source? = null | ||||
|     private var maybeSearchFilter: String? = null | ||||
|     private var userIdentifier: String = "" | ||||
|     private var displayAccountHeader: Boolean = false | ||||
| @@ -102,7 +107,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|     private var lastFetchDone: Boolean = false | ||||
|     private var hiddenTags: List<String> = emptyList() | ||||
|  | ||||
|  | ||||
|     private lateinit var tabNewBadge: TextBadgeItem | ||||
|     private lateinit var tabArchiveBadge: TextBadgeItem | ||||
|     private lateinit var tabStarredBadge: TextBadgeItem | ||||
| @@ -114,7 +118,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|     private lateinit var appColors: AppColors | ||||
|     private var offset: Int = 0 | ||||
|     private var firstVisible: Int = 0 | ||||
|     private var recyclerViewScrollListener: RecyclerView.OnScrollListener? = null | ||||
|     private lateinit var recyclerViewScrollListener: RecyclerView.OnScrollListener | ||||
|     private lateinit var settings: SharedPreferences | ||||
|  | ||||
|     private var recyclerAdapter: RecyclerView.Adapter<*>? = null | ||||
| @@ -123,10 +127,11 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|     private var badgeAll: Int = -1 | ||||
|     private var badgeFavs: Int = -1 | ||||
|  | ||||
|  | ||||
|     private lateinit var tagsBadge: Map<Long, Int> | ||||
|  | ||||
|     data class DrawerData(val tags: List<Tag>?, val sources: List<Sources>?) | ||||
|     private lateinit var db: AppDatabase | ||||
|  | ||||
|     data class DrawerData(val tags: List<Tag>?, val sources: List<Source>?) | ||||
|  | ||||
|     override fun onStart() { | ||||
|         super.onStart() | ||||
| @@ -147,6 +152,12 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|             Amplify.getSharedInstance().promptIfReady(promptView) | ||||
|         } | ||||
|  | ||||
|         db = Room.databaseBuilder( | ||||
|             applicationContext, | ||||
|             AppDatabase::class.java!!, "selfoss-database" | ||||
|         ).build() | ||||
|  | ||||
|  | ||||
|         customTabActivityHelper = CustomTabActivityHelper() | ||||
|  | ||||
|         sharedPref = PreferenceManager.getDefaultSharedPreferences(this) | ||||
| @@ -209,8 +220,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|                 ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT | ||||
|             ) { | ||||
|                 override fun getSwipeDirs( | ||||
|                     recyclerView: RecyclerView?, | ||||
|                     viewHolder: RecyclerView.ViewHolder? | ||||
|                     recyclerView: RecyclerView, | ||||
|                     viewHolder: RecyclerView.ViewHolder | ||||
|                 ): Int = | ||||
|                     if (elementsShown != UNREAD_SHOWN) { | ||||
|                         0 | ||||
| @@ -374,7 +385,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|     private fun handleThemeBinding() { | ||||
|         val scoop = Scoop.getInstance() | ||||
|         scoop.bind(this, Toppings.PRIMARY.value, toolBar) | ||||
|         if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|             scoop.bindStatusBar(this, Toppings.PRIMARY_DARK.value) | ||||
|         } | ||||
|     } | ||||
| @@ -384,7 +395,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|         val scoop = Scoop.getInstance() | ||||
|         scoop.update(Toppings.PRIMARY.value, appColors.colorPrimary) | ||||
|  | ||||
|         if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|             scoop.update(Toppings.PRIMARY_DARK.value, appColors.colorPrimaryDark) | ||||
|         } | ||||
|     } | ||||
| @@ -508,7 +519,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|                         ) | ||||
|                     } | ||||
|                 } else { | ||||
|                     val filteredHiddenTags: List<Tag> = maybeTags.filter { hiddenTags.contains(it.tag) } | ||||
|                     val filteredHiddenTags: List<Tag> = | ||||
|                         maybeTags.filter { hiddenTags.contains(it.tag) } | ||||
|                     tagsBadge = filteredHiddenTags.map { | ||||
|                         val gd = GradientDrawable() | ||||
|                         val color = try { | ||||
| @@ -544,7 +556,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             fun handleSources(maybeSources: List<Sources>?) { | ||||
|             fun handleSources(maybeSources: List<Source>?) { | ||||
|                 if (maybeSources == null) { | ||||
|                     if (loadedFromCache) { | ||||
|                         drawer.addItem( | ||||
| @@ -643,14 +655,19 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|  | ||||
|  | ||||
|                 if (!loadedFromCache) { | ||||
|                     Reservoir.putAsync( | ||||
|                         "drawerData", maybeDrawerData, object : ReservoirPutCallback { | ||||
|                             override fun onSuccess() { | ||||
|                             } | ||||
|  | ||||
|                             override fun onFailure(p0: Exception?) { | ||||
|                             } | ||||
|                         }) | ||||
|                     if (maybeDrawerData.tags != null) { | ||||
|                         thread { | ||||
|                             val tagEntities = maybeDrawerData.tags.map { it.toEntity() } | ||||
|                             db.drawerDataDao().insertAllTags(*tagEntities.toTypedArray()) | ||||
|                         } | ||||
|                     } | ||||
|                     if (maybeDrawerData.sources != null) { | ||||
|                         thread { | ||||
|                             val sourceEntities = | ||||
|                                 maybeDrawerData.sources.map { it.toEntity(this@HomeActivity) } | ||||
|                             db.drawerDataDao().insertAllSources(*sourceEntities.toTypedArray()) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 if (!loadedFromCache) { | ||||
| @@ -672,13 +689,13 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|  | ||||
|         fun drawerApiCalls(maybeDrawerData: DrawerData?) { | ||||
|             var tags: List<Tag>? = null | ||||
|             var sources: List<Sources>? | ||||
|             var sources: List<Source>? | ||||
|  | ||||
|             fun sourcesApiCall() { | ||||
|                 api.sources.enqueue(object : Callback<List<Sources>> { | ||||
|                 api.sources.enqueue(object : Callback<List<Source>> { | ||||
|                     override fun onResponse( | ||||
|                         call: Call<List<Sources>>?, | ||||
|                         response: Response<List<Sources>> | ||||
|                         call: Call<List<Source>>?, | ||||
|                         response: Response<List<Source>> | ||||
|                     ) { | ||||
|                         sources = response.body() | ||||
|                         val apiDrawerData = DrawerData(tags, sources) | ||||
| @@ -687,7 +704,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     override fun onFailure(call: Call<List<Sources>>?, t: Throwable?) { | ||||
|                     override fun onFailure(call: Call<List<Source>>?, t: Throwable?) { | ||||
|                     } | ||||
|                 }) | ||||
|             } | ||||
| @@ -713,18 +730,12 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|         val resultType = object : TypeToken<DrawerData>() {}.type | ||||
|         Reservoir.getAsync( | ||||
|             "drawerData", resultType, object : ReservoirGetCallback<DrawerData> { | ||||
|                 override fun onSuccess(maybeDrawerData: DrawerData?) { | ||||
|                     handleDrawerData(maybeDrawerData, loadedFromCache = true) | ||||
|                     drawerApiCalls(maybeDrawerData) | ||||
|                 } | ||||
|  | ||||
|                 override fun onFailure(p0: Exception?) { | ||||
|                     drawerApiCalls(null) | ||||
|                 } | ||||
|             }) | ||||
|         thread { | ||||
|             var drawerData = DrawerData(db.drawerDataDao().tags().map { it.toView() }, | ||||
|                                         db.drawerDataDao().sources().map { it.toView() }) | ||||
|             handleDrawerData(drawerData, loadedFromCache = true) | ||||
|             drawerApiCalls(drawerData) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun reloadLayoutManager() { | ||||
| @@ -735,7 +746,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|         when (currentManager) { | ||||
|             is StaggeredGridLayoutManager -> | ||||
|                 if (!shouldBeCardView) { | ||||
|                     layoutManager = GridLayoutManager(this, calculateNoOfColumns()) | ||||
|                     layoutManager = GridLayoutManager( | ||||
|                         this, | ||||
|                         calculateNoOfColumns() | ||||
|                     ) | ||||
|                     recyclerView.layoutManager = layoutManager | ||||
|                 } | ||||
|             is GridLayoutManager -> | ||||
| @@ -751,7 +765,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|             else -> | ||||
|                 if (currentManager == null) { | ||||
|                     if (!shouldBeCardView) { | ||||
|                         layoutManager = GridLayoutManager(this, calculateNoOfColumns()) | ||||
|                         layoutManager = GridLayoutManager( | ||||
|                             this, | ||||
|                             calculateNoOfColumns() | ||||
|                         ) | ||||
|                         recyclerView.layoutManager = layoutManager | ||||
|                     } else { | ||||
|                         layoutManager = StaggeredGridLayoutManager( | ||||
| @@ -805,22 +822,20 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|     } | ||||
|  | ||||
|     private fun handleInfiniteScroll() { | ||||
|         if (recyclerViewScrollListener == null) { | ||||
|             recyclerViewScrollListener = object : RecyclerView.OnScrollListener() { | ||||
|                 override fun onScrolled(localRecycler: RecyclerView?, dx: Int, dy: Int) { | ||||
|                     if (localRecycler != null && dy > 0) { | ||||
|                         val manager = recyclerView.layoutManager | ||||
|                         val lastVisibleItem: Int = when (manager) { | ||||
|                             is StaggeredGridLayoutManager -> manager.findLastCompletelyVisibleItemPositions( | ||||
|                                 null | ||||
|                             ).last() | ||||
|                             is GridLayoutManager -> manager.findLastCompletelyVisibleItemPosition() | ||||
|                             else -> 0 | ||||
|                         } | ||||
|         recyclerViewScrollListener = object : RecyclerView.OnScrollListener() { | ||||
|             override fun onScrolled(localRecycler: RecyclerView, dx: Int, dy: Int) { | ||||
|                 if (localRecycler != null && dy > 0) { | ||||
|                     val manager = recyclerView.layoutManager | ||||
|                     val lastVisibleItem: Int = when (manager) { | ||||
|                         is StaggeredGridLayoutManager -> manager.findLastCompletelyVisibleItemPositions( | ||||
|                             null | ||||
|                         ).last() | ||||
|                         is GridLayoutManager -> manager.findLastCompletelyVisibleItemPosition() | ||||
|                         else -> 0 | ||||
|                     } | ||||
|  | ||||
|                         if (lastVisibleItem == (items.size - 1) && items.size < maxItemNumber()) { | ||||
|                             getElementsAccordingToTab(appendResults = true) | ||||
|                         } | ||||
|                     if (lastVisibleItem == (items.size - 1) && items.size < maxItemNumber()) { | ||||
|                         getElementsAccordingToTab(appendResults = true) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| @@ -859,8 +874,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|     } | ||||
|  | ||||
|     private fun filter(tags: String): Boolean { | ||||
|       val tagsList = tags.replace("\\s".toRegex(), "").split(",") | ||||
|       return tagsList.intersect(hiddenTags).isEmpty() | ||||
|         val tagsList = tags.replace("\\s".toRegex(), "").split(",") | ||||
|         return tagsList.intersect(hiddenTags).isEmpty() | ||||
|     } | ||||
|  | ||||
|     private fun doCallTo( | ||||
| @@ -874,7 +889,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { | ||||
|                 if (shouldUpdate) { | ||||
|                     items = response.body() as ArrayList<Item> | ||||
|                     items = items.filter { | ||||
|                       maybeTagFilter != null || filter(it.tags) | ||||
|                         maybeTagFilter != null || filter(it.tags) | ||||
|                     } as ArrayList<Item> | ||||
|  | ||||
|                     if (allItems.isEmpty()) { | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import android.content.Intent | ||||
| import android.net.Uri | ||||
| import android.os.Bundle | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.v7.app.AppCompatDelegate | ||||
| import androidx.appcompat.app.AppCompatDelegate | ||||
| import android.view.View | ||||
|  | ||||
| class IntroActivity : MaterialIntroActivity() { | ||||
|   | ||||
| @@ -6,8 +6,8 @@ import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.content.SharedPreferences | ||||
| import android.os.Bundle | ||||
| import android.support.v7.app.AlertDialog | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import androidx.appcompat.app.AlertDialog | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import android.text.TextUtils | ||||
| import android.view.Menu | ||||
| import android.view.MenuItem | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package apps.amine.bou.readerforselfoss | ||||
| import android.content.Intent | ||||
| import android.os.Bundle | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
|  | ||||
| class MainActivity : AppCompatActivity() { | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,12 @@ | ||||
| package apps.amine.bou.readerforselfoss | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.SharedPreferences | ||||
| import android.graphics.drawable.Drawable | ||||
| import android.net.Uri | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.multidex.MultiDexApplication | ||||
| import androidx.multidex.MultiDexApplication | ||||
| import android.widget.ImageView | ||||
| import apps.amine.bou.readerforselfoss.utils.Config | ||||
| import com.anupcowkur.reservoir.Reservoir | ||||
| import com.bumptech.glide.Glide | ||||
| import com.bumptech.glide.request.RequestOptions | ||||
| import com.ftinc.scoop.Scoop | ||||
| @@ -49,8 +47,6 @@ class MyApp : MultiDexApplication() { | ||||
|  | ||||
|         initAmplify() | ||||
|  | ||||
|         initCache() | ||||
|  | ||||
|         val prefs = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) | ||||
|         if (prefs.getString("unique_id", "").isEmpty()) { | ||||
|             val editor = prefs.edit() | ||||
| @@ -80,14 +76,6 @@ class MyApp : MultiDexApplication() { | ||||
|             .applyAllDefaultRules() | ||||
|     } | ||||
|  | ||||
|     private fun initCache() { | ||||
|         try { | ||||
|             Reservoir.init(this, 8192) //in bytes | ||||
|         } catch (e: IOException) { | ||||
|             //failure | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun initDrawerImageLoader() { | ||||
|         DrawerImageLoader.init(object : AbstractDrawerImageLoader() { | ||||
|             override fun set( | ||||
|   | ||||
| @@ -3,10 +3,12 @@ package apps.amine.bou.readerforselfoss | ||||
| import android.graphics.drawable.ColorDrawable | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.support.v4.app.FragmentManager | ||||
| import android.support.v4.app.FragmentStatePagerAdapter | ||||
| import android.support.v4.content.ContextCompat | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import android.preference.PreferenceManager | ||||
| import androidx.fragment.app.FragmentManager | ||||
| import androidx.fragment.app.FragmentStatePagerAdapter | ||||
| import androidx.core.content.ContextCompat | ||||
| import androidx.viewpager.widget.ViewPager | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import android.view.Menu | ||||
| import android.view.MenuItem | ||||
| import android.view.ViewGroup | ||||
| @@ -18,10 +20,13 @@ import apps.amine.bou.readerforselfoss.fragments.ArticleFragment | ||||
| 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.maybeHandleSilentException | ||||
| import apps.amine.bou.readerforselfoss.utils.succeeded | ||||
| import apps.amine.bou.readerforselfoss.utils.toggleStar | ||||
| import com.ftinc.scoop.Scoop | ||||
| import kotlinx.android.synthetic.main.activity_reader.* | ||||
| import me.relex.circleindicator.CircleIndicator | ||||
| import org.acra.ACRA | ||||
| import retrofit2.Call | ||||
| import retrofit2.Callback | ||||
| import retrofit2.Response | ||||
| @@ -29,7 +34,9 @@ import retrofit2.Response | ||||
| class ReaderActivity : AppCompatActivity() { | ||||
|  | ||||
|     private var markOnScroll: Boolean = false | ||||
|     private var debugReadingItems: Boolean = false | ||||
|     private var currentItem: Int = 0 | ||||
|     private lateinit var userIdentifier: String | ||||
|  | ||||
|     private lateinit var api: SelfossApi | ||||
|  | ||||
| @@ -63,6 +70,18 @@ class ReaderActivity : AppCompatActivity() { | ||||
|         supportActionBar?.setDisplayHomeAsUpEnabled(true) | ||||
|         supportActionBar?.setDisplayShowHomeEnabled(true) | ||||
|  | ||||
|         val prefs = PreferenceManager.getDefaultSharedPreferences(this) | ||||
|  | ||||
|         debugReadingItems = prefs.getBoolean("read_debug", false) | ||||
|         userIdentifier = prefs.getString("unique_id", "") | ||||
|         markOnScroll = prefs.getBoolean("mark_on_scroll", false) | ||||
|  | ||||
|         api = SelfossApi( | ||||
|             this, | ||||
|             this@ReaderActivity, | ||||
|             prefs.getBoolean("isSelfSignedCert", false), | ||||
|             prefs.getBoolean("should_log_everything", false) | ||||
|         ) | ||||
|  | ||||
|         if (allItems.isEmpty()) { | ||||
|             finish() | ||||
| @@ -70,6 +89,8 @@ class ReaderActivity : AppCompatActivity() { | ||||
|  | ||||
|         currentItem = intent.getIntExtra("currentItem", 0) | ||||
|  | ||||
|         readItem(allItems[currentItem].id) | ||||
|  | ||||
|         pager.adapter = ScreenSlidePagerAdapter(supportFragmentManager, AppColors(this@ReaderActivity)) | ||||
|         pager.currentItem = currentItem | ||||
|     } | ||||
| @@ -77,10 +98,64 @@ class ReaderActivity : AppCompatActivity() { | ||||
|     override fun onResume() { | ||||
|         super.onResume() | ||||
|  | ||||
|         (pager.adapter as ScreenSlidePagerAdapter).notifyDataSetChanged() | ||||
|         notifyAdapter() | ||||
|  | ||||
|         pager.setPageTransformer(true, DepthPageTransformer()) | ||||
|         (indicator as CircleIndicator).setViewPager(pager) | ||||
|  | ||||
|         pager.addOnPageChangeListener( | ||||
|             object : ViewPager.SimpleOnPageChangeListener() { | ||||
|  | ||||
|                 override fun onPageSelected(position: Int) { | ||||
|  | ||||
|                     if (allItems[position].starred) { | ||||
|                         canRemoveFromFavorite() | ||||
|                     } else { | ||||
|                         canFavorite() | ||||
|                     } | ||||
|                     readItem(allItems[pager.currentItem].id) | ||||
|                 } | ||||
|             } | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     fun readItem(id: String) { | ||||
|         if (markOnScroll) { | ||||
|             api.markItem(id).enqueue( | ||||
|                 object : Callback<SuccessResponse> { | ||||
|                     override fun onResponse( | ||||
|                         call: Call<SuccessResponse>, | ||||
|                         response: Response<SuccessResponse> | ||||
|                     ) { | ||||
|                         if (!response.succeeded() && debugReadingItems) { | ||||
|                             val message = | ||||
|                                 "message: ${response.message()} " + | ||||
|                                         "response isSuccess: ${response.isSuccessful} " + | ||||
|                                         "response code: ${response.code()} " + | ||||
|                                         "response message: ${response.message()} " + | ||||
|                                         "response errorBody: ${response.errorBody()?.string()} " + | ||||
|                                         "body success: ${response.body()?.success} " + | ||||
|                                         "body isSuccess: ${response.body()?.isSuccess}" | ||||
|                             ACRA.getErrorReporter() | ||||
|                                 .maybeHandleSilentException(Exception(message), this@ReaderActivity) | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     override fun onFailure( | ||||
|                         call: Call<SuccessResponse>, | ||||
|                         t: Throwable | ||||
|                     ) { | ||||
|                         if (debugReadingItems) { | ||||
|                             ACRA.getErrorReporter().maybeHandleSilentException(t, this@ReaderActivity) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun notifyAdapter() { | ||||
|         (pager.adapter as ScreenSlidePagerAdapter).notifyDataSetChanged() | ||||
|     } | ||||
|  | ||||
|     override fun onPause() { | ||||
| @@ -142,6 +217,7 @@ class ReaderActivity : AppCompatActivity() { | ||||
|                             response: Response<SuccessResponse> | ||||
|                         ) { | ||||
|                             allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar() | ||||
|                             notifyAdapter() | ||||
|                             canRemoveFromFavorite() | ||||
|                         } | ||||
|  | ||||
| @@ -165,6 +241,7 @@ class ReaderActivity : AppCompatActivity() { | ||||
|                             response: Response<SuccessResponse> | ||||
|                         ) { | ||||
|                             allItems[pager.currentItem] = allItems[pager.currentItem].toggleStar() | ||||
|                             notifyAdapter() | ||||
|                             canFavorite() | ||||
|                         } | ||||
|  | ||||
|   | ||||
| @@ -5,12 +5,12 @@ import android.content.res.ColorStateList | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import android.support.v7.widget.LinearLayoutManager | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.recyclerview.widget.LinearLayoutManager | ||||
| import android.widget.Toast | ||||
| import apps.amine.bou.readerforselfoss.adapters.SourcesListAdapter | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.Sources | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.Source | ||||
| import apps.amine.bou.readerforselfoss.themes.AppColors | ||||
| import apps.amine.bou.readerforselfoss.themes.Toppings | ||||
| import com.ftinc.scoop.Scoop | ||||
| @@ -61,18 +61,18 @@ class SourcesActivity : AppCompatActivity() { | ||||
|             prefs.getBoolean("isSelfSignedCert", false), | ||||
|             prefs.getBoolean("should_log_everything", false) | ||||
|         ) | ||||
|         var items: ArrayList<Sources> = ArrayList() | ||||
|         var items: ArrayList<Source> = ArrayList() | ||||
|  | ||||
|         recyclerView.setHasFixedSize(true) | ||||
|         recyclerView.layoutManager = mLayoutManager | ||||
|  | ||||
|         api.sources.enqueue(object : Callback<List<Sources>> { | ||||
|         api.sources.enqueue(object : Callback<List<Source>> { | ||||
|             override fun onResponse( | ||||
|                 call: Call<List<Sources>>, | ||||
|                 response: Response<List<Sources>> | ||||
|                 call: Call<List<Source>>, | ||||
|                 response: Response<List<Source>> | ||||
|             ) { | ||||
|                 if (response.body() != null && response.body()!!.isNotEmpty()) { | ||||
|                     items = response.body() as ArrayList<Sources> | ||||
|                     items = response.body() as ArrayList<Source> | ||||
|                 } | ||||
|                 val mAdapter = SourcesListAdapter(this@SourcesActivity, items, api) | ||||
|                 recyclerView.adapter = mAdapter | ||||
| @@ -86,7 +86,7 @@ class SourcesActivity : AppCompatActivity() { | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             override fun onFailure(call: Call<List<Sources>>, t: Throwable) { | ||||
|             override fun onFailure(call: Call<List<Source>>, t: Throwable) { | ||||
|                 Toast.makeText( | ||||
|                     this@SourcesActivity, | ||||
|                     R.string.cant_get_sources, | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package apps.amine.bou.readerforselfoss.adapters | ||||
|  | ||||
| import android.app.Activity | ||||
| import android.content.Context | ||||
| import android.support.v7.widget.CardView | ||||
| import android.support.v7.widget.RecyclerView | ||||
| import androidx.cardview.widget.CardView | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import android.text.Html | ||||
| import android.view.LayoutInflater | ||||
| import android.view.View | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package apps.amine.bou.readerforselfoss.adapters | ||||
|  | ||||
| import android.app.Activity | ||||
| import android.content.Context | ||||
| import android.support.constraint.ConstraintLayout | ||||
| import android.support.v7.widget.RecyclerView | ||||
| import androidx.constraintlayout.widget.ConstraintLayout | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import android.text.Html | ||||
| import android.util.TypedValue | ||||
| import android.view.LayoutInflater | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package apps.amine.bou.readerforselfoss.adapters | ||||
|  | ||||
| import android.app.Activity | ||||
| import android.graphics.Color | ||||
| import android.support.design.widget.Snackbar | ||||
| import android.support.v7.widget.RecyclerView | ||||
| import com.google.android.material.snackbar.Snackbar | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import android.widget.TextView | ||||
| import android.widget.Toast | ||||
| import apps.amine.bou.readerforselfoss.R | ||||
| @@ -62,7 +62,7 @@ abstract class ItemsAdapter<VH : RecyclerView.ViewHolder?> : RecyclerView.Adapte | ||||
|             } | ||||
|  | ||||
|         val view = s.view | ||||
|         val tv: TextView = view.findViewById(android.support.design.R.id.snackbar_text) | ||||
|         val tv: TextView = view.findViewById(com.google.android.material.R.id.snackbar_text) | ||||
|         tv.setTextColor(Color.WHITE) | ||||
|         s.show() | ||||
|     } | ||||
|   | ||||
| @@ -2,15 +2,15 @@ package apps.amine.bou.readerforselfoss.adapters | ||||
|  | ||||
| import android.app.Activity | ||||
| import android.content.Context | ||||
| import android.support.constraint.ConstraintLayout | ||||
| import android.support.v7.widget.RecyclerView | ||||
| import androidx.constraintlayout.widget.ConstraintLayout | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import android.view.LayoutInflater | ||||
| import android.view.ViewGroup | ||||
| import android.widget.Button | ||||
| import android.widget.Toast | ||||
| import apps.amine.bou.readerforselfoss.R | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.Sources | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.Source | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse | ||||
| import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable | ||||
| import apps.amine.bou.readerforselfoss.utils.toTextDrawableString | ||||
| @@ -23,7 +23,7 @@ import retrofit2.Response | ||||
|  | ||||
| class SourcesListAdapter( | ||||
|     private val app: Activity, | ||||
|     private val items: ArrayList<Sources>, | ||||
|     private val items: ArrayList<Source>, | ||||
|     private val api: SelfossApi | ||||
| ) : RecyclerView.Adapter<SourcesListAdapter.ViewHolder>() { | ||||
|     private val c: Context = app.baseContext | ||||
|   | ||||
| @@ -159,7 +159,7 @@ class SelfossApi( | ||||
|     fun update(): Call<String> = | ||||
|         service.update(userName, password) | ||||
|  | ||||
|     val sources: Call<List<Sources>> | ||||
|     val sources: Call<List<Source>> | ||||
|         get() = service.sources(userName, password) | ||||
|  | ||||
|     fun deleteSource(id: String): Call<SuccessResponse> = | ||||
|   | ||||
| @@ -42,7 +42,7 @@ data class Spout( | ||||
|     @SerializedName("description") val description: String | ||||
| ) | ||||
|  | ||||
| data class Sources( | ||||
| data class Source( | ||||
|     @SerializedName("id") val id: String, | ||||
|     @SerializedName("title") val title: String, | ||||
|     @SerializedName("tags") val tags: String, | ||||
|   | ||||
| @@ -95,7 +95,7 @@ internal interface SelfossService { | ||||
|     fun sources( | ||||
|         @Query("username") username: String, | ||||
|         @Query("password") password: String | ||||
|     ): Call<List<Sources>> | ||||
|     ): Call<List<Source>> | ||||
|  | ||||
|     @DELETE("source/{id}") | ||||
|     fun deleteSource( | ||||
|   | ||||
| @@ -1,20 +1,17 @@ | ||||
| package apps.amine.bou.readerforselfoss.fragments | ||||
|  | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.content.SharedPreferences | ||||
| import android.content.res.ColorStateList | ||||
| import android.graphics.drawable.ColorDrawable | ||||
| import android.net.Uri | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.customtabs.CustomTabsIntent | ||||
| import android.support.design.widget.FloatingActionButton | ||||
| import android.support.v4.app.Fragment | ||||
| import android.support.v4.content.ContextCompat | ||||
| import android.support.v4.widget.NestedScrollView | ||||
| import android.support.v7.app.AlertDialog | ||||
| import androidx.browser.customtabs.CustomTabsIntent | ||||
| import com.google.android.material.floatingactionbutton.FloatingActionButton | ||||
| import androidx.fragment.app.Fragment | ||||
| import androidx.core.content.ContextCompat | ||||
| import androidx.core.widget.NestedScrollView | ||||
| import android.view.LayoutInflater | ||||
| import android.view.MenuItem | ||||
| import android.view.View | ||||
| @@ -58,7 +55,6 @@ class ArticleFragment : Fragment() { | ||||
|     private lateinit var contentSource: String | ||||
|     private lateinit var contentImage: String | ||||
|     private lateinit var contentTitle: String | ||||
|     private var showMalformedUrl: Boolean = false | ||||
|     private lateinit var editor: SharedPreferences.Editor | ||||
|     private lateinit var fab: FloatingActionButton | ||||
|     private lateinit var appColors: AppColors | ||||
| @@ -97,11 +93,9 @@ class ArticleFragment : Fragment() { | ||||
|         val prefs = PreferenceManager.getDefaultSharedPreferences(activity) | ||||
|         editor = prefs.edit() | ||||
|         fontSize = prefs.getString("reader_font_size", "14").toInt() | ||||
|         showMalformedUrl = prefs.getBoolean("show_error_malformed_url", true) | ||||
|  | ||||
|         val settings = activity!!.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE) | ||||
|         val debugReadingItems = prefs.getBoolean("read_debug", false) | ||||
|         val markOnScroll = prefs.getBoolean("mark_on_scroll", false) | ||||
|  | ||||
|         val api = SelfossApi( | ||||
|             context!!, | ||||
| @@ -211,38 +205,6 @@ class ArticleFragment : Fragment() { | ||||
|             } | ||||
|         ) | ||||
|  | ||||
|         if (markOnScroll) { | ||||
|             api.markItem(allItems[pageNumber.toInt()].id).enqueue( | ||||
|                 object : Callback<SuccessResponse> { | ||||
|                     override fun onResponse( | ||||
|                         call: Call<SuccessResponse>, | ||||
|                         response: Response<SuccessResponse> | ||||
|                     ) { | ||||
|                         if (!response.succeeded() && debugReadingItems) { | ||||
|                             val message = | ||||
|                                 "message: ${response.message()} " + | ||||
|                                         "response isSuccess: ${response.isSuccessful} " + | ||||
|                                         "response code: ${response.code()} " + | ||||
|                                         "response message: ${response.message()} " + | ||||
|                                         "response errorBody: ${response.errorBody()?.string()} " + | ||||
|                                         "body success: ${response.body()?.success} " + | ||||
|                                         "body isSuccess: ${response.body()?.isSuccess}" | ||||
|                             ACRA.getErrorReporter().maybeHandleSilentException(Exception(message), activity!!) | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     override fun onFailure( | ||||
|                         call: Call<SuccessResponse>, | ||||
|                         t: Throwable | ||||
|                     ) { | ||||
|                         if (debugReadingItems) { | ||||
|                             ACRA.getErrorReporter().maybeHandleSilentException(t, activity!!) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             ) | ||||
|         } | ||||
|  | ||||
|         return rootView | ||||
|     } | ||||
|  | ||||
| @@ -266,7 +228,13 @@ class ArticleFragment : Fragment() { | ||||
|                         if (response.body() != null && response.body()!!.content != null && !response.body()!!.content.isNullOrEmpty()) { | ||||
|                             try { | ||||
|                                 rootView.titleView.text = response.body()!!.title | ||||
|                                 url = response.body()!!.url | ||||
|                                 try { | ||||
|                                     // Note: Mercury may return relative urls... If it does the url val will not be changed. | ||||
|                                     URL(response.body()!!.url) | ||||
|                                     url = response.body()!!.url | ||||
|                                 } catch (e: MalformedURLException) { | ||||
|                                     ACRA.getErrorReporter().maybeHandleSilentException(e, activity!!) | ||||
|                                 } | ||||
|                             } catch (e: Exception) { | ||||
|                                 if (context != null) { | ||||
|                                     ACRA.getErrorReporter().maybeHandleSilentException(e, context!!) | ||||
| @@ -395,73 +363,46 @@ class ArticleFragment : Fragment() { | ||||
|             val itemUrl = URL(url) | ||||
|             baseUrl = itemUrl.protocol + "://" + itemUrl.host | ||||
|         } catch (e: MalformedURLException) { | ||||
|             if (showMalformedUrl && context != null) { | ||||
|                 val alertDialog = AlertDialog.Builder(context!!).create() | ||||
|                 alertDialog.setTitle("Error") | ||||
|                 alertDialog.setMessage("You are encountering a bug that I can't solve. Can you please contact me to solve the issue, please ?") | ||||
|                 alertDialog.setButton( | ||||
|                     AlertDialog.BUTTON_POSITIVE, | ||||
|                     "Send mail" | ||||
|                 ) { dialog, _ -> | ||||
|  | ||||
|                     // This won't be translated because it should only be temporary. | ||||
|                     val to = Config.feedbackEmail | ||||
|                     val subject= "[ReaderForSelfoss MalformedURLException]" | ||||
|                     val body= "Please specify the source, item and spout you are using for the url below : \n ${e.message}" | ||||
|                     val mailTo = "mailto:" + to + "?&subject=" + Uri.encode(subject) + "&body=" + Uri.encode(body) | ||||
|  | ||||
|                     val emailIntent = Intent(Intent.ACTION_VIEW) | ||||
|                     emailIntent.data = Uri.parse(mailTo) | ||||
|                     startActivity(emailIntent) | ||||
|  | ||||
|                     dialog.dismiss() | ||||
|                 } | ||||
|                 alertDialog.setButton( | ||||
|                     AlertDialog.BUTTON_NEUTRAL, | ||||
|                     "Not now" | ||||
|                 ) { dialog, _ -> dialog.dismiss() } | ||||
|                 alertDialog.setButton( | ||||
|                     AlertDialog.BUTTON_NEGATIVE, | ||||
|                     "Don't show anymore." | ||||
|                 ) { dialog, _ -> | ||||
|                     editor.putBoolean("show_error_malformed_url", false) | ||||
|                     editor.apply() | ||||
|                     dialog.dismiss() | ||||
|                 } | ||||
|                 alertDialog.show() | ||||
|             } | ||||
|             ACRA.getErrorReporter().maybeHandleSilentException(e, activity!!) | ||||
|         } | ||||
|  | ||||
|         rootView.webcontent.loadDataWithBaseURL( | ||||
|             baseUrl, | ||||
|             """<style> | ||||
|                 |img { | ||||
|                 |  display: inline-block; | ||||
|                 |  height: auto; | ||||
|                 |  width: 100%; | ||||
|                 |  max-width: 100%; | ||||
|                 |} | ||||
|                 |a { | ||||
|                 |  color: $stringColor !important; | ||||
|                 |} | ||||
|                 |*:not(a) { | ||||
|                 |  color: $stringTextColor; | ||||
|                 |} | ||||
|                 |* { | ||||
|                 |  font-size: ${fontSize.toPx}px; | ||||
|                 |  text-align: justify; | ||||
|                 |  word-break: break-word; | ||||
|                 |  overflow:hidden; | ||||
|                 |} | ||||
|                 |a, pre, code { | ||||
|                 |  text-align: left; | ||||
|                 |} | ||||
|                 |pre, code { | ||||
|                 |  white-space: pre-wrap; | ||||
|                 |  width:100%; | ||||
|                 |  background-color: $stringBackgroundColor; | ||||
|                 |}</style>$c""".trimMargin(), | ||||
|             "text/html; charset=utf-8", | ||||
|             """<html> | ||||
|                 |<head> | ||||
|                 |   <style> | ||||
|                 |      img { | ||||
|                 |        display: inline-block; | ||||
|                 |        height: auto; | ||||
|                 |        width: 100%; | ||||
|                 |        max-width: 100%; | ||||
|                 |      } | ||||
|                 |      a { | ||||
|                 |        color: $stringColor !important; | ||||
|                 |      } | ||||
|                 |      *:not(a) { | ||||
|                 |        color: $stringTextColor; | ||||
|                 |      } | ||||
|                 |      * { | ||||
|                 |        font-size: ${fontSize.toPx}px; | ||||
|                 |        text-align: justify; | ||||
|                 |        word-break: break-word; | ||||
|                 |        overflow:hidden; | ||||
|                 |      } | ||||
|                 |      a, pre, code { | ||||
|                 |        text-align: left; | ||||
|                 |      } | ||||
|                 |      pre, code { | ||||
|                 |        white-space: pre-wrap; | ||||
|                 |        width:100%; | ||||
|                 |        background-color: $stringBackgroundColor; | ||||
|                 |      } | ||||
|                 |   </style> | ||||
|                 |</head> | ||||
|                 |<body> | ||||
|                 |   $c | ||||
|                 |</body>""".trimMargin(), | ||||
|             "text/html", | ||||
|             "utf-8", | ||||
|             null | ||||
|         ) | ||||
|   | ||||
| @@ -0,0 +1,37 @@ | ||||
| package apps.amine.bou.readerforselfoss.persistence.dao | ||||
|  | ||||
| import androidx.lifecycle.LiveData | ||||
| import androidx.room.Delete | ||||
| import androidx.room.Dao | ||||
| import androidx.room.Insert | ||||
| import androidx.room.OnConflictStrategy | ||||
| import androidx.room.Query | ||||
| import apps.amine.bou.readerforselfoss.persistence.entities.SourceEntity | ||||
| import apps.amine.bou.readerforselfoss.persistence.entities.TagEntity | ||||
|  | ||||
| @Dao | ||||
| interface DrawerDataDao { | ||||
|     @Query("SELECT * FROM tags") | ||||
|     fun tags(): List<TagEntity> | ||||
|  | ||||
|     @Query("SELECT * FROM sources") | ||||
|     fun sources(): List<SourceEntity> | ||||
|  | ||||
|     @Insert(onConflict = OnConflictStrategy.REPLACE) | ||||
|     fun insertAllTags(vararg tags: TagEntity) | ||||
|  | ||||
|     @Insert(onConflict = OnConflictStrategy.REPLACE) | ||||
|     fun insertAllSources(vararg sources: SourceEntity) | ||||
|  | ||||
|     @Query("DELETE FROM tags") | ||||
|     fun deleteAllTags() | ||||
|  | ||||
|     @Query("DELETE FROM sources") | ||||
|     fun deleteAllSources() | ||||
|  | ||||
|     @Delete | ||||
|     fun deleteTag(tag: TagEntity) | ||||
|  | ||||
|     @Delete | ||||
|     fun deleteSource(source: SourceEntity) | ||||
| } | ||||
| @@ -0,0 +1,12 @@ | ||||
| package apps.amine.bou.readerforselfoss.persistence.database | ||||
|  | ||||
| import androidx.room.RoomDatabase | ||||
| import androidx.room.Database | ||||
| import apps.amine.bou.readerforselfoss.persistence.dao.DrawerDataDao | ||||
| import apps.amine.bou.readerforselfoss.persistence.entities.SourceEntity | ||||
| import apps.amine.bou.readerforselfoss.persistence.entities.TagEntity | ||||
|  | ||||
| @Database(entities = [TagEntity::class, SourceEntity::class], version = 1) | ||||
| abstract class AppDatabase : RoomDatabase() { | ||||
|     abstract fun drawerDataDao(): DrawerDataDao | ||||
| } | ||||
| @@ -0,0 +1,33 @@ | ||||
| package apps.amine.bou.readerforselfoss.persistence.entities | ||||
|  | ||||
| import androidx.room.ColumnInfo | ||||
| import androidx.room.Entity | ||||
| import androidx.room.PrimaryKey | ||||
|  | ||||
| @Entity(tableName = "tags") | ||||
| data class TagEntity( | ||||
|     @PrimaryKey | ||||
|     @ColumnInfo(name = "tag") | ||||
|     val tag: String, | ||||
|     @ColumnInfo(name = "color") | ||||
|     val color: String, | ||||
|     @ColumnInfo(name = "unread") | ||||
|     val unread: Int | ||||
| ) | ||||
|  | ||||
| @Entity(tableName = "sources") | ||||
| data class SourceEntity( | ||||
|     @PrimaryKey | ||||
|     @ColumnInfo(name = "id") | ||||
|     val id: String, | ||||
|     @ColumnInfo(name = "title") | ||||
|     val title: String, | ||||
|     @ColumnInfo(name = "tags") | ||||
|     val tags: String, | ||||
|     @ColumnInfo(name = "spout") | ||||
|     val spout: String, | ||||
|     @ColumnInfo(name = "error") | ||||
|     val error: String, | ||||
|     @ColumnInfo(name = "icon") | ||||
|     val icon: String | ||||
| ) | ||||
| @@ -4,13 +4,13 @@ import android.content.res.Configuration; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceActivity; | ||||
| import android.support.annotation.LayoutRes; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.support.annotation.Nullable; | ||||
| import android.support.design.widget.AppBarLayout; | ||||
| import android.support.v7.app.ActionBar; | ||||
| import android.support.v7.app.AppCompatDelegate; | ||||
| import android.support.v7.widget.Toolbar; | ||||
| import androidx.annotation.LayoutRes; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import com.google.android.material.appbar.AppBarLayout; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import androidx.appcompat.app.AppCompatDelegate; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.MenuInflater; | ||||
| import android.view.View; | ||||
|   | ||||
| @@ -19,7 +19,7 @@ import android.preference.PreferenceActivity; | ||||
| import android.preference.PreferenceFragment; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.preference.SwitchPreference; | ||||
| import android.support.v7.app.ActionBar; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import android.text.Editable; | ||||
| import android.text.InputFilter; | ||||
| import android.text.Spanned; | ||||
| @@ -31,7 +31,6 @@ import android.widget.Toast; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import apps.amine.bou.readerforselfoss.BuildConfig; | ||||
| import apps.amine.bou.readerforselfoss.R; | ||||
| import apps.amine.bou.readerforselfoss.themes.AppColors; | ||||
| import apps.amine.bou.readerforselfoss.utils.Config; | ||||
|   | ||||
| @@ -3,8 +3,8 @@ package apps.amine.bou.readerforselfoss.themes | ||||
| import android.app.Activity | ||||
| import android.content.Context | ||||
| import android.preference.PreferenceManager | ||||
| import android.support.annotation.ColorInt | ||||
| import android.support.v7.view.ContextThemeWrapper | ||||
| import androidx.annotation.ColorInt | ||||
| import androidx.appcompat.view.ContextThemeWrapper | ||||
| import android.util.TypedValue | ||||
| import apps.amine.bou.readerforselfoss.R | ||||
| import android.view.LayoutInflater | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| package apps.amine.bou.readerforselfoss.transformers | ||||
|  | ||||
| import android.support.v4.view.ViewPager | ||||
| import androidx.viewpager.widget.ViewPager | ||||
| import android.view.View | ||||
|  | ||||
| class DepthPageTransformer : ViewPager.PageTransformer { | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.graphics.BitmapFactory | ||||
| import android.net.Uri | ||||
| import android.support.customtabs.CustomTabsIntent | ||||
| import androidx.browser.customtabs.CustomTabsIntent | ||||
| import android.util.Patterns | ||||
| import android.widget.Toast | ||||
| import apps.amine.bou.readerforselfoss.R | ||||
|   | ||||
| @@ -1,54 +0,0 @@ | ||||
| package apps.amine.bou.readerforselfoss.utils | ||||
|  | ||||
| import android.content.Context | ||||
| import android.support.design.widget.CoordinatorLayout | ||||
| import android.support.design.widget.FloatingActionButton | ||||
| import android.util.AttributeSet | ||||
| import android.view.View | ||||
|  | ||||
| class ScrollAwareFABBehavior( | ||||
|     context: Context, | ||||
|     attrs: AttributeSet | ||||
| ) : CoordinatorLayout.Behavior<FloatingActionButton>() { | ||||
|  | ||||
|  | ||||
|     override fun onStartNestedScroll( | ||||
|         coordinatorLayout: CoordinatorLayout, | ||||
|         child: FloatingActionButton, | ||||
|         directTargetChild: View, | ||||
|         target: View, | ||||
|         nestedScrollAxes: Int | ||||
|     ): Boolean { | ||||
|         return true | ||||
|     } | ||||
|  | ||||
|     override fun onNestedScroll( | ||||
|         coordinatorLayout: CoordinatorLayout, | ||||
|         child: FloatingActionButton, | ||||
|         target: View, | ||||
|         dxConsumed: Int, | ||||
|         dyConsumed: Int, | ||||
|         dxUnconsumed: Int, | ||||
|         dyUnconsumed: Int | ||||
|     ) { | ||||
|         super.onNestedScroll( | ||||
|             coordinatorLayout, | ||||
|             child, | ||||
|             target, | ||||
|             dxConsumed, | ||||
|             dyConsumed, | ||||
|             dxUnconsumed, | ||||
|             dyUnconsumed | ||||
|         ) | ||||
|         if (dyConsumed > 0 && child.visibility == View.VISIBLE) { | ||||
|             child.hide(object : FloatingActionButton.OnVisibilityChangedListener() { | ||||
|                 override fun onHidden(fab: FloatingActionButton?) { | ||||
|                     super.onHidden(fab) | ||||
|                     fab!!.visibility = View.INVISIBLE | ||||
|                 } | ||||
|             }) | ||||
|         } else if (dyConsumed < 0 && child.visibility != View.VISIBLE) { | ||||
|             child.show() | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -4,10 +4,10 @@ package apps.amine.bou.readerforselfoss.utils.customtabs; | ||||
| import android.app.Activity; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
| import android.support.customtabs.CustomTabsClient; | ||||
| import android.support.customtabs.CustomTabsIntent; | ||||
| import android.support.customtabs.CustomTabsServiceConnection; | ||||
| import android.support.customtabs.CustomTabsSession; | ||||
| import androidx.browser.customtabs.CustomTabsClient; | ||||
| import androidx.browser.customtabs.CustomTabsIntent; | ||||
| import androidx.browser.customtabs.CustomTabsServiceConnection; | ||||
| import androidx.browser.customtabs.CustomTabsSession; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import android.content.IntentFilter; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.content.pm.ResolveInfo; | ||||
| import android.net.Uri; | ||||
| import android.support.customtabs.CustomTabsService; | ||||
| import androidx.browser.customtabs.CustomTabsService; | ||||
| import android.text.TextUtils; | ||||
| import android.util.Log; | ||||
|  | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package apps.amine.bou.readerforselfoss.utils.customtabs; | ||||
|  | ||||
|  | ||||
| import android.content.ComponentName; | ||||
| import android.support.customtabs.CustomTabsClient; | ||||
| import android.support.customtabs.CustomTabsServiceConnection; | ||||
| import androidx.browser.customtabs.CustomTabsClient; | ||||
| import androidx.browser.customtabs.CustomTabsServiceConnection; | ||||
|  | ||||
| import java.lang.ref.WeakReference; | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package apps.amine.bou.readerforselfoss.utils.customtabs; | ||||
|  | ||||
|  | ||||
| import android.support.customtabs.CustomTabsClient; | ||||
| import androidx.browser.customtabs.CustomTabsClient; | ||||
|  | ||||
|  | ||||
| public interface ServiceConnectionCallback { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| /* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomBaseViewHolder.java */ | ||||
| package apps.amine.bou.readerforselfoss.utils.drawer | ||||
|  | ||||
| import android.support.v7.widget.RecyclerView | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import android.view.View | ||||
| import android.widget.ImageView | ||||
| import android.widget.TextView | ||||
|   | ||||
| @@ -2,10 +2,10 @@ | ||||
| package apps.amine.bou.readerforselfoss.utils.drawer | ||||
|  | ||||
| import android.net.Uri | ||||
| import android.support.annotation.ColorInt | ||||
| import android.support.annotation.ColorRes | ||||
| import android.support.annotation.StringRes | ||||
| import android.support.v7.widget.RecyclerView | ||||
| 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 | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| /* 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 android.support.annotation.LayoutRes | ||||
| import android.support.annotation.StringRes | ||||
| import androidx.annotation.LayoutRes | ||||
| import androidx.annotation.StringRes | ||||
| import android.view.View | ||||
| import android.widget.TextView | ||||
| import apps.amine.bou.readerforselfoss.R | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package apps.amine.bou.readerforselfoss.utils.glide | ||||
|  | ||||
| import android.content.Context | ||||
| import android.graphics.Bitmap | ||||
| import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory | ||||
| import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory | ||||
| import android.widget.ImageView | ||||
| import com.bumptech.glide.Glide | ||||
| import com.bumptech.glide.request.RequestOptions | ||||
|   | ||||
| @@ -0,0 +1,41 @@ | ||||
| package apps.amine.bou.readerforselfoss.utils.persistence | ||||
|  | ||||
| import android.content.Context | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.Source | ||||
| import apps.amine.bou.readerforselfoss.api.selfoss.Tag | ||||
| import apps.amine.bou.readerforselfoss.persistence.entities.SourceEntity | ||||
| import apps.amine.bou.readerforselfoss.persistence.entities.TagEntity | ||||
|  | ||||
| fun TagEntity.toView(): Tag = | ||||
|         Tag( | ||||
|             this.tag, | ||||
|             this.color, | ||||
|             this.unread | ||||
|         ) | ||||
|  | ||||
| fun SourceEntity.toView(): Source = | ||||
|         Source( | ||||
|             this.id, | ||||
|             this.title, | ||||
|             this.tags, | ||||
|             this.spout, | ||||
|             this.error, | ||||
|             this.icon | ||||
|         ) | ||||
|  | ||||
| fun Source.toEntity(context: Context): SourceEntity = | ||||
|         SourceEntity( | ||||
|             this.id, | ||||
|             this.title, | ||||
|             this.tags, | ||||
|             this.spout, | ||||
|             this.error, | ||||
|             this.getIcon(context) | ||||
|         ) | ||||
|  | ||||
| fun Tag.toEntity(): TagEntity = | ||||
|         TagEntity( | ||||
|             this.tag, | ||||
|             this.color, | ||||
|             this.unread | ||||
|         ) | ||||
| @@ -10,22 +10,22 @@ | ||||
|         android:layout_height="match_parent" | ||||
|         android:orientation="vertical"> | ||||
|  | ||||
|         <android.support.design.widget.AppBarLayout | ||||
|         <com.google.android.material.appbar.AppBarLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content"> | ||||
|  | ||||
|             <android.support.v7.widget.Toolbar | ||||
|             <androidx.appcompat.widget.Toolbar | ||||
|                 android:id="@+id/toolbar" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="?attr/actionBarSize" | ||||
|                 app:theme="@style/ToolBarStyle" | ||||
|                 app:popupTheme="?attr/toolbarPopupTheme" /> | ||||
|  | ||||
|         </android.support.design.widget.AppBarLayout> | ||||
|         </com.google.android.material.appbar.AppBarLayout> | ||||
|  | ||||
|  | ||||
|  | ||||
|         <android.support.constraint.ConstraintLayout | ||||
|         <androidx.constraintlayout.widget.ConstraintLayout | ||||
|             android:paddingBottom="@dimen/activity_vertical_margin" | ||||
|             android:paddingLeft="@dimen/activity_horizontal_margin" | ||||
|             android:paddingRight="@dimen/activity_horizontal_margin" | ||||
| @@ -121,7 +121,7 @@ | ||||
|                 android:layout_marginBottom="16dp" | ||||
|                 app:layout_constraintVertical_bias="0.0"/> | ||||
|  | ||||
|         </android.support.constraint.ConstraintLayout> | ||||
|         </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
|         <ProgressBar | ||||
|             android:id="@+id/progress" | ||||
|   | ||||
| @@ -30,13 +30,13 @@ | ||||
|         app:prompt_view_background_color="?attr/colorAccent" | ||||
|         app:prompt_view_thanks_display_time_ms="2000"/> | ||||
|  | ||||
|     <android.support.design.widget.CoordinatorLayout | ||||
|     <androidx.coordinatorlayout.widget.CoordinatorLayout | ||||
|         android:id="@+id/coordLayout" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:layout_below="@id/promptView"> | ||||
|  | ||||
|         <android.support.design.widget.CoordinatorLayout | ||||
|         <androidx.coordinatorlayout.widget.CoordinatorLayout | ||||
|             android:id="@+id/intern_coordLayout" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="match_parent"> | ||||
| @@ -46,18 +46,18 @@ | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:orientation="vertical"> | ||||
|  | ||||
|                 <android.support.design.widget.AppBarLayout | ||||
|                 <com.google.android.material.appbar.AppBarLayout | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="wrap_content"> | ||||
|  | ||||
|                     <android.support.v7.widget.Toolbar | ||||
|                     <androidx.appcompat.widget.Toolbar | ||||
|                         android:id="@+id/toolBar" | ||||
|                         android:layout_width="match_parent" | ||||
|                         android:layout_height="?attr/actionBarSize" | ||||
|                         app:theme="@style/ToolBarStyle" | ||||
|                         app:popupTheme="?attr/toolbarPopupTheme" /> | ||||
|  | ||||
|                 </android.support.design.widget.AppBarLayout> | ||||
|                 </com.google.android.material.appbar.AppBarLayout> | ||||
|  | ||||
|                 <FrameLayout | ||||
|                     android:id="@+id/drawer_layout" | ||||
| @@ -66,7 +66,7 @@ | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="match_parent"> | ||||
|  | ||||
|                     <android.support.v4.widget.SwipeRefreshLayout | ||||
|                     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout | ||||
|                         android:id="@+id/swipeRefreshLayout" | ||||
|                         android:layout_width="match_parent" | ||||
|                         android:layout_height="match_parent"> | ||||
| @@ -89,7 +89,7 @@ | ||||
|                                 android:background="@color/transparent" | ||||
|                                 android:visibility="gone" /> | ||||
|  | ||||
|                             <android.support.v7.widget.RecyclerView | ||||
|                             <androidx.recyclerview.widget.RecyclerView | ||||
|                                 android:id="@+id/recyclerView" | ||||
|                                 android:layout_width="match_parent" | ||||
|                                 android:layout_height="wrap_content" | ||||
| @@ -100,16 +100,16 @@ | ||||
|                                 app:layout_behavior="@string/appbar_scrolling_view_behavior" /> | ||||
|                         </LinearLayout> | ||||
|  | ||||
|                     </android.support.v4.widget.SwipeRefreshLayout> | ||||
|                     </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> | ||||
|  | ||||
|                 </FrameLayout> | ||||
|             </LinearLayout> | ||||
|  | ||||
|         </android.support.design.widget.CoordinatorLayout> | ||||
|         </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||
|         <com.ashokvarma.bottomnavigation.BottomNavigationBar | ||||
|             android:layout_gravity="bottom" | ||||
|             android:id="@+id/bottomBar" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="60dp"/> | ||||
|     </android.support.design.widget.CoordinatorLayout> | ||||
|     </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||
| </RelativeLayout> | ||||
| @@ -6,18 +6,18 @@ | ||||
|     android:gravity="center_horizontal" | ||||
|     android:orientation="vertical" | ||||
|     tools:context="apps.amine.bou.readerforselfoss.LoginActivity"> | ||||
|     <android.support.design.widget.AppBarLayout | ||||
|     <com.google.android.material.appbar.AppBarLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content"> | ||||
|  | ||||
|         <android.support.v7.widget.Toolbar | ||||
|         <androidx.appcompat.widget.Toolbar | ||||
|             android:id="@+id/toolbar" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="?attr/actionBarSize" | ||||
|             app:theme="@style/ToolBarStyle" | ||||
|             app:popupTheme="?attr/toolbarPopupTheme" /> | ||||
|  | ||||
|     </android.support.design.widget.AppBarLayout> | ||||
|     </com.google.android.material.appbar.AppBarLayout> | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
| @@ -45,7 +45,7 @@ | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:orientation="vertical"> | ||||
|  | ||||
|                 <android.support.design.widget.TextInputLayout | ||||
|                 <com.google.android.material.textfield.TextInputLayout | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:id="@+id/urlLayout" | ||||
| @@ -60,7 +60,7 @@ | ||||
|                         android:inputType="textUri" | ||||
|                         android:maxLines="1" /> | ||||
|  | ||||
|                 </android.support.design.widget.TextInputLayout> | ||||
|                 </com.google.android.material.textfield.TextInputLayout> | ||||
|  | ||||
|                 <Switch | ||||
|                     android:text="@string/withLoginSwitch" | ||||
| @@ -69,7 +69,7 @@ | ||||
|                     android:id="@+id/withLogin" | ||||
|                     android:layout_weight="1"/> | ||||
|  | ||||
|                 <android.support.design.widget.TextInputLayout | ||||
|                 <com.google.android.material.textfield.TextInputLayout | ||||
|                     android:id="@+id/loginLayout" | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="wrap_content" | ||||
| @@ -83,9 +83,9 @@ | ||||
|                         android:inputType="text" | ||||
|                         android:maxLines="1" /> | ||||
|  | ||||
|                 </android.support.design.widget.TextInputLayout> | ||||
|                 </com.google.android.material.textfield.TextInputLayout> | ||||
|  | ||||
|                 <android.support.design.widget.TextInputLayout | ||||
|                 <com.google.android.material.textfield.TextInputLayout | ||||
|                     android:id="@+id/passwordLayout" | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="wrap_content" | ||||
| @@ -99,7 +99,7 @@ | ||||
|                         android:inputType="textPassword" | ||||
|                         android:maxLines="1" /> | ||||
|  | ||||
|                 </android.support.design.widget.TextInputLayout> | ||||
|                 </com.google.android.material.textfield.TextInputLayout> | ||||
|  | ||||
|                 <Switch | ||||
|                     android:id="@+id/withHttpLogin" | ||||
| @@ -108,7 +108,7 @@ | ||||
|                     android:layout_weight="1" | ||||
|                     android:text="@string/withHttpLoginSwitch" /> | ||||
|  | ||||
|                 <android.support.design.widget.TextInputLayout | ||||
|                 <com.google.android.material.textfield.TextInputLayout | ||||
|                     android:id="@+id/httpLoginInput" | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="match_parent" | ||||
| @@ -120,9 +120,9 @@ | ||||
|                         android:layout_width="match_parent" | ||||
|                         android:layout_height="wrap_content" | ||||
|                         android:hint="@string/prompt_http_login" /> | ||||
|                 </android.support.design.widget.TextInputLayout> | ||||
|                 </com.google.android.material.textfield.TextInputLayout> | ||||
|  | ||||
|                 <android.support.design.widget.TextInputLayout | ||||
|                 <com.google.android.material.textfield.TextInputLayout | ||||
|                     android:id="@+id/httpPasswordInput" | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="match_parent" | ||||
| @@ -134,7 +134,7 @@ | ||||
|                         android:layout_height="wrap_content" | ||||
|                         android:hint="@string/prompt_http_password" | ||||
|                         android:inputType="textPassword" /> | ||||
|                 </android.support.design.widget.TextInputLayout> | ||||
|                 </com.google.android.material.textfield.TextInputLayout> | ||||
|  | ||||
|                 <Switch | ||||
|                     android:id="@+id/withSelfhostedCert" | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <android.support.constraint.ConstraintLayout | ||||
| <androidx.constraintlayout.widget.ConstraintLayout | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     tools:context="apps.amine.bou.readerforselfoss.MainActivity"> | ||||
|  | ||||
| </android.support.constraint.ConstraintLayout> | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent"> | ||||
|  | ||||
|     <android.support.design.widget.AppBarLayout | ||||
|     <com.google.android.material.appbar.AppBarLayout | ||||
|         android:id="@+id/appBarLayout" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
| @@ -12,16 +12,16 @@ | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="parent"> | ||||
|  | ||||
|         <android.support.v7.widget.Toolbar | ||||
|         <androidx.appcompat.widget.Toolbar | ||||
|             android:id="@+id/toolBar" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="?attr/actionBarSize" | ||||
|             app:popupTheme="?attr/toolbarPopupTheme" | ||||
|             app:theme="@style/ToolBarStyle" /> | ||||
|  | ||||
|     </android.support.design.widget.AppBarLayout> | ||||
|     </com.google.android.material.appbar.AppBarLayout> | ||||
|  | ||||
|     <android.support.v4.view.ViewPager | ||||
|     <androidx.viewpager.widget.ViewPager | ||||
|         android:id="@+id/pager" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="0dp" | ||||
| @@ -41,4 +41,4 @@ | ||||
|         app:layout_constraintLeft_toLeftOf="parent" | ||||
|         app:layout_constraintRight_toRightOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="@+id/pager" /> | ||||
| </android.support.constraint.ConstraintLayout> | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|   | ||||
| @@ -1,33 +1,33 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
|  | ||||
| <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     tools:context="apps.amine.bou.readerforselfoss.SourcesActivity"> | ||||
|     <android.support.design.widget.AppBarLayout | ||||
|     <com.google.android.material.appbar.AppBarLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content"> | ||||
|  | ||||
|         <android.support.v7.widget.Toolbar | ||||
|         <androidx.appcompat.widget.Toolbar | ||||
|             android:id="@+id/toolbar" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="?attr/actionBarSize" | ||||
|             app:theme="@style/ToolBarStyle" | ||||
|             app:popupTheme="?attr/toolbarPopupTheme" /> | ||||
|  | ||||
|     </android.support.design.widget.AppBarLayout> | ||||
|     </com.google.android.material.appbar.AppBarLayout> | ||||
|  | ||||
|     <android.support.v7.widget.RecyclerView | ||||
|     <androidx.recyclerview.widget.RecyclerView | ||||
|         android:id="@+id/recyclerView" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:scrollbars="vertical" | ||||
|         app:layout_behavior="@string/appbar_scrolling_view_behavior"> | ||||
|     </android.support.v7.widget.RecyclerView> | ||||
|     </androidx.recyclerview.widget.RecyclerView> | ||||
|  | ||||
|     <android.support.design.widget.FloatingActionButton | ||||
|     <com.google.android.material.floatingactionbutton.FloatingActionButton | ||||
|         android:id="@+id/fab" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
| @@ -42,4 +42,4 @@ | ||||
|         android:layout_marginEnd="16dp" | ||||
|         android:layout_marginRight="16dp" | ||||
|         app:layout_behavior="apps.amine.bou.readerforselfoss.utils.ScrollAwareFABBehavior" /> | ||||
| </android.support.design.widget.CoordinatorLayout> | ||||
| </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <android.support.v7.widget.CardView | ||||
| <androidx.cardview.widget.CardView | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:card_view="http://schemas.android.com/apk/res-auto" | ||||
| @@ -18,7 +18,7 @@ | ||||
|     card_view:cardUseCompatPadding="true" | ||||
|     card_view:layout_constraintBottom_toBottomOf="parent"> | ||||
|  | ||||
|     <android.support.constraint.ConstraintLayout | ||||
|     <androidx.constraintlayout.widget.ConstraintLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content"> | ||||
|  | ||||
| @@ -34,7 +34,7 @@ | ||||
|             app:srcCompat="@drawable/background_splash" | ||||
|             card_view:layout_constraintBottom_toTopOf="@+id/constraintLayout" /> | ||||
|  | ||||
|         <android.support.constraint.ConstraintLayout | ||||
|         <androidx.constraintlayout.widget.ConstraintLayout | ||||
|             android:id="@+id/constraintLayout" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
| @@ -143,7 +143,7 @@ | ||||
|  | ||||
|             </RelativeLayout> | ||||
|  | ||||
|         </android.support.constraint.ConstraintLayout> | ||||
|     </android.support.constraint.ConstraintLayout> | ||||
|         </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|     </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
| </android.support.v7.widget.CardView> | ||||
| </androidx.cardview.widget.CardView> | ||||
| @@ -1,4 +1,4 @@ | ||||
| <android.support.design.widget.CoordinatorLayout | ||||
| <androidx.coordinatorlayout.widget.CoordinatorLayout | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
| @@ -6,12 +6,12 @@ | ||||
|     android:layout_height="match_parent" | ||||
|     android:descendantFocusability="blocksDescendants"> | ||||
|  | ||||
|     <android.support.v4.widget.NestedScrollView | ||||
|     <androidx.core.widget.NestedScrollView | ||||
|         android:id="@+id/nestedScrollView" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent"> | ||||
|  | ||||
|         <android.support.constraint.ConstraintLayout | ||||
|         <androidx.constraintlayout.widget.ConstraintLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="match_parent"> | ||||
|  | ||||
| @@ -70,9 +70,9 @@ | ||||
|                 app:layout_constraintTop_toBottomOf="@+id/source" | ||||
|                 tools:visibility="visible" /> | ||||
|  | ||||
|         </android.support.constraint.ConstraintLayout> | ||||
|         </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
|     </android.support.v4.widget.NestedScrollView> | ||||
|     </androidx.core.widget.NestedScrollView> | ||||
|  | ||||
|     <FrameLayout | ||||
|         android:layout_width="match_parent" | ||||
| @@ -89,7 +89,7 @@ | ||||
|             android:layout_gravity="bottom" | ||||
|             app:floatingMenu="@menu/reader_toolbar" /> | ||||
|  | ||||
|         <android.support.design.widget.FloatingActionButton | ||||
|         <com.google.android.material.floatingactionbutton.FloatingActionButton | ||||
|             android:id="@+id/fab" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
| @@ -123,4 +123,4 @@ | ||||
|             android:progressTint="?attr/colorAccent" /> | ||||
|     </FrameLayout> | ||||
|  | ||||
| </android.support.design.widget.CoordinatorLayout> | ||||
| </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
| @@ -115,4 +115,4 @@ | ||||
|  | ||||
|     </RelativeLayout> | ||||
|  | ||||
| </android.support.constraint.ConstraintLayout> | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
| @@ -1,15 +1,15 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <android.support.design.widget.AppBarLayout | ||||
| <com.google.android.material.appbar.AppBarLayout | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|  | ||||
|     <android.support.v7.widget.Toolbar | ||||
|     <androidx.appcompat.widget.Toolbar | ||||
|         android:id="@+id/toolbar" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="?attr/actionBarSize" | ||||
|         app:theme="@style/ToolBarStyle" | ||||
|         app:popupTheme="?attr/toolbarPopupTheme" /> | ||||
|  | ||||
| </android.support.design.widget.AppBarLayout> | ||||
| </com.google.android.material.appbar.AppBarLayout> | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <android.support.constraint.ConstraintLayout | ||||
| <androidx.constraintlayout.widget.ConstraintLayout | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
| @@ -52,4 +52,4 @@ | ||||
|         android:layout_width="34dp" | ||||
|         android:layout_height="34dp"/> | ||||
|  | ||||
| </android.support.constraint.ConstraintLayout> | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
| @@ -6,7 +6,7 @@ | ||||
|         android:title="@string/menu_home_search" | ||||
|         android:icon="@drawable/ic_action_search" | ||||
|         app:showAsAction="ifRoom|collapseActionView" | ||||
|         app:actionViewClass="android.support.v7.widget.SearchView" /> | ||||
|         app:actionViewClass="androidx.appcompat.widget.SearchView" /> | ||||
|  | ||||
|     <item android:id="@+id/readAll" | ||||
|           android:icon="@drawable/ic_done_all_white_24dp" | ||||
|   | ||||
| @@ -168,5 +168,5 @@ | ||||
|   <string name="pref_debug_debug_logs">Registro de depuración (éstos se enviarán sin diálogo)</string> | ||||
|   <string name="acra_login">Habilitar el registro</string> | ||||
|   <string name="drawer_item_hidden_tags">Etiquetas ocultas</string> | ||||
|   <string name="unmark">Mark item as unread</string> | ||||
|   <string name="unmark">Marcar artículo como no leído</string> | ||||
| </resources> | ||||
|   | ||||
| @@ -168,5 +168,5 @@ | ||||
|   <string name="pref_debug_debug_logs">Rexistro de depuración (Estes enviaranse automáticamente)</string> | ||||
|   <string name="acra_login">Habilitar o rexistro</string> | ||||
|   <string name="drawer_item_hidden_tags">Etiquetas ocultas</string> | ||||
|   <string name="unmark">Mark item as unread</string> | ||||
|   <string name="unmark">Marcar artículo como non lido</string> | ||||
| </resources> | ||||
|   | ||||
| @@ -1,53 +1,53 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!--Generated by crowdin.com--> | ||||
| <resources xmlns:tools="http://schemas.android.com/tools"> | ||||
|   <string name="app_name">"Reader for Selfoss"</string> | ||||
|   <string name="title_activity_login">"Log in"</string> | ||||
|   <string name="app_name">"Lettore RSS per Selfoss"</string> | ||||
|   <string name="title_activity_login">"Accedi"</string> | ||||
|   <string name="prompt_password">"Password"</string> | ||||
|   <string name="prompt_http_password">"HTTP Password"</string> | ||||
|   <string name="action_sign_in">"Go"</string> | ||||
|   <string name="error_invalid_password">"Password not long enough"</string> | ||||
|   <string name="error_field_required">"Field required"</string> | ||||
|   <string name="prompt_url">"Url"</string> | ||||
|   <string name="withLoginSwitch">"Login required ?"</string> | ||||
|   <string name="withHttpLoginSwitch">"HTTP Login required ?"</string> | ||||
|   <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> | ||||
|   <string name="prompt_login">"Username"</string> | ||||
|   <string name="prompt_http_login">"HTTP Username"</string> | ||||
|   <string name="label_share">"Share"</string> | ||||
|   <string name="readAll">"Read all"</string> | ||||
|   <string name="action_disconnect">"Disconnect"</string> | ||||
|   <string name="title_activity_settings">"Settings"</string> | ||||
|   <string name="pref_header_general">"General"</string> | ||||
|   <string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> | ||||
|   <string name="prompt_http_password">"Password HTTP"</string> | ||||
|   <string name="action_sign_in">"Vai"</string> | ||||
|   <string name="error_invalid_password">"La password non è sufficientemente lunga"</string> | ||||
|   <string name="error_field_required">"Campo obbligatorio"</string> | ||||
|   <string name="prompt_url">"URL"</string> | ||||
|   <string name="withLoginSwitch">"È richiesto l'accesso?"</string> | ||||
|   <string name="withHttpLoginSwitch">"Accesso HTTP necessario?"</string> | ||||
|   <string name="login_url_problem">"Oops. Potrebbe essere necessario aggiungere un \"/\" alla fine dell'url."</string> | ||||
|   <string name="prompt_login">"Nome utente"</string> | ||||
|   <string name="prompt_http_login">"Nome utente HTTP"</string> | ||||
|   <string name="label_share">"Condividi"</string> | ||||
|   <string name="readAll">"Segna tutte come lette"</string> | ||||
|   <string name="action_disconnect">"Scollegati"</string> | ||||
|   <string name="title_activity_settings">"Impostazioni"</string> | ||||
|   <string name="pref_header_general">"Generali"</string> | ||||
|   <string name="pref_switch_actions_tap_title">"Tap sugli articoli"</string> | ||||
|   <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> | ||||
|   <string name="add_source_hint_url">"Link"</string> | ||||
|   <string name="add_source_hint_name">"Name"</string> | ||||
|   <string name="add_source">"Add a source"</string> | ||||
|   <string name="add_source_save">"Save"</string> | ||||
|   <string name="wrong_infos">"Check your details again."</string> | ||||
|   <string name="add_source_hint_name">"Nome"</string> | ||||
|   <string name="add_source">"Aggiungi una fonte"</string> | ||||
|   <string name="add_source_save">"Salva"</string> | ||||
|   <string name="wrong_infos">"Controlla nuovamente i dati."</string> | ||||
|   <string name="all_posts_not_read">"All posts weren't read"</string> | ||||
|   <string name="all_posts_read">"All posts were read"</string> | ||||
|   <string name="cant_get_favs">"Can't get favorites"</string> | ||||
|   <string name="cant_get_new_elements">"Can't get new articles"</string> | ||||
|   <string name="all_posts_read">"Tutti i messaggi sono stati letti"</string> | ||||
|   <string name="cant_get_favs">"Non è possibile ottenere i preferiti"</string> | ||||
|   <string name="cant_get_new_elements">"Non è possibile ottenere nuovi articoli"</string> | ||||
|   <string name="cant_get_read">"Can't get read articles"</string> | ||||
|   <string name="nothing_here">"Nothing here"</string> | ||||
|   <string name="tab_new">"New"</string> | ||||
|   <string name="tab_read">"All"</string> | ||||
|   <string name="tab_favs">"Favorites"</string> | ||||
|   <string name="action_about">"About"</string> | ||||
|   <string name="marked_as_read">"Item read"</string> | ||||
|   <string name="undo_string">"Undo"</string> | ||||
|   <string name="addStringNoUrl">"Log in to add sources."</string> | ||||
|   <string name="nothing_here">"Non c'è niente qui"</string> | ||||
|   <string name="tab_new">"Nuovi"</string> | ||||
|   <string name="tab_read">"Tutti"</string> | ||||
|   <string name="tab_favs">"Preferiti"</string> | ||||
|   <string name="action_about">"Informazioni"</string> | ||||
|   <string name="marked_as_read">"Articolo letto"</string> | ||||
|   <string name="undo_string">"Annulla"</string> | ||||
|   <string name="addStringNoUrl">"Autenticati per aggiungere fonti."</string> | ||||
|   <string name="cant_get_sources">"Can't get sources list."</string> | ||||
|   <string name="cant_create_source">"Can't create source."</string> | ||||
|   <string name="cant_get_spouts">"Can't get spouts list."</string> | ||||
|   <string name="form_not_complete">"The form is not complete"</string> | ||||
|   <string name="form_not_complete">"Il modulo non è completo"</string> | ||||
|   <string name="pref_header_links">"Links"</string> | ||||
|   <string name="issue_tracker_link">"Issue Tracker"</string> | ||||
|   <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> | ||||
|   <string name="warning_wrong_url">"WARNING"</string> | ||||
|   <string name="pref_switch_card_view_title">"Card View"</string> | ||||
|   <string name="issue_tracker_link">"Traccia problemi"</string> | ||||
|   <string name="issue_tracker_summary">"Segnalare un bug o richiedere una nuova funzionalità"</string> | ||||
|   <string name="warning_wrong_url">"ATTENZIONE"</string> | ||||
|   <string name="pref_switch_card_view_title">"Visualizzazione a schede"</string> | ||||
|   <string name="cant_mark_favortie">"Can't mark article as favorite"</string> | ||||
|   <string name="cant_unmark_favortie">"Can't remove item from favorite"</string> | ||||
|   <string name="share">"Share"</string> | ||||
| @@ -92,32 +92,32 @@ | ||||
|   <string name="intro_hello_title">"Hi there !"</string> | ||||
|   <string name="intro_hello_message">"Thanks for downloading the app !"</string> | ||||
|   <string name="intro_needs_selfoss_title">"Before you start…"</string> | ||||
|   <string name="intro_needs_selfoss_message">"You can't use the app without a Selfoss instance."</string> | ||||
|   <string name="intro_needs_selfoss_link">"What is Selfoss ?"</string> | ||||
|   <string name="intro_all_set_title">"All set !"</string> | ||||
|   <string name="intro_needs_selfoss_message">"Non è possibile utilizzare l'app senza un'istanza di Selfoss."</string> | ||||
|   <string name="intro_needs_selfoss_link">"Che cosa è Selfoss?"</string> | ||||
|   <string name="intro_all_set_title">"Tutto pronto!"</string> | ||||
|   <string name="intro_all_set_message">"You are ready to use the app. Don't forget to go to the settings page to configure your app, and where you'll find some useful links."</string> | ||||
|   <string name="card_height_title">Full height cards</string> | ||||
|   <string name="card_height_title">Schede a piena altezza</string> | ||||
|   <string name="card_height_on">Cards height will adjust to its content</string> | ||||
|   <string name="card_height_off">Card height will be fixed</string> | ||||
|   <string name="source_code">Source code</string> | ||||
|   <string name="cant_mark_read">Can\'t mark article as read</string> | ||||
|   <string name="drawer_error_loading_tags">Error loading tags…</string> | ||||
|   <string name="drawer_error_loading_sources">Error loading sources…</string> | ||||
|   <string name="drawer_item_filters">Filters</string> | ||||
|   <string name="drawer_action_clear">clear</string> | ||||
|   <string name="source_code">Codice sorgente</string> | ||||
|   <string name="cant_mark_read">Impossibile contrassegnare l\'articolo come già letto</string> | ||||
|   <string name="drawer_error_loading_tags">Errore nel caricamento dei tag…</string> | ||||
|   <string name="drawer_error_loading_sources">Errore nel caricamento delle fonti…</string> | ||||
|   <string name="drawer_item_filters">Filtri</string> | ||||
|   <string name="drawer_action_clear">cancella</string> | ||||
|   <string name="drawer_item_tags">Tags</string> | ||||
|   <string name="drawer_item_sources">Sources</string> | ||||
|   <string name="drawer_action_edit">edit</string> | ||||
|   <string name="drawer_item_sources">Fonti</string> | ||||
|   <string name="drawer_action_edit">modifica</string> | ||||
|   <string name="cache_drawer_error" tools:keep="@string/cache_drawer_error">Couldn\'t cache your drawer data</string> | ||||
|   <string name="no_tags_loaded">No tags loaded</string> | ||||
|   <string name="no_tags_loaded">Nessun tag caricato</string> | ||||
|   <string name="no_sources_loaded">No sources loaded</string> | ||||
|   <string name="drawer_loading">Loading …</string> | ||||
|   <string name="menu_home_search">Search</string> | ||||
|   <string name="can_delete_source">Can\'t delete the source…</string> | ||||
|   <string name="drawer_loading">Caricamento…</string> | ||||
|   <string name="menu_home_search">Cerca</string> | ||||
|   <string name="can_delete_source">Non è possibile eliminare la fonte…</string> | ||||
|   <string name="base_url_error">There was an issue when trying to communicate with your Selfoss Instance. If the issue persists, please get in touch with me.</string> | ||||
|   <string name="pref_header_theme">Themes</string> | ||||
|   <string name="default_theme">Default</string> | ||||
|   <string name="default_dark_theme">Default/Dark</string> | ||||
|   <string name="pref_header_theme">Temi</string> | ||||
|   <string name="default_theme">Predefinito</string> | ||||
|   <string name="default_dark_theme">Predefinito (Scuro)</string> | ||||
|   <string name="pref_header_debug">Debug</string> | ||||
|   <string name="login_debug_title">Activate to log login errors</string> | ||||
|   <string name="login_debug_on">Any error on the login page will be logged</string> | ||||
| @@ -125,9 +125,9 @@ | ||||
|   <string name="login_menu_debug">Debug</string> | ||||
|   <string name="self_hosted_cert_switch">Using a self hosted certificate ?</string> | ||||
|   <string name="self_signed_cert_warning">Due to security reasons, self signed certificates are not supported by default. By activating this, I\'ll not be responsible of any security problem you encounter.</string> | ||||
|   <string name="pref_selfoss_category">Selfoss Api</string> | ||||
|   <string name="pref_api_items_number_title">Loaded items number</string> | ||||
|   <string name="pref_hidden_tags">Hidden Tags</string> | ||||
|   <string name="pref_selfoss_category">Api di Selfoss</string> | ||||
|   <string name="pref_api_items_number_title">Numero di elementi caricati</string> | ||||
|   <string name="pref_hidden_tags">Tag nascosti</string> | ||||
|   <string name="read_debug_title">Read articles appearing as unread ?</string> | ||||
|   <string name="read_debug_off">No log when marking an item as read</string> | ||||
|   <string name="read_debug_on">Api calls will be logged when marking an article as read</string> | ||||
| @@ -139,9 +139,9 @@ | ||||
|   <string name="login_everything_on">This will log every api call for debug purpose.</string> | ||||
|   <string name="login_everything_off">No api call will be logged</string> | ||||
|   <string name="pref_general_infinite_loading_title">Load more articles on scroll</string> | ||||
|   <string name="translation">Translation</string> | ||||
|   <string name="translation">Traduzioni</string> | ||||
|   <string name="cant_open_invalid_url">The item url is invalid. I\'m looking into solving this issue so the app won\'t crash.</string> | ||||
|   <string name="drawer_report_bug">Report a bug</string> | ||||
|   <string name="drawer_report_bug">Segnala un bug</string> | ||||
|   <string name="items_number_should_be_number">The items number should be an integer.</string> | ||||
|   <string name="reader_action_more">Read more</string> | ||||
|   <string name="reader_action_open">Open in browser</string> | ||||
| @@ -168,5 +168,5 @@ | ||||
|   <string name="pref_debug_debug_logs">Debug logging (these will be sent without a dialog)</string> | ||||
|   <string name="acra_login">Enable logging</string> | ||||
|   <string name="drawer_item_hidden_tags">Hidden Tags</string> | ||||
|   <string name="unmark">Mark item as unread</string> | ||||
|   <string name="unmark">Segna come non letto</string> | ||||
| </resources> | ||||
|   | ||||
| @@ -2,61 +2,61 @@ | ||||
| <!--Generated by crowdin.com--> | ||||
| <resources xmlns:tools="http://schemas.android.com/tools"> | ||||
|   <string name="app_name">"Reader for Selfoss"</string> | ||||
|   <string name="title_activity_login">"Log in"</string> | ||||
|   <string name="prompt_password">"Password"</string> | ||||
|   <string name="prompt_http_password">"HTTP Password"</string> | ||||
|   <string name="title_activity_login">"로그인"</string> | ||||
|   <string name="prompt_password">"비밀번호"</string> | ||||
|   <string name="prompt_http_password">"HTTP 암호"</string> | ||||
|   <string name="action_sign_in">"Go"</string> | ||||
|   <string name="error_invalid_password">"Password not long enough"</string> | ||||
|   <string name="error_field_required">"Field required"</string> | ||||
|   <string name="error_invalid_password">"패스워드가 짧습니다."</string> | ||||
|   <string name="error_field_required">"필수 항목"</string> | ||||
|   <string name="prompt_url">"Url"</string> | ||||
|   <string name="withLoginSwitch">"Login required ?"</string> | ||||
|   <string name="withHttpLoginSwitch">"HTTP Login required ?"</string> | ||||
|   <string name="login_url_problem">"Oops. You may need to add a \"/\" at the end of the url."</string> | ||||
|   <string name="prompt_login">"Username"</string> | ||||
|   <string name="prompt_http_login">"HTTP Username"</string> | ||||
|   <string name="label_share">"Share"</string> | ||||
|   <string name="readAll">"Read all"</string> | ||||
|   <string name="action_disconnect">"Disconnect"</string> | ||||
|   <string name="title_activity_settings">"Settings"</string> | ||||
|   <string name="pref_header_general">"General"</string> | ||||
|   <string name="pref_switch_actions_tap_title">"Tap action on the articles"</string> | ||||
|   <string name="add_source_hint_tags">"Tag1, Tag2, Tag3"</string> | ||||
|   <string name="add_source_hint_url">"Link"</string> | ||||
|   <string name="add_source_hint_name">"Name"</string> | ||||
|   <string name="add_source">"Add a source"</string> | ||||
|   <string name="add_source_save">"Save"</string> | ||||
|   <string name="wrong_infos">"Check your details again."</string> | ||||
|   <string name="all_posts_not_read">"All posts weren't read"</string> | ||||
|   <string name="all_posts_read">"All posts were read"</string> | ||||
|   <string name="cant_get_favs">"Can't get favorites"</string> | ||||
|   <string name="cant_get_new_elements">"Can't get new articles"</string> | ||||
|   <string name="cant_get_read">"Can't get read articles"</string> | ||||
|   <string name="nothing_here">"Nothing here"</string> | ||||
|   <string name="tab_new">"New"</string> | ||||
|   <string name="tab_read">"All"</string> | ||||
|   <string name="tab_favs">"Favorites"</string> | ||||
|   <string name="action_about">"About"</string> | ||||
|   <string name="marked_as_read">"Item read"</string> | ||||
|   <string name="undo_string">"Undo"</string> | ||||
|   <string name="addStringNoUrl">"Log in to add sources."</string> | ||||
|   <string name="cant_get_sources">"Can't get sources list."</string> | ||||
|   <string name="cant_create_source">"Can't create source."</string> | ||||
|   <string name="cant_get_spouts">"Can't get spouts list."</string> | ||||
|   <string name="form_not_complete">"The form is not complete"</string> | ||||
|   <string name="pref_header_links">"Links"</string> | ||||
|   <string name="issue_tracker_link">"Issue Tracker"</string> | ||||
|   <string name="issue_tracker_summary">"Report a bug or ask for a new feature"</string> | ||||
|   <string name="warning_wrong_url">"WARNING"</string> | ||||
|   <string name="pref_switch_card_view_title">"Card View"</string> | ||||
|   <string name="cant_mark_favortie">"Can't mark article as favorite"</string> | ||||
|   <string name="cant_unmark_favortie">"Can't remove item from favorite"</string> | ||||
|   <string name="share">"Share"</string> | ||||
|   <string name="rating_prompt_title">"Enjoying the app ?"</string> | ||||
|   <string name="rating_prompt_yes">"Yes !"</string> | ||||
|   <string name="rating_prompt_no">"Not really …"</string> | ||||
|   <string name="rating_prompt_feedback_title">"Can you tell us why ?"</string> | ||||
|   <string name="rating_prompt_feedback_yes">"OK !"</string> | ||||
|   <string name="rating_prompt_feedback_no">"Not now."</string> | ||||
|   <string name="withLoginSwitch">"로그인이 필요합니까?"</string> | ||||
|   <string name="withHttpLoginSwitch">"HTTP 로그인이 필요 합니까?"</string> | ||||
|   <string name="login_url_problem">"죄송합니다. Url의 끝에 \"/\"를 추가할 필요가 있습니다."</string> | ||||
|   <string name="prompt_login">"사용자 이름"</string> | ||||
|   <string name="prompt_http_login">"HTTP 사용자 이름"</string> | ||||
|   <string name="label_share">"공유"</string> | ||||
|   <string name="readAll">"모두 읽기"</string> | ||||
|   <string name="action_disconnect">"연결 해제"</string> | ||||
|   <string name="title_activity_settings">"설정"</string> | ||||
|   <string name="pref_header_general">"일반"</string> | ||||
|   <string name="pref_switch_actions_tap_title">"기사에 탭 액션"</string> | ||||
|   <string name="add_source_hint_tags">"태그1, 태그2, 태그3"</string> | ||||
|   <string name="add_source_hint_url">"링크"</string> | ||||
|   <string name="add_source_hint_name">"이름"</string> | ||||
|   <string name="add_source">"소스 추가"</string> | ||||
|   <string name="add_source_save">"저장"</string> | ||||
|   <string name="wrong_infos">"세부 정보를 다시 확인하세요."</string> | ||||
|   <string name="all_posts_not_read">"모든 게시물을 읽지 않았습니다."</string> | ||||
|   <string name="all_posts_read">"모든 게시물을 읽었습니다."</string> | ||||
|   <string name="cant_get_favs">"즐겨찾기를 가져올 수 없습니다."</string> | ||||
|   <string name="cant_get_new_elements">"새로운 기사를 가져올 수 없습니다."</string> | ||||
|   <string name="cant_get_read">"읽은 기사를 가져올 수 없습니다."</string> | ||||
|   <string name="nothing_here">"비어있음"</string> | ||||
|   <string name="tab_new">"새로운"</string> | ||||
|   <string name="tab_read">"전체"</string> | ||||
|   <string name="tab_favs">"즐겨찾기"</string> | ||||
|   <string name="action_about">"정보"</string> | ||||
|   <string name="marked_as_read">"항목 읽기"</string> | ||||
|   <string name="undo_string">"실행 취소"</string> | ||||
|   <string name="addStringNoUrl">"로그인 소스를 추가 해야 합니다."</string> | ||||
|   <string name="cant_get_sources">"소스 리스트를 얻을 수 없습니다."</string> | ||||
|   <string name="cant_create_source">"소스를 만들 수 없습니다."</string> | ||||
|   <string name="cant_get_spouts">"Spouts 목록을 가져올 수 없습니다."</string> | ||||
|   <string name="form_not_complete">"양식이 완료되지 않았습니다."</string> | ||||
|   <string name="pref_header_links">"링크"</string> | ||||
|   <string name="issue_tracker_link">"이슈 트래커"</string> | ||||
|   <string name="issue_tracker_summary">"버그를 보고 하거나 새기능에 대해 요청하세요."</string> | ||||
|   <string name="warning_wrong_url">"경고"</string> | ||||
|   <string name="pref_switch_card_view_title">"카드 형식 보기"</string> | ||||
|   <string name="cant_mark_favortie">"좋아하는 문서를 마크할 수 없습니다."</string> | ||||
|   <string name="cant_unmark_favortie">"좋아하는 항목에서 제거할 수 없습니다."</string> | ||||
|   <string name="share">"공유"</string> | ||||
|   <string name="rating_prompt_title">"이 앱에 만족하십니까?"</string> | ||||
|   <string name="rating_prompt_yes">"예!"</string> | ||||
|   <string name="rating_prompt_no">"설마..."</string> | ||||
|   <string name="rating_prompt_feedback_title">"이유를 우리에게 말해줄 수 있습니까?"</string> | ||||
|   <string name="rating_prompt_feedback_yes">"OK!"</string> | ||||
|   <string name="rating_prompt_feedback_no">"나중에"</string> | ||||
|   <string name="rating_prompt_rating_title">"Great ! Can you rate us on the Store ?"</string> | ||||
|   <string name="rating_prompt_rating_yes">"Sure !"</string> | ||||
|   <string name="rating_prompt_rating_no">"Not right now."</string> | ||||
|   | ||||
| @@ -7,22 +7,22 @@ | ||||
|         android:key="dark_theme" | ||||
|         android:title="Dark theme" /> | ||||
|  | ||||
|     <com.jrummyapps.android.colorpicker.ColorPreference | ||||
|     <com.jaredrummler.android.colorpicker.ColorPreference | ||||
|         android:defaultValue="@color/colorPrimary" | ||||
|         android:key="color_primary" | ||||
|         android:title="Primary color"/> | ||||
|  | ||||
|     <com.jrummyapps.android.colorpicker.ColorPreference | ||||
|     <com.jaredrummler.android.colorpicker.ColorPreference | ||||
|         android:defaultValue="@color/colorPrimaryDark" | ||||
|         android:key="color_primary_dark" | ||||
|         android:title="Primary dark color"/> | ||||
|  | ||||
|     <com.jrummyapps.android.colorpicker.ColorPreference | ||||
|     <com.jaredrummler.android.colorpicker.ColorPreference | ||||
|         android:defaultValue="@color/colorAccent" | ||||
|         android:key="color_accent" | ||||
|         android:title="Accent color"/> | ||||
|  | ||||
|     <com.jrummyapps.android.colorpicker.ColorPreference | ||||
|     <com.jaredrummler.android.colorpicker.ColorPreference | ||||
|         android:defaultValue="@color/colorAccentDark" | ||||
|         android:key="color_accent_dark" | ||||
|         android:title="Accent dark color"/> | ||||
|   | ||||
							
								
								
									
										12
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								build.gradle
									
									
									
									
									
								
							| @@ -2,18 +2,20 @@ | ||||
|  | ||||
| buildscript { | ||||
|     ext { | ||||
|         kotlin_version = '1.2.31' | ||||
|         android_version = '27.1.1' | ||||
|         kotlin_version = '1.2.51' | ||||
|         android_version = '1.0.0' | ||||
|         lifecycle_version = '2.0.0' | ||||
|         room_version = '2.1.0-alpha01' | ||||
|     } | ||||
|     repositories { | ||||
|         jcenter() | ||||
|         google() | ||||
|         jcenter() | ||||
|         maven { | ||||
|             url "https://jitpack.io" | ||||
|         } | ||||
|     } | ||||
|     dependencies { | ||||
|         classpath 'com.android.tools.build:gradle:3.1.4' | ||||
|         classpath 'com.android.tools.build:gradle:3.2.0' | ||||
|         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | ||||
|     } | ||||
| } | ||||
| @@ -23,7 +25,7 @@ allprojects { | ||||
|         // For likebutton only | ||||
|         maven { url "https://jitpack.io" } | ||||
|  | ||||
|         maven { url 'https://maven.google.com' } | ||||
|         google() | ||||
|         jcenter() | ||||
|         mavenCentral() | ||||
|     } | ||||
|   | ||||
| @@ -16,4 +16,6 @@ org.gradle.jvmargs=-Xmx1536m | ||||
| # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects | ||||
| # org.gradle.parallel=true | ||||
| org.gradle.caching=true | ||||
| android.enableD8=true | ||||
| android.enableD8=true | ||||
| android.useAndroidX=true | ||||
| android.enableJetifier=true | ||||
							
								
								
									
										4
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| #Tue Mar 27 19:14:12 CEST 2018 | ||||
| #Tue Sep 25 20:41:54 CEST 2018 | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip | ||||
|   | ||||
		Reference in New Issue
	
	Block a user