Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
9fa178d513 | |||
043b184065 | |||
10559bb894 | |||
d0000d66b2 | |||
b447ac738a | |||
faebfc238c | |||
c28fbd37cc |
3
.github/CONTRIBUTING.md
vendored
3
.github/CONTRIBUTING.md
vendored
@ -22,7 +22,8 @@ Always check if the web version of your instance is working.
|
|||||||
### Bug reports/Feature request
|
### Bug reports/Feature request
|
||||||
|
|
||||||
* Always search before reporting an issue or asking for a feature to avoid duplicates.
|
* Always search before reporting an issue or asking for a feature to avoid duplicates.
|
||||||
* Include every usefull details (app version, phone model, Android version and screenshots when possible)
|
* Include your unique user id. It's displayed on the debug settings page. (You can tap it, it'll be copied to your clipboard)
|
||||||
|
* Include every other useful details (app version, phone model, Android version and screenshots when possible).
|
||||||
* Avoid bumping non-fatal issues, or feature requests. I'll try to fix them as soon as possible, and try to prioritize the requests. (You may wan to use the [reactions](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) for that)
|
* Avoid bumping non-fatal issues, or feature requests. I'll try to fix them as soon as possible, and try to prioritize the requests. (You may wan to use the [reactions](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) for that)
|
||||||
|
|
||||||
### Pull requests
|
### Pull requests
|
||||||
|
18
CHANGELOG.md
18
CHANGELOG.md
@ -1,3 +1,21 @@
|
|||||||
|
**1.5.2.13**
|
||||||
|
|
||||||
|
- Updated glide.
|
||||||
|
|
||||||
|
- Loading images from self signed certificate now working.
|
||||||
|
|
||||||
|
**1.5.2.12**
|
||||||
|
|
||||||
|
- Self signed certificates are now working for loading data. Image are not loading yet.
|
||||||
|
|
||||||
|
**1.5.2.11**
|
||||||
|
|
||||||
|
- Added a random unique identifier to be used in the logs.
|
||||||
|
|
||||||
|
**1.5.2.08/09/10**
|
||||||
|
|
||||||
|
- Added settable logs for reading articles problems.
|
||||||
|
|
||||||
**1.5.2.07**
|
**1.5.2.07**
|
||||||
|
|
||||||
- Added the ability to choose the number of items loaded (the maximum value is 200 and is imposed by the selfoss api)
|
- Added the ability to choose the number of items loaded (the maximum value is 200 and is imposed by the selfoss api)
|
||||||
|
@ -35,7 +35,7 @@ repositories {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 26
|
compileSdkVersion 26
|
||||||
buildToolsVersion "26.0.0"
|
buildToolsVersion "26.0.1"
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "apps.amine.bou.readerforselfoss"
|
applicationId "apps.amine.bou.readerforselfoss"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
@ -83,12 +83,12 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// Testing
|
// Testing
|
||||||
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
|
androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.0'
|
||||||
androidTestCompile 'com.android.support.test:runner:0.5'
|
androidTestCompile 'com.android.support.test:runner:1.0.0'
|
||||||
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
|
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
|
||||||
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2'
|
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:3.0.0'
|
||||||
// Espresso-intents for validation and stubbing of Intents
|
// Espresso-intents for validation and stubbing of Intents
|
||||||
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2'
|
androidTestCompile 'com.android.support.test.espresso:espresso-intents:3.0.0'
|
||||||
|
|
||||||
|
|
||||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
@ -119,7 +119,7 @@ dependencies {
|
|||||||
compile 'agency.tango.android:material-intro-screen:0.0.5'
|
compile 'agency.tango.android:material-intro-screen:0.0.5'
|
||||||
|
|
||||||
// About
|
// About
|
||||||
compile('com.mikepenz:aboutlibraries:5.9.6@aar') {
|
compile('com.mikepenz:aboutlibraries:5.9.7@aar') {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +137,10 @@ dependencies {
|
|||||||
compile 'org.sufficientlysecure:html-textview:3.3'
|
compile 'org.sufficientlysecure:html-textview:3.3'
|
||||||
|
|
||||||
// glide
|
// glide
|
||||||
compile 'com.github.bumptech.glide:glide:3.7.0'
|
compile('com.github.bumptech.glide:glide:4.1.0@aar') {
|
||||||
|
transitive = true;
|
||||||
|
}
|
||||||
|
compile('com.github.bumptech.glide:okhttp3-integration:4.1.0@aar')
|
||||||
|
|
||||||
// Asking politely users to rate the app
|
// Asking politely users to rate the app
|
||||||
compile 'com.github.stkent:amplify:1.5.0'
|
compile 'com.github.stkent:amplify:1.5.0'
|
||||||
|
6
app/proguard-rules.pro
vendored
6
app/proguard-rules.pro
vendored
@ -56,4 +56,8 @@
|
|||||||
|
|
||||||
|
|
||||||
#Bottom bar lib
|
#Bottom bar lib
|
||||||
-dontwarn com.roughike.bottombar.**
|
-dontwarn com.roughike.bottombar.**
|
||||||
|
|
||||||
|
|
||||||
|
# self signed glidemodule
|
||||||
|
-keep public class * implements com.bumptech.glide.module.GlideModule
|
@ -64,6 +64,9 @@
|
|||||||
<activity android:name=".ReaderActivity"
|
<activity android:name=".ReaderActivity"
|
||||||
android:theme="@style/DragDismissTheme">
|
android:theme="@style/DragDismissTheme">
|
||||||
</activity>
|
</activity>
|
||||||
|
<meta-data
|
||||||
|
android:name="apps.amine.bou.readerforselfoss.utils.glide.SelfSignedGlideModule"
|
||||||
|
android:value="GlideModule" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -64,6 +64,10 @@ import com.ashokvarma.bottomnavigation.BottomNavigationBar
|
|||||||
import com.ashokvarma.bottomnavigation.BottomNavigationItem
|
import com.ashokvarma.bottomnavigation.BottomNavigationItem
|
||||||
import com.ashokvarma.bottomnavigation.TextBadgeItem
|
import com.ashokvarma.bottomnavigation.TextBadgeItem
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
import com.mikepenz.materialdrawer.AccountHeader
|
||||||
|
import com.mikepenz.materialdrawer.AccountHeaderBuilder
|
||||||
|
import com.mikepenz.materialdrawer.holder.DimenHolder
|
||||||
|
import com.mikepenz.materialdrawer.model.ProfileDrawerItem
|
||||||
|
|
||||||
|
|
||||||
class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
||||||
@ -92,6 +96,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
private var maybeTagFilter: Tag? = null
|
private var maybeTagFilter: Tag? = null
|
||||||
private var maybeSourceFilter: Sources? = null
|
private var maybeSourceFilter: Sources? = null
|
||||||
private var maybeSearchFilter: String? = null
|
private var maybeSearchFilter: String? = null
|
||||||
|
private var userIdentifier: String = ""
|
||||||
|
|
||||||
private lateinit var emptyText: TextView
|
private lateinit var emptyText: TextView
|
||||||
private lateinit var recyclerView: RecyclerView
|
private lateinit var recyclerView: RecyclerView
|
||||||
@ -141,7 +146,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
customTabActivityHelper = CustomTabActivityHelper()
|
customTabActivityHelper = CustomTabActivityHelper()
|
||||||
|
|
||||||
val dirtyPref = PreferenceManager.getDefaultSharedPreferences(this)
|
val dirtyPref = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
api = SelfossApi(this, this@HomeActivity, dirtyPref.getBoolean("isSelfSignedCert", false))
|
api = SelfossApi(this, this@HomeActivity, dirtyPref.getBoolean("isSelfSignedCert", false))
|
||||||
items = ArrayList()
|
items = ArrayList()
|
||||||
|
|
||||||
@ -149,7 +154,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
handleBottomBar()
|
handleBottomBar()
|
||||||
|
|
||||||
handleDrawer()
|
handleDrawer(dirtyPref)
|
||||||
|
|
||||||
coordinatorLayout = findViewById(R.id.coordLayout)
|
coordinatorLayout = findViewById(R.id.coordLayout)
|
||||||
swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout)
|
swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout)
|
||||||
@ -287,12 +292,28 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
displayAllCount = sharedPref.getBoolean("display_other_count", false)
|
displayAllCount = sharedPref.getBoolean("display_other_count", false)
|
||||||
fullHeightCards = sharedPref.getBoolean("full_height_cards", false)
|
fullHeightCards = sharedPref.getBoolean("full_height_cards", false)
|
||||||
itemsNumber = sharedPref.getString("prefer_api_items_number", "200").toInt()
|
itemsNumber = sharedPref.getString("prefer_api_items_number", "200").toInt()
|
||||||
|
userIdentifier = sharedPref.getString("unique_id", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleDrawer() {
|
private fun handleDrawer(dirtyPref: SharedPreferences) {
|
||||||
|
|
||||||
|
val headerResult: AccountHeader = AccountHeaderBuilder()
|
||||||
|
.withActivity(this)
|
||||||
|
.withHeaderBackground(R.drawable.bg)
|
||||||
|
.addProfiles(
|
||||||
|
ProfileDrawerItem()
|
||||||
|
.withName(
|
||||||
|
dirtyPref.getString("url", "")
|
||||||
|
)
|
||||||
|
.withIcon(resources.getDrawable(R.mipmap.ic_launcher))
|
||||||
|
)
|
||||||
|
.withSelectionListEnabledForSingleProfile(false)
|
||||||
|
.build()
|
||||||
|
|
||||||
drawer = DrawerBuilder()
|
drawer = DrawerBuilder()
|
||||||
.withActivity(this)
|
.withActivity(this)
|
||||||
|
.withAccountHeader(headerResult)
|
||||||
|
.withHeaderHeight(DimenHolder.fromDp(140))
|
||||||
.withRootView(R.id.drawer_layout)
|
.withRootView(R.id.drawer_layout)
|
||||||
.withToolbar(toolbar)
|
.withToolbar(toolbar)
|
||||||
.withActionBarDrawerToggle(true)
|
.withActionBarDrawerToggle(true)
|
||||||
@ -314,25 +335,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
drawer.addStickyFooterItem(
|
|
||||||
PrimaryDrawerItem()
|
|
||||||
.withName(R.string.action_about)
|
|
||||||
.withSelectable(false)
|
|
||||||
.withIcon(R.drawable.ic_info_outline)
|
|
||||||
.withIconTintingEnabled(true)
|
|
||||||
.withOnDrawerItemClickListener { _, _, _ ->
|
|
||||||
LibsBuilder()
|
|
||||||
.withActivityStyle(
|
|
||||||
if (appColors.isDarkTheme)
|
|
||||||
Libs.ActivityStyle.LIGHT_DARK_TOOLBAR
|
|
||||||
else
|
|
||||||
Libs.ActivityStyle.DARK
|
|
||||||
)
|
|
||||||
.withAboutIconShown(true)
|
|
||||||
.withAboutVersionShown(true)
|
|
||||||
.start(this@HomeActivity)
|
|
||||||
false
|
|
||||||
})
|
|
||||||
drawer.addStickyFooterItem(
|
drawer.addStickyFooterItem(
|
||||||
PrimaryDrawerItem()
|
PrimaryDrawerItem()
|
||||||
.withName(R.string.title_activity_settings)
|
.withName(R.string.title_activity_settings)
|
||||||
@ -436,6 +438,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
.withIdentifier(DRAWER_ID_TAGS)
|
.withIdentifier(DRAWER_ID_TAGS)
|
||||||
.withSelectable(false))
|
.withSelectable(false))
|
||||||
handleTags(maybeDrawerData.tags)
|
handleTags(maybeDrawerData.tags)
|
||||||
|
drawer.addItem(DividerDrawerItem())
|
||||||
drawer.addItem(
|
drawer.addItem(
|
||||||
SecondaryDrawerItem()
|
SecondaryDrawerItem()
|
||||||
.withName(getString(R.string.drawer_item_sources))
|
.withName(getString(R.string.drawer_item_sources))
|
||||||
@ -448,6 +451,26 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
handleSources(maybeDrawerData.sources)
|
handleSources(maybeDrawerData.sources)
|
||||||
|
drawer.addItem(DividerDrawerItem())
|
||||||
|
drawer.addItem(
|
||||||
|
PrimaryDrawerItem()
|
||||||
|
.withName(R.string.action_about)
|
||||||
|
.withSelectable(false)
|
||||||
|
.withIcon(R.drawable.ic_info_outline)
|
||||||
|
.withIconTintingEnabled(true)
|
||||||
|
.withOnDrawerItemClickListener { _, _, _ ->
|
||||||
|
LibsBuilder()
|
||||||
|
.withActivityStyle(
|
||||||
|
if (appColors.isDarkTheme)
|
||||||
|
Libs.ActivityStyle.LIGHT_DARK_TOOLBAR
|
||||||
|
else
|
||||||
|
Libs.ActivityStyle.DARK
|
||||||
|
)
|
||||||
|
.withAboutIconShown(true)
|
||||||
|
.withAboutVersionShown(true)
|
||||||
|
.start(this@HomeActivity)
|
||||||
|
false
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
if (!loadedFromCache)
|
if (!loadedFromCache)
|
||||||
@ -644,7 +667,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
articleViewer,
|
articleViewer,
|
||||||
fullHeightCards,
|
fullHeightCards,
|
||||||
appColors,
|
appColors,
|
||||||
debugReadingItems)
|
debugReadingItems,
|
||||||
|
userIdentifier)
|
||||||
} else {
|
} else {
|
||||||
mAdapter =
|
mAdapter =
|
||||||
ItemListAdapter(
|
ItemListAdapter(
|
||||||
@ -655,7 +679,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
clickBehavior,
|
clickBehavior,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
debugReadingItems)
|
debugReadingItems,
|
||||||
|
userIdentifier)
|
||||||
}
|
}
|
||||||
recyclerView.adapter = mAdapter
|
recyclerView.adapter = mAdapter
|
||||||
mAdapter.notifyDataSetChanged()
|
mAdapter.notifyDataSetChanged()
|
||||||
|
@ -51,6 +51,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
private lateinit var mPasswordView: EditText
|
private lateinit var mPasswordView: EditText
|
||||||
private lateinit var mHTTPPasswordView: EditText
|
private lateinit var mHTTPPasswordView: EditText
|
||||||
private lateinit var mLoginFormView: View
|
private lateinit var mLoginFormView: View
|
||||||
|
private lateinit var userIdentifier: String
|
||||||
private var logErrors: Boolean = false
|
private var logErrors: Boolean = false
|
||||||
|
|
||||||
|
|
||||||
@ -76,6 +77,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
|
|
||||||
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
|
userIdentifier = settings.getString("unique_id", "")
|
||||||
logErrors = settings.getBoolean("loging_debug", false)
|
logErrors = settings.getBoolean("loging_debug", false)
|
||||||
|
|
||||||
editor = settings.edit()
|
editor = settings.edit()
|
||||||
@ -224,6 +226,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
mHTTPLoginView.error = getString(R.string.wrong_infos)
|
mHTTPLoginView.error = getString(R.string.wrong_infos)
|
||||||
mHTTPPasswordView.error = getString(R.string.wrong_infos)
|
mHTTPPasswordView.error = getString(R.string.wrong_infos)
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
|
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
|
||||||
Crashlytics.logException(t)
|
Crashlytics.logException(t)
|
||||||
Toast.makeText(this@LoginActivity, t.message, Toast.LENGTH_LONG).show()
|
Toast.makeText(this@LoginActivity, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
@ -6,8 +6,10 @@ import android.net.Uri
|
|||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import android.support.multidex.MultiDexApplication
|
import android.support.multidex.MultiDexApplication
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import com.anupcowkur.reservoir.Reservoir
|
import com.anupcowkur.reservoir.Reservoir
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
|
import com.bumptech.glide.request.RequestOptions
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
import com.github.stkent.amplify.tracking.Amplify
|
import com.github.stkent.amplify.tracking.Amplify
|
||||||
@ -15,9 +17,13 @@ import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
|
|||||||
import com.mikepenz.materialdrawer.util.DrawerImageLoader
|
import com.mikepenz.materialdrawer.util.DrawerImageLoader
|
||||||
import io.fabric.sdk.android.Fabric
|
import io.fabric.sdk.android.Fabric
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.util.UUID.randomUUID
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MyApp : MultiDexApplication() {
|
class MyApp : MultiDexApplication() {
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
Fabric.with(this, Crashlytics())
|
Fabric.with(this, Crashlytics())
|
||||||
@ -26,6 +32,13 @@ class MyApp : MultiDexApplication() {
|
|||||||
|
|
||||||
initCache()
|
initCache()
|
||||||
|
|
||||||
|
val prefs = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
|
if (prefs.getString("unique_id", "").isEmpty()) {
|
||||||
|
val editor = prefs.edit()
|
||||||
|
editor.putString("unique_id", randomUUID().toString())
|
||||||
|
editor.apply()
|
||||||
|
}
|
||||||
|
|
||||||
initDrawerImageLoader()
|
initDrawerImageLoader()
|
||||||
|
|
||||||
initTheme()
|
initTheme()
|
||||||
@ -51,11 +64,15 @@ class MyApp : MultiDexApplication() {
|
|||||||
private fun initDrawerImageLoader() {
|
private fun initDrawerImageLoader() {
|
||||||
DrawerImageLoader.init(object : AbstractDrawerImageLoader() {
|
DrawerImageLoader.init(object : AbstractDrawerImageLoader() {
|
||||||
override fun set(imageView: ImageView?, uri: Uri?, placeholder: Drawable?, tag: String?) {
|
override fun set(imageView: ImageView?, uri: Uri?, placeholder: Drawable?, tag: String?) {
|
||||||
Glide.with(imageView?.context).load(uri).placeholder(placeholder).into(imageView)
|
Glide.with(imageView?.context)
|
||||||
|
.load(uri)
|
||||||
|
.apply(RequestOptions.fitCenterTransform()
|
||||||
|
.placeholder(placeholder))
|
||||||
|
.into(imageView)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun cancel(imageView: ImageView?) {
|
override fun cancel(imageView: ImageView?) {
|
||||||
Glide.clear(imageView)
|
Glide.with(imageView?.context).clear(imageView)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun placeholder(ctx: Context?, tag: String?): Drawable {
|
override fun placeholder(ctx: Context?, tag: String?): Drawable {
|
||||||
|
@ -24,6 +24,7 @@ import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
|||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
||||||
import apps.amine.bou.readerforselfoss.utils.shareLink
|
import apps.amine.bou.readerforselfoss.utils.shareLink
|
||||||
|
import com.bumptech.glide.request.RequestOptions
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
|
||||||
|
|
||||||
@ -75,9 +76,9 @@ class ReaderActivity : DragDismissActivity() {
|
|||||||
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty())
|
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty())
|
||||||
Glide
|
Glide
|
||||||
.with(baseContext)
|
.with(baseContext)
|
||||||
.load(response.body()!!.lead_image_url)
|
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.fitCenter()
|
.load(response.body()!!.lead_image_url)
|
||||||
|
.apply(RequestOptions.fitCenterTransform())
|
||||||
.into(image)
|
.into(image)
|
||||||
|
|
||||||
shareBtn.setOnClickListener {
|
shareBtn.setOnClickListener {
|
||||||
|
@ -32,6 +32,9 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
|||||||
import apps.amine.bou.readerforselfoss.themes.AppColors
|
import apps.amine.bou.readerforselfoss.themes.AppColors
|
||||||
import apps.amine.bou.readerforselfoss.utils.*
|
import apps.amine.bou.readerforselfoss.utils.*
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.glide.bitmapFitCenter
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
@ -43,7 +46,8 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
private val articleViewer: Boolean,
|
private val articleViewer: Boolean,
|
||||||
private val fullHeightCards: Boolean,
|
private val fullHeightCards: Boolean,
|
||||||
private val appColors: AppColors,
|
private val appColors: AppColors,
|
||||||
val debugReadingItems: Boolean) : RecyclerView.Adapter<ItemCardAdapter.ViewHolder>() {
|
val debugReadingItems: Boolean,
|
||||||
|
val userIdentifier: String) : RecyclerView.Adapter<ItemCardAdapter.ViewHolder>() {
|
||||||
private val c: Context = app.baseContext
|
private val c: Context = app.baseContext
|
||||||
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
||||||
|
|
||||||
@ -62,7 +66,7 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
holder.sourceTitleAndDate.text = itm.sourceAndDateText()
|
holder.sourceTitleAndDate.text = itm.sourceAndDateText()
|
||||||
|
|
||||||
if (itm.getThumbnail(c).isEmpty()) {
|
if (itm.getThumbnail(c).isEmpty()) {
|
||||||
Glide.clear(holder.itemImage)
|
Glide.with(c).clear(holder.itemImage)
|
||||||
holder.itemImage.setImageDrawable(null)
|
holder.itemImage.setImageDrawable(null)
|
||||||
} else {
|
} else {
|
||||||
if (fullHeightCards) {
|
if (fullHeightCards) {
|
||||||
@ -129,11 +133,16 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
if (debugReadingItems) {
|
if (debugReadingItems) {
|
||||||
val message =
|
val message =
|
||||||
"message: ${response.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 success: ${response.body()?.success} " +
|
||||||
"body isSuccess: ${response.body()?.isSuccess} " +
|
"body isSuccess: ${response.body()?.isSuccess}"
|
||||||
"raw body string: ${response.raw()?.body()?.string()}"
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
||||||
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
|
|
||||||
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
||||||
}
|
}
|
||||||
doUnmark(i, position)
|
doUnmark(i, position)
|
||||||
@ -141,6 +150,7 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
if (debugReadingItems) {
|
if (debugReadingItems) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
||||||
Crashlytics.logException(t)
|
Crashlytics.logException(t)
|
||||||
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
@ -29,6 +29,8 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
|||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
import apps.amine.bou.readerforselfoss.utils.*
|
import apps.amine.bou.readerforselfoss.utils.*
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.glide.bitmapCenterCrop
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
||||||
import com.crashlytics.android.Crashlytics
|
import com.crashlytics.android.Crashlytics
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
@ -40,7 +42,8 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
private val clickBehavior: Boolean,
|
private val clickBehavior: Boolean,
|
||||||
private val internalBrowser: Boolean,
|
private val internalBrowser: Boolean,
|
||||||
private val articleViewer: Boolean,
|
private val articleViewer: Boolean,
|
||||||
val debugReadingItems: Boolean) : RecyclerView.Adapter<ItemListAdapter.ViewHolder>() {
|
val debugReadingItems: Boolean,
|
||||||
|
val userIdentifier: String) : RecyclerView.Adapter<ItemListAdapter.ViewHolder>() {
|
||||||
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
private val generator: ColorGenerator = ColorGenerator.MATERIAL
|
||||||
private val c: Context = app.baseContext
|
private val c: Context = app.baseContext
|
||||||
private val bars: ArrayList<Boolean> = ArrayList(Collections.nCopies(items.size + 1, false))
|
private val bars: ArrayList<Boolean> = ArrayList(Collections.nCopies(items.size + 1, false))
|
||||||
@ -138,9 +141,13 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
if (debugReadingItems) {
|
if (debugReadingItems) {
|
||||||
val message =
|
val message =
|
||||||
"message: ${response.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 success: ${response.body()?.success} " +
|
||||||
"body isSuccess: ${response.body()?.isSuccess} " +
|
"body isSuccess: ${response.body()?.isSuccess}"
|
||||||
"raw body string: ${response.raw()?.body()?.string()}"
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
Crashlytics.log(100, "READ_DEBUG_SUCCESS", message)
|
||||||
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
Crashlytics.logException(Exception("Was success, but did it work ?"))
|
||||||
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
Toast.makeText(c, message, Toast.LENGTH_LONG).show()
|
||||||
@ -151,6 +158,7 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
if (debugReadingItems) {
|
if (debugReadingItems) {
|
||||||
|
Crashlytics.setUserIdentifier(userIdentifier)
|
||||||
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
Crashlytics.log(100, "READ_DEBUG_ERROR", t.message)
|
||||||
Crashlytics.logException(t)
|
Crashlytics.logException(t)
|
||||||
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
Toast.makeText(c, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
@ -21,7 +21,7 @@ import apps.amine.bou.readerforselfoss.R
|
|||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Sources
|
import apps.amine.bou.readerforselfoss.api.selfoss.Sources
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
import apps.amine.bou.readerforselfoss.utils.circularBitmapDrawable
|
import apps.amine.bou.readerforselfoss.utils.glide.circularBitmapDrawable
|
||||||
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
import apps.amine.bou.readerforselfoss.utils.toTextDrawableString
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,11 +2,6 @@ package apps.amine.bou.readerforselfoss.api.selfoss
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
|
||||||
import android.support.v7.app.AlertDialog
|
|
||||||
import android.widget.Toast
|
|
||||||
import apps.amine.bou.readerforselfoss.LoginActivity
|
|
||||||
import apps.amine.bou.readerforselfoss.R
|
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
import com.burgstaller.okhttp.AuthenticationCacheInterceptor
|
import com.burgstaller.okhttp.AuthenticationCacheInterceptor
|
||||||
@ -23,9 +18,7 @@ import retrofit2.Retrofit
|
|||||||
import retrofit2.converter.gson.GsonConverterFactory
|
import retrofit2.converter.gson.GsonConverterFactory
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import java.security.cert.CertificateException
|
import apps.amine.bou.readerforselfoss.utils.getUnsafeHttpClient
|
||||||
import java.security.cert.X509Certificate
|
|
||||||
import javax.net.ssl.*
|
|
||||||
|
|
||||||
|
|
||||||
// codebeat:disable[ARITY,TOO_MANY_FUNCTIONS]
|
// codebeat:disable[ARITY,TOO_MANY_FUNCTIONS]
|
||||||
@ -38,36 +31,7 @@ class SelfossApi(c: Context, callingActivity: Activity, isWithSelfSignedCert: Bo
|
|||||||
|
|
||||||
fun OkHttpClient.Builder.maybeWithSelfSigned(isWithSelfSignedCert: Boolean): OkHttpClient.Builder =
|
fun OkHttpClient.Builder.maybeWithSelfSigned(isWithSelfSignedCert: Boolean): OkHttpClient.Builder =
|
||||||
if (isWithSelfSignedCert) {
|
if (isWithSelfSignedCert) {
|
||||||
try {
|
getUnsafeHttpClient()
|
||||||
// Create a trust manager that does not validate certificate chains
|
|
||||||
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
|
|
||||||
override fun getAcceptedIssuers(): Array<X509Certificate> =
|
|
||||||
arrayOf()
|
|
||||||
|
|
||||||
@Throws(CertificateException::class)
|
|
||||||
override fun checkClientTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Throws(CertificateException::class)
|
|
||||||
override fun checkServerTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) {
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
// Install the all-trusting trust manager
|
|
||||||
val sslContext = SSLContext.getInstance("SSL")
|
|
||||||
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
|
|
||||||
|
|
||||||
val sslSocketFactory = sslContext.socketFactory
|
|
||||||
|
|
||||||
OkHttpClient.Builder()
|
|
||||||
.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
|
|
||||||
.hostnameVerifier { _, _ -> true }
|
|
||||||
|
|
||||||
} catch (e: Exception) {
|
|
||||||
throw RuntimeException(e)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,11 @@ package apps.amine.bou.readerforselfoss.settings;
|
|||||||
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
|
import android.content.ClipData;
|
||||||
|
import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@ -11,6 +14,7 @@ import android.os.Bundle;
|
|||||||
import android.preference.EditTextPreference;
|
import android.preference.EditTextPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
import android.preference.Preference.OnPreferenceClickListener;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
@ -19,10 +23,12 @@ import android.preference.PreferenceManager;
|
|||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import apps.amine.bou.readerforselfoss.R;
|
import apps.amine.bou.readerforselfoss.R;
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.Config;
|
||||||
import com.ftinc.scoop.ui.ScoopSettingsActivity;
|
import com.ftinc.scoop.ui.ScoopSettingsActivity;
|
||||||
|
|
||||||
|
|
||||||
@ -184,6 +190,25 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
addPreferencesFromResource(R.xml.pref_debug);
|
addPreferencesFromResource(R.xml.pref_debug);
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
|
SharedPreferences pref = getActivity().getSharedPreferences(Config.Companion.getSettingsName(), Context.MODE_PRIVATE);
|
||||||
|
final String id = pref.getString("unique_id", "...");
|
||||||
|
|
||||||
|
final Preference identifier = findPreference("debug_identifier");
|
||||||
|
final ClipboardManager clipboard = (ClipboardManager)
|
||||||
|
getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
|
|
||||||
|
identifier.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
ClipData clip = ClipData.newPlainText("Selfoss unique id", id);
|
||||||
|
clipboard.setPrimaryClip(clip);
|
||||||
|
|
||||||
|
Toast.makeText(getActivity(), R.string.unique_id_to_clipboard, Toast.LENGTH_LONG).show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
identifier.setTitle(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
package apps.amine.bou.readerforselfoss.utils
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory
|
|
||||||
import android.widget.ImageView
|
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import com.bumptech.glide.request.target.BitmapImageViewTarget
|
|
||||||
|
|
||||||
|
|
||||||
fun Context.bitmapCenterCrop(url: String, iv: ImageView) =
|
|
||||||
Glide.with(this).load(url).asBitmap().centerCrop().into(iv)
|
|
||||||
|
|
||||||
fun Context.bitmapFitCenter(url: String, iv: ImageView) =
|
|
||||||
Glide.with(this).load(url).asBitmap().fitCenter().into(iv)
|
|
||||||
|
|
||||||
fun Context.circularBitmapDrawable(url: String, iv: ImageView) =
|
|
||||||
Glide.with(this).load(url).asBitmap().centerCrop().into(object : BitmapImageViewTarget(iv) {
|
|
||||||
override fun setResource(resource: Bitmap) {
|
|
||||||
val circularBitmapDrawable = RoundedBitmapDrawableFactory.create(resources, resource)
|
|
||||||
circularBitmapDrawable.isCircular = true
|
|
||||||
iv.setImageDrawable(circularBitmapDrawable)
|
|
||||||
}
|
|
||||||
})
|
|
@ -0,0 +1,39 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.utils
|
||||||
|
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import java.security.cert.CertificateException
|
||||||
|
import java.security.cert.X509Certificate
|
||||||
|
import javax.net.ssl.SSLContext
|
||||||
|
import javax.net.ssl.TrustManager
|
||||||
|
import javax.net.ssl.X509TrustManager
|
||||||
|
|
||||||
|
fun getUnsafeHttpClient() =
|
||||||
|
try {
|
||||||
|
// Create a trust manager that does not validate certificate chains
|
||||||
|
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
|
||||||
|
override fun getAcceptedIssuers(): Array<X509Certificate> =
|
||||||
|
arrayOf()
|
||||||
|
|
||||||
|
@Throws(CertificateException::class)
|
||||||
|
override fun checkClientTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(CertificateException::class)
|
||||||
|
override fun checkServerTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) {
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
// Install the all-trusting trust manager
|
||||||
|
val sslContext = SSLContext.getInstance("SSL")
|
||||||
|
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
|
||||||
|
|
||||||
|
val sslSocketFactory = sslContext.socketFactory
|
||||||
|
|
||||||
|
OkHttpClient.Builder()
|
||||||
|
.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
|
||||||
|
.hostnameVerifier { _, _ -> true }
|
||||||
|
|
||||||
|
} catch (e: Exception) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.utils.glide
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory
|
||||||
|
import android.widget.ImageView
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.bumptech.glide.request.RequestOptions
|
||||||
|
import com.bumptech.glide.request.target.BitmapImageViewTarget
|
||||||
|
|
||||||
|
|
||||||
|
fun Context.bitmapCenterCrop(url: String, iv: ImageView) =
|
||||||
|
Glide.with(this).asBitmap().load(url).apply(RequestOptions.centerCropTransform()).into(iv)
|
||||||
|
|
||||||
|
fun Context.bitmapFitCenter(url: String, iv: ImageView) =
|
||||||
|
Glide.with(this).asBitmap().load(url).apply(RequestOptions.fitCenterTransform()).into(iv)
|
||||||
|
|
||||||
|
fun Context.circularBitmapDrawable(url: String, iv: ImageView) =
|
||||||
|
Glide.with(this)
|
||||||
|
.asBitmap()
|
||||||
|
.load(url)
|
||||||
|
.apply(RequestOptions.centerCropTransform()).
|
||||||
|
into(object : BitmapImageViewTarget(iv) {
|
||||||
|
override fun setResource(resource: Bitmap?) {
|
||||||
|
val circularBitmapDrawable = RoundedBitmapDrawableFactory.create(resources, resource)
|
||||||
|
circularBitmapDrawable.isCircular = true
|
||||||
|
iv.setImageDrawable(circularBitmapDrawable)
|
||||||
|
}
|
||||||
|
})
|
@ -0,0 +1,32 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.utils.glide
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.getUnsafeHttpClient
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.bumptech.glide.GlideBuilder
|
||||||
|
import com.bumptech.glide.Registry
|
||||||
|
import com.bumptech.glide.module.GlideModule
|
||||||
|
import com.bumptech.glide.load.model.GlideUrl
|
||||||
|
import java.io.InputStream
|
||||||
|
|
||||||
|
|
||||||
|
class SelfSignedGlideModule : GlideModule {
|
||||||
|
|
||||||
|
override fun applyOptions(context: Context?, builder: GlideBuilder?) {}
|
||||||
|
|
||||||
|
override fun registerComponents(context: Context?, glide: Glide?, registry: Registry?) {
|
||||||
|
|
||||||
|
if (context != null) {
|
||||||
|
val pref = context?.getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
|
if (pref.getBoolean("isSelfSignedCert", false)) {
|
||||||
|
val client = getUnsafeHttpClient().build()
|
||||||
|
|
||||||
|
registry?.append(GlideUrl::class.java, InputStream::class.java,
|
||||||
|
com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader.Factory(client))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
app/src/main/res/drawable/bg.png
Normal file
BIN
app/src/main/res/drawable/bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 406 B |
@ -143,4 +143,6 @@
|
|||||||
<string name="read_debug_title">Des articles lus marqués comme non lus ?</string>
|
<string name="read_debug_title">Des articles lus marqués comme non lus ?</string>
|
||||||
<string name="read_debug_on">Les appels API vont être logués lorsequ\'un article est marqué comme lu</string>
|
<string name="read_debug_on">Les appels API vont être logués lorsequ\'un article est marqué comme lu</string>
|
||||||
<string name="read_debug_off">Aucun log quand un article est marqué comme lu</string>
|
<string name="read_debug_off">Aucun log quand un article est marqué comme lu</string>
|
||||||
|
<string name="summary_debug_identifier">Identifiant de debug</string>
|
||||||
|
<string name="unique_id_to_clipboard">Texte copié</string>
|
||||||
</resources>
|
</resources>
|
@ -143,4 +143,6 @@
|
|||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
||||||
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">No log when marking an item as read</string>
|
||||||
|
<string name="summary_debug_identifier">Debug identifier</string>
|
||||||
|
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
||||||
</resources>
|
</resources>
|
@ -145,4 +145,6 @@
|
|||||||
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
<string name="read_debug_title">Read articles appearing as unread ?</string>
|
||||||
<string name="read_debug_off">No log when marking an item as read</string>
|
<string name="read_debug_off">No log when marking an item as read</string>
|
||||||
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
<string name="read_debug_on">Api calls will be logged when marking an article as read</string>
|
||||||
|
<string name="summary_debug_identifier">Debug identifier</string>
|
||||||
|
<string name="unique_id_to_clipboard">Identifier copied to your clipboard</string>
|
||||||
</resources>
|
</resources>
|
@ -13,6 +13,7 @@
|
|||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
<item name="android:colorBackground">@color/md_grey_50</item>
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarDark" parent="MaterialDrawerTheme">
|
<style name="NoBarDark" parent="MaterialDrawerTheme">
|
||||||
@ -25,12 +26,14 @@
|
|||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- ToolBar -->
|
<!-- ToolBar -->
|
||||||
<style name="ToolBarStyle" parent="Theme.AppCompat">
|
<style name="ToolBarStyle" parent="Theme.AppCompat">
|
||||||
<item name="android:textColorPrimary">@color/white</item>
|
<item name="android:textColorPrimary">@color/white</item>
|
||||||
<item name="android:textColorSecondary">@color/white</item>
|
<item name="android:textColorSecondary">@color/white</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
<item name="actionMenuTextColor">@color/white</item>
|
<item name="actionMenuTextColor">@color/white</item>
|
||||||
<!--<item name="actionOverflowButtonStyle">@style/ActionButtonOverflowStyle</item>
|
<!--<item name="actionOverflowButtonStyle">@style/ActionButtonOverflowStyle</item>
|
||||||
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>-->
|
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>-->
|
||||||
@ -46,6 +49,7 @@
|
|||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
<item name="android:colorBackground">@color/md_grey_50</item>
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarBlueAmberDark" parent="MaterialDrawerTheme">
|
<style name="NoBarBlueAmberDark" parent="MaterialDrawerTheme">
|
||||||
@ -58,6 +62,7 @@
|
|||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarGreyOrange" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarGreyOrange" parent="MaterialDrawerTheme.Light">
|
||||||
@ -69,6 +74,7 @@
|
|||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
<item name="android:colorBackground">@color/md_grey_50</item>
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarGreyOrangeDark" parent="MaterialDrawerTheme">
|
<style name="NoBarGreyOrangeDark" parent="MaterialDrawerTheme">
|
||||||
@ -81,6 +87,7 @@
|
|||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarIndigoPink" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarIndigoPink" parent="MaterialDrawerTheme.Light">
|
||||||
@ -92,6 +99,7 @@
|
|||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
<item name="android:colorBackground">@color/md_grey_50</item>
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarIndigoPinkDark" parent="MaterialDrawerTheme">
|
<style name="NoBarIndigoPinkDark" parent="MaterialDrawerTheme">
|
||||||
@ -104,6 +112,7 @@
|
|||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarRedTeal" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarRedTeal" parent="MaterialDrawerTheme.Light">
|
||||||
@ -115,6 +124,7 @@
|
|||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
<item name="android:colorBackground">@color/md_grey_50</item>
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarRedTealDark" parent="MaterialDrawerTheme">
|
<style name="NoBarRedTealDark" parent="MaterialDrawerTheme">
|
||||||
@ -127,6 +137,7 @@
|
|||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarCyanPink" parent="MaterialDrawerTheme.Light">
|
<style name="NoBarCyanPink" parent="MaterialDrawerTheme.Light">
|
||||||
@ -138,6 +149,7 @@
|
|||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
<item name="android:colorBackground">@color/md_grey_50</item>
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarCyanPinkDark" parent="MaterialDrawerTheme">
|
<style name="NoBarCyanPinkDark" parent="MaterialDrawerTheme">
|
||||||
@ -150,6 +162,7 @@
|
|||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
@ -162,6 +175,7 @@
|
|||||||
<item name="android:colorBackground">@color/md_grey_50</item>
|
<item name="android:colorBackground">@color/md_grey_50</item>
|
||||||
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
<item name="android:textColorPrimary">@color/md_grey_900</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
<item name="android:textColorSecondary">@color/md_grey_400</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="NoBarTealOrangeDark" parent="MaterialDrawerTheme">
|
<style name="NoBarTealOrangeDark" parent="MaterialDrawerTheme">
|
||||||
@ -174,6 +188,7 @@
|
|||||||
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
<item name="bnbBackgroundColor">@color/md_grey_900</item>
|
||||||
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
<item name="android:textColorPrimary">@color/md_white_1000</item>
|
||||||
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
<item name="android:textColorSecondary">@color/md_grey_600</item>
|
||||||
|
<item name="material_drawer_header_selection_text">@color/md_grey_900</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -15,4 +15,9 @@
|
|||||||
android:summaryOff="@string/read_debug_off"
|
android:summaryOff="@string/read_debug_off"
|
||||||
android:summaryOn="@string/read_debug_on"
|
android:summaryOn="@string/read_debug_on"
|
||||||
android:title="@string/read_debug_title" />
|
android:title="@string/read_debug_title" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:enabled="true"
|
||||||
|
android:key="debug_identifier"
|
||||||
|
android:summary="@string/summary_debug_identifier" />
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
@ -1,13 +1,13 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.1.3-2'
|
ext.kotlin_version = '1.1.4-3'
|
||||||
repositories {
|
repositories {
|
||||||
maven { url 'https://maven.google.com' }
|
|
||||||
jcenter()
|
jcenter()
|
||||||
|
google()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.0.0-beta2'
|
classpath 'com.android.tools.build:gradle:3.0.0-beta4'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
#Wed Aug 16 19:45:22 CEST 2017
|
#Sat Sep 02 11:43:17 CEST 2017
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-rc-1-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
|
||||||
|
Reference in New Issue
Block a user