From cd11190f051a9865cd143ff123fdb08269332229 Mon Sep 17 00:00:00 2001
From: Janne Mareike Koschinski <janne@kuschku.de>
Date: Mon, 14 Jun 2021 11:13:33 +0200
Subject: [PATCH] Increase width of drag area at each side

---
 .../quasseldroid/ui/chat/ChatActivity.kt      |  2 +
 .../util/DrawerLayoutEdgeSizeModifier.kt      | 32 ++++++++++++++
 .../quasseldroid/util/ReflectionHelper.kt     | 43 +++++++++++++++++++
 app/src/main/res/values/ints.xml              |  1 +
 4 files changed, 78 insertions(+)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/DrawerLayoutEdgeSizeModifier.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/ReflectionHelper.kt

diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index a673a55f2..2005ff819 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -91,6 +91,7 @@ import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
 import de.kuschku.quasseldroid.util.missingfeatures.MissingFeaturesDialog
 import de.kuschku.quasseldroid.util.missingfeatures.RequiredFeatures
 import de.kuschku.quasseldroid.util.service.ServiceBoundActivity
+import de.kuschku.quasseldroid.util.setEdgeSize
 import de.kuschku.quasseldroid.util.ui.DragInterceptBottomSheetBehavior
 import de.kuschku.quasseldroid.util.ui.drawable.DrawerToggleActivityDrawable
 import de.kuschku.quasseldroid.util.ui.drawable.NickCountDrawable
@@ -293,6 +294,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
 
     setSupportActionBar(binding.layoutMain.layoutToolbar.toolbar)
 
+    binding.drawerLayout.setEdgeSize(resources.getInteger(R.integer.drawer_edge_size))
     chatViewModel.bufferOpened.toLiveData().observe(this, Observer {
       actionMode?.finish()
       if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/DrawerLayoutEdgeSizeModifier.kt b/app/src/main/java/de/kuschku/quasseldroid/util/DrawerLayoutEdgeSizeModifier.kt
new file mode 100644
index 000000000..8bee0bd02
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/DrawerLayoutEdgeSizeModifier.kt
@@ -0,0 +1,32 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2021 Janne Mareike Koschinski
+ * Copyright (c) 2021 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package de.kuschku.quasseldroid.util
+
+import androidx.customview.widget.ViewDragHelper
+import androidx.drawerlayout.widget.DrawerLayout
+
+fun DrawerLayout.setEdgeSize(edgeSize: Int) {
+  val leftDragger: ViewDragHelper = getField("mLeftDragger") ?: return
+  val rightDragger: ViewDragHelper = getField("mRightDragger") ?: return
+
+  val density = context.resources.displayMetrics.density
+  leftDragger.setField("mEdgeSize", (edgeSize * density + 0.5f).toInt())
+  rightDragger.setField("mEdgeSize", (edgeSize * density + 0.5f).toInt())
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ReflectionHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ReflectionHelper.kt
new file mode 100644
index 000000000..c249e8286
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ReflectionHelper.kt
@@ -0,0 +1,43 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2021 Janne Mareike Koschinski
+ * Copyright (c) 2021 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package de.kuschku.quasseldroid.util
+
+import java.lang.reflect.Field
+
+inline fun <reified T, reified U> T.getField(fieldName: String): U? = try {
+  obtainField(fieldName)?.get(this) as? U
+} catch (_: Throwable) {
+  null
+}
+
+inline fun <reified T, reified U> T.setField(fieldName: String, value: U) {
+  try {
+    obtainField(fieldName)?.set(this, value)
+  } catch (_: Throwable) {
+  }
+}
+
+inline fun <reified T> T.obtainField(fieldName: String): Field? = try {
+  val field = T::class.java.getDeclaredField(fieldName)
+  field.isAccessible = true
+  field
+} catch (_: Throwable) {
+  null
+}
diff --git a/app/src/main/res/values/ints.xml b/app/src/main/res/values/ints.xml
index 98e199b17..3a92a8571 100644
--- a/app/src/main/res/values/ints.xml
+++ b/app/src/main/res/values/ints.xml
@@ -19,4 +19,5 @@
 
 <resources>
   <integer name="shortcut_image_size">432</integer>
+  <integer name="drawer_edge_size">96</integer>
 </resources>
-- 
GitLab