diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt index 68613eb..5e408d2 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt @@ -2,6 +2,8 @@ package apps.amine.bou.readerforselfoss import android.os.Bundle import android.preference.PreferenceManager +import android.support.customtabs.CustomTabsIntent +import android.text.Html import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -12,6 +14,7 @@ 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 @@ -27,6 +30,18 @@ import xyz.klinker.android.drag_dismiss.activity.DragDismissActivity class ReaderActivity : DragDismissActivity() { private lateinit var mCustomTabActivityHelper: CustomTabActivityHelper + private lateinit var image: ImageView + private lateinit var source: TextView + private lateinit var title: TextView + private lateinit var content: TextView + //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 browserBtn: ImageButton + private lateinit var shareBtn: ImageButton override fun onStart() { super.onStart() @@ -42,16 +57,18 @@ class ReaderActivity : DragDismissActivity() { Scoop.getInstance().apply(this) val v = inflater.inflate(R.layout.activity_reader, parent, false) showProgressBar() - val prefs = PreferenceManager.getDefaultSharedPreferences(this) - val image: ImageView = v.findViewById(R.id.imageView) - val source: TextView = v.findViewById(R.id.source) - val title: TextView = v.findViewById(R.id.title) - val content: HtmlTextView = v.findViewById(R.id.content) - val url = intent.getStringExtra("url") - val parser = MercuryApi(BuildConfig.MERCURY_KEY, prefs.getBoolean("should_log_everything", false)) - val browserBtn: ImageButton = v.findViewById(R.id.browserBtn) - val shareBtn: ImageButton = v.findViewById(R.id.shareBtn) + image = v.findViewById(R.id.imageView) + source = v.findViewById(R.id.source) + title = v.findViewById(R.id.title) + content = v.findViewById(R.id.content) + browserBtn = v.findViewById(R.id.browserBtn) + shareBtn = v.findViewById(R.id.shareBtn) + url = intent.getStringExtra("url") + contentText = intent.getStringExtra("content") + contentTitle = intent.getStringExtra("title") + contentImage = intent.getStringExtra("image") + contentSource = intent.getStringExtra("source") val customTabsIntent = this@ReaderActivity.buildCustomTabsIntent() @@ -59,6 +76,49 @@ class ReaderActivity : DragDismissActivity() { mCustomTabActivityHelper.bindCustomTabsService(this) + if (contentText.isEmptyOrNullOrNullString()) { + getContentFromMercury(customTabsIntent) + } else { + source.text = contentSource + title.text = contentTitle + content.text = Html.fromHtml(contentText, HtmlHttpImageGetter(content, null, true), null) + //content.setHtml(contentText, HtmlHttpImageGetter(content, null, true)) + + if (!contentImage.isEmptyOrNullOrNullString()) + Glide + .with(baseContext) + .asBitmap() + .load(contentImage) + .apply(RequestOptions.fitCenterTransform()) + .into(image) + + shareBtn.setOnClickListener { + this@ReaderActivity.shareLink(url) + } + + browserBtn.setOnClickListener { + this@ReaderActivity.openItemUrl( + url, + contentText, + contentImage, + contentTitle, + contentSource, + customTabsIntent, + false, + false, + this@ReaderActivity) + } + + hideProgressBar() + } + return v + } + + private fun getContentFromMercury(customTabsIntent: CustomTabsIntent) { + + val prefs = PreferenceManager.getDefaultSharedPreferences(this) + val parser = MercuryApi(BuildConfig.MERCURY_KEY, prefs.getBoolean("should_log_everything", false)) + parser.parseUrl(url).enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { if (response.body() != null && response.body()!!.content != null && response.body()!!.content.isNotEmpty()) { @@ -66,18 +126,20 @@ class ReaderActivity : DragDismissActivity() { title.text = response.body()!!.title if (response.body()!!.content != null && !response.body()!!.content.isEmpty()) { try { - content.setHtml(response.body()!!.content, HtmlHttpImageGetter(content, null, true)) + content.text = Html.fromHtml(response.body()!!.content, HtmlHttpImageGetter(content, null, true), null) + + //content.setHtml(response.body()!!.content, HtmlHttpImageGetter(content, null, true)) } catch (e: IndexOutOfBoundsException) { openInBrowserAfterFailing() } } if (response.body()!!.lead_image_url != null && !response.body()!!.lead_image_url.isEmpty()) Glide - .with(baseContext) - .asBitmap() - .load(response.body()!!.lead_image_url) - .apply(RequestOptions.fitCenterTransform()) - .into(image) + .with(baseContext) + .asBitmap() + .load(response.body()!!.lead_image_url) + .apply(RequestOptions.fitCenterTransform()) + .into(image) shareBtn.setOnClickListener { this@ReaderActivity.shareLink(response.body()!!.url) @@ -85,11 +147,15 @@ class ReaderActivity : DragDismissActivity() { browserBtn.setOnClickListener { this@ReaderActivity.openItemUrl( - response.body()!!.url, - customTabsIntent, - false, - false, - this@ReaderActivity) + response.body()!!.url, + contentText, + contentImage, + contentTitle, + contentSource, + customTabsIntent, + false, + false, + this@ReaderActivity) } hideProgressBar() @@ -100,15 +166,18 @@ class ReaderActivity : DragDismissActivity() { private fun openInBrowserAfterFailing() { this@ReaderActivity.openItemUrl( - url, - customTabsIntent, - true, - false, - this@ReaderActivity + url, + contentText, + contentImage, + contentTitle, + contentSource, + customTabsIntent, + true, + false, + this@ReaderActivity ) finish() } }) - return v } } diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemCardAdapter.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemCardAdapter.kt index 6296893..b8e8d03 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemCardAdapter.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemCardAdapter.kt @@ -77,10 +77,10 @@ class ItemCardAdapter(private val app: Activity, val color = generator.getColor(itm.sourcetitle) val drawable = - TextDrawable - .builder() - .round() - .build(itm.sourcetitle.toTextDrawableString(), color) + TextDrawable + .builder() + .round() + .build(itm.sourcetitle.toTextDrawableString(), color) holder.sourceImage.setImageDrawable(drawable) } else { c.circularBitmapDrawable(itm.getIcon(c), holder.sourceImage) @@ -128,13 +128,13 @@ class ItemCardAdapter(private val app: Activity, override fun onResponse(call: Call, response: Response) { if (!response.succeeded() && debugReadingItems) { val message = - "message: ${response.message()} " + - "response isSuccess: ${response.isSuccessful} " + - "response code: ${response.code()} " + - "response message: ${response.message()} " + - "response errorBody: ${response.errorBody()?.string()} " + - "body success: ${response.body()?.success} " + - "body isSuccess: ${response.body()?.isSuccess}" + "message: ${response.message()} " + + "response isSuccess: ${response.isSuccessful} " + + "response code: ${response.code()} " + + "response message: ${response.message()} " + + "response errorBody: ${response.errorBody()?.string()} " + + "body success: ${response.body()?.success} " + + "body isSuccess: ${response.body()?.isSuccess}" Crashlytics.setUserIdentifier(userIdentifier) Crashlytics.log(100, "READ_DEBUG_SUCCESS", message) Crashlytics.logException(Exception("Was success, but did it work ?")) @@ -229,10 +229,14 @@ class ItemCardAdapter(private val app: Activity, mView.setOnClickListener { c.openItemUrl(items[adapterPosition].getLinkDecoded(), - customTabsIntent, - internalBrowser, - articleViewer, - app) + items[adapterPosition].content, + items[adapterPosition].getIcon(c), + items[adapterPosition].title, + items[adapterPosition].sourceAndDateText(), + customTabsIntent, + internalBrowser, + articleViewer, + app) } } } diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemListAdapter.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemListAdapter.kt index beb26e4..a5ff956 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemListAdapter.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/adapters/ItemListAdapter.kt @@ -72,8 +72,8 @@ class ItemListAdapter(private val app: Activity, if (itm.getThumbnail(c).isEmpty()) { val sizeInInt = 46 val sizeInDp = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, sizeInInt.toFloat(), c.resources - .displayMetrics).toInt() + TypedValue.COMPLEX_UNIT_DIP, sizeInInt.toFloat(), c.resources + .displayMetrics).toInt() val marginInInt = 16 val marginInDp = TypedValue.applyDimension( @@ -147,13 +147,13 @@ class ItemListAdapter(private val app: Activity, override fun onResponse(call: Call, response: Response) { if (!response.succeeded() && debugReadingItems) { val message = - "message: ${response.message()} " + - "response isSuccess: ${response.isSuccessful} " + - "response code: ${response.code()} " + - "response message: ${response.message()} " + - "response errorBody: ${response.errorBody()?.string()} " + - "body success: ${response.body()?.success} " + - "body isSuccess: ${response.body()?.isSuccess}" + "message: ${response.message()} " + + "response isSuccess: ${response.isSuccessful} " + + "response code: ${response.code()} " + + "response message: ${response.message()} " + + "response errorBody: ${response.errorBody()?.string()} " + + "body success: ${response.body()?.success} " + + "body isSuccess: ${response.body()?.isSuccess}" Crashlytics.setUserIdentifier(userIdentifier) Crashlytics.log(100, "READ_DEBUG_SUCCESS", message) Crashlytics.logException(Exception("Was success, but did it work ?")) @@ -247,10 +247,14 @@ class ItemListAdapter(private val app: Activity, if (!clickBehavior) { mView.setOnClickListener { c.openItemUrl(items[adapterPosition].getLinkDecoded(), - customTabsIntent, - internalBrowser, - articleViewer, - app) + items[adapterPosition].content, + items[adapterPosition].getIcon(c), + items[adapterPosition].title, + items[adapterPosition].sourceAndDateText(), + customTabsIntent, + internalBrowser, + articleViewer, + app) } mView.setOnLongClickListener { actionBarShowHide() @@ -260,10 +264,14 @@ class ItemListAdapter(private val app: Activity, mView.setOnClickListener { actionBarShowHide() } mView.setOnLongClickListener { c.openItemUrl(items[adapterPosition].getLinkDecoded(), - customTabsIntent, - internalBrowser, - articleViewer, - app) + items[adapterPosition].content, + items[adapterPosition].getIcon(c), + items[adapterPosition].title, + items[adapterPosition].sourceAndDateText(), + customTabsIntent, + internalBrowser, + articleViewer, + app) true } } diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/api/selfoss/SelfossModels.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/api/selfoss/SelfossModels.kt index c95a3e5..0c3b0fd 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/api/selfoss/SelfossModels.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/api/selfoss/SelfossModels.kt @@ -55,6 +55,7 @@ data class Sources(@SerializedName("id") val id: String, data class Item(@SerializedName("id") val id: String, @SerializedName("datetime") val datetime: String, @SerializedName("title") val title: String, + @SerializedName("content") val content: String, @SerializedName("unread") val unread: Boolean, @SerializedName("starred") val starred: Boolean, @SerializedName("thumbnail") val thumbnail: String, @@ -72,15 +73,16 @@ data class Item(@SerializedName("id") val id: String, } constructor(source: Parcel) : this( - id = source.readString(), - datetime = source.readString(), - title = source.readString(), - unread = 0.toByte() != source.readByte(), - starred = 0.toByte() != source.readByte(), - thumbnail = source.readString(), - icon = source.readString(), - link = source.readString(), - sourcetitle = source.readString() + id = source.readString(), + datetime = source.readString(), + title = source.readString(), + content = source.readString(), + unread = 0.toByte() != source.readByte(), + starred = 0.toByte() != source.readByte(), + thumbnail = source.readString(), + icon = source.readString(), + link = source.readString(), + sourcetitle = source.readString() ) override fun describeContents() = 0 @@ -89,6 +91,7 @@ data class Item(@SerializedName("id") val id: String, dest.writeString(id) dest.writeString(datetime) dest.writeString(title) + dest.writeString(content) dest.writeByte((if (unread) 1 else 0)) dest.writeByte((if (starred) 1 else 0)) dest.writeString(thumbnail) diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/utils/LinksUtils.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/utils/LinksUtils.kt index 996c2c9..09216b3 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/utils/LinksUtils.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/utils/LinksUtils.kt @@ -51,6 +51,10 @@ fun Context.buildCustomTabsIntent(): CustomTabsIntent { } fun Context.openItemUrlInternally(linkDecoded: String, + content: String, + image: String, + title: String, + source: String, customTabsIntent: CustomTabsIntent, articleViewer: Boolean, app: Activity) { @@ -58,12 +62,17 @@ fun Context.openItemUrlInternally(linkDecoded: String, val intent = Intent(this, ReaderActivity::class.java) DragDismissIntentBuilder(this) - .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) + .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) } else { try { @@ -80,6 +89,10 @@ fun Context.openItemUrlInternally(linkDecoded: String, } fun Context.openItemUrl(linkDecoded: String, + content: String, + image: String, + title: String, + source: String, customTabsIntent: CustomTabsIntent, internalBrowser: Boolean, articleViewer: Boolean, @@ -91,7 +104,7 @@ fun Context.openItemUrl(linkDecoded: String, if (!internalBrowser) { openInBrowser(linkDecoded, app) } else { - this.openItemUrlInternally(linkDecoded, customTabsIntent, articleViewer, app) + this.openItemUrlInternally(linkDecoded, content, image, title, source, customTabsIntent, articleViewer, app) } } } @@ -103,7 +116,7 @@ private fun openInBrowser(linkDecoded: String, app: Activity) { } fun String.isUrlValid(): Boolean = - HttpUrl.parse(this) != null && Patterns.WEB_URL.matcher(this).matches() + HttpUrl.parse(this) != null && Patterns.WEB_URL.matcher(this).matches() fun String.isBaseUrlValid(): Boolean { val baseUrl = HttpUrl.parse(this) diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index aef8c9b..9a60d71 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -50,7 +50,23 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/source" /> - + +