Simple view pager. Closes #50.
This commit is contained in:
parent
4818a101cc
commit
1bf8a578bc
@ -122,7 +122,7 @@ dependencies {
|
|||||||
compile 'com.google.firebase:firebase-core:11.4.2'
|
compile 'com.google.firebase:firebase-core:11.4.2'
|
||||||
compile 'com.google.firebase:firebase-config:11.4.2'
|
compile 'com.google.firebase:firebase-config:11.4.2'
|
||||||
compile 'com.google.firebase:firebase-invites:11.4.2'
|
compile 'com.google.firebase:firebase-invites:11.4.2'
|
||||||
compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
|
compile('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {
|
||||||
transitive = true;
|
transitive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,6 +170,9 @@ dependencies {
|
|||||||
compile 'com.heinrichreimersoftware:android-issue-reporter:1.3.1'
|
compile 'com.heinrichreimersoftware:android-issue-reporter:1.3.1'
|
||||||
|
|
||||||
compile 'com.github.rubensousa:floatingtoolbar:1.5.1'
|
compile 'com.github.rubensousa:floatingtoolbar:1.5.1'
|
||||||
|
|
||||||
|
// Pager
|
||||||
|
compile 'me.relex:circleindicator:1.2.2@aar'
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
|
@ -1,209 +1,39 @@
|
|||||||
package apps.amine.bou.readerforselfoss
|
package apps.amine.bou.readerforselfoss
|
||||||
|
|
||||||
import android.content.SharedPreferences
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.preference.PreferenceManager
|
import android.support.v4.app.FragmentManager
|
||||||
import android.support.customtabs.CustomTabsIntent
|
import android.support.v4.app.FragmentStatePagerAdapter
|
||||||
import android.support.design.widget.FloatingActionButton
|
|
||||||
import android.support.v4.widget.NestedScrollView
|
|
||||||
import android.support.v7.app.AppCompatActivity
|
import android.support.v7.app.AppCompatActivity
|
||||||
import android.text.Html
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
import android.text.method.LinkMovementMethod
|
import apps.amine.bou.readerforselfoss.fragments.ArticleFragment
|
||||||
import android.view.MenuItem
|
|
||||||
import android.view.View
|
|
||||||
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
|
||||||
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
|
||||||
import apps.amine.bou.readerforselfoss.utils.shareLink
|
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import com.bumptech.glide.request.RequestOptions
|
|
||||||
import com.crashlytics.android.Crashlytics
|
|
||||||
import com.ftinc.scoop.Scoop
|
|
||||||
import com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
|
||||||
import kotlinx.android.synthetic.main.activity_reader.*
|
import kotlinx.android.synthetic.main.activity_reader.*
|
||||||
import org.sufficientlysecure.htmltextview.HtmlHttpImageGetter
|
import me.relex.circleindicator.CircleIndicator
|
||||||
import retrofit2.Call
|
|
||||||
import retrofit2.Callback
|
|
||||||
import retrofit2.Response
|
|
||||||
|
|
||||||
class ReaderActivity : AppCompatActivity() {
|
class ReaderActivity : AppCompatActivity() {
|
||||||
private lateinit var mCustomTabActivityHelper: CustomTabActivityHelper
|
|
||||||
//private lateinit var content: HtmlTextView
|
|
||||||
private lateinit var url: String
|
|
||||||
private lateinit var contentText: String
|
|
||||||
private lateinit var contentSource: String
|
|
||||||
private lateinit var contentImage: String
|
|
||||||
private lateinit var contentTitle: String
|
|
||||||
private lateinit var fab: FloatingActionButton
|
|
||||||
|
|
||||||
override fun onStop() {
|
private lateinit var allItems: ArrayList<Item>
|
||||||
super.onStop()
|
|
||||||
mCustomTabActivityHelper.unbindCustomTabsService(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
Scoop.getInstance().apply(this)
|
|
||||||
setContentView(R.layout.activity_reader)
|
setContentView(R.layout.activity_reader)
|
||||||
|
|
||||||
url = intent.getStringExtra("url")
|
allItems = intent.getParcelableArrayListExtra<Item>("allItems")
|
||||||
contentText = intent.getStringExtra("content")
|
val currentItem = intent.getIntExtra("currentItem", 0)
|
||||||
contentTitle = intent.getStringExtra("title")
|
|
||||||
contentImage = intent.getStringExtra("image")
|
|
||||||
contentSource = intent.getStringExtra("source")
|
|
||||||
|
|
||||||
fab = findViewById(R.id.fab)
|
var adapter = ScreenSlidePagerAdapter(supportFragmentManager)
|
||||||
val mFloatingToolbar: FloatingToolbar = findViewById(R.id.floatingToolbar)
|
pager.adapter = adapter
|
||||||
mFloatingToolbar.attachFab(fab)
|
pager.currentItem = currentItem
|
||||||
|
|
||||||
val customTabsIntent = this@ReaderActivity.buildCustomTabsIntent()
|
(indicator as CircleIndicator).setViewPager(pager)
|
||||||
mCustomTabActivityHelper = CustomTabActivityHelper()
|
}
|
||||||
mCustomTabActivityHelper.bindCustomTabsService(this)
|
|
||||||
|
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
|
||||||
|
override fun getCount(): Int {
|
||||||
mFloatingToolbar.setClickListener(object : FloatingToolbar.ItemClickListener {
|
return allItems.size
|
||||||
override fun onItemClick(item: MenuItem) {
|
|
||||||
when (item.itemId) {
|
|
||||||
R.id.more_action -> getContentFromMercury(customTabsIntent, prefs)
|
|
||||||
R.id.share_action -> this@ReaderActivity.shareLink(url)
|
|
||||||
R.id.open_action -> this@ReaderActivity.openItemUrl(
|
|
||||||
url,
|
|
||||||
contentText,
|
|
||||||
contentImage,
|
|
||||||
contentTitle,
|
|
||||||
contentSource,
|
|
||||||
customTabsIntent,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
this@ReaderActivity
|
|
||||||
)
|
|
||||||
else -> Unit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onItemLongClick(item: MenuItem?) {
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
if (contentText.isEmptyOrNullOrNullString()) {
|
|
||||||
getContentFromMercury(customTabsIntent, prefs)
|
|
||||||
} else {
|
|
||||||
source.text = contentSource
|
|
||||||
titleView.text = contentTitle
|
|
||||||
tryToHandleHtml(contentText, customTabsIntent, prefs)
|
|
||||||
|
|
||||||
if (!contentImage.isEmptyOrNullOrNullString()) {
|
|
||||||
imageView.visibility = View.VISIBLE
|
|
||||||
Glide
|
|
||||||
.with(baseContext)
|
|
||||||
.asBitmap()
|
|
||||||
.load(contentImage)
|
|
||||||
.apply(RequestOptions.fitCenterTransform())
|
|
||||||
.into(imageView)
|
|
||||||
} else {
|
|
||||||
imageView.visibility = View.GONE
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nestedScrollView.setOnScrollChangeListener(
|
override fun getItem(position: Int): ArticleFragment {
|
||||||
NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
|
return ArticleFragment.newInstance(position, allItems)
|
||||||
if (scrollY > oldScrollY) {
|
|
||||||
fab.hide()
|
|
||||||
} else {
|
|
||||||
if (mFloatingToolbar.isShowing) mFloatingToolbar.hide() else fab.show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
content.movementMethod = LinkMovementMethod.getInstance()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getContentFromMercury(
|
|
||||||
customTabsIntent: CustomTabsIntent,
|
|
||||||
prefs: SharedPreferences
|
|
||||||
) {
|
|
||||||
progressBar.visibility = View.VISIBLE
|
|
||||||
val parser = MercuryApi(
|
|
||||||
BuildConfig.MERCURY_KEY,
|
|
||||||
prefs.getBoolean("should_log_everything", false)
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.parseUrl(url).enqueue(object : Callback<ParsedContent> {
|
|
||||||
override fun onResponse(
|
|
||||||
call: Call<ParsedContent>,
|
|
||||||
response: Response<ParsedContent>
|
|
||||||
) {
|
|
||||||
if (response.body() != null && response.body()!!.content != null && response.body()!!.content.isNotEmpty()) {
|
|
||||||
source.text = response.body()!!.domain
|
|
||||||
titleView.text = response.body()!!.title
|
|
||||||
this@ReaderActivity.url = response.body()!!.url
|
|
||||||
|
|
||||||
if (response.body()!!.content != null && !response.body()!!.content.isEmpty()) {
|
|
||||||
tryToHandleHtml(response.body()!!.content, customTabsIntent, prefs)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty()) {
|
|
||||||
imageView.visibility = View.VISIBLE
|
|
||||||
Glide
|
|
||||||
.with(baseContext)
|
|
||||||
.asBitmap()
|
|
||||||
.load(response.body()!!.lead_image_url)
|
|
||||||
.apply(RequestOptions.fitCenterTransform())
|
|
||||||
.into(imageView)
|
|
||||||
} else {
|
|
||||||
imageView.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
nestedScrollView.scrollTo(0, 0)
|
|
||||||
|
|
||||||
progressBar.visibility = View.GONE
|
|
||||||
} else {
|
|
||||||
openInBrowserAfterFailing(customTabsIntent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(
|
|
||||||
call: Call<ParsedContent>,
|
|
||||||
t: Throwable
|
|
||||||
) = openInBrowserAfterFailing(customTabsIntent)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun tryToHandleHtml(
|
|
||||||
c: String,
|
|
||||||
customTabsIntent: CustomTabsIntent,
|
|
||||||
prefs: SharedPreferences
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
content.text = Html.fromHtml(c, HtmlHttpImageGetter(content, null, true), null)
|
|
||||||
|
|
||||||
//content.setHtml(response.body()!!.content, HtmlHttpImageGetter(content, null, true))
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
|
||||||
Crashlytics.log(100, "CANT_TRANSFORM_TO_HTML", e.message)
|
|
||||||
Crashlytics.logException(e)
|
|
||||||
openInBrowserAfterFailing(customTabsIntent)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openInBrowserAfterFailing(customTabsIntent: CustomTabsIntent) {
|
|
||||||
progressBar.visibility = View.GONE
|
|
||||||
this@ReaderActivity.openItemUrl(
|
|
||||||
url,
|
|
||||||
contentText,
|
|
||||||
contentImage,
|
|
||||||
contentTitle,
|
|
||||||
contentSource,
|
|
||||||
customTabsIntent,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
this@ReaderActivity
|
|
||||||
)
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -255,11 +255,9 @@ class ItemCardAdapter(
|
|||||||
|
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(
|
c.openItemUrl(
|
||||||
|
items,
|
||||||
|
adapterPosition,
|
||||||
items[adapterPosition].getLinkDecoded(),
|
items[adapterPosition].getLinkDecoded(),
|
||||||
items[adapterPosition].content,
|
|
||||||
items[adapterPosition].getThumbnail(c),
|
|
||||||
items[adapterPosition].title,
|
|
||||||
items[adapterPosition].sourceAndDateText(),
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
|
@ -273,11 +273,9 @@ class ItemListAdapter(
|
|||||||
if (!clickBehavior) {
|
if (!clickBehavior) {
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(
|
c.openItemUrl(
|
||||||
|
items,
|
||||||
|
adapterPosition,
|
||||||
items[adapterPosition].getLinkDecoded(),
|
items[adapterPosition].getLinkDecoded(),
|
||||||
items[adapterPosition].content,
|
|
||||||
items[adapterPosition].getThumbnail(c),
|
|
||||||
items[adapterPosition].title,
|
|
||||||
items[adapterPosition].sourceAndDateText(),
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
@ -292,11 +290,9 @@ class ItemListAdapter(
|
|||||||
mView.setOnClickListener { actionBarShowHide() }
|
mView.setOnClickListener { actionBarShowHide() }
|
||||||
mView.setOnLongClickListener {
|
mView.setOnLongClickListener {
|
||||||
c.openItemUrl(
|
c.openItemUrl(
|
||||||
|
items,
|
||||||
|
adapterPosition,
|
||||||
items[adapterPosition].getLinkDecoded(),
|
items[adapterPosition].getLinkDecoded(),
|
||||||
items[adapterPosition].content,
|
|
||||||
items[adapterPosition].getThumbnail(c),
|
|
||||||
items[adapterPosition].title,
|
|
||||||
items[adapterPosition].sourceAndDateText(),
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
|
@ -0,0 +1,241 @@
|
|||||||
|
package apps.amine.bou.readerforselfoss.fragments
|
||||||
|
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
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.widget.NestedScrollView
|
||||||
|
import android.text.Html
|
||||||
|
import android.text.method.LinkMovementMethod
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.MenuItem
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import apps.amine.bou.readerforselfoss.BuildConfig
|
||||||
|
import apps.amine.bou.readerforselfoss.R
|
||||||
|
import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
||||||
|
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
||||||
|
import apps.amine.bou.readerforselfoss.api.selfoss.Item
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.isEmptyOrNullOrNullString
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.shareLink
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.sourceAndDateText
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.bumptech.glide.request.RequestOptions
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
|
import com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
||||||
|
import org.sufficientlysecure.htmltextview.HtmlHttpImageGetter
|
||||||
|
import retrofit2.Call
|
||||||
|
import retrofit2.Callback
|
||||||
|
import retrofit2.Response
|
||||||
|
|
||||||
|
|
||||||
|
import kotlinx.android.synthetic.main.fragment_article.view.*
|
||||||
|
|
||||||
|
class ArticleFragment : Fragment() {
|
||||||
|
private lateinit var pageNumber: Number
|
||||||
|
private lateinit var allItems: ArrayList<Item>
|
||||||
|
private lateinit var mCustomTabActivityHelper: CustomTabActivityHelper
|
||||||
|
//private lateinit var content: HtmlTextView
|
||||||
|
private lateinit var url: String
|
||||||
|
private lateinit var contentText: String
|
||||||
|
private lateinit var contentSource: String
|
||||||
|
private lateinit var contentImage: String
|
||||||
|
private lateinit var contentTitle: String
|
||||||
|
private lateinit var fab: FloatingActionButton
|
||||||
|
|
||||||
|
override fun onStop() {
|
||||||
|
super.onStop()
|
||||||
|
mCustomTabActivityHelper.unbindCustomTabsService(activity)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
pageNumber = arguments!!.getInt(ARG_POSITION)
|
||||||
|
allItems = arguments!!.getParcelableArrayList(ARG_ITEMS)
|
||||||
|
}
|
||||||
|
|
||||||
|
private lateinit var rootView: ViewGroup
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View? {
|
||||||
|
rootView = inflater
|
||||||
|
.inflate(R.layout.fragment_article, container, false) as ViewGroup
|
||||||
|
|
||||||
|
url = allItems[pageNumber.toInt()].getLinkDecoded()
|
||||||
|
contentText = allItems[pageNumber.toInt()].content
|
||||||
|
contentTitle = allItems[pageNumber.toInt()].title
|
||||||
|
contentImage = allItems[pageNumber.toInt()].getThumbnail(activity!!)
|
||||||
|
contentSource = allItems[pageNumber.toInt()].sourceAndDateText()
|
||||||
|
|
||||||
|
fab = rootView.fab
|
||||||
|
val mFloatingToolbar: FloatingToolbar = rootView.floatingToolbar
|
||||||
|
mFloatingToolbar.attachFab(fab)
|
||||||
|
|
||||||
|
val customTabsIntent = activity!!.buildCustomTabsIntent()
|
||||||
|
mCustomTabActivityHelper = CustomTabActivityHelper()
|
||||||
|
mCustomTabActivityHelper.bindCustomTabsService(activity)
|
||||||
|
|
||||||
|
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
|
||||||
|
|
||||||
|
mFloatingToolbar.setClickListener(object : FloatingToolbar.ItemClickListener {
|
||||||
|
override fun onItemClick(item: MenuItem) {
|
||||||
|
when (item.itemId) {
|
||||||
|
R.id.more_action -> getContentFromMercury(customTabsIntent, prefs)
|
||||||
|
R.id.share_action -> activity!!.shareLink(url)
|
||||||
|
R.id.open_action -> activity!!.openItemUrl(
|
||||||
|
allItems,
|
||||||
|
pageNumber.toInt(),
|
||||||
|
url,
|
||||||
|
customTabsIntent,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
activity!!
|
||||||
|
)
|
||||||
|
else -> Unit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onItemLongClick(item: MenuItem?) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
if (contentText.isEmptyOrNullOrNullString()) {
|
||||||
|
getContentFromMercury(customTabsIntent, prefs)
|
||||||
|
} else {
|
||||||
|
rootView.source.text = contentSource
|
||||||
|
rootView.titleView.text = contentTitle
|
||||||
|
tryToHandleHtml(contentText, customTabsIntent, prefs)
|
||||||
|
|
||||||
|
if (!contentImage.isEmptyOrNullOrNullString()) {
|
||||||
|
rootView.imageView.visibility = View.VISIBLE
|
||||||
|
Glide
|
||||||
|
.with(activity!!.baseContext)
|
||||||
|
.asBitmap()
|
||||||
|
.load(contentImage)
|
||||||
|
.apply(RequestOptions.fitCenterTransform())
|
||||||
|
.into(rootView.imageView)
|
||||||
|
} else {
|
||||||
|
rootView.imageView.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootView.nestedScrollView.setOnScrollChangeListener(
|
||||||
|
NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
|
||||||
|
if (scrollY > oldScrollY) {
|
||||||
|
fab.hide()
|
||||||
|
} else {
|
||||||
|
if (mFloatingToolbar.isShowing) mFloatingToolbar.hide() else fab.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
rootView.content.movementMethod = LinkMovementMethod.getInstance()
|
||||||
|
|
||||||
|
return rootView
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getContentFromMercury(
|
||||||
|
customTabsIntent: CustomTabsIntent,
|
||||||
|
prefs: SharedPreferences
|
||||||
|
) {
|
||||||
|
rootView.progressBar.visibility = View.VISIBLE
|
||||||
|
val parser = MercuryApi(
|
||||||
|
BuildConfig.MERCURY_KEY,
|
||||||
|
prefs.getBoolean("should_log_everything", false)
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.parseUrl(url).enqueue(object : Callback<ParsedContent> {
|
||||||
|
override fun onResponse(
|
||||||
|
call: Call<ParsedContent>,
|
||||||
|
response: Response<ParsedContent>
|
||||||
|
) {
|
||||||
|
if (response.body() != null && response.body()!!.content != null && response.body()!!.content.isNotEmpty()) {
|
||||||
|
rootView.source.text = response.body()!!.domain
|
||||||
|
rootView.titleView.text = response.body()!!.title
|
||||||
|
url = response.body()!!.url
|
||||||
|
|
||||||
|
if (response.body()!!.content != null && !response.body()!!.content.isEmpty()) {
|
||||||
|
tryToHandleHtml(response.body()!!.content, customTabsIntent, prefs)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty()) {
|
||||||
|
rootView.imageView.visibility = View.VISIBLE
|
||||||
|
Glide
|
||||||
|
.with(activity!!.baseContext)
|
||||||
|
.asBitmap()
|
||||||
|
.load(response.body()!!.lead_image_url)
|
||||||
|
.apply(RequestOptions.fitCenterTransform())
|
||||||
|
.into(rootView.imageView)
|
||||||
|
} else {
|
||||||
|
rootView.imageView.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
rootView.nestedScrollView.scrollTo(0, 0)
|
||||||
|
|
||||||
|
rootView.progressBar.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
openInBrowserAfterFailing(customTabsIntent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(
|
||||||
|
call: Call<ParsedContent>,
|
||||||
|
t: Throwable
|
||||||
|
) = openInBrowserAfterFailing(customTabsIntent)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun tryToHandleHtml(
|
||||||
|
c: String,
|
||||||
|
customTabsIntent: CustomTabsIntent,
|
||||||
|
prefs: SharedPreferences
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
rootView.content.text = Html.fromHtml(c, HtmlHttpImageGetter(rootView.content, null, true), null)
|
||||||
|
|
||||||
|
//content.setHtml(response.body()!!.content, HtmlHttpImageGetter(content, null, true))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Crashlytics.setUserIdentifier(prefs.getString("unique_id", ""))
|
||||||
|
Crashlytics.log(100, "CANT_TRANSFORM_TO_HTML", e.message)
|
||||||
|
Crashlytics.logException(e)
|
||||||
|
openInBrowserAfterFailing(customTabsIntent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openInBrowserAfterFailing(customTabsIntent: CustomTabsIntent) {
|
||||||
|
rootView.progressBar.visibility = View.GONE
|
||||||
|
activity!!.openItemUrl(
|
||||||
|
allItems,
|
||||||
|
pageNumber.toInt(),
|
||||||
|
url,
|
||||||
|
customTabsIntent,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
activity!!
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val ARG_POSITION = "position"
|
||||||
|
private val ARG_ITEMS = "items"
|
||||||
|
|
||||||
|
fun newInstance(position: Int, allItems: ArrayList<Item>): ArticleFragment {
|
||||||
|
val fragment = ArticleFragment()
|
||||||
|
val args = Bundle()
|
||||||
|
args.putInt(ARG_POSITION, position)
|
||||||
|
args.putParcelableArrayList(ARG_ITEMS, allItems)
|
||||||
|
fragment.arguments = args
|
||||||
|
return fragment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -59,30 +59,17 @@ fun Context.buildCustomTabsIntent(): CustomTabsIntent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Context.openItemUrlInternally(
|
fun Context.openItemUrlInternally(
|
||||||
|
allItems: ArrayList<Item>,
|
||||||
|
currentItem: Int,
|
||||||
linkDecoded: String,
|
linkDecoded: String,
|
||||||
content: String,
|
|
||||||
image: String,
|
|
||||||
title: String,
|
|
||||||
source: String,
|
|
||||||
customTabsIntent: CustomTabsIntent,
|
customTabsIntent: CustomTabsIntent,
|
||||||
articleViewer: Boolean,
|
articleViewer: Boolean,
|
||||||
app: Activity
|
app: Activity
|
||||||
) {
|
) {
|
||||||
if (articleViewer) {
|
if (articleViewer) {
|
||||||
val intent = Intent(this, ReaderActivity::class.java)
|
val intent = Intent(this, ReaderActivity::class.java)
|
||||||
|
intent.putParcelableArrayListExtra("allItems", allItems)
|
||||||
/*DragDismissIntentBuilder(this)
|
intent.putExtra("currentItem", currentItem)
|
||||||
.setFullscreenOnTablets(true) // defaults to false, tablets will have padding on each side
|
|
||||||
.setDragElasticity(DragDismissIntentBuilder.DragElasticity.NORMAL) // Larger elasticities will make it easier to dismiss.
|
|
||||||
.setDrawUnderStatusBar(true)
|
|
||||||
.build(intent)*/
|
|
||||||
|
|
||||||
|
|
||||||
intent.putExtra("url", linkDecoded)
|
|
||||||
intent.putExtra("content", content)
|
|
||||||
intent.putExtra("title", title)
|
|
||||||
intent.putExtra("image", image)
|
|
||||||
intent.putExtra("source", source)
|
|
||||||
app.startActivity(intent)
|
app.startActivity(intent)
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
@ -102,11 +89,9 @@ fun Context.openItemUrlInternally(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Context.openItemUrl(
|
fun Context.openItemUrl(
|
||||||
|
allItems: ArrayList<Item>,
|
||||||
|
currentItem: Int,
|
||||||
linkDecoded: String,
|
linkDecoded: String,
|
||||||
content: String,
|
|
||||||
image: String,
|
|
||||||
title: String,
|
|
||||||
source: String,
|
|
||||||
customTabsIntent: CustomTabsIntent,
|
customTabsIntent: CustomTabsIntent,
|
||||||
internalBrowser: Boolean,
|
internalBrowser: Boolean,
|
||||||
articleViewer: Boolean,
|
articleViewer: Boolean,
|
||||||
@ -124,11 +109,9 @@ fun Context.openItemUrl(
|
|||||||
openInBrowser(linkDecoded, app)
|
openInBrowser(linkDecoded, app)
|
||||||
} else {
|
} else {
|
||||||
this.openItemUrlInternally(
|
this.openItemUrlInternally(
|
||||||
|
allItems,
|
||||||
|
currentItem,
|
||||||
linkDecoded,
|
linkDecoded,
|
||||||
content,
|
|
||||||
image,
|
|
||||||
title,
|
|
||||||
source,
|
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
app
|
app
|
||||||
|
@ -1,148 +1,28 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<android.support.design.widget.CoordinatorLayout
|
<android.support.constraint.ConstraintLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<android.support.v4.widget.NestedScrollView
|
<android.support.v4.view.ViewPager
|
||||||
android:id="@+id/nestedScrollView"
|
android:id="@+id/pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="0dp"
|
||||||
|
|
||||||
<android.support.constraint.ConstraintLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/imageView"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="200dp"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/source"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
|
||||||
android:textSize="12sp"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/titleView"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="6dp"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
|
||||||
android:textStyle="bold"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/source" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/content"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:paddingBottom="48dp"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/titleView"
|
|
||||||
android:textColorLink="?attr/colorAccent"/>
|
|
||||||
|
|
||||||
<!--<org.sufficientlysecure.htmltextview.HtmlTextView
|
|
||||||
android:id="@+id/content"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginStart="16dp"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:paddingBottom="48dp"
|
|
||||||
app:layout_constraintHorizontal_bias="0.0"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/titleView" />-->
|
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
|
||||||
|
|
||||||
</android.support.v4.widget.NestedScrollView>
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
android:layout_gravity="end|bottom|right">
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
<com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
|
||||||
android:id="@+id/floatingToolbar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="?attr/actionBarSize"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
app:floatingItemBackground="?attr/colorAccent"
|
|
||||||
app:floatingMenu="@menu/reader_toolbar" />
|
|
||||||
|
|
||||||
<android.support.design.widget.FloatingActionButton
|
<me.relex.circleindicator.CircleIndicator
|
||||||
android:id="@+id/fab"
|
android:id="@+id/indicator"
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:layout_alignParentEnd="true"
|
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_gravity="end|bottom|right"
|
|
||||||
android:layout_marginBottom="16dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
|
||||||
android:src="@drawable/ic_add"
|
|
||||||
app:backgroundTint="?attr/colorAccent"
|
|
||||||
app:fabSize="mini"
|
|
||||||
app:rippleColor="?attr/colorAccentDark" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/progressBar"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="20dp"
|
||||||
android:visibility="gone"
|
android:background="#55000000"
|
||||||
android:animateLayoutChanges="true"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
android:alpha="0.8"
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
android:background="@color/black"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
android:clickable="false">
|
app:layout_constraintRight_toRightOf="parent" />
|
||||||
|
</android.support.constraint.ConstraintLayout>
|
||||||
<ProgressBar
|
|
||||||
style="?android:attr/progressBarStyleLarge"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:progressTint="?attr/colorAccent" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
</android.support.design.widget.CoordinatorLayout>
|
|
||||||
|
|
||||||
|
146
app/src/main/res/layout/fragment_article.xml
Normal file
146
app/src/main/res/layout/fragment_article.xml
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
<android.support.design.widget.CoordinatorLayout
|
||||||
|
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.v4.widget.NestedScrollView
|
||||||
|
android:id="@+id/nestedScrollView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<android.support.constraint.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="200dp"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/source"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
|
android:textSize="12sp"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/titleView"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/source" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/content"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:paddingBottom="48dp"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/titleView"
|
||||||
|
android:textColorLink="?attr/colorAccent"/>
|
||||||
|
|
||||||
|
<!--<org.sufficientlysecure.htmltextview.HtmlTextView
|
||||||
|
android:id="@+id/content"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:paddingBottom="48dp"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/titleView" />-->
|
||||||
|
|
||||||
|
</android.support.constraint.ConstraintLayout>
|
||||||
|
|
||||||
|
</android.support.v4.widget.NestedScrollView>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
android:layout_gravity="end|bottom|right">
|
||||||
|
|
||||||
|
<com.github.rubensousa.floatingtoolbar.FloatingToolbar
|
||||||
|
android:id="@+id/floatingToolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
|
app:floatingItemBackground="?attr/colorAccent"
|
||||||
|
app:floatingMenu="@menu/reader_toolbar" />
|
||||||
|
|
||||||
|
<android.support.design.widget.FloatingActionButton
|
||||||
|
android:id="@+id/fab"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_gravity="end|bottom|right"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:src="@drawable/ic_add"
|
||||||
|
app:backgroundTint="?attr/colorAccent"
|
||||||
|
app:fabSize="mini"
|
||||||
|
app:rippleColor="?attr/colorAccentDark" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/progressBar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:animateLayoutChanges="true"
|
||||||
|
android:alpha="0.8"
|
||||||
|
android:background="@color/black"
|
||||||
|
android:clickable="false">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
style="?android:attr/progressBarStyleLarge"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:progressTint="?attr/colorAccent" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
</android.support.design.widget.CoordinatorLayout>
|
Loading…
Reference in New Issue
Block a user