Compare commits

..

12 Commits

Author SHA1 Message Date
1f67f2fdee Fixes #121. 2017-11-21 19:05:14 +01:00
ebf4d294a8 Fixing infinite scroll trying to load more items when there are no more. 2017-11-20 21:08:13 +01:00
4a4dbacc95 Changelog. 2017-11-18 15:19:57 +01:00
687839b5f8 Infinite scroll should be working as expected. Fixes #116. 2017-11-18 15:09:44 +01:00
8fb339034f Fixed #117. 2017-11-16 19:37:19 +01:00
8e9fd9c985 Changelog. 2017-11-14 19:38:18 +01:00
72400f71c0 Changed color of links in the article viewer. 2017-11-14 19:36:23 +01:00
1151587951 Merge branch 'master' of github.com:aminecmi/ReaderforSelfoss 2017-11-14 19:23:12 +01:00
abcd500045 Fixed #114. 2017-11-14 19:22:43 +01:00
beda24e736 New Crowdin translations (#112)
* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Portuguese, Brazilian)
2017-11-14 11:15:47 +01:00
37b2c5c2df Fixed toolbar and fab behavior #113. 2017-11-13 19:35:14 +01:00
7b5246ebf1 Update. 2017-11-13 18:58:57 +01:00
7 changed files with 97 additions and 53 deletions

View File

