updating the main screens UI, use rounded corners at thumbnails

This commit is contained in:
tibbi 2020-11-01 21:58:18 +01:00
parent 48235c629a
commit a7c1789a55
8 changed files with 99 additions and 108 deletions

View file

@ -77,7 +77,7 @@ android {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:5.31.17' implementation 'com.simplemobiletools:commons:5.31.18'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'

View file

@ -166,7 +166,7 @@ class WidgetConfigureActivity : SimpleActivity() {
val path = directoryDao.getDirectoryThumbnail(folderPath) val path = directoryDao.getDirectoryThumbnail(folderPath)
if (path != null) { if (path != null) {
runOnUiThread { runOnUiThread {
loadJpg(path, config_image, config.cropThumbnails) loadJpg(path, config_image, config.cropThumbnails, true)
} }
} }
} }

View file

@ -35,7 +35,6 @@ import kotlinx.android.synthetic.main.directory_item_grid.view.dir_lock
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_name import kotlinx.android.synthetic.main.directory_item_grid.view.dir_name
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_pin import kotlinx.android.synthetic.main.directory_item_grid.view.dir_pin
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_thumbnail import kotlinx.android.synthetic.main.directory_item_grid.view.dir_thumbnail
import kotlinx.android.synthetic.main.directory_item_grid.view.photo_cnt
import kotlinx.android.synthetic.main.directory_item_list.view.* import kotlinx.android.synthetic.main.directory_item_list.view.*
import java.io.File import java.io.File
@ -662,9 +661,6 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
private fun setupView(view: View, directory: Directory) { private fun setupView(view: View, directory: Directory) {
val isSelected = selectedKeys.contains(directory.path.hashCode()) val isSelected = selectedKeys.contains(directory.path.hashCode())
view.apply { view.apply {
dir_name.text = if (groupDirectSubfolders && directory.subfoldersCount > 1) "${directory.name} (${directory.subfoldersCount})" else directory.name
dir_path?.text = "${directory.path.substringBeforeLast("/")}/"
photo_cnt.text = directory.subfoldersMediaCount.toString()
val thumbnailType = when { val thumbnailType = when {
directory.tmb.isVideoFast() -> TYPE_VIDEOS directory.tmb.isVideoFast() -> TYPE_VIDEOS
directory.tmb.isGif() -> TYPE_GIFS directory.tmb.isGif() -> TYPE_GIFS
@ -684,7 +680,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
dir_lock.applyColorFilter(config.backgroundColor.getContrastColor()) dir_lock.applyColorFilter(config.backgroundColor.getContrastColor())
} else { } else {
dir_lock.beGone() dir_lock.beGone()
activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails) activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, true)
} }
dir_pin.beVisibleIf(pinnedFolders.contains(directory.path)) dir_pin.beVisibleIf(pinnedFolders.contains(directory.path))
@ -693,14 +689,18 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList<Directo
dir_location.setImageResource(if (directory.location == LOCATION_SD) R.drawable.ic_sd_card_vector else R.drawable.ic_usb_vector) dir_location.setImageResource(if (directory.location == LOCATION_SD) R.drawable.ic_sd_card_vector else R.drawable.ic_usb_vector)
} }
photo_cnt.beVisibleIf(showMediaCount)
if (isListViewType) {
dir_name.setTextColor(textColor) dir_name.setTextColor(textColor)
dir_path.setTextColor(textColor) if (isListViewType) {
dir_name.text = if (groupDirectSubfolders && directory.subfoldersCount > 1) "${directory.name} [${directory.subfoldersCount}]" else directory.name
dir_path.text = "${directory.path.substringBeforeLast("/")}/"
photo_cnt.setTextColor(textColor) photo_cnt.setTextColor(textColor)
photo_cnt.text = directory.subfoldersMediaCount.toString()
photo_cnt.beVisibleIf(showMediaCount)
dir_path.setTextColor(textColor)
dir_pin.applyColorFilter(textColor) dir_pin.applyColorFilter(textColor)
dir_location.applyColorFilter(textColor) dir_location.applyColorFilter(textColor)
} else {
dir_name.text = if (groupDirectSubfolders && directory.subfoldersCount > 1) "${directory.name} [${directory.subfoldersCount}]" else "${directory.name} (${directory.subfoldersMediaCount})"
} }
} }
} }

View file

@ -543,14 +543,14 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList<Thumbnai
} }
if (loadImageInstantly) { if (loadImageInstantly) {
activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, rotatedImagePaths) activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, false, rotatedImagePaths)
} else { } else {
medium_thumbnail.setImageDrawable(null) medium_thumbnail.setImageDrawable(null)
medium_thumbnail.isHorizontalScrolling = scrollHorizontally medium_thumbnail.isHorizontalScrolling = scrollHorizontally
delayHandler.postDelayed({ delayHandler.postDelayed({
val isVisible = visibleItemPaths.contains(medium.path) val isVisible = visibleItemPaths.contains(medium.path)
if (isVisible) { if (isVisible) {
activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, rotatedImagePaths) activity.loadImage(medium.type, path, medium_thumbnail, scrollHorizontally, animateGifs, cropThumbnails, false, rotatedImagePaths)
} }
}, IMAGE_LOAD_DELAY) }, IMAGE_LOAD_DELAY)
} }

