Improve mouse accessibility

master
Koitharu 12 months ago
parent 7cc777f0a6
commit b4b9f90edc
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -1,11 +1,14 @@
package org.koitharu.kotatsu.core.ui.widgets package org.koitharu.kotatsu.core.ui.widgets
import android.content.Context import android.content.Context
import android.os.Build
import android.text.Selection import android.text.Selection
import android.text.Spannable import android.text.Spannable
import android.util.AttributeSet import android.util.AttributeSet
import android.view.MotionEvent import android.view.MotionEvent
import android.view.PointerIcon
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.core.view.PointerIconCompat
import com.google.android.material.textview.MaterialTextView import com.google.android.material.textview.MaterialTextView
class SelectableTextView @JvmOverloads constructor( class SelectableTextView @JvmOverloads constructor(
@ -14,6 +17,12 @@ class SelectableTextView @JvmOverloads constructor(
@AttrRes defStyleAttr: Int = android.R.attr.textViewStyle, @AttrRes defStyleAttr: Int = android.R.attr.textViewStyle,
) : MaterialTextView(context, attrs, defStyleAttr) { ) : MaterialTextView(context, attrs, defStyleAttr) {
init {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
pointerIcon = PointerIcon.getSystemIcon(context, PointerIconCompat.TYPE_TEXT)
}
}
override fun dispatchTouchEvent(event: MotionEvent?): Boolean { override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
fixSelectionRange() fixSelectionRange()
return super.dispatchTouchEvent(event) return super.dispatchTouchEvent(event)

@ -1,6 +1,7 @@
package org.koitharu.kotatsu.details.ui.adapter package org.koitharu.kotatsu.details.ui.adapter
import android.graphics.Typeface import android.graphics.Typeface
import androidx.appcompat.widget.TooltipCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter
@ -22,6 +23,7 @@ fun chapterGridItemAD(
bind { payloads -> bind { payloads ->
if (payloads.isEmpty()) { if (payloads.isEmpty()) {
binding.textViewTitle.text = item.chapter.numberString() ?: "?" binding.textViewTitle.text = item.chapter.numberString() ?: "?"
TooltipCompat.setTooltipText(itemView, item.chapter.title)
} }
binding.imageViewNew.isVisible = item.isNew binding.imageViewNew.isVisible = item.isNew
binding.imageViewCurrent.isVisible = item.isCurrent binding.imageViewCurrent.isVisible = item.isCurrent

@ -10,12 +10,15 @@ import android.content.IntentFilter
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup.MarginLayoutParams
import android.widget.TextView import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.text.buildSpannedString import androidx.core.text.buildSpannedString
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
@ -91,12 +94,15 @@ class AppUpdateActivity : BaseActivity<ActivityAppUpdateBinding>(), View.OnClick
insets: WindowInsetsCompat insets: WindowInsetsCompat
): WindowInsetsCompat { ): WindowInsetsCompat {
val barsInsets = insets.systemBarsInsets val barsInsets = insets.systemBarsInsets
val basePadding = resources.getDimensionPixelOffset(R.dimen.screen_padding) viewBinding.root.updatePadding(top = barsInsets.top)
viewBinding.root.setPadding( viewBinding.dockedToolbarChild.updateLayoutParams<MarginLayoutParams> {
barsInsets.left + basePadding, leftMargin = barsInsets.left
barsInsets.top + basePadding, rightMargin = barsInsets.right
barsInsets.right + basePadding, bottomMargin = barsInsets.bottom
barsInsets.bottom + basePadding, }
viewBinding.scrollView.updatePadding(
left = barsInsets.left,
right = barsInsets.right,
) )
return insets.consumeAllSystemBarsInsets() return insets.consumeAllSystemBarsInsets()
} }

@ -1,94 +1,92 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <LinearLayout
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"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:padding="@dimen/screen_padding"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/textView_title" android:id="@+id/textView_title"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginHorizontal="@dimen/screen_padding"
android:drawablePadding="16dp" android:layout_marginTop="24dp"
android:drawablePadding="@dimen/screen_padding"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:text="@string/app_update_available" android:text="@string/app_update_available"
android:textAppearance="?textAppearanceHeadline5" android:textAppearance="?textAppearanceHeadline5"
app:drawableTint="?colorPrimary" app:drawableTint="?colorPrimary"
app:drawableTopCompat="@drawable/ic_app_update" app:drawableTopCompat="@drawable/ic_app_update" />
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.progressindicator.LinearProgressIndicator <com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progressBar" android:id="@+id/progressBar"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/screen_padding"
android:layout_marginTop="@dimen/screen_padding" android:layout_marginTop="@dimen/screen_padding"
android:max="100" android:max="100"
android:visibility="gone" android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textView_title"
tools:visibility="visible" /> tools:visibility="visible" />
<TextView <TextView
android:id="@+id/textView_error" android:id="@+id/textView_error"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/screen_padding"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:textColor="?colorError" android:textColor="?colorError"
android:visibility="gone" android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/progressBar"
tools:text="@string/error_corrupted_file" tools:text="@string/error_corrupted_file"
tools:visibility="visible" /> tools:visibility="visible" />
<ScrollView <ScrollView
android:id="@+id/scrollView" android:id="@+id/scrollView"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginVertical="@dimen/screen_padding" android:layout_marginTop="@dimen/screen_padding"
app:layout_constraintBottom_toTopOf="@id/barrier" android:layout_weight="1">
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textView_error">
<TextView <TextView
android:id="@+id/textView_content" android:id="@+id/textView_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/screen_padding"
android:paddingBottom="@dimen/screen_padding"
android:textAppearance="?textAppearanceBodyMedium" android:textAppearance="?textAppearanceBodyMedium"
tools:text="@tools:sample/lorem/random" /> tools:text="@tools:sample/lorem/random" />
</ScrollView> </ScrollView>
<com.google.android.material.button.MaterialButton <com.google.android.material.dockedtoolbar.DockedToolbarLayout
android:id="@+id/button_cancel" android:id="@+id/docked_toolbar"
style="?materialButtonOutlinedStyle" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@android:string/cancel" android:fitsSystemWindows="false">
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.button.MaterialButton <FrameLayout
android:id="@+id/button_update" android:id="@+id/docked_toolbar_child"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="@dimen/m3_comp_toolbar_docked_container_height">
android:enabled="false"
android:text="@string/update"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.constraintlayout.widget.Barrier <Button
android:id="@+id/barrier" android:id="@+id/button_cancel"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="top" android:layout_gravity="center_vertical|start"
app:constraint_referenced_ids="button_cancel,button_update" /> android:text="@android:string/cancel" />
<Button
android:id="@+id/button_update"
style="?materialButtonTonalStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:enabled="false"
android:text="@string/update" />
</FrameLayout>
</com.google.android.material.dockedtoolbar.DockedToolbarLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>

@ -22,6 +22,7 @@
android:contentDescription="@string/back" android:contentDescription="@string/back"
android:elevation="@dimen/m3_sys_elevation_level1" android:elevation="@dimen/m3_sys_elevation_level1"
android:scaleType="center" android:scaleType="center"
android:tooltipText="@string/back"
app:srcCompat="?homeAsUpIndicator" /> app:srcCompat="?homeAsUpIndicator" />
<ImageButton <ImageButton
@ -31,9 +32,10 @@
android:layout_gravity="end" android:layout_gravity="end"
android:layout_margin="@dimen/screen_padding" android:layout_margin="@dimen/screen_padding"
android:background="@drawable/bg_circle_button" android:background="@drawable/bg_circle_button"
android:contentDescription="@string/back" android:contentDescription="@string/show_menu"
android:elevation="@dimen/m3_sys_elevation_level1" android:elevation="@dimen/m3_sys_elevation_level1"
android:scaleType="center" android:scaleType="center"
android:tooltipText="@string/show_menu"
app:srcCompat="@drawable/abc_ic_menu_overflow_material" /> app:srcCompat="@drawable/abc_ic_menu_overflow_material" />
<com.google.android.material.progressindicator.CircularProgressIndicator <com.google.android.material.progressindicator.CircularProgressIndicator

@ -28,6 +28,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/settings" android:contentDescription="@string/settings"
android:tooltipText="@string/settings"
android:padding="4dp" android:padding="4dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"

@ -61,6 +61,7 @@
android:layout_height="16dp" android:layout_height="16dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:contentDescription="@string/check_for_new_chapters" android:contentDescription="@string/check_for_new_chapters"
android:tooltipText="@string/check_for_new_chapters"
app:layout_constraintBottom_toBottomOf="@id/textView_subtitle" app:layout_constraintBottom_toBottomOf="@id/textView_subtitle"
app:layout_constraintEnd_toStartOf="@id/imageView_hidden" app:layout_constraintEnd_toStartOf="@id/imageView_hidden"
app:layout_constraintStart_toEndOf="@id/textView_subtitle" app:layout_constraintStart_toEndOf="@id/textView_subtitle"
@ -71,7 +72,8 @@
android:id="@+id/imageView_hidden" android:id="@+id/imageView_hidden"
android:layout_width="16dp" android:layout_width="16dp"
android:layout_height="16dp" android:layout_height="16dp"
android:contentDescription="@string/show_on_shelf" android:contentDescription="@string/hide_from_main_screen"
android:tooltipText="@string/hide_from_main_screen"
app:layout_constraintBottom_toBottomOf="@id/textView_subtitle" app:layout_constraintBottom_toBottomOf="@id/textView_subtitle"
app:layout_constraintEnd_toEndOf="@id/textView_title" app:layout_constraintEnd_toEndOf="@id/textView_title"
app:layout_constraintStart_toEndOf="@id/imageView_tracker" app:layout_constraintStart_toEndOf="@id/imageView_tracker"

@ -88,7 +88,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:elegantTextHeight="false" android:elegantTextHeight="false"
android:ellipsize="middle" android:ellipsize="end"
android:paddingTop="4dp" android:paddingTop="4dp"
android:singleLine="true" android:singleLine="true"
android:textAppearance="?attr/textAppearanceTitleSmall" android:textAppearance="?attr/textAppearanceTitleSmall"

@ -45,9 +45,12 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/details"
android:minWidth="?minTouchTargetSize" android:minWidth="?minTouchTargetSize"
android:minHeight="?minTouchTargetSize" android:minHeight="?minTouchTargetSize"
android:pointerIcon="hand"
android:scaleType="center" android:scaleType="center"
android:tooltipText="@string/details"
android:visibility="gone" android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"

@ -29,7 +29,7 @@
tools:drawableStart="@drawable/ic_explore_selector" tools:drawableStart="@drawable/ic_explore_selector"
tools:text="@string/explore" /> tools:text="@string/explore" />
<ImageView <ImageButton
android:id="@+id/imageView_remove" android:id="@+id/imageView_remove"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -37,7 +37,8 @@
android:contentDescription="@string/remove" android:contentDescription="@string/remove"
android:padding="@dimen/margin_small" android:padding="@dimen/margin_small"
android:scaleType="center" android:scaleType="center"
android:src="@drawable/ic_delete" /> android:src="@drawable/ic_delete"
android:tooltipText="@string/remove" />
<ImageView <ImageView
android:id="@+id/imageView_reorder" android:id="@+id/imageView_reorder"
@ -46,8 +47,10 @@
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/reorder" android:contentDescription="@string/reorder"
android:padding="@dimen/margin_small" android:padding="@dimen/margin_small"
android:pointerIcon="grab"
android:scaleType="center" android:scaleType="center"
android:src="@drawable/ic_reorder_handle" /> android:src="@drawable/ic_reorder_handle"
android:tooltipText="@string/reorder" />
</LinearLayout> </LinearLayout>

@ -61,7 +61,7 @@
android:layout_marginVertical="@dimen/margin_small" android:layout_marginVertical="@dimen/margin_small"
android:background="?colorOutline" /> android:background="?colorOutline" />
<ImageView <ImageButton
android:id="@+id/imageView_add" android:id="@+id/imageView_add"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

@ -55,7 +55,7 @@
</LinearLayout> </LinearLayout>
<ImageView <ImageButton
android:id="@+id/imageView_menu" android:id="@+id/imageView_menu"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -67,7 +67,7 @@
android:tooltipText="@string/more" android:tooltipText="@string/more"
app:tint="?colorControlNormal" /> app:tint="?colorControlNormal" />
<ImageView <ImageButton
android:id="@+id/imageView_add" android:id="@+id/imageView_add"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -78,7 +78,7 @@
android:src="@drawable/ic_add" android:src="@drawable/ic_add"
android:tooltipText="@string/add" /> android:tooltipText="@string/add" />
<ImageView <ImageButton
android:id="@+id/imageView_remove" android:id="@+id/imageView_remove"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

@ -47,6 +47,7 @@
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/remove" android:contentDescription="@string/remove"
android:padding="?listPreferredItemPaddingEnd" android:padding="?listPreferredItemPaddingEnd"
android:tooltipText="@string/remove"
app:srcCompat="@drawable/ic_delete" /> app:srcCompat="@drawable/ic_delete" />
</LinearLayout> </LinearLayout>

@ -38,6 +38,7 @@
android:background="@drawable/custom_selectable_item_background" android:background="@drawable/custom_selectable_item_background"
android:drawablePadding="4dp" android:drawablePadding="4dp"
android:padding="4dp" android:padding="4dp"
android:pointerIcon="hand"
android:singleLine="true" android:singleLine="true"
android:textAppearance="?textAppearanceBodyMedium" android:textAppearance="?textAppearanceBodyMedium"
app:layout_constrainedWidth="true" app:layout_constrainedWidth="true"

@ -38,13 +38,14 @@
android:textAppearance="?textAppearanceBodyLarge" android:textAppearance="?textAppearanceBodyLarge"
tools:text="@string/filter" /> tools:text="@string/filter" />
<ImageView <ImageButton
android:id="@+id/sh_button_close" android:id="@+id/sh_button_close"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/close" android:contentDescription="@string/close"
android:tooltipText="@string/close"
android:padding="16dp" android:padding="16dp"
app:srcCompat="?actionModeCloseDrawable" app:srcCompat="?actionModeCloseDrawable"
app:tint="?colorControlActivated" /> app:tint="?colorControlActivated" />

@ -837,4 +837,5 @@
<string name="incognito_mode_hint_nsfw">This manga may contain adult content. Do you want to use incognito mode?</string> <string name="incognito_mode_hint_nsfw">This manga may contain adult content. Do you want to use incognito mode?</string>
<string name="incognito_for_nsfw">Incognito mode for NSFW manga</string> <string name="incognito_for_nsfw">Incognito mode for NSFW manga</string>
<string name="additional_action_required">Additional action is required</string> <string name="additional_action_required">Additional action is required</string>
<string name="hide_from_main_screen">Hide from main screen</string>
</resources> </resources>

Loading…
Cancel
Save