@ -1,3 +1,25 @@
**1.5.4.15**
- Fixed an issue with the sources list.
**1.5.4.14**
- Fixing infinite scroll trying to load more items when there are no more.
**1.5.4.13**
- Displaying the right number of items.
- Fixing infinite scroll remaining issues. Should be stable enough.
**1.5.4.12**
- Fixed fab and toolbar issue (#113)
- Fixed links clickable (#114)
- Changed the link colors in the article viewer
**1.5.4.11** **1.5.4.11**
- Hiding FABs on scroll. - Hiding FABs on scroll.

View File

@ -71,7 +71,6 @@ import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
import kotlinx.android.synthetic.main.activity_home.* import kotlinx.android.synthetic.main.activity_home.*
class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener { class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
private val MENU_PREFERENCES = 12302 private val MENU_PREFERENCES = 12302
@ -117,6 +116,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
private var recyclerViewScrollListener: RecyclerView.OnScrollListener? = null private var recyclerViewScrollListener: RecyclerView.OnScrollListener? = null
private lateinit var settings: SharedPreferences private lateinit var settings: SharedPreferences
private var badgeNew: Int = -1
private var badgeAll: Int = -1
private var badgeFavs: Int = -1
@ -190,8 +193,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
is ItemListAdapter -> adapter.removeItemAtIndex(position) is ItemListAdapter -> adapter.removeItemAtIndex(position)
} }
if (items.size > 0) if (items.size > 0) {
tabNewBadge.setText("${items.size}").maybeShow() badgeNew--
reloadBadgeContent()
}
else else
tabNewBadge.hide() tabNewBadge.hide()
@ -203,8 +208,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
else -> 0 else -> 0
} }
if (lastVisibleItem == (items.size - 1)) { if (lastVisibleItem === items.size && items.size <= maxItemNumber() && maxItemNumber() >= itemsNumber) {
getElementsAccordingToTab(appendResults = true) getElementsAccordingToTab(appendResults = true, offsetOverride = lastVisibleItem)
} }
} catch (e: IndexOutOfBoundsException) { } catch (e: IndexOutOfBoundsException) {
@ -628,7 +633,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
else -> 0 else -> 0
} }
if (lastVisibleItem == (items.size - 1)) { if (lastVisibleItem == (items.size - 1) && items.size < maxItemNumber()) {
getElementsAccordingToTab(appendResults = true) getElementsAccordingToTab(appendResults = true)
} }
} }
@ -639,7 +644,7 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
recyclerView.addOnScrollListener(recyclerViewScrollListener) recyclerView.addOnScrollListener(recyclerViewScrollListener)
} }
fun mayBeEmpty() = private fun mayBeEmpty() =
if (items.isEmpty()) { if (items.isEmpty()) {
emptyText.visibility = View.VISIBLE emptyText.visibility = View.VISIBLE
recyclerView.visibility = View.GONE recyclerView.visibility = View.GONE
@ -648,13 +653,21 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
recyclerView.visibility = View.VISIBLE recyclerView.visibility = View.VISIBLE
} }
private fun getElementsAccordingToTab(appendResults: Boolean = false) = private fun getElementsAccordingToTab(appendResults: Boolean = false, offsetOverride: Int? = null) {
when (elementsShown) { offset = if (appendResults && offsetOverride === null) {
UNREAD_SHOWN -> getUnRead(appendResults) (offset + itemsNumber)
READ_SHOWN -> getRead(appendResults) } else {
FAV_SHOWN -> getStarred(appendResults) offsetOverride ?: 0
else -> getUnRead(appendResults) }
} firstVisible = if (appendResults) firstVisible else 0
when (elementsShown) {
UNREAD_SHOWN -> getUnRead(appendResults)
READ_SHOWN -> getRead(appendResults)
FAV_SHOWN -> getStarred(appendResults)
else -> getUnRead(appendResults)
}
}
private fun doCallTo(appendResults: Boolean, toastMessage: Int, call: (String?, Long?, String?) -> Call<List<Item>>) { private fun doCallTo(appendResults: Boolean, toastMessage: Int, call: (String?, Long?, String?) -> Call<List<Item>>) {
fun handleItemsResponse(response: Response<List<Item>>) { fun handleItemsResponse(response: Response<List<Item>>) {
@ -694,25 +707,16 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
} }
private fun getUnRead(appendResults: Boolean = false) { private fun getUnRead(appendResults: Boolean = false) {
offset = if (appendResults) (offset + itemsNumber)
else 0
firstVisible = if (appendResults) firstVisible else 0
elementsShown = UNREAD_SHOWN elementsShown = UNREAD_SHOWN
doCallTo(appendResults, R.string.cant_get_new_elements){t, id, f -> api.newItems(t, id, f, itemsNumber, offset)} doCallTo(appendResults, R.string.cant_get_new_elements){t, id, f -> api.newItems(t, id, f, itemsNumber, offset)}
} }
private fun getRead(appendResults: Boolean = false) { private fun getRead(appendResults: Boolean = false) {
offset = if (appendResults) (offset + itemsNumber)
else 0
firstVisible = if (appendResults) firstVisible else 0
elementsShown = READ_SHOWN elementsShown = READ_SHOWN
doCallTo(appendResults, R.string.cant_get_read){t, id, f -> api.readItems(t, id, f, itemsNumber, offset)} doCallTo(appendResults, R.string.cant_get_read){t, id, f -> api.readItems(t, id, f, itemsNumber, offset)}
} }
private fun getStarred(appendResults: Boolean = false) { private fun getStarred(appendResults: Boolean = false) {
offset = if (appendResults) (offset + itemsNumber)
else 0
firstVisible = if (appendResults) firstVisible else 0
elementsShown = FAV_SHOWN elementsShown = FAV_SHOWN
doCallTo(appendResults, R.string.cant_get_favs){t, id, f -> api.starredItems(t, id, f, itemsNumber, offset)} doCallTo(appendResults, R.string.cant_get_favs){t, id, f -> api.starredItems(t, id, f, itemsNumber, offset)}
} }
@ -771,26 +775,38 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
api.stats.enqueue(object : Callback<Stats> { api.stats.enqueue(object : Callback<Stats> {
override fun onResponse(call: Call<Stats>, response: Response<Stats>) { override fun onResponse(call: Call<Stats>, response: Response<Stats>) {
if (response.body() != null) { if (response.body() != null) {
if (displayUnreadCount)
tabNewBadge badgeNew = response.body()!!.unread
.setText(response.body()!!.unread.toString()) badgeAll = response.body()!!.total
.maybeShow() badgeFavs = response.body()!!.starred
if (displayAllCount) { reloadBadgeContent()
tabArchiveBadge
.setText(response.body()!!.total.toString())
.maybeShow()
tabStarredBadge
.setText(response.body()!!.starred.toString())
.maybeShow()
} else {
tabArchiveBadge.removeBadge()
tabStarredBadge.removeBadge()
}
} }
} }
override fun onFailure(call: Call<Stats>, t: Throwable) {} override fun onFailure(call: Call<Stats>, t: Throwable) {}
}) })
} else {
reloadBadgeContent(succeeded = false)
}
}
private fun reloadBadgeContent(succeeded: Boolean = true) {
if (succeeded) {
if (displayUnreadCount)
tabNewBadge
.setText(badgeNew.toString())
.maybeShow()
if (displayAllCount) {
tabArchiveBadge
.setText(badgeAll.toString())
.maybeShow()
tabStarredBadge
.setText(badgeFavs.toString())
.maybeShow()
} else {
tabArchiveBadge.removeBadge()
tabStarredBadge.removeBadge()
}
} else { } else {
tabNewBadge.removeBadge() tabNewBadge.removeBadge()
tabArchiveBadge.removeBadge() tabArchiveBadge.removeBadge()
@ -919,4 +935,12 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
else -> return super.onOptionsItemSelected(item) else -> return super.onOptionsItemSelected(item)
} }
} }
private fun maxItemNumber(): Int =
when (elementsShown) {
UNREAD_SHOWN -> badgeNew
READ_SHOWN -> badgeAll
FAV_SHOWN -> badgeFavs
else -> badgeNew // if !elementsShown then unread are fetched.
}
} }