View file

@ -14,6 +14,8 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.Priority import com.bumptech.glide.Priority
import com.bumptech.glide.load.DecodeFormat import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
@ -396,17 +398,17 @@ fun Context.getFolderNameFromPath(path: String): String {
} }
fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean, fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean,
skipMemoryCacheAtPaths: ArrayList<String>? = null) { roundCorners: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
target.isHorizontalScrolling = horizontalScroll target.isHorizontalScrolling = horizontalScroll
if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS || type == TYPE_PORTRAITS) { if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS || type == TYPE_PORTRAITS) {
if (type == TYPE_IMAGES && path.isPng()) { if (type == TYPE_IMAGES && path.isPng()) {
loadPng(path, target, cropThumbnails, skipMemoryCacheAtPaths) loadPng(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} else { } else {
loadJpg(path, target, cropThumbnails, skipMemoryCacheAtPaths) loadJpg(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} }
} else if (type == TYPE_GIFS) { } else if (type == TYPE_GIFS) {
if (!animateGifs) { if (!animateGifs) {
loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths) loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
return return
} }
@ -417,12 +419,12 @@ fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizo
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
} catch (e: Exception) { } catch (e: Exception) {
loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths) loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} catch (e: OutOfMemoryError) { } catch (e: OutOfMemoryError) {
loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths) loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} }
} else if (type == TYPE_SVGS) { } else if (type == TYPE_SVGS) {
loadSVG(path, target, cropThumbnails) loadSVG(path, target, cropThumbnails, roundCorners)
} }
} }
@ -447,7 +449,7 @@ fun Context.getPathLocation(path: String): Int {
} }
} }
fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) { fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
val options = RequestOptions() val options = RequestOptions()
.signature(path.getFileSignature()) .signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
@ -455,57 +457,79 @@ fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boo
.priority(Priority.LOW) .priority(Priority.LOW)
.format(DecodeFormat.PREFER_ARGB_8888) .format(DecodeFormat.PREFER_ARGB_8888)
val builder = Glide.with(applicationContext) if (cropThumbnails) options.centerCrop() else options.fitCenter()
var builder = Glide.with(applicationContext)
.asBitmap() .asBitmap()
.load(path) .load(path)
.apply(options)
if (cropThumbnails) options.centerCrop() else options.fitCenter() if (roundCorners) {
builder.apply(options).into(target) val cornerRadius = resources.getDimension(R.dimen.rounded_corner_radius).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
} }
fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) { builder.into(target)
}
fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
val options = RequestOptions() val options = RequestOptions()
.signature(path.getFileSignature()) .signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.priority(Priority.LOW) .priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
val builder = Glide.with(applicationContext) if (cropThumbnails) options.centerCrop() else options.fitCenter()
var builder = Glide.with(applicationContext)
.load(path) .load(path)
.apply(options)
if (cropThumbnails) options.centerCrop() else options.fitCenter()
builder.apply(options)
.transition(DrawableTransitionOptions.withCrossFade()) .transition(DrawableTransitionOptions.withCrossFade())
.into(target)
if (roundCorners) {
val cornerRadius = resources.getDimension(R.dimen.rounded_corner_radius).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
} }
fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) { builder.into(target)
}
fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Boolean, skipMemoryCacheAtPaths: ArrayList<String>? = null) {
val options = RequestOptions() val options = RequestOptions()
.signature(path.getFileSignature()) .signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true) .skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.priority(Priority.LOW) .priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
val builder = Glide.with(applicationContext) if (cropThumbnails) options.centerCrop() else options.fitCenter()
var builder = Glide.with(applicationContext)
.asBitmap() // make sure the GIF wont animate .asBitmap() // make sure the GIF wont animate
.load(path) .load(path)
.apply(options)
if (cropThumbnails) options.centerCrop() else options.fitCenter() if (roundCorners) {
builder.apply(options) val cornerRadius = resources.getDimension(R.dimen.rounded_corner_radius).toInt()
.into(target) builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
} }
fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean) { builder.into(target)
}
fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Boolean) {
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
val options = RequestOptions().signature(path.getFileSignature()) val options = RequestOptions().signature(path.getFileSignature())
Glide.with(applicationContext) var builder = Glide.with(applicationContext)
.`as`(PictureDrawable::class.java) .`as`(PictureDrawable::class.java)
.listener(SvgSoftwareLayerSetter()) .listener(SvgSoftwareLayerSetter())
.load(path) .load(path)
.apply(options) .apply(options)
.transition(DrawableTransitionOptions.withCrossFade()) .transition(DrawableTransitionOptions.withCrossFade())
.into(target)
if (roundCorners) {
val cornerRadius = resources.getDimension(R.dimen.rounded_corner_radius).toInt()
builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
}
builder.into(target)
} }
fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, callback: (ArrayList<Directory>) -> Unit) { fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, callback: (ArrayList<Directory>) -> Unit) {

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/directories_refresh_layout" android:id="@+id/directories_refresh_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -26,14 +25,14 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/directories_switch_searching" android:layout_below="@+id/directories_switch_searching"
android:gravity="center_horizontal"
android:alpha="0.8" android:alpha="0.8"
android:textStyle="italic" android:gravity="center_horizontal"
android:paddingStart="@dimen/activity_margin" android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin" android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin" android:paddingEnd="@dimen/activity_margin"
android:text="@string/no_media_with_filters" android:text="@string/no_media_with_filters"
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
android:textStyle="italic"
android:visibility="gone" /> android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView

View file

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dir_holder" android:id="@+id/dir_holder"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/medium_margin"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:padding="1px"> android:paddingTop="@dimen/medium_margin">
<com.simplemobiletools.gallery.pro.views.MySquareImageView <com.simplemobiletools.gallery.pro.views.MySquareImageView
android:id="@+id/dir_thumbnail" android:id="@+id/dir_thumbnail"
@ -32,10 +32,9 @@
android:id="@+id/dir_check" android:id="@+id/dir_check"
android:layout_width="@dimen/selection_check_size" android:layout_width="@dimen/selection_check_size"
android:layout_height="@dimen/selection_check_size" android:layout_height="@dimen/selection_check_size"
android:layout_alignEnd="@+id/dir_shadow_holder"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_margin="@dimen/small_margin" android:layout_margin="@dimen/medium_margin"
android:background="@drawable/circle_background" android:background="@drawable/circle_background"
android:contentDescription="@null" android:contentDescription="@null"
android:padding="@dimen/tiny_margin" android:padding="@dimen/tiny_margin"
@ -48,68 +47,36 @@
android:layout_height="@dimen/selection_check_size" android:layout_height="@dimen/selection_check_size"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_margin="@dimen/small_margin" android:layout_margin="@dimen/medium_margin"
android:background="@drawable/circle_black_background" android:background="@drawable/circle_black_background"
android:contentDescription="@string/pin" android:contentDescription="@string/pin"
android:padding="@dimen/small_margin" android:padding="@dimen/small_margin"
android:src="@drawable/ic_pin" android:src="@drawable/ic_pin"
android:visibility="gone" /> android:visibility="gone" />
<ImageView
android:id="@+id/dir_shadow_holder"
android:layout_width="match_parent"
android:layout_height="@dimen/tmb_shadow_height"
android:layout_alignStart="@+id/dir_bottom_holder"
android:layout_alignEnd="@+id/dir_bottom_holder"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background"
android:contentDescription="@null"/>
<LinearLayout
android:id="@+id/dir_bottom_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/dir_thumbnail"
android:layout_alignEnd="@+id/dir_thumbnail"
android:layout_alignParentBottom="true"
android:gravity="bottom"
android:orientation="vertical"
android:paddingLeft="@dimen/medium_margin"
android:paddingTop="@dimen/small_margin"
android:paddingRight="@dimen/medium_margin"
android:paddingBottom="@dimen/small_margin">
<TextView <TextView
android:id="@+id/dir_name" android:id="@+id/dir_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/dir_thumbnail"
android:layout_alignStart="@+id/dir_thumbnail"
android:layout_toStartOf="@+id/dir_location"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2" android:maxLines="2"
android:paddingBottom="@dimen/small_margin" android:paddingTop="@dimen/medium_margin"
android:shadowColor="@color/default_background_color"
android:shadowRadius="4"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="@dimen/normal_text_size" /> android:textSize="@dimen/normal_text_size" />
<TextView
android:id="@+id/photo_cnt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="@dimen/normal_text_size"/>
</LinearLayout>
<ImageView <ImageView
android:id="@+id/dir_location" android:id="@+id/dir_location"
android:layout_width="@dimen/sd_card_icon_size" android:layout_width="@dimen/sd_card_icon_size"
android:layout_height="@dimen/sd_card_icon_size" android:layout_height="@dimen/sd_card_icon_size"
android:layout_alignEnd="@+id/dir_bottom_holder" android:layout_alignBottom="@+id/dir_name"
android:layout_alignParentBottom="true" android:layout_alignParentEnd="true"
android:alpha="0.8" android:alpha="0.8"
android:contentDescription="@null" android:contentDescription="@null"
android:paddingEnd="@dimen/small_margin" android:paddingTop="@dimen/tiny_margin"
android:paddingBottom="@dimen/small_margin" android:paddingBottom="@dimen/tiny_margin"
android:src="@drawable/ic_sd_card_vector" android:src="@drawable/ic_sd_card_vector"
android:visibility="gone" /> android:visibility="gone" />

View file

@ -23,4 +23,5 @@
<dimen name="widget_initial_size">110dp</dimen> <dimen name="widget_initial_size">110dp</dimen>
<dimen name="full_brush_size">40dp</dimen> <dimen name="full_brush_size">40dp</dimen>
<dimen name="lock_padding">40dp</dimen> <dimen name="lock_padding">40dp</dimen>
<dimen name="rounded_corner_radius">10dp</dimen>
</resources> </resources>