From 7ed25c7f1d720a63b15fed109b8c8a4da8ffb4aa Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Thu, 28 Jul 2022 19:35:21 +0200 Subject: [PATCH 1/2] Reduce technical debt and improve code, remove hardcoded strings --- .../java/org/pixeldroid/app/LoginActivity.kt | 1 - .../java/org/pixeldroid/app/MainActivity.kt | 1 - .../app/postCreation/PostCreationActivity.kt | 15 +-- .../app/postCreation/PostCreationViewModel.kt | 3 +- .../app/postCreation/ProgressRequestBody.kt | 4 +- .../app/postCreation/SquareLayout.kt | 1 - .../app/postCreation/camera/CameraFragment.kt | 5 +- .../photoEdit/EditImageFragment.kt | 40 +++--- .../photoEdit/EditPhotoViewPagerAdapter.kt | 25 ---- .../photoEdit/FilterListFragment.kt | 66 ++++------ .../photoEdit/NonSwipeableViewPager.kt | 43 ------- .../photoEdit/PhotoEditActivity.kt | 40 ++++-- .../photoEdit/SpaceItemDecoration.kt | 22 ---- .../photoEdit/ThumbnailAdapter.kt | 3 +- .../org/pixeldroid/app/posts/AlbumActivity.kt | 2 +- .../org/pixeldroid/app/posts/HtmlUtils.kt | 2 - .../app/posts/NestedScrollableHost.kt | 2 +- .../pixeldroid/app/posts/StatusViewHolder.kt | 6 +- .../posts/feeds/CommonFeedFragmentUtils.kt | 7 +- .../feeds/cachedFeeds/CachedFeedFragment.kt | 11 +- .../uncachedFeeds/UncachedFeedFragment.kt | 10 +- .../hashtags/HashTagContentRepository.kt | 6 +- .../pixeldroid/app/profile/ProfileActivity.kt | 14 +-- .../searchDiscover/SearchDiscoverFragment.kt | 6 +- .../pixeldroid/app/utils/BlurHashDecoder.kt | 2 +- .../pixeldroid/app/utils/ImageConverter.kt | 109 +++------------- .../app/utils/PixelDroidApplication.kt | 3 +- .../java/org/pixeldroid/app/utils/Utils.kt | 3 +- .../app/utils/api/objects/Account.kt | 2 +- .../app/utils/api/objects/Status.kt | 4 +- .../main/res/layout/activity_photo_edit.xml | 2 +- .../main/res/layout/fragment_edit_image.xml | 119 ++++++++++-------- app/src/main/res/layout/post_fragment.xml | 3 +- .../main/res/layout/thumbnail_list_item.xml | 1 + app/src/main/res/values/strings.xml | 15 ++- 35 files changed, 225 insertions(+), 373 deletions(-) delete mode 100644 app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditPhotoViewPagerAdapter.kt delete mode 100644 app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/NonSwipeableViewPager.kt delete mode 100644 app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/SpaceItemDecoration.kt diff --git a/app/src/main/java/org/pixeldroid/app/LoginActivity.kt b/app/src/main/java/org/pixeldroid/app/LoginActivity.kt index 59d0caca..1f1d4f93 100644 --- a/app/src/main/java/org/pixeldroid/app/LoginActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/LoginActivity.kt @@ -303,7 +303,6 @@ class LoginActivity : BaseThemedWithoutBarActivity() { } } - @OptIn(ExperimentalPagingApi::class) private suspend fun storeUser(accessToken: String, refreshToken: String?, clientId: String, clientSecret: String, instance: String) { try { val user = pixelfedAPI.verifyCredentials("Bearer $accessToken") diff --git a/app/src/main/java/org/pixeldroid/app/MainActivity.kt b/app/src/main/java/org/pixeldroid/app/MainActivity.kt index 0407c857..cd80b0d8 100644 --- a/app/src/main/java/org/pixeldroid/app/MainActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/MainActivity.kt @@ -62,7 +62,6 @@ class MainActivity : BaseThemedWithoutBarActivity() { companion object { const val ADD_ACCOUNT_IDENTIFIER: Long = -13 - const val LOG_OUT_REQUESTED = "LOG_OUT_REQUESTED" } private lateinit var binding: ActivityMainBinding diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt index 9048c8f5..9539fe00 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationActivity.kt @@ -13,6 +13,7 @@ import android.util.Log import android.view.View import android.view.View.INVISIBLE import android.view.View.VISIBLE +import android.view.View.GONE import android.widget.Toast import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher @@ -195,7 +196,7 @@ class PostCreationActivity : BaseThemedWithoutBarActivity() { model.setImages(model.addPossibleImages(it)) } } else if (result.resultCode != Activity.RESULT_CANCELED) { - Toast.makeText(applicationContext, "Error while adding images", Toast.LENGTH_SHORT).show() + Toast.makeText(applicationContext, R.string.add_images_error, Toast.LENGTH_SHORT).show() } } @@ -296,11 +297,11 @@ class PostCreationActivity : BaseThemedWithoutBarActivity() { private fun enableButton(enable: Boolean = true){ binding.postCreationSendButton.isEnabled = enable if(enable){ - binding.postingProgressBar.visibility = View.GONE - binding.postCreationSendButton.visibility = View.VISIBLE + binding.postingProgressBar.visibility = GONE + binding.postCreationSendButton.visibility = VISIBLE } else { - binding.postingProgressBar.visibility = View.VISIBLE - binding.postCreationSendButton.visibility = View.GONE + binding.postingProgressBar.visibility = VISIBLE + binding.postCreationSendButton.visibility = GONE } } @@ -310,9 +311,9 @@ class PostCreationActivity : BaseThemedWithoutBarActivity() { if (result?.resultCode == Activity.RESULT_OK && result.data != null) { val position: Int = result.data!!.getIntExtra(PhotoEditActivity.PICTURE_POSITION, 0) model.modifyAt(position, result.data!!) - ?: Toast.makeText(applicationContext, "Error while editing", Toast.LENGTH_SHORT).show() + ?: Toast.makeText(applicationContext, R.string.error_editing, Toast.LENGTH_SHORT).show() } else if(result?.resultCode != Activity.RESULT_CANCELED){ - Toast.makeText(applicationContext, "Error while editing", Toast.LENGTH_SHORT).show() + Toast.makeText(applicationContext, R.string.error_editing, Toast.LENGTH_SHORT).show() } } diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationViewModel.kt b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationViewModel.kt index f5e57acb..219f1256 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationViewModel.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/PostCreationViewModel.kt @@ -248,7 +248,8 @@ class PostCreationViewModel(application: Application, clipdata: ClipData? = null return } - val imagePart = ProgressRequestBody(imageInputStream, data.size) + val type = imageUri.getMimeType(getApplication().contentResolver) + val imagePart = ProgressRequestBody(imageInputStream, data.size, type) val requestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", System.currentTimeMillis().toString(), imagePart) diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/ProgressRequestBody.kt b/app/src/main/java/org/pixeldroid/app/postCreation/ProgressRequestBody.kt index 499d1733..684a9bff 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/ProgressRequestBody.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/ProgressRequestBody.kt @@ -8,7 +8,7 @@ import okhttp3.RequestBody import okio.BufferedSink import java.io.* -class ProgressRequestBody(private val mFile: InputStream, private val length: Long) : RequestBody() { +class ProgressRequestBody(private val mFile: InputStream, private val length: Long, private val type: String) : RequestBody() { private val getProgressSubject: PublishSubject = PublishSubject.create() @@ -18,7 +18,7 @@ class ProgressRequestBody(private val mFile: InputStream, private val length: Lo } override fun contentType(): MediaType? { - return "image/png".toMediaTypeOrNull() + return type.toMediaTypeOrNull() } @Throws(IOException::class) diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt b/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt index f024d76b..6c9478c9 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/SquareLayout.kt @@ -3,7 +3,6 @@ package org.pixeldroid.app.postCreation import android.content.Context import android.util.AttributeSet import android.widget.FrameLayout -import android.widget.RelativeLayout internal class SquareLayout(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) { diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraFragment.kt b/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraFragment.kt index 4091b36c..cbaeada8 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/camera/CameraFragment.kt @@ -25,14 +25,15 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.core.view.setPadding -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.pixeldroid.app.R import org.pixeldroid.app.databinding.FragmentCameraBinding import org.pixeldroid.app.postCreation.PostCreationActivity +import org.pixeldroid.app.utils.BaseFragment import java.io.File import java.util.concurrent.ExecutorService import java.util.concurrent.Executors @@ -40,8 +41,6 @@ import kotlin.math.abs import kotlin.math.max import kotlin.math.min import kotlin.properties.Delegates -import org.pixeldroid.app.R -import org.pixeldroid.app.utils.BaseFragment private const val ANIMATION_FAST_MILLIS = 50L private const val ANIMATION_SLOW_MILLIS = 100L diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditImageFragment.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditImageFragment.kt index 1602ac88..e09bf2bb 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditImageFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditImageFragment.kt @@ -7,14 +7,12 @@ import android.view.View import android.view.ViewGroup import android.widget.SeekBar import org.pixeldroid.app.R +import org.pixeldroid.app.databinding.FragmentEditImageBinding class EditImageFragment : Fragment(), SeekBar.OnSeekBarChangeListener { private var listener: PhotoEditActivity? = null - - private lateinit var seekbarBrightness: SeekBar - private lateinit var seekbarSaturation: SeekBar - private lateinit var seekbarContrast: SeekBar + private lateinit var binding: FragmentEditImageBinding private var BRIGHTNESS_MAX = 200 private var SATURATION_MAX = 20 @@ -26,32 +24,28 @@ class EditImageFragment : Fragment(), SeekBar.OnSeekBarChangeListener { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { // Inflate the layout for this fragment - val view = inflater.inflate(R.layout.fragment_edit_image, container, false) + binding = FragmentEditImageBinding.inflate(inflater, container, false) - seekbarBrightness = view.findViewById(R.id.seekbar_brightness) - seekbarSaturation = view.findViewById(R.id.seekbar_saturation) - seekbarContrast = view.findViewById(R.id.seekbar_contrast) + binding.seekbarBrightness.max = BRIGHTNESS_MAX + binding.seekbarBrightness.progress = BRIGHTNESS_START - seekbarBrightness.max = BRIGHTNESS_MAX - seekbarBrightness.progress = BRIGHTNESS_START + binding.seekbarContrast.max = CONTRAST_MAX + binding.seekbarContrast.progress = CONTRAST_START - seekbarContrast.max = CONTRAST_MAX - seekbarContrast.progress = CONTRAST_START - - seekbarSaturation.max = SATURATION_MAX - seekbarSaturation.progress = SATURATION_START + binding.seekbarSaturation.max = SATURATION_MAX + binding.seekbarSaturation.progress = SATURATION_START setOnSeekBarChangeListeners(this) - return view + return binding.root } private fun setOnSeekBarChangeListeners(listener: EditImageFragment?){ - seekbarBrightness.setOnSeekBarChangeListener(listener) - seekbarContrast.setOnSeekBarChangeListener(listener) - seekbarSaturation.setOnSeekBarChangeListener(listener) + binding.seekbarBrightness.setOnSeekBarChangeListener(listener) + binding.seekbarContrast.setOnSeekBarChangeListener(listener) + binding.seekbarSaturation.setOnSeekBarChangeListener(listener) } override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { @@ -75,9 +69,9 @@ class EditImageFragment : Fragment(), SeekBar.OnSeekBarChangeListener { // Make sure to ignore seekbar change events, since we don't want to have the reset cause // filter applications due to the onProgressChanged calls setOnSeekBarChangeListeners(null) - seekbarBrightness.progress = BRIGHTNESS_START - seekbarContrast.progress = CONTRAST_START - seekbarSaturation.progress = SATURATION_START + binding.seekbarBrightness.progress = BRIGHTNESS_START + binding.seekbarContrast.progress = CONTRAST_START + binding.seekbarSaturation.progress = SATURATION_START setOnSeekBarChangeListeners(this) } diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditPhotoViewPagerAdapter.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditPhotoViewPagerAdapter.kt deleted file mode 100644 index db23f72e..00000000 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/EditPhotoViewPagerAdapter.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.pixeldroid.app.postCreation.photoEdit - -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter - -class EditPhotoViewPagerAdapter (manager: FragmentManager): - FragmentPagerAdapter(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { - - private val fragmentList = ArrayList() - private val fragmentTitleList = ArrayList() - - override fun getItem(position: Int) = fragmentList[position] - - override fun getCount() = fragmentList.size - - fun addFragment(fragment: Fragment, title: String) { - fragmentList.add(fragment) - fragmentTitleList.add(title) - } - - override fun getPageTitle(position: Int): CharSequence { - return fragmentTitleList[position] - } -} \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/FilterListFragment.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/FilterListFragment.kt index 1d02bbc7..9e139ba5 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/FilterListFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/FilterListFragment.kt @@ -1,75 +1,64 @@ package org.pixeldroid.app.postCreation.photoEdit import android.graphics.Bitmap -import android.graphics.ImageDecoder -import android.os.Build import android.os.Bundle -import android.provider.MediaStore -import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import org.pixeldroid.app.R import com.zomato.photofilters.FilterPack import com.zomato.photofilters.imageprocessors.Filter import com.zomato.photofilters.utils.ThumbnailItem import com.zomato.photofilters.utils.ThumbnailsManager +import kotlinx.coroutines.launch +import org.pixeldroid.app.R +import org.pixeldroid.app.databinding.FragmentFilterListBinding import org.pixeldroid.app.utils.bitmapFromUri class FilterListFragment : Fragment() { - private lateinit var recyclerView: RecyclerView - private var listener : PhotoEditActivity? = null + private lateinit var binding: FragmentFilterListBinding + + private var listener : ((Filter) -> Unit)? = null internal lateinit var adapter: ThumbnailAdapter private lateinit var tbItemList: MutableList override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { // Inflate the layout for this fragment - val view = inflater.inflate(R.layout.fragment_filter_list, container, false) + binding = FragmentFilterListBinding.inflate(inflater, container, false) tbItemList = ArrayList() - recyclerView = view.findViewById(R.id.recycler_view) - recyclerView.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) - recyclerView.itemAnimator = DefaultItemAnimator() - - val space = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8f, resources.displayMetrics).toInt() - recyclerView.addItemDecoration(SpaceItemDecoration(space)) + binding.recyclerView.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) adapter = ThumbnailAdapter(requireActivity(), tbItemList, this) - recyclerView.adapter = adapter + binding.recyclerView.adapter = adapter - return view + return binding.root } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - displayImage(null) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + displayImage() } - private fun displayImage(bitmap: Bitmap?) { - val r = Runnable { - val tbImage: Bitmap = (if (bitmap == null) { - bitmapFromUri(requireActivity().contentResolver, PhotoEditActivity.imageUri) - } else { - Bitmap.createScaledBitmap(bitmap, 100, 100, false) - }) - ?: return@Runnable + private fun displayImage() { + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) { + val tbImage: Bitmap = bitmapFromUri(requireActivity().contentResolver, PhotoEditActivity.imageUri) + setupFilter(tbImage) - if(activity != null) setupFilter(tbImage) - - if(context != null) tbItemList.addAll(ThumbnailsManager.processThumbs(context)) - activity?.runOnUiThread{ adapter.notifyDataSetChanged() } + tbItemList.addAll(ThumbnailsManager.processThumbs(context)) + adapter.notifyDataSetChanged() + } } - - Thread(r).start() } private fun setupFilter(tbImage: Bitmap?) { @@ -95,14 +84,13 @@ class FilterListFragment : Fragment() { fun resetSelectedFilter(){ adapter.resetSelected() - displayImage(null) } fun onFilterSelected(filter: Filter) { - listener?.onFilterSelected(filter) + listener?.invoke(filter) } - fun setListener(listFragmentListener: PhotoEditActivity) { + fun setListener(listFragmentListener: (filter: Filter) -> Unit) { this.listener = listFragmentListener } } diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/NonSwipeableViewPager.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/NonSwipeableViewPager.kt deleted file mode 100644 index 4e7145b4..00000000 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/NonSwipeableViewPager.kt +++ /dev/null @@ -1,43 +0,0 @@ -package org.pixeldroid.app.postCreation.photoEdit - -import android.content.Context -import android.util.AttributeSet -import android.view.MotionEvent -import android.view.animation.DecelerateInterpolator -import android.widget.Scroller -import androidx.viewpager.widget.ViewPager - -class NonSwipeableViewPager: ViewPager { - constructor(context: Context):super(context) { - setMyScroller() - } - - constructor(context: Context,attributeSet: AttributeSet): super(context, attributeSet) { - setMyScroller() - } - - override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { - return false - } - - override fun onTouchEvent(ev: MotionEvent?): Boolean { - return false - } - - private fun setMyScroller() { - try { - val viewPager = ViewPager::class.java - val scroller = viewPager.getDeclaredField("mScroller") - scroller.isAccessible = true - scroller.set(this, FilterScroller(context)) - } catch (e:Exception) { - e.printStackTrace() - } - } -} - -class FilterScroller(context: Context): Scroller(context, DecelerateInterpolator()) { - override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) { - super.startScroll(startX, startY, dx, dy, 400) - } -} \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt index 9a75a521..a5024742 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/PhotoEditActivity.kt @@ -5,12 +5,10 @@ import android.app.AlertDialog import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap -import android.graphics.Color import android.graphics.Point import android.graphics.drawable.BitmapDrawable import android.net.Uri import android.os.Bundle -import android.util.TypedValue import android.view.Menu import android.view.MenuItem import android.view.View.GONE @@ -18,9 +16,12 @@ import android.view.View.VISIBLE import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 import com.bumptech.glide.Glide -import com.google.android.material.color.MaterialColors import com.google.android.material.snackbar.Snackbar +import com.google.android.material.tabs.TabLayoutMediator import com.yalantis.ucrop.UCrop import com.zomato.photofilters.imageprocessors.Filter import com.zomato.photofilters.imageprocessors.subfilters.BrightnessSubFilter @@ -115,7 +116,6 @@ class PhotoEditActivity : BaseThemedWithBarActivity() { loadImage() setupViewPager(binding.viewPager) - binding.tabs.setupWithViewPager(binding.viewPager) } private fun loadImage() { @@ -137,18 +137,36 @@ class PhotoEditActivity : BaseThemedWithBarActivity() { return Bitmap.createScaledBitmap(image, (image.width * scale).toInt(), newY.toInt(), true) } - private fun setupViewPager(viewPager: NonSwipeableViewPager?) { - val adapter = EditPhotoViewPagerAdapter(supportFragmentManager) - + private fun setupViewPager(viewPager: ViewPager2) { filterListFragment = FilterListFragment() - filterListFragment.setListener(this) + filterListFragment.setListener(::onFilterSelected) editImageFragment = EditImageFragment() editImageFragment.setListener(this) - adapter.addFragment(filterListFragment, "FILTERS") - adapter.addFragment(editImageFragment, "EDIT") - viewPager!!.adapter = adapter + val tabs: List<() -> Fragment> = listOf({ filterListFragment }, { editImageFragment }) + + // Keep both tabs loaded at all times because values are needed there + viewPager.offscreenPageLimit = 1 + + //Disable swiping in viewpager + viewPager.isUserInputEnabled = false + + viewPager.adapter = object : FragmentStateAdapter(this) { + override fun createFragment(position: Int): Fragment { + return tabs[position]() + } + + override fun getItemCount(): Int { + return tabs.size + } + } + TabLayoutMediator(binding.tabs, viewPager) { tab, position -> + tab.setText(when(position) { + 0 -> R.string.tab_filters + else -> R.string.edit + }) + }.attach() } override fun onCreateOptionsMenu(menu: Menu): Boolean { diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/SpaceItemDecoration.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/SpaceItemDecoration.kt deleted file mode 100644 index b720aba9..00000000 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/SpaceItemDecoration.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.pixeldroid.app.postCreation.photoEdit - -import android.graphics.Rect -import android.view.View -import androidx.recyclerview.widget.RecyclerView - -class SpaceItemDecoration(private val space: Int): RecyclerView.ItemDecoration() { - override fun getItemOffsets( - outRect: Rect, - view: View, - parent: RecyclerView, - state: RecyclerView.State - ) { - if (parent.getChildAdapterPosition(view) == state.itemCount - 1) { - outRect.left = space - outRect.right = 0 - } else { - outRect.left = 0 - outRect.right = space - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt index 52448d8b..bad3c242 100644 --- a/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt +++ b/app/src/main/java/org/pixeldroid/app/postCreation/photoEdit/ThumbnailAdapter.kt @@ -5,11 +5,10 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView -import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView +import com.zomato.photofilters.utils.ThumbnailItem import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ThumbnailListItemBinding -import com.zomato.photofilters.utils.ThumbnailItem import org.pixeldroid.app.utils.getColorFromAttr class ThumbnailAdapter (private val context: Context, diff --git a/app/src/main/java/org/pixeldroid/app/posts/AlbumActivity.kt b/app/src/main/java/org/pixeldroid/app/posts/AlbumActivity.kt index 311a9be9..3b577d97 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/AlbumActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/AlbumActivity.kt @@ -36,6 +36,6 @@ class AlbumActivity : BaseActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayShowTitleEnabled(false) supportActionBar?.setBackgroundDrawable(null) - window.statusBarColor = ContextCompat.getColor(this,android.R.color.transparent); + window.statusBarColor = ContextCompat.getColor(this,android.R.color.transparent) } } \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/posts/HtmlUtils.kt b/app/src/main/java/org/pixeldroid/app/posts/HtmlUtils.kt index eb9ee3b7..e56e64fe 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/HtmlUtils.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/HtmlUtils.kt @@ -7,7 +7,6 @@ import android.text.SpannableStringBuilder import android.text.Spanned import android.text.style.ClickableSpan import android.text.style.URLSpan -import android.util.Log import android.view.View import android.widget.TextView import androidx.core.text.toSpanned @@ -22,7 +21,6 @@ import java.net.URI import java.net.URISyntaxException import java.text.ParseException import java.time.Instant -import java.time.ZoneOffset import java.util.* fun fromHtml(html: String): Spanned { diff --git a/app/src/main/java/org/pixeldroid/app/posts/NestedScrollableHost.kt b/app/src/main/java/org/pixeldroid/app/posts/NestedScrollableHost.kt index 9a4d74a1..057715f7 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/NestedScrollableHost.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/NestedScrollableHost.kt @@ -38,7 +38,7 @@ class NestedScrollableHost(context: Context, attrs: AttributeSet? = null) : } - var images: ArrayList = ArrayList(); + var images: ArrayList = ArrayList() var doubleTapCallback: (() -> Unit)? = null private val child: View? get() = if (childCount > 0) getChildAt(0) else null diff --git a/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt b/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt index 31d44b24..d23e7f7f 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/StatusViewHolder.kt @@ -42,7 +42,6 @@ import org.pixeldroid.app.databinding.OpenedAlbumBinding import org.pixeldroid.app.databinding.PostFragmentBinding import org.pixeldroid.app.posts.MediaViewerActivity.Companion.openActivity import org.pixeldroid.app.utils.BlurHashDecoder -import org.pixeldroid.app.utils.ImageConverter import org.pixeldroid.app.utils.api.PixelfedAPI import org.pixeldroid.app.utils.api.objects.Attachment import org.pixeldroid.app.utils.api.objects.Status @@ -51,6 +50,7 @@ import org.pixeldroid.app.utils.api.objects.Status.Companion.POST_TAG import org.pixeldroid.app.utils.api.objects.Status.Companion.VIEW_COMMENTS_TAG import org.pixeldroid.app.utils.db.AppDatabase import org.pixeldroid.app.utils.di.PixelfedAPIHolder +import org.pixeldroid.app.utils.setProfileImageFromURL import retrofit2.HttpException import java.io.File import java.io.IOException @@ -132,10 +132,10 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold binding.root.context ) - binding.postDomain.text = status?.getStatusDomain(domain) + binding.postDomain.text = status?.getStatusDomain(domain, binding.postDomain.context) //Setup images - ImageConverter.setRoundImageFromURL( + setProfileImageFromURL( binding.root, status?.getProfilePicUrl(), binding.profilePic diff --git a/app/src/main/java/org/pixeldroid/app/posts/feeds/CommonFeedFragmentUtils.kt b/app/src/main/java/org/pixeldroid/app/posts/feeds/CommonFeedFragmentUtils.kt index daa19705..f0d7959c 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/feeds/CommonFeedFragmentUtils.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/feeds/CommonFeedFragmentUtils.kt @@ -6,7 +6,6 @@ import android.view.ViewGroup import android.widget.ProgressBar import androidx.constraintlayout.motion.widget.MotionLayout import androidx.core.view.isVisible -import androidx.core.view.size import androidx.lifecycle.LifecycleCoroutineScope import androidx.paging.LoadState import androidx.paging.LoadStateAdapter @@ -14,14 +13,14 @@ import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.gson.Gson +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.pixeldroid.app.R import org.pixeldroid.app.databinding.ErrorLayoutBinding import org.pixeldroid.app.databinding.LoadStateFooterViewItemBinding import org.pixeldroid.app.posts.feeds.uncachedFeeds.FeedViewModel import org.pixeldroid.app.utils.api.objects.FeedContent -import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch import retrofit2.HttpException /** diff --git a/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/CachedFeedFragment.kt b/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/CachedFeedFragment.kt index 6b73df07..76b088d5 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/CachedFeedFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/feeds/cachedFeeds/CachedFeedFragment.kt @@ -7,12 +7,15 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import androidx.paging.* -import androidx.paging.LoadState.* -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.paging.ExperimentalPagingApi +import androidx.paging.LoadState.NotLoading +import androidx.paging.PagingDataAdapter +import androidx.paging.RemoteMediator import androidx.recyclerview.widget.RecyclerView import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.distinctUntilChangedBy +import kotlinx.coroutines.flow.filter import org.pixeldroid.app.databinding.FragmentFeedBinding import org.pixeldroid.app.posts.feeds.initAdapter import org.pixeldroid.app.utils.BaseFragment diff --git a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedFeedFragment.kt b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedFeedFragment.kt index e23f5061..ef24a535 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedFeedFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/UncachedFeedFragment.kt @@ -7,18 +7,18 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import androidx.paging.* +import androidx.paging.ExperimentalPagingApi +import androidx.paging.LoadState +import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.RecyclerView -import org.pixeldroid.app.posts.feeds.launch import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch - import org.pixeldroid.app.databinding.FragmentFeedBinding -import org.pixeldroid.app.utils.BaseFragment import org.pixeldroid.app.posts.feeds.initAdapter +import org.pixeldroid.app.posts.feeds.launch +import org.pixeldroid.app.utils.BaseFragment import org.pixeldroid.app.utils.api.objects.FeedContent diff --git a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagContentRepository.kt b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagContentRepository.kt index f4238774..3491cb83 100644 --- a/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagContentRepository.kt +++ b/app/src/main/java/org/pixeldroid/app/posts/feeds/uncachedFeeds/hashtags/HashTagContentRepository.kt @@ -4,11 +4,9 @@ import androidx.paging.ExperimentalPagingApi import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData -import org.pixeldroid.app.utils.api.PixelfedAPI -import org.pixeldroid.app.posts.feeds.uncachedFeeds.UncachedContentRepository -import org.pixeldroid.app.utils.api.objects.FeedContent -import org.pixeldroid.app.utils.api.objects.Results import kotlinx.coroutines.flow.Flow +import org.pixeldroid.app.posts.feeds.uncachedFeeds.UncachedContentRepository +import org.pixeldroid.app.utils.api.PixelfedAPI import org.pixeldroid.app.utils.api.objects.Status import javax.inject.Inject diff --git a/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt b/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt index ebe666c6..d50b9d30 100644 --- a/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/profile/ProfileActivity.kt @@ -33,15 +33,12 @@ import org.pixeldroid.app.posts.feeds.uncachedFeeds.FeedViewModel import org.pixeldroid.app.posts.feeds.uncachedFeeds.UncachedContentRepository import org.pixeldroid.app.posts.feeds.uncachedFeeds.profile.ProfileContentRepository import org.pixeldroid.app.posts.parseHTMLText -import org.pixeldroid.app.utils.BaseThemedWithBarActivity -import org.pixeldroid.app.utils.BlurHashDecoder -import org.pixeldroid.app.utils.ImageConverter +import org.pixeldroid.app.utils.* import org.pixeldroid.app.utils.api.PixelfedAPI import org.pixeldroid.app.utils.api.objects.Account import org.pixeldroid.app.utils.api.objects.Attachment import org.pixeldroid.app.utils.api.objects.Status import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity -import org.pixeldroid.app.utils.openUrl import retrofit2.HttpException import java.io.IOException @@ -99,9 +96,9 @@ class ProfileActivity : BaseThemedWithBarActivity() { } /** - * Shows or hides the error in the different FeedFragments + * Shows or hides the error in the profile */ - private fun showError(errorText: String = "Something went wrong while loading", show: Boolean = true){ + private fun showError(errorText: String = getString(R.string.profile_error), show: Boolean = true){ if(show){ binding.profileProgressBar.visibility = View.GONE binding.motionLayout.transitionToEnd() @@ -116,6 +113,7 @@ class ProfileActivity : BaseThemedWithBarActivity() { if(account != null) { setViews(account) } else { + supportActionBar?.setTitle(R.string.menu_account) lifecycleScope.launchWhenResumed { val api: PixelfedAPI = apiHolder.api ?: apiHolder.setToCurrentUser() val myAccount: Account = try { @@ -149,7 +147,7 @@ class ProfileActivity : BaseThemedWithBarActivity() { */ private fun setViews(account: Account) { val profilePicture = binding.profilePictureImageView - ImageConverter.setRoundImageFromURL( + setProfileImageFromURL( View(applicationContext), account.anyAvatar(), profilePicture @@ -368,7 +366,7 @@ class ProfilePostsViewHolder(binding: FragmentProfilePostsBinding) : RecyclerVie ).placeholder(R.drawable.ic_sensitive).apply(RequestOptions().centerCrop()) .into(postPreview) } else { - ImageConverter.setSquareImageFromURL(postPreview, + setSquareImageFromURL(postPreview, post.getPostPreviewURL(), postPreview, post.media_attachments?.firstOrNull()?.blurhash) diff --git a/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchDiscoverFragment.kt b/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchDiscoverFragment.kt index 05f5c5c6..9b8acdb8 100644 --- a/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchDiscoverFragment.kt +++ b/app/src/main/java/org/pixeldroid/app/searchDiscover/SearchDiscoverFragment.kt @@ -18,9 +18,9 @@ import org.pixeldroid.app.utils.api.PixelfedAPI import org.pixeldroid.app.utils.api.objects.Status import org.pixeldroid.app.posts.PostActivity import org.pixeldroid.app.utils.BaseFragment -import org.pixeldroid.app.utils.ImageConverter import org.pixeldroid.app.utils.api.objects.Attachment import org.pixeldroid.app.utils.bindingLifecycleAware +import org.pixeldroid.app.utils.setSquareImageFromURL import retrofit2.HttpException import java.io.IOException @@ -69,7 +69,7 @@ class SearchDiscoverFragment : BaseFragment() { } } - fun showError(@StringRes errorText: Int = R.string.loading_toast, show: Boolean = true){ + private fun showError(@StringRes errorText: Int = R.string.loading_toast, show: Boolean = true){ binding.motionLayout.apply { if(show){ transitionToEnd() @@ -126,7 +126,7 @@ class SearchDiscoverFragment : BaseFragment() { } else holder.videoIcon.visibility = View.GONE } - ImageConverter.setSquareImageFromURL(holder.postView, post?.getPostPreviewURL(), holder.postPreview, post?.media_attachments?.firstOrNull()?.blurhash) + setSquareImageFromURL(holder.postView, post?.getPostPreviewURL(), 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/org/pixeldroid/app/utils/BlurHashDecoder.kt b/app/src/main/java/org/pixeldroid/app/utils/BlurHashDecoder.kt index d45cb367..734ad2d4 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/BlurHashDecoder.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/BlurHashDecoder.kt @@ -29,7 +29,7 @@ object BlurHashDecoder { ) } - fun decode(blurHash: String?, width: Int?, height: Int?, punch: Float = 1f): Bitmap? { + private fun decode(blurHash: String?, width: Int?, height: Int?, punch: Float = 1f): Bitmap? { if (blurHash == null || width == null || height == null || blurHash.length < 6) { return null } diff --git a/app/src/main/java/org/pixeldroid/app/utils/ImageConverter.kt b/app/src/main/java/org/pixeldroid/app/utils/ImageConverter.kt index ce8dca05..afbf7355 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/ImageConverter.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/ImageConverter.kt @@ -1,99 +1,30 @@ package org.pixeldroid.app.utils -import android.graphics.drawable.Drawable import android.view.View import android.widget.ImageView -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import org.pixeldroid.app.R -class ImageConverter { - companion object { - /** - * @brief Loads a given image (via url) into a given image view - * @param activity, the activity in which this is happening - * @param url, the url of the image that will be loaded - * @param view, the imageView into which we will load the image - */ - fun setImageViewFromURL(activity: AppCompatActivity, url : String?, view : ImageView) { - Glide.with(activity).load(url).into(view) - } + /** + * @brief Loads a given image (via url) as a round image into a given image view + * @param view, the view in which this is happening + * @param url, the url of the image that will be loaded + * @param image, the imageView into which we will load the image + */ +fun setProfileImageFromURL(view : View, url : String?, image : ImageView) { + Glide.with(view).load(url).apply(RequestOptions().circleCrop()) + .placeholder(R.drawable.ic_default_user).into(image) +} - /** - * @brief Loads a given image (via url) into a given image view - * @param fragment, the fragment in which this is happening - * @param url, the url of the image that will be loaded - * @param view, the imageView into which we will load the image - */ - fun setImageViewFromURL(fragment: Fragment, url : String?, view : ImageView) { - Glide.with(fragment).load(url).into(view) - } - - /** - * @brief Loads a given image (via url) into a given image view - * @param fragmentActivity, the fragmentActivity in which this is happening - * @param url, the url of the image that will be loaded - * @param view, the imageView into which we will load the image - */ - fun setImageViewFromURL(fragmentActivity: FragmentActivity, url : String?, view : ImageView) { - Glide.with(fragmentActivity).load(url).into(view) - } - - /** - * @brief Loads a given image (via url) into a given image view - * @param fragView, the view in which this is happening - * @param url, the url of the image that will be loaded - * @param view, the imageView into which we will load the image - */ - fun setImageViewFromURL(fragView: View, url : String?, view : ImageView) { - Glide.with(fragView).load(url).into(view) - } - - /** - * @brief Loads a given image (via url) as a round image into a given image view - * @param view, the view in which this is happening - * @param url, the url of the image that will be loaded - * @param image, the imageView into which we will load the image - */ - fun setRoundImageFromURL(view : View, url : String?, image : ImageView) { - Glide.with(view).load(url).apply(RequestOptions().circleCrop()) - .placeholder(R.drawable.ic_default_user).into(image) - } - - /** - * @brief Loads a given image (via url) as a square image into a given image view - * @param view, the view in which this is happening - * @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, blurhash: String? = null) { - Glide.with(view).load(url).placeholder( - blurhash?.let { BlurHashDecoder.blurHashBitmap(view.resources, it, 32,32) } - ).apply(RequestOptions().centerCrop()).into(image) - - } - - /** - * @brief Loads a given image (via url) as a square image into a given image view - * @param view, the view in which this is happening - * @param drawable, the drawable of the image - * @param image, the imageView into which we will load the image - */ - fun setSquareImageFromDrawable(view : View, drawable : Drawable?, image : ImageView) { - Glide.with(view).load(drawable).apply(RequestOptions().centerCrop()).into(image) - - } - - /** - * @brief Loads a default image into a given image view - * @param view, the view in which this is happening - * @param image, the imageView into which we will load the image - */ - fun setImageFromDrawable(view : View, image : ImageView, drawable : Int) { - Glide.with(view).load(drawable).into(image) - } - } +/** + * @brief Loads a given image (via url) as a square image into a given image view + * @param view, the view in which this is happening + * @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, blurhash: String? = null) { + Glide.with(view).load(url).placeholder( + blurhash?.let { BlurHashDecoder.blurHashBitmap(view.resources, it, 32, 32) } + ).apply(RequestOptions().centerCrop()).into(image) } \ No newline at end of file diff --git a/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt b/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt index 74905e50..44f81387 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/PixelDroidApplication.kt @@ -3,9 +3,8 @@ package org.pixeldroid.app.utils import android.app.Application import androidx.preference.PreferenceManager import com.google.android.material.color.DynamicColors -import org.pixeldroid.app.utils.di.* -import com.mikepenz.iconics.Iconics import org.ligi.tracedroid.TraceDroid +import org.pixeldroid.app.utils.di.* class PixelDroidApplication: Application() { diff --git a/app/src/main/java/org/pixeldroid/app/utils/Utils.kt b/app/src/main/java/org/pixeldroid/app/utils/Utils.kt index d760ae57..9e235cad 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/Utils.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/Utils.kt @@ -29,6 +29,7 @@ import com.arthenica.ffmpegkit.FFmpegKitConfig import com.google.android.material.color.MaterialColors import okhttp3.HttpUrl import org.pixeldroid.app.R +import java.util.* import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty @@ -65,7 +66,7 @@ fun Uri.getMimeType(contentResolver: ContentResolver, fallback: String = "image/ contentResolver.getType(this) } else { MimeTypeMap.getFileExtensionFromUrl(toString()) - ?.run { MimeTypeMap.getSingleton().getMimeTypeFromExtension(toLowerCase()) } + ?.run { MimeTypeMap.getSingleton().getMimeTypeFromExtension(lowercase(Locale.getDefault())) } } ?: fallback } diff --git a/app/src/main/java/org/pixeldroid/app/utils/api/objects/Account.kt b/app/src/main/java/org/pixeldroid/app/utils/api/objects/Account.kt index 39072875..d084799c 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/api/objects/Account.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/api/objects/Account.kt @@ -73,7 +73,7 @@ data class Account( fun getDisplayName() : String = when { username.isNullOrBlank() && display_name.isNullOrBlank() -> "" display_name.isNullOrBlank() -> "@$username" - else -> display_name.orEmpty() + else -> display_name } fun anyAvatar(): String? = avatar_static ?: avatar diff --git a/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt b/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt index 9e860577..22e72806 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/api/objects/Status.kt @@ -84,10 +84,10 @@ open class Status( ) } - fun getStatusDomain(domain: String) : String { + fun getStatusDomain(domain: String, context: Context) : String { val accountDomain = getDomain(account!!.url) return if(getDomain(domain) == accountDomain) "" - else " from $accountDomain" + else context.getString(R.string.from_other_domain).format(accountDomain) } diff --git a/app/src/main/res/layout/activity_photo_edit.xml b/app/src/main/res/layout/activity_photo_edit.xml index bde67174..279f9d8b 100644 --- a/app/src/main/res/layout/activity_photo_edit.xml +++ b/app/src/main/res/layout/activity_photo_edit.xml @@ -26,7 +26,7 @@ android:scaleType="centerInside" android:contentDescription="@string/image_preview" /> - - - - - - - - - + - + - + - + - + - + - + - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/post_fragment.xml b/app/src/main/res/layout/post_fragment.xml index f0c25e18..a9ca4719 100644 --- a/app/src/main/res/layout/post_fragment.xml +++ b/app/src/main/res/layout/post_fragment.xml @@ -42,11 +42,12 @@ android:id="@+id/postDomain" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="8dp" android:textColor="#b3b3b3" app:layout_constraintBottom_toBottomOf="@+id/profilePic" app:layout_constraintStart_toEndOf="@+id/username" app:layout_constraintTop_toTopOf="@+id/profilePic" - tools:text=" from domain.tld" /> + tools:text="from domain.tld" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8a0c5863..7b15ebb1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -119,10 +119,10 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" - BRIGHTNESS - CONTRAST - SATURATION - FILTERS + Brightness + Contrast + Saturation + Filters Edit Thumbnail of filter Normal @@ -133,6 +133,7 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" Button to crop or rotate the image Save your edits? No, cancel edit + Error while editing Capture @@ -282,4 +283,10 @@ For more info about Pixelfed, you can check here: https://pixelfed.org" Choose a color accent Choose this color accent Chosen color accent + Could not load profile + + + from %1$s + + Error while adding images \ No newline at end of file From fa20a7731a8bfafd548022f1a718b84c8e643ef0 Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Thu, 28 Jul 2022 20:56:29 +0200 Subject: [PATCH 2/2] Remove hardcoded strings, add contentdescriptions --- .../app/utils/notificationsWorker/NotificationsWorker.kt | 5 ++--- app/src/main/res/layout/fragment_notifications.xml | 2 +- app/src/main/res/layout/fragment_profile_posts.xml | 2 +- app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/pixeldroid/app/utils/notificationsWorker/NotificationsWorker.kt b/app/src/main/java/org/pixeldroid/app/utils/notificationsWorker/NotificationsWorker.kt index ddd3d3a7..af1d924e 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/notificationsWorker/NotificationsWorker.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/notificationsWorker/NotificationsWorker.kt @@ -6,7 +6,6 @@ import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent -import android.graphics.Color import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -24,6 +23,7 @@ import org.pixeldroid.app.utils.api.objects.Status import org.pixeldroid.app.utils.db.AppDatabase import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity import org.pixeldroid.app.utils.di.PixelfedAPIHolder +import org.pixeldroid.app.utils.getColorFromAttr import retrofit2.HttpException import java.io.IOException import java.time.Instant @@ -171,7 +171,6 @@ class NotificationsWorker( }.putExtra(USER_NOTIFICATION_TAG, user.user_id) .putExtra(INSTANCE_NOTIFICATION_TAG, user.instance_uri) - val builder = NotificationCompat.Builder(applicationContext, makeChannelId(uniqueUserId, notification.type)) .setSmallIcon( when (notification.type) { @@ -184,7 +183,7 @@ class NotificationsWorker( null -> R.drawable.ic_comment_empty } ) - .setColor(Color.parseColor("#6200EE")) + .setColor(applicationContext.getColorFromAttr(R.attr.colorPrimary)) .setContentTitle( notification.account?.username?.let { username -> applicationContext.getString( diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_notifications.xml index 709235b6..115c49ff 100644 --- a/app/src/main/res/layout/fragment_notifications.xml +++ b/app/src/main/res/layout/fragment_notifications.xml @@ -58,7 +58,7 @@ app:layout_constraintTop_toBottomOf="@id/notification_type" tools:src="@drawable/ic_default_user" tools:srcCompat="@tools:sample/backgrounds/scenic" - android:contentDescription="TODO" /> + android:contentDescription="@string/notification_thumbnail" /> from %1$s Error while adding images + "Thumbnail of image in this notification's post" + Preview of a post \ No newline at end of file