View File

@ -8,6 +8,7 @@ import android.support.design.widget.FloatingActionButton
import android.support.v4.widget.NestedScrollView import android.support.v4.widget.NestedScrollView
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.text.Html import android.text.Html
import android.text.method.LinkMovementMethod
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
@ -114,9 +115,11 @@ class ReaderActivity : AppCompatActivity() {
if (scrollY > oldScrollY) { if (scrollY > oldScrollY) {
fab.hide() fab.hide()
} else { } else {
fab.show() if (mFloatingToolbar.isShowing) mFloatingToolbar.hide() else fab.show()
} }
}) })
content.movementMethod = LinkMovementMethod.getInstance()
} }
private fun getContentFromMercury(customTabsIntent: CustomTabsIntent, prefs: SharedPreferences) { private fun getContentFromMercury(customTabsIntent: CustomTabsIntent, prefs: SharedPreferences) {

View File

@ -46,21 +46,17 @@ class SourcesListAdapter(private val app: Activity,
.builder() .builder()
.round() .round()
.build(itm.title.toTextDrawableString(), color) .build(itm.title.toTextDrawableString(), color)
holder.itemImage.setImageDrawable(drawable) holder.mView.itemImage.setImageDrawable(drawable)
} else { } else {
c.circularBitmapDrawable(itm.getIcon(c), holder.itemImage) c.circularBitmapDrawable(itm.getIcon(c), holder.mView.itemImage)
} }
holder.sourceTitle.text = itm.title holder.mView.sourceTitle.text = itm.title
} }
override fun getItemCount(): Int { override fun getItemCount(): Int = items.size
return items.size
}
inner class ViewHolder(internal val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) { inner class ViewHolder(internal val mView: ConstraintLayout) : RecyclerView.ViewHolder(mView) {
lateinit var itemImage: ImageView
lateinit var sourceTitle: TextView
init { init {
handleClickListeners() handleClickListeners()

View File

@ -58,7 +58,6 @@
<TextView <TextView
android:id="@+id/content" android:id="@+id/content"
android:autoLink="web"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
@ -70,7 +69,8 @@
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/titleView" /> app:layout_constraintTop_toBottomOf="@+id/titleView"
android:textColorLink="?attr/colorAccent"/>
<!--<org.sufficientlysecure.htmltextview.HtmlTextView <!--<org.sufficientlysecure.htmltextview.HtmlTextView
android:id="@+id/content" android:id="@+id/content"

View File

@ -35,7 +35,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end|bottom|right" android:layout_gravity="end|bottom|right"
android:src="@drawable/ic_add" android:src="@drawable/ic_add"
android:tint="?android:textColorPrimary"
android:paddingBottom="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.1.51' ext.kotlin_version = '1.1.60'
repositories { repositories {
jcenter() jcenter()
google() google()
@ -10,12 +10,12 @@ buildscript {
} }
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.0.0' classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
classpath 'com.google.gms:google-services:3.1.0' classpath 'com.google.gms:google-services:3.1.1'
// Not the official version https://stackoverflow.com/questions/46525040/sonarqube-android-not-working-for-gradle-3-0-0/46813528#46813528 // Not the official version https://stackoverflow.com/questions/46525040/sonarqube-android-not-working-for-gradle-3-0-0/46813528#46813528
classpath "com.github.Shusshu:sonar-scanner-gradle:feature~support-android-gradle-3-SNAPSHOT" classpath "com.github.Shusshu:sonar-scanner-gradle:feature~support-android-gradle-3-SNAPSHOT"