From f66475bbdb5d996a835eec62d6c9f2c9906fead2 Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Mon, 8 Feb 2021 01:32:10 +0100 Subject: [PATCH 1/6] Initial blurhash use --- .../h/pixeldroid/posts/StatusViewHolder.kt | 18 ++- .../com/h/pixeldroid/utils/BlurHashDecoder.kt | 142 ++++++++++++++++++ .../utils/api/objects/Attachment.kt | 22 ++- 3 files changed, 175 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt diff --git a/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt b/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt index 0b340e51..eb801653 100644 --- a/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt +++ b/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt @@ -3,16 +3,17 @@ package com.h.pixeldroid.posts import android.Manifest import android.app.AlertDialog import android.content.Intent -import android.graphics.Color import android.graphics.Typeface -import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.text.method.LinkMovementMethod import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.* +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.PopupMenu +import android.widget.Toast import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleCoroutineScope import androidx.recyclerview.widget.RecyclerView @@ -24,6 +25,7 @@ import com.h.pixeldroid.R import com.h.pixeldroid.databinding.AlbumImageViewBinding import com.h.pixeldroid.databinding.CommentBinding import com.h.pixeldroid.databinding.PostFragmentBinding +import com.h.pixeldroid.utils.BlurHashDecoder import com.h.pixeldroid.utils.ImageConverter import com.h.pixeldroid.utils.api.PixelfedAPI import com.h.pixeldroid.utils.api.objects.Attachment @@ -57,7 +59,6 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold //Setup the post layout val picRequest = Glide.with(itemView) .asDrawable().fitCenter() - .placeholder(ColorDrawable(Color.GRAY)) val user = db.userDao().getActiveUser()!! @@ -139,7 +140,9 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold if(status?.media_attachments?.size == 1) { - request.load(status?.getPostUrl()).into(binding.postPicture) + request.placeholder( + BlurHashDecoder.blurHashBitmap(binding.root.context.resources, status?.media_attachments?.get(0)) + ).load(status?.getPostUrl()).into(binding.postPicture) val imgDescription = status?.media_attachments?.get(0)?.description.orEmpty().ifEmpty { binding.root.context.getString( R.string.no_description) } binding.postPicture.contentDescription = imgDescription @@ -687,7 +690,10 @@ class AlbumViewPagerAdapter(private val media_attachments: List) : override fun getItemCount() = media_attachments.size override fun onBindViewHolder(holder: ViewHolder, position: Int) { Glide.with(holder.binding.root) - .asDrawable().fitCenter().placeholder(ColorDrawable(Color.GRAY)) + .asDrawable().fitCenter().placeholder( + BlurHashDecoder.blurHashBitmap( + holder.binding.root.context.resources, media_attachments[position]) + ) .load(media_attachments[position].url).into(holder.image) val description = media_attachments[position].description diff --git a/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt b/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt new file mode 100644 index 00000000..fb92e738 --- /dev/null +++ b/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt @@ -0,0 +1,142 @@ +package com.h.pixeldroid.utils + +/** + * Blurhash implementation from blurhash project: + * https://github.com/woltapp/blurhash + * Minor modifications by charlag, for the Tusky project + * https://github.com/tuskyapp/Tusky/ + */ + +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.Color +import android.graphics.drawable.BitmapDrawable +import com.h.pixeldroid.utils.api.objects.Attachment +import kotlin.math.PI +import kotlin.math.cos +import kotlin.math.pow +import kotlin.math.withSign + +object BlurHashDecoder { + + fun blurHashBitmap(resources: Resources, attachment: Attachment?): BitmapDrawable { + return BitmapDrawable(resources, + decode(attachment?.blurhash, + (32 * (attachment?.meta?.original?.aspect ?: 1.0)).toInt(), + 32) + ) + } + + fun decode(blurHash: String?, width: Int?, height: Int?, punch: Float = 1f): Bitmap? { + if (blurHash == null || width == null || height == null || blurHash.length < 6) { + return null + } + require(width > 0) { "Width must be greater than zero" } + require(height > 0) { "height must be greater than zero" } + + val numCompEnc = decode83(blurHash, 0, 1) + val numCompX = (numCompEnc % 9) + 1 + val numCompY = (numCompEnc / 9) + 1 + if (blurHash.length != 4 + 2 * numCompX * numCompY) { + return null + } + val maxAcEnc = decode83(blurHash, 1, 2) + val maxAc = (maxAcEnc + 1) / 166f + val colors = Array(numCompX * numCompY) { i -> + if (i == 0) { + val colorEnc = decode83(blurHash, 2, 6) + decodeDc(colorEnc) + } else { + val from = 4 + i * 2 + val colorEnc = decode83(blurHash, from, from + 2) + decodeAc(colorEnc, maxAc * punch) + } + } + return composeBitmap(width, height, numCompX, numCompY, colors) + } + + private fun decode83(str: String, from: Int = 0, to: Int = str.length): Int { + var result = 0 + for (i in from until to) { + val index = charMap[str[i]] ?: -1 + if (index != -1) { + result = result * 83 + index + } + } + return result + } + + private fun decodeDc(colorEnc: Int): FloatArray { + val r = colorEnc shr 16 + val g = (colorEnc shr 8) and 255 + val b = colorEnc and 255 + return floatArrayOf(srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)) + } + + private fun srgbToLinear(colorEnc: Int): Float { + val v = colorEnc / 255f + return if (v <= 0.04045f) { + (v / 12.92f) + } else { + ((v + 0.055f) / 1.055f).pow(2.4f) + } + } + + private fun decodeAc(value: Int, maxAc: Float): FloatArray { + val r = value / (19 * 19) + val g = (value / 19) % 19 + val b = value % 19 + return floatArrayOf( + signedPow2((r - 9) / 9.0f) * maxAc, + signedPow2((g - 9) / 9.0f) * maxAc, + signedPow2((b - 9) / 9.0f) * maxAc + ) + } + + private fun signedPow2(value: Float) = value.pow(2f).withSign(value) + + private fun composeBitmap( + width: Int, height: Int, + numCompX: Int, numCompY: Int, + colors: Array + ): Bitmap { + val imageArray = IntArray(width * height) + for (y in 0 until height) { + for (x in 0 until width) { + var r = 0f + var g = 0f + var b = 0f + for (j in 0 until numCompY) { + for (i in 0 until numCompX) { + val basis = (cos(PI * x * i / width) * cos(PI * y * j / height)).toFloat() + val color = colors[j * numCompX + i] + r += color[0] * basis + g += color[1] * basis + b += color[2] * basis + } + } + imageArray[x + width * y] = Color.rgb(linearToSrgb(r), linearToSrgb(g), linearToSrgb(b)) + } + } + return Bitmap.createBitmap(imageArray, width, height, Bitmap.Config.ARGB_8888) + } + + private fun linearToSrgb(value: Float): Int { + val v = value.coerceIn(0f, 1f) + return if (v <= 0.0031308f) { + (v * 12.92f * 255f + 0.5f).toInt() + } else { + ((1.055f * v.pow(1 / 2.4f) - 0.055f) * 255 + 0.5f).toInt() + } + } + + private val charMap = listOf( + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '#', '$', '%', '*', '+', ',', + '-', '.', ':', ';', '=', '?', '@', '[', ']', '^', '_', '{', '|', '}', '~' + ) + .mapIndexed { i, c -> c to i } + .toMap() +} \ No newline at end of file diff --git a/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt b/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt index 4d9cc2a2..894221b0 100644 --- a/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt +++ b/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt @@ -11,11 +11,31 @@ data class Attachment( //Optional attributes val remote_url: String? = null, //URL val text_url: String? = null, //URL - //TODO meta + + val meta: Meta?, + val description: String? = null, val blurhash: String? = null ) : Serializable { enum class AttachmentType { unknown, image, gifv, video, audio } + + data class Meta ( + val focus: Focus?, + val original: Image? + ) : Serializable + + { + data class Focus( + val x: Int?, + val y: Int? + ) : Serializable + data class Image( + val width: Int?, + val height: Int?, + val size: String?, + val aspect: Double? + ) : Serializable + } } From c88f4a4cecb7fbc6a099b61da9bcd9b3457c3604 Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Mon, 8 Feb 2021 18:01:48 +0100 Subject: [PATCH 2/6] Initial support for using API size values for single photos --- .../com/h/pixeldroid/posts/PostFragment.kt | 5 +++- .../h/pixeldroid/posts/StatusViewHolder.kt | 27 +++++++++++++------ .../cachedFeeds/postFeeds/PostFeedFragment.kt | 7 ++--- .../search/SearchPostsFragment.kt | 7 ++--- .../com/h/pixeldroid/utils/BlurHashDecoder.kt | 7 +++-- .../main/java/com/h/pixeldroid/utils/Utils.kt | 16 +++++++++++ .../utils/api/objects/Attachment.kt | 4 +-- app/src/main/res/layout/post_fragment.xml | 3 +-- 8 files changed, 55 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/h/pixeldroid/posts/PostFragment.kt b/app/src/main/java/com/h/pixeldroid/posts/PostFragment.kt index 52670064..c53969a4 100644 --- a/app/src/main/java/com/h/pixeldroid/posts/PostFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/posts/PostFragment.kt @@ -11,6 +11,7 @@ import com.h.pixeldroid.utils.api.objects.Status.Companion.DOMAIN_TAG import com.h.pixeldroid.utils.api.objects.Status.Companion.POST_TAG import com.h.pixeldroid.utils.BaseFragment import com.h.pixeldroid.utils.bindingLifecycleAware +import com.h.pixeldroid.utils.displayDimensionsInPx class PostFragment : BaseFragment() { @@ -43,7 +44,9 @@ class PostFragment : BaseFragment() { val holder = StatusViewHolder(binding) - holder.bind(currentStatus, api, db, lifecycleScope) + + + holder.bind(currentStatus, api, db, lifecycleScope, requireContext().displayDimensionsInPx()) } } diff --git a/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt b/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt index eb801653..953d4675 100644 --- a/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt +++ b/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt @@ -10,10 +10,7 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.PopupMenu -import android.widget.Toast +import android.widget.* import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleCoroutineScope import androidx.recyclerview.widget.RecyclerView @@ -31,6 +28,7 @@ import com.h.pixeldroid.utils.api.PixelfedAPI import com.h.pixeldroid.utils.api.objects.Attachment import com.h.pixeldroid.utils.api.objects.Status import com.h.pixeldroid.utils.db.AppDatabase +import com.h.pixeldroid.utils.displayDimensionsInPx import com.karumi.dexter.Dexter import com.karumi.dexter.listener.PermissionDeniedResponse import com.karumi.dexter.listener.PermissionGrantedResponse @@ -38,6 +36,7 @@ import com.karumi.dexter.listener.single.BasePermissionListener import kotlinx.coroutines.launch import retrofit2.HttpException import java.io.IOException +import kotlin.math.roundToInt /** @@ -47,14 +46,26 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold private var status: Status? = null - fun bind(status: Status?, pixelfedAPI: PixelfedAPI, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope) { + fun bind(status: Status?, pixelfedAPI: PixelfedAPI, db: AppDatabase, lifecycleScope: LifecycleCoroutineScope, displayDimensionsInPx: Pair) { this.itemView.visibility = View.VISIBLE this.status = status - val metrics = itemView.context.resources.displayMetrics - //Limit the height of the different images - binding.postPicture.maxHeight = metrics.heightPixels * 3/4 + val maxImageRatio: Float = status?.media_attachments?.map { + if (it.meta?.original?.width == null || it.meta.original.height == null) { + 1f + } else { + it.meta.original.width.toFloat() / it.meta.original.height.toFloat() + } + }?.maxOrNull() ?: 1f + + val (displayWidth, displayHeight) = displayDimensionsInPx + val height = if (displayWidth / maxImageRatio > displayHeight * 3/4f) { + binding.postPicture.layoutParams.width = ((displayHeight * 3 / 4f) * maxImageRatio).roundToInt() + displayHeight * 3 / 4f + } else displayWidth / maxImageRatio + + binding.postPicture.layoutParams.height = height.toInt() //Setup the post layout val picRequest = Glide.with(itemView) diff --git a/app/src/main/java/com/h/pixeldroid/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt b/app/src/main/java/com/h/pixeldroid/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt index ff40607c..132fff05 100644 --- a/app/src/main/java/com/h/pixeldroid/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/posts/feeds/cachedFeeds/postFeeds/PostFeedFragment.kt @@ -19,6 +19,7 @@ import com.h.pixeldroid.posts.feeds.cachedFeeds.CachedFeedFragment import com.h.pixeldroid.posts.feeds.cachedFeeds.ViewModelFactory import com.h.pixeldroid.utils.api.objects.FeedContentDatabase import com.h.pixeldroid.utils.api.objects.Status +import com.h.pixeldroid.utils.displayDimensionsInPx /** @@ -35,7 +36,7 @@ class PostFeedFragment: CachedFeedFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - adapter = PostsAdapter() + adapter = PostsAdapter(requireContext().displayDimensionsInPx()) @Suppress("UNCHECKED_CAST") if (requireArguments().get("home") as Boolean){ @@ -67,7 +68,7 @@ class PostFeedFragment: CachedFeedFragment() { return view } - inner class PostsAdapter : PagingDataAdapter( + inner class PostsAdapter(private val displayDimensionsInPx: Pair) : PagingDataAdapter( object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: T, newItem: T): Boolean { return oldItem.id == newItem.id @@ -89,7 +90,7 @@ class PostFeedFragment: CachedFeedFragment() { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val uiModel = getItem(position) as Status uiModel.let { - (holder as StatusViewHolder).bind(it, apiHolder.setDomainToCurrentUser(db), db, lifecycleScope) + (holder as StatusViewHolder).bind(it, apiHolder.setDomainToCurrentUser(db), db, lifecycleScope, displayDimensionsInPx) } } } diff --git a/app/src/main/java/com/h/pixeldroid/posts/feeds/uncachedFeeds/search/SearchPostsFragment.kt b/app/src/main/java/com/h/pixeldroid/posts/feeds/uncachedFeeds/search/SearchPostsFragment.kt index b93cb8ad..bcb7c69b 100644 --- a/app/src/main/java/com/h/pixeldroid/posts/feeds/uncachedFeeds/search/SearchPostsFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/posts/feeds/uncachedFeeds/search/SearchPostsFragment.kt @@ -15,6 +15,7 @@ import com.h.pixeldroid.posts.StatusViewHolder import com.h.pixeldroid.posts.feeds.uncachedFeeds.* import com.h.pixeldroid.utils.api.objects.Results import com.h.pixeldroid.utils.api.objects.Status +import com.h.pixeldroid.utils.displayDimensionsInPx /** * Fragment to show a list of [Status]es, as a result of a search. @@ -25,7 +26,7 @@ class SearchPostsFragment : UncachedFeedFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - adapter = PostsAdapter() + adapter = PostsAdapter(requireContext().displayDimensionsInPx()) query = arguments?.getSerializable("searchFeed") as String @@ -57,7 +58,7 @@ class SearchPostsFragment : UncachedFeedFragment() { return view } - inner class PostsAdapter : PagingDataAdapter( + inner class PostsAdapter(private val displayDimensionsInPx: Pair) : PagingDataAdapter( object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Status, newItem: Status): Boolean { return oldItem.id == newItem.id @@ -79,7 +80,7 @@ class SearchPostsFragment : UncachedFeedFragment() { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val uiModel = getItem(position) as Status uiModel.let { - (holder as StatusViewHolder).bind(it, apiHolder.setDomainToCurrentUser(db), db, lifecycleScope) + (holder as StatusViewHolder).bind(it, apiHolder.setDomainToCurrentUser(db), db, lifecycleScope, displayDimensionsInPx) } } } diff --git a/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt b/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt index fb92e738..c624f5ba 100644 --- a/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt +++ b/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt @@ -20,10 +20,13 @@ import kotlin.math.withSign object BlurHashDecoder { fun blurHashBitmap(resources: Resources, attachment: Attachment?): BitmapDrawable { + val ratioOr0 = (attachment?.meta?.original?.width?.toFloat() ?: 1f) / (attachment?.meta?.original?.height?.toFloat() ?: 1f) + + val ratio = if (ratioOr0 == 0f) 1f else ratioOr0 return BitmapDrawable(resources, decode(attachment?.blurhash, - (32 * (attachment?.meta?.original?.aspect ?: 1.0)).toInt(), - 32) + (32f * ratio).toInt().coerceAtLeast(32), + (32f / ratio).toInt().coerceAtLeast(32)) ) } diff --git a/app/src/main/java/com/h/pixeldroid/utils/Utils.kt b/app/src/main/java/com/h/pixeldroid/utils/Utils.kt index cea99310..2431574b 100644 --- a/app/src/main/java/com/h/pixeldroid/utils/Utils.kt +++ b/app/src/main/java/com/h/pixeldroid/utils/Utils.kt @@ -8,6 +8,8 @@ import android.content.res.Resources import android.net.ConnectivityManager import android.net.Uri import android.os.Build +import android.util.DisplayMetrics +import android.view.WindowManager import androidx.appcompat.app.AppCompatDelegate import androidx.browser.customtabs.CustomTabsIntent import androidx.fragment.app.Fragment @@ -38,6 +40,20 @@ fun validDomain(domain: String?): Boolean { return true } + +fun Context.displayDimensionsInPx(): Pair { + val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager + + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + Pair(windowManager.currentWindowMetrics.bounds.width(), windowManager.currentWindowMetrics.bounds.height()) + } else { + val metrics = DisplayMetrics() + @Suppress("DEPRECATION") + windowManager.defaultDisplay.getMetrics(metrics) + Pair(metrics.widthPixels, metrics.heightPixels) + } +} + fun normalizeDomain(domain: String): String { return "https://" + domain .replace("http://", "") diff --git a/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt b/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt index 894221b0..1202f338 100644 --- a/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt +++ b/app/src/main/java/com/h/pixeldroid/utils/api/objects/Attachment.kt @@ -28,8 +28,8 @@ data class Attachment( { data class Focus( - val x: Int?, - val y: Int? + val x: Double?, + val y: Double? ) : Serializable data class Image( val width: Int?, diff --git a/app/src/main/res/layout/post_fragment.xml b/app/src/main/res/layout/post_fragment.xml index 745550c5..06028c34 100644 --- a/app/src/main/res/layout/post_fragment.xml +++ b/app/src/main/res/layout/post_fragment.xml @@ -76,8 +76,7 @@ Date: Tue, 9 Feb 2021 20:47:04 +0100 Subject: [PATCH 3/6] Fix discover --- .../com/h/pixeldroid/posts/PostActivity.kt | 28 +------------------ .../searchDiscover/SearchDiscoverFragment.kt | 23 ++++----------- .../utils/api/objects/DiscoverPost.kt | 13 --------- .../utils/api/objects/DiscoverPosts.kt | 2 +- app/src/main/res/layout/activity_post.xml | 11 -------- 5 files changed, 8 insertions(+), 69 deletions(-) delete mode 100644 app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPost.kt diff --git a/app/src/main/java/com/h/pixeldroid/posts/PostActivity.kt b/app/src/main/java/com/h/pixeldroid/posts/PostActivity.kt index 0cb7bcaa..95f67060 100644 --- a/app/src/main/java/com/h/pixeldroid/posts/PostActivity.kt +++ b/app/src/main/java/com/h/pixeldroid/posts/PostActivity.kt @@ -6,7 +6,6 @@ import android.view.View import androidx.lifecycle.lifecycleScope import com.h.pixeldroid.R import com.h.pixeldroid.databinding.ActivityPostBinding -import com.h.pixeldroid.utils.api.objects.DiscoverPost import com.h.pixeldroid.utils.api.objects.Status import com.h.pixeldroid.utils.api.objects.Status.Companion.DISCOVER_TAG import com.h.pixeldroid.utils.api.objects.Status.Companion.DOMAIN_TAG @@ -30,7 +29,6 @@ class PostActivity : BaseActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) val status = intent.getSerializableExtra(POST_TAG) as Status? - val discoverPost: DiscoverPost? = intent.getSerializableExtra(DISCOVER_TAG) as DiscoverPost? val user = db.userDao().getActiveUser() @@ -41,12 +39,7 @@ class PostActivity : BaseActivity() { val arguments = Bundle() arguments.putString(DOMAIN_TAG, domain) - if (discoverPost != null) { - binding.postProgressBar.visibility = View.VISIBLE - getDiscoverPost(arguments, discoverPost) - } else { - initializeFragment(arguments, status) - } + initializeFragment(arguments, status) } override fun onSupportNavigateUp(): Boolean { @@ -54,25 +47,6 @@ class PostActivity : BaseActivity() { return true } - private fun getDiscoverPost( - arguments: Bundle, - discoverPost: DiscoverPost - ) { - val api = apiHolder.api ?: apiHolder.setDomainToCurrentUser(db) - val id = discoverPost.url?.substringAfterLast('/') ?: "" - lifecycleScope.launchWhenCreated { - try { - val status = api.getStatus("Bearer $accessToken", id) - binding.postProgressBar.visibility = View.GONE - initializeFragment(arguments, status) - } catch (exception: IOException) { - //TODO show error message - Log.e("PostActivity:", exception.toString()) - } catch (exception: HttpException) { - } - } - } - private fun initializeFragment(arguments: Bundle, status: Status?){ supportActionBar?.title = getString(R.string.post_title).format(status!!.account?.getDisplayName()) arguments.putSerializable(POST_TAG, status) diff --git a/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt b/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt index 855fa03d..25f098df 100644 --- a/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt @@ -4,25 +4,17 @@ import android.app.SearchManager import android.content.Context import android.content.Intent import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.* import androidx.annotation.StringRes -import androidx.appcompat.widget.SearchView -import androidx.constraintlayout.motion.widget.MotionLayout import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.h.pixeldroid.R import com.h.pixeldroid.databinding.FragmentSearchBinding -import com.h.pixeldroid.databinding.PostFragmentBinding import com.h.pixeldroid.profile.ProfilePostViewHolder import com.h.pixeldroid.utils.api.PixelfedAPI -import com.h.pixeldroid.utils.api.objects.DiscoverPost -import com.h.pixeldroid.utils.api.objects.DiscoverPosts import com.h.pixeldroid.utils.api.objects.Status import com.h.pixeldroid.posts.PostActivity import com.h.pixeldroid.utils.BaseFragment @@ -34,10 +26,7 @@ import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.iconics.utils.color import com.mikepenz.iconics.utils.paddingDp import com.mikepenz.iconics.utils.sizeDp -import retrofit2.Call -import retrofit2.Callback import retrofit2.HttpException -import retrofit2.Response import java.io.IOException /** @@ -122,12 +111,12 @@ class SearchDiscoverFragment : BaseFragment() { } /** - * [RecyclerView.Adapter] that can display a list of [DiscoverPost]s + * [RecyclerView.Adapter] that can display a list of [Status]s' thumbnails for the discover view */ class DiscoverRecyclerViewAdapter: RecyclerView.Adapter() { - private val posts: ArrayList = ArrayList() + private val posts: ArrayList = ArrayList() - fun addPosts(newPosts : List) { + fun addPosts(newPosts : List) { posts.clear() posts.addAll(newPosts) notifyDataSetChanged() @@ -141,15 +130,15 @@ class SearchDiscoverFragment : BaseFragment() { override fun onBindViewHolder(holder: ProfilePostViewHolder, position: Int) { val post = posts[position] - if(post.type?.contains("album") == true) { + if(post.media_attachments?.size ?: 0 > 1) { holder.albumIcon.visibility = View.VISIBLE } else { holder.albumIcon.visibility = View.GONE } - ImageConverter.setSquareImageFromURL(holder.postView, post.thumb, holder.postPreview) + ImageConverter.setSquareImageFromURL(holder.postView, post.media_attachments?.firstOrNull()?.preview_url, holder.postPreview) holder.postPreview.setOnClickListener { val intent = Intent(holder.postView.context, PostActivity::class.java) - intent.putExtra(Status.DISCOVER_TAG, post) + intent.putExtra(Status.POST_TAG, post) holder.postView.context.startActivity(intent) } } diff --git a/app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPost.kt b/app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPost.kt deleted file mode 100644 index ff1f3b86..00000000 --- a/app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPost.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.h.pixeldroid.utils.api.objects - -import java.io.Serializable - -/* -NOT DOCUMENTED, USE WITH CAUTION - */ - -data class DiscoverPost( - val type: String?, //This is probably an enum, with these values: https://github.com/pixelfed/pixelfed/blob/700c7805cecc364b68b9cfe20df00608e0f6c465/app/Status.php#L31 - val url: String?, //URL to post - val thumb: String? //URL to thumbnail -) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPosts.kt b/app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPosts.kt index 1fdfb94f..cf3c27f6 100644 --- a/app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPosts.kt +++ b/app/src/main/java/com/h/pixeldroid/utils/api/objects/DiscoverPosts.kt @@ -4,5 +4,5 @@ import java.io.Serializable data class DiscoverPosts( //Required attributes - val posts: List + val posts: List ) : Serializable diff --git a/app/src/main/res/layout/activity_post.xml b/app/src/main/res/layout/activity_post.xml index befd542c..8f9084e5 100644 --- a/app/src/main/res/layout/activity_post.xml +++ b/app/src/main/res/layout/activity_post.xml @@ -6,17 +6,6 @@ android:layout_height="match_parent" tools:context=".posts.PostActivity"> - - From 70f0e59d66eef6af23cada5cb96b7da286bb4e9c Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Tue, 9 Feb 2021 23:28:08 +0100 Subject: [PATCH 4/6] add blurhash to discover --- .../h/pixeldroid/posts/StatusViewHolder.kt | 19 ++++++++++++++++--- .../searchDiscover/SearchDiscoverFragment.kt | 2 +- .../com/h/pixeldroid/utils/BlurHashDecoder.kt | 6 +++--- .../com/h/pixeldroid/utils/ImageConverter.kt | 6 ++++-- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt b/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt index 953d4675..873202c0 100644 --- a/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt +++ b/app/src/main/java/com/h/pixeldroid/posts/StatusViewHolder.kt @@ -152,7 +152,15 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold if(status?.media_attachments?.size == 1) { request.placeholder( - BlurHashDecoder.blurHashBitmap(binding.root.context.resources, status?.media_attachments?.get(0)) + status?.media_attachments?.get(0).let { + it?.blurhash?.let { hash -> + BlurHashDecoder.blurHashBitmap(binding.root.resources, + hash, + it.meta?.original?.width, + it.meta?.original?.height + ) + } + } ).load(status?.getPostUrl()).into(binding.postPicture) val imgDescription = status?.media_attachments?.get(0)?.description.orEmpty().ifEmpty { binding.root.context.getString( R.string.no_description) } @@ -702,8 +710,13 @@ class AlbumViewPagerAdapter(private val media_attachments: List) : override fun onBindViewHolder(holder: ViewHolder, position: Int) { Glide.with(holder.binding.root) .asDrawable().fitCenter().placeholder( - BlurHashDecoder.blurHashBitmap( - holder.binding.root.context.resources, media_attachments[position]) + media_attachments[position].blurhash?.let { + BlurHashDecoder.blurHashBitmap( + holder.binding.root.resources, + it, + media_attachments[position].meta?.original?.width, + media_attachments[position].meta?.original?.height) + } ) .load(media_attachments[position].url).into(holder.image) diff --git a/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt b/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt index 25f098df..966e9846 100644 --- a/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/searchDiscover/SearchDiscoverFragment.kt @@ -135,7 +135,7 @@ class SearchDiscoverFragment : BaseFragment() { } else { holder.albumIcon.visibility = View.GONE } - ImageConverter.setSquareImageFromURL(holder.postView, post.media_attachments?.firstOrNull()?.preview_url, holder.postPreview) + ImageConverter.setSquareImageFromURL(holder.postView, post.media_attachments?.firstOrNull()?.preview_url, holder.postPreview, post.media_attachments?.firstOrNull()?.blurhash) holder.postPreview.setOnClickListener { val intent = Intent(holder.postView.context, PostActivity::class.java) intent.putExtra(Status.POST_TAG, post) diff --git a/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt b/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt index c624f5ba..847edc45 100644 --- a/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt +++ b/app/src/main/java/com/h/pixeldroid/utils/BlurHashDecoder.kt @@ -19,12 +19,12 @@ import kotlin.math.withSign object BlurHashDecoder { - fun blurHashBitmap(resources: Resources, attachment: Attachment?): BitmapDrawable { - val ratioOr0 = (attachment?.meta?.original?.width?.toFloat() ?: 1f) / (attachment?.meta?.original?.height?.toFloat() ?: 1f) + fun blurHashBitmap(resources: Resources, blurHash: String, width: Int?, height: Int?): BitmapDrawable { + val ratioOr0 = (width?.toFloat() ?: 1f) / (height?.toFloat() ?: 1f) val ratio = if (ratioOr0 == 0f) 1f else ratioOr0 return BitmapDrawable(resources, - decode(attachment?.blurhash, + decode(blurHash, (32f * ratio).toInt().coerceAtLeast(32), (32f / ratio).toInt().coerceAtLeast(32)) ) diff --git a/app/src/main/java/com/h/pixeldroid/utils/ImageConverter.kt b/app/src/main/java/com/h/pixeldroid/utils/ImageConverter.kt index 9e80fde7..305e4196 100644 --- a/app/src/main/java/com/h/pixeldroid/utils/ImageConverter.kt +++ b/app/src/main/java/com/h/pixeldroid/utils/ImageConverter.kt @@ -69,8 +69,10 @@ class ImageConverter { * @param url, the url of the image that will be loaded * @param image, the imageView into which we will load the image */ - fun setSquareImageFromURL(view : View, url : String?, image : ImageView) { - Glide.with(view).load(url).apply(RequestOptions().centerCrop()).into(image) + fun setSquareImageFromURL(view : View, url : String?, image : ImageView, blurhash: String? = null) { + Glide.with(view).load(url).placeholder( + blurhash?.let { BlurHashDecoder.blurHashBitmap(view.resources, it, 32,32) } + ).apply(RequestOptions().centerCrop()).into(image) } From 1268f5c9775a819c38c5dc41a43a1398dd6619eb Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Thu, 11 Feb 2021 01:06:45 +0100 Subject: [PATCH 5/6] fix unit tests --- app/src/test/java/com/h/pixeldroid/APIUnitTest.kt | 2 +- app/src/test/java/com/h/pixeldroid/PostUnitTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/com/h/pixeldroid/APIUnitTest.kt b/app/src/test/java/com/h/pixeldroid/APIUnitTest.kt index 562a449e..560839d8 100644 --- a/app/src/test/java/com/h/pixeldroid/APIUnitTest.kt +++ b/app/src/test/java/com/h/pixeldroid/APIUnitTest.kt @@ -31,7 +31,7 @@ class APIUnitTest { visibility=Status.Visibility.public, sensitive=false, spoiler_text="", media_attachments= listOf(Attachment(id="15888", type= Attachment.AttachmentType.image, url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB.jpeg", preview_url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB_thumb.jpeg", - remote_url=null, text_url=null, description=null, blurhash=null)), + remote_url=null, text_url=null, description=null, blurhash=null, meta = null)), application= Application(name="web", website=null, vapid_key=null), mentions=emptyList(), tags= listOf(Tag(name="hiking", url="https://pixelfed.de/discover/tags/hiking", history=null), Tag(name="nature", url="https://pixelfed.de/discover/tags/nature", history=null), Tag(name="rotavicentina", url="https://pixelfed.de/discover/tags/rotavicentina", history=null)), emojis= emptyList(), reblogs_count=0, favourites_count=0, replies_count=0, url="https://pixelfed.de/p/Miike/140364967936397312", diff --git a/app/src/test/java/com/h/pixeldroid/PostUnitTest.kt b/app/src/test/java/com/h/pixeldroid/PostUnitTest.kt index 3dd59f13..e70bb86f 100644 --- a/app/src/test/java/com/h/pixeldroid/PostUnitTest.kt +++ b/app/src/test/java/com/h/pixeldroid/PostUnitTest.kt @@ -20,7 +20,7 @@ class PostUnitTest { media_attachments= listOf( Attachment(id="15888", type= Attachment.AttachmentType.image, url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB.jpeg", preview_url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB_thumb.jpeg", - remote_url=null, text_url=null, description=null, blurhash=null) + remote_url=null, text_url=null, description=null, blurhash=null, meta = null) ), application= Application(name="web", website=null, vapid_key=null), mentions=emptyList(), tags= listOf(Tag(name="hiking", url="https://pixelfed.de/discover/tags/hiking", history=null), Tag(name="nature", url="https://pixelfed.de/discover/tags/nature", history=null), Tag(name="rotavicentina", url="https://pixelfed.de/discover/tags/rotavicentina", history=null)), From fe087828034599a4f0ffe771fea7215175abbf0c Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Thu, 11 Feb 2021 01:24:05 +0100 Subject: [PATCH 6/6] At least make integration tests compile --- .../java/com/h/pixeldroid/CameraTest.kt | 12 +++---- .../java/com/h/pixeldroid/DrawerMenuTest.kt | 12 +++---- .../java/com/h/pixeldroid/EditPhotoTest.kt | 20 ++++++------ .../java/com/h/pixeldroid/HomeFeedTest.kt | 6 ++-- .../java/com/h/pixeldroid/IntentTest.kt | 6 ++-- .../h/pixeldroid/LoginActivityOnlineTest.kt | 6 ++-- .../java/com/h/pixeldroid/LoginCheckIntent.kt | 3 -- .../h/pixeldroid/PostCreationFragmentTest.kt | 10 +++--- .../java/com/h/pixeldroid/PostTest.kt | 32 +++++++++++-------- .../photoEdit/PhotoEditActivity.kt | 2 +- 10 files changed, 55 insertions(+), 54 deletions(-) diff --git a/app/src/androidTest/java/com/h/pixeldroid/CameraTest.kt b/app/src/androidTest/java/com/h/pixeldroid/CameraTest.kt index e5ca9d0f..66835e54 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/CameraTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/CameraTest.kt @@ -4,6 +4,7 @@ import android.Manifest import android.content.Context import android.content.Intent import android.content.Intent.ACTION_CHOOSER +import android.widget.ImageButton import androidx.fragment.app.testing.launchFragmentInContainer import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.intent.Intents @@ -14,7 +15,6 @@ import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity import com.h.pixeldroid.postCreation.camera.CameraFragment import com.h.pixeldroid.testUtility.clearData import com.h.pixeldroid.testUtility.initDB -import kotlinx.android.synthetic.main.camera_ui_container.* import org.hamcrest.CoreMatchers import org.hamcrest.Matcher import org.junit.After @@ -50,9 +50,9 @@ class CameraTest { avatar_static = "some_avatar_url", isActive = true, accessToken = "token", - refreshToken = refreshToken, - clientId = clientId, - clientSecret = clientSecret + refreshToken = "refreshToken", + clientId = "clientId", + clientSecret = "clientSecret" ) ) db.close() @@ -88,7 +88,7 @@ class CameraTest { val scenario = launchFragmentInContainer() scenario.onFragment { fragment -> - fragment.photo_view_button.performClick() + fragment.view?.findViewById(R.id.photo_view_button)?.performClick() } Thread.sleep(1000) @@ -102,7 +102,7 @@ class CameraTest { fun switchButton() { val scenario = launchFragmentInContainer() scenario.onFragment { fragment -> - fragment.camera_switch_button.performClick() + fragment.view?.findViewById(R.id.camera_switch_button)?.performClick() } Thread.sleep(1000) scenario.onFragment { fragment -> diff --git a/app/src/androidTest/java/com/h/pixeldroid/DrawerMenuTest.kt b/app/src/androidTest/java/com/h/pixeldroid/DrawerMenuTest.kt index dde1f96c..a23d3869 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/DrawerMenuTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/DrawerMenuTest.kt @@ -61,9 +61,9 @@ class DrawerMenuTest { avatar_static = "some_avatar_url", isActive = true, accessToken = "token", - refreshToken = refreshToken, - clientId = clientId, - clientSecret = clientSecret + refreshToken = "refreshToken", + clientId = "clientId", + clientSecret = "clientSecret" ) ) db.close() @@ -132,8 +132,7 @@ class DrawerMenuTest { onView(withText(R.string.menu_account)).perform(click()) // Check that profile activity was opened. onView(withId(R.id.editButton)).check(matches(isDisplayed())) - val followersText = context.getString(R.string.nb_followers) - .format(68) + val followersText = context.resources.getQuantityString(R.plurals.nb_followers, 68) onView(withText(followersText)).perform(click()) onView(withText("Dobios")).check(matches(isDisplayed())) } @@ -144,8 +143,7 @@ class DrawerMenuTest { onView(withText(R.string.menu_account)).perform(click()) // Check that profile activity was opened. onView(withId(R.id.editButton)).check(matches(isDisplayed())) - val followingText = context.getString(R.string.nb_following) - .format(27) + val followingText = context.resources.getQuantityString(R.plurals.nb_followers, 27) onView(withText(followingText)).perform(click()) onView(withText("Dobios")).check(matches(isDisplayed())) } diff --git a/app/src/androidTest/java/com/h/pixeldroid/EditPhotoTest.kt b/app/src/androidTest/java/com/h/pixeldroid/EditPhotoTest.kt index 356cbd3b..1193e192 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/EditPhotoTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/EditPhotoTest.kt @@ -22,14 +22,14 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.GrantPermissionRule import com.google.android.material.tabs.TabLayout -import com.h.pixeldroid.adapters.ThumbnailAdapter +import com.h.pixeldroid.postCreation.photoEdit.PhotoEditActivity +import com.h.pixeldroid.postCreation.photoEdit.ThumbnailAdapter import com.h.pixeldroid.settings.AboutActivity import com.h.pixeldroid.testUtility.CustomMatchers import com.h.pixeldroid.testUtility.clearData -import junit.framework.Assert.assertTrue -import kotlinx.android.synthetic.main.fragment_edit_image.* import org.hamcrest.CoreMatchers.allOf import org.junit.* +import org.junit.Assert.assertTrue import org.junit.rules.Timeout import org.junit.runner.RunWith import java.io.File @@ -141,9 +141,9 @@ class EditPhotoTest { Espresso.onView(withId(R.id.seekbar_contrast)).perform(setProgress(change)) Espresso.onView(withId(R.id.seekbar_saturation)).perform(setProgress(change)) - Assert.assertEquals(change, activity.seekbar_brightness.progress) - Assert.assertEquals(change, activity.seekbar_contrast.progress) - Assert.assertEquals(change, activity.seekbar_saturation.progress) + Assert.assertEquals(change, activity.findViewById(R.id.seekbar_brightness).progress) + Assert.assertEquals(change, activity.findViewById(R.id.seekbar_contrast).progress) + Assert.assertEquals(change, activity.findViewById(R.id.seekbar_saturation).progress) Thread.sleep(1000) @@ -152,9 +152,9 @@ class EditPhotoTest { Espresso.onView(withId(R.id.seekbar_contrast)).perform(setProgress(change)) Espresso.onView(withId(R.id.seekbar_saturation)).perform(setProgress(change)) - Assert.assertEquals(change, activity.seekbar_brightness.progress) - Assert.assertEquals(change, activity.seekbar_contrast.progress) - Assert.assertEquals(change, activity.seekbar_saturation.progress) + Assert.assertEquals(change, activity.findViewById(R.id.seekbar_brightness).progress) + Assert.assertEquals(change, activity.findViewById(R.id.seekbar_contrast).progress) + Assert.assertEquals(change, activity.findViewById(R.id.seekbar_saturation).progress) } @Test @@ -181,7 +181,7 @@ class EditPhotoTest { @Test fun alreadyUploadingDialog() { activityScenario.onActivity { a -> a.saving = true } - Espresso.onView(withId(R.id.action_upload)).perform(click()) + Espresso.onView(withId(R.id.action_save)).perform(click()) Thread.sleep(1000) Espresso.onView(withText(R.string.busy_dialog_text)).check(matches(isDisplayed())) } diff --git a/app/src/androidTest/java/com/h/pixeldroid/HomeFeedTest.kt b/app/src/androidTest/java/com/h/pixeldroid/HomeFeedTest.kt index 0f188bac..98f340c6 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/HomeFeedTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/HomeFeedTest.kt @@ -68,9 +68,9 @@ class HomeFeedTest { avatar_static = "some_avatar_url", isActive = true, accessToken = "token", - refreshToken = refreshToken, - clientId = clientId, - clientSecret = clientSecret + refreshToken = "refreshToken", + clientId = "clientId", + clientSecret = "clientSecret" ) ) db.close() diff --git a/app/src/androidTest/java/com/h/pixeldroid/IntentTest.kt b/app/src/androidTest/java/com/h/pixeldroid/IntentTest.kt index fc1a9226..38957ee0 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/IntentTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/IntentTest.kt @@ -85,9 +85,9 @@ class IntentTest { avatar_static = "some_avatar_url", isActive = true, accessToken = "token", - refreshToken = refreshToken, - clientId = clientId, - clientSecret = clientSecret + refreshToken = "refreshToken", + clientId = "clientId", + clientSecret = "clientSecret" ) ) db.close() diff --git a/app/src/androidTest/java/com/h/pixeldroid/LoginActivityOnlineTest.kt b/app/src/androidTest/java/com/h/pixeldroid/LoginActivityOnlineTest.kt index 35ece520..78530895 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/LoginActivityOnlineTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/LoginActivityOnlineTest.kt @@ -124,9 +124,9 @@ class LoginActivityOnlineTest { avatar_static = "some_avatar_url", isActive = true, accessToken = "token", - refreshToken = refreshToken, - clientId = clientId, - clientSecret = clientSecret + refreshToken = "refreshToken", + clientId = "clientId", + clientSecret = "clientSecret" ) ) db.close() diff --git a/app/src/androidTest/java/com/h/pixeldroid/LoginCheckIntent.kt b/app/src/androidTest/java/com/h/pixeldroid/LoginCheckIntent.kt index 37c292ea..78219fbc 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/LoginCheckIntent.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/LoginCheckIntent.kt @@ -1,6 +1,5 @@ package com.h.pixeldroid -import android.content.Context import android.content.Intent import android.content.Intent.ACTION_VIEW import androidx.test.core.app.ActivityScenario @@ -28,8 +27,6 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class LoginCheckIntent { - private lateinit var context: Context - @get:Rule var globalTimeout: Timeout = Timeout.seconds(100) diff --git a/app/src/androidTest/java/com/h/pixeldroid/PostCreationFragmentTest.kt b/app/src/androidTest/java/com/h/pixeldroid/PostCreationFragmentTest.kt index 4dea5921..2f2fa227 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/PostCreationFragmentTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/PostCreationFragmentTest.kt @@ -16,13 +16,13 @@ import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.GrantPermissionRule +import com.google.android.material.tabs.TabLayout import com.h.pixeldroid.utils.db.AppDatabase import com.h.pixeldroid.utils.db.entities.InstanceDatabaseEntity import com.h.pixeldroid.utils.db.entities.UserDatabaseEntity import com.h.pixeldroid.testUtility.MockServer import com.h.pixeldroid.testUtility.clearData import com.h.pixeldroid.testUtility.initDB -import kotlinx.android.synthetic.main.activity_main.* import org.hamcrest.Matcher import org.junit.After import org.junit.Before @@ -96,9 +96,9 @@ class PostFragmentUITests { avatar_static = "some_avatar_url", isActive = true, accessToken = "token", - refreshToken = refreshToken, - clientId = clientId, - clientSecret = clientSecret + refreshToken = "refreshToken", + clientId = "clientId", + clientSecret = "clientSecret" ) ) db.close() @@ -114,7 +114,7 @@ class PostFragmentUITests { @Test fun newPostUiTest() { ActivityScenario.launch(MainActivity::class.java).onActivity { - a -> a.tabs.getTabAt(2)!!.select() + it.findViewById(R.id.tabs).getTabAt(2)!!.select() } Thread.sleep(1500) onView(withId(R.id.photo_view_button)).check(matches(isDisplayed())) diff --git a/app/src/androidTest/java/com/h/pixeldroid/PostTest.kt b/app/src/androidTest/java/com/h/pixeldroid/PostTest.kt index 1086efc5..0daab678 100644 --- a/app/src/androidTest/java/com/h/pixeldroid/PostTest.kt +++ b/app/src/androidTest/java/com/h/pixeldroid/PostTest.kt @@ -63,9 +63,9 @@ class PostTest { avatar_static = "some_avatar_url", isActive = true, accessToken = "token", - refreshToken = refreshToken, - clientId = clientId, - clientSecret = clientSecret + refreshToken = "refreshToken", + clientId = "clientId", + clientSecret = "clientSecret" ) ) db.close() @@ -76,14 +76,15 @@ class PostTest { fun saveToGalleryTestSimplePost() { val attachment = Attachment( id = "12", - url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png" + url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png", + meta = null ) val post = Status( id = "12", account = Account( id = "12", username = "douze", - url = "https://pixelfed.de/douze" + url = "https://pixelfed.de/douze", ), media_attachments = listOf(attachment) ) @@ -106,11 +107,13 @@ class PostTest { fun saveToGalleryTestAlbum() { val attachment1 = Attachment( id = "12", - url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png" + url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png", + meta = null ) val attachment2 = Attachment( id = "13", - url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png" + url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png", + meta = null ) val post = Status( id = "12", @@ -141,14 +144,15 @@ class PostTest { val expectedIntent: Matcher = IntentMatchers.hasAction(Intent.ACTION_CHOOSER) val attachment = Attachment( id = "12", - url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png" + url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png", + meta = null ) val post = Status( id = "12", account = Account( id = "12", username = "douze", - url = "https://pixelfed.de/douze" + url = "https://pixelfed.de/douze", ), media_attachments = listOf(attachment) ) @@ -166,11 +170,13 @@ class PostTest { val expectedIntent: Matcher = IntentMatchers.hasAction(Intent.ACTION_CHOOSER) val attachment1 = Attachment( id = "12", - url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png" + url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png", + meta = null ) val attachment2 = Attachment( id = "13", - url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png" + url = "https://wiki.gnugen.ch/lib/tpl/gnugen/images/logo_web.png", + meta = null ) val post = Status( id = "12", @@ -208,7 +214,7 @@ class PostTest { media_attachments= listOf( Attachment(id="15888", type= Attachment.AttachmentType.image, url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB.jpeg", preview_url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB_thumb.jpeg", - remote_url=null, text_url=null, description=null, blurhash=null) + remote_url=null, text_url=null, description=null, blurhash=null, meta = null) ), application= Application(name="web", website=null, vapid_key=null), mentions=emptyList(), tags= listOf(Tag(name="hiking", url="https://pixelfed.de/discover/tags/hiking", history=null), Tag(name="nature", url="https://pixelfed.de/discover/tags/nature", history=null), Tag(name="rotavicentina", url="https://pixelfed.de/discover/tags/rotavicentina", history=null)), @@ -235,7 +241,7 @@ class PostTest { media_attachments= listOf( Attachment(id="15888", type= Attachment.AttachmentType.image, url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB.jpeg", preview_url="https://pixelfed.de/storage/m/113a3e2124a33b1f5511e531953f5ee48456e0c7/34dd6d9fb1762dac8c7ddeeaf789d2d8fa083c9f/JtjO0eAbELpgO1UZqF5ydrKbCKRVyJUM1WAaqIeB_thumb.jpeg", - remote_url=null, text_url=null, description=null, blurhash=null) + remote_url=null, text_url=null, description=null, blurhash=null, meta = null) ), application= Application(name="web", website=null, vapid_key=null), mentions=emptyList(), tags= listOf(Tag(name="hiking", url="https://pixelfed.de/discover/tags/hiking", history=null), Tag(name="nature", url="https://pixelfed.de/discover/tags/nature", history=null), Tag(name="rotavicentina", url="https://pixelfed.de/discover/tags/rotavicentina", history=null)), diff --git a/app/src/main/java/com/h/pixeldroid/postCreation/photoEdit/PhotoEditActivity.kt b/app/src/main/java/com/h/pixeldroid/postCreation/photoEdit/PhotoEditActivity.kt index c42c9971..e6e276f3 100644 --- a/app/src/main/java/com/h/pixeldroid/postCreation/photoEdit/PhotoEditActivity.kt +++ b/app/src/main/java/com/h/pixeldroid/postCreation/photoEdit/PhotoEditActivity.kt @@ -49,7 +49,7 @@ private val REQUIRED_PERMISSIONS = arrayOf( class PhotoEditActivity : BaseActivity() { - private var saving: Boolean = false + var saving: Boolean = false private val BITMAP_CONFIG = Bitmap.Config.ARGB_8888 private val BRIGHTNESS_START = 0 private val SATURATION_START = 1.0f