status: increase hit area for fav/reblog buttons #71

This commit is contained in:
Alibek Omarov 2020-02-20 04:25:35 +03:00
parent 052b58f5af
commit 74d2bd6aaa
2 changed files with 64 additions and 1 deletions

View File

@ -37,6 +37,7 @@ import com.keylesspalace.tusky.util.LinkHelper;
import com.keylesspalace.tusky.util.StatusDisplayOptions;
import com.keylesspalace.tusky.util.ThemeUtils;
import com.keylesspalace.tusky.util.TimestampUtils;
import com.keylesspalace.tusky.util.ViewExtensionsKt;
import com.keylesspalace.tusky.view.MediaPreviewImageView;
import com.keylesspalace.tusky.viewdata.PollOptionViewData;
import com.keylesspalace.tusky.viewdata.PollViewData;
@ -111,7 +112,16 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
favouriteButton = itemView.findViewById(R.id.status_favourite);
bookmarkButton = itemView.findViewById(R.id.status_bookmark);
moreButton = itemView.findViewById(R.id.status_more);
float INCREASE_HORIZONTAL_HIT_AREA = 20.0f;
ViewExtensionsKt.increaseHitArea(replyButton, 0.0f, INCREASE_HORIZONTAL_HIT_AREA);
if(reblogButton != null)
ViewExtensionsKt.increaseHitArea(reblogButton, 0.0f, INCREASE_HORIZONTAL_HIT_AREA);
ViewExtensionsKt.increaseHitArea(favouriteButton, 0.0f, INCREASE_HORIZONTAL_HIT_AREA);
ViewExtensionsKt.increaseHitArea(bookmarkButton, 0.0f, INCREASE_HORIZONTAL_HIT_AREA);
ViewExtensionsKt.increaseHitArea(moreButton, 0.0f, INCREASE_HORIZONTAL_HIT_AREA);
itemView.findViewById(R.id.status_media_preview_container).setClipToOutline(true);
mediaPreviews = new MediaPreviewImageView[]{
@ -632,6 +642,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
listener.onMore(v, position);
}
});
/* Even though the content TextView is a child of the container, it won't respond to clicks
* if it contains URLSpans without also setting its listener. The surrounding spans will
* just eat the clicks instead of deferring to the parent listener, but WILL respond to a

View File

@ -20,6 +20,13 @@ import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.widget.EditText
import android.util.TypedValue
import android.content.res.Resources
import android.view.TouchDelegate
import android.view.MotionEvent
import android.graphics.Rect
/*import java.util.List
import java.util.ArrayList*/
fun View.show() {
this.visibility = View.VISIBLE
@ -33,6 +40,51 @@ fun View.visible(visible: Boolean, or: Int = View.GONE) {
this.visibility = if (visible) View.VISIBLE else or
}
class MultipleTouchDelegate : TouchDelegate {
var delegates = mutableListOf<TouchDelegate>()
constructor(v: View) : super(Rect(), v)
public fun addDelegate(delegate: TouchDelegate) {
delegates.add(delegate)
}
override fun onTouchEvent(event: MotionEvent) : Boolean {
var ret = false
val x = event.x
val y = event.y
for(delegate in delegates) {
event.setLocation(x, y)
ret = delegate.onTouchEvent(event) || ret
}
return ret
}
}
fun View.increaseHitArea(vdp: Float, hdp: Float) {
val parent = this.parent as View
val vpixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, vdp, Resources.getSystem().displayMetrics).toInt()
val hpixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, hdp, Resources.getSystem().displayMetrics).toInt()
parent.post {
val rect = Rect()
this.getHitRect(rect)
rect.top -= vpixels
rect.left -= hpixels
rect.bottom += vpixels
rect.right += hpixels
if(parent.touchDelegate != null && parent.touchDelegate is MultipleTouchDelegate) {
(parent.touchDelegate as MultipleTouchDelegate).addDelegate(TouchDelegate(rect, this))
} else {
val mtd = MultipleTouchDelegate(this)
mtd.addDelegate(TouchDelegate(rect, this))
parent.touchDelegate = mtd
}
}
}
open class DefaultTextWatcher : TextWatcher {
override fun afterTextChanged(s: Editable) {
}
@ -60,4 +112,4 @@ inline fun EditText.afterTextChanged(
callback(s)
}
})
}
}