From 5a28649a08e7a24cfaeac4935f6469177f487932 Mon Sep 17 00:00:00 2001 From: andrekir Date: Thu, 2 Mar 2023 21:37:04 -0300 Subject: [PATCH] refactor: consolidate extensions --- .../com/geeksville/mesh/ui/ChannelFragment.kt | 3 +- .../geeksville/mesh/ui/MessagesFragment.kt | 27 +-------- .../geeksville/mesh/ui/SettingsFragment.kt | 8 +-- .../com/geeksville/mesh/util/AnyExtensions.kt | 27 --------- .../mesh/util/ByteArrayExtensions.kt | 3 - .../com/geeksville/mesh/util/Extensions.kt | 57 +++++++++++++++++++ .../com/geeksville/mesh/util/anonymize.kt | 17 ------ 7 files changed, 66 insertions(+), 76 deletions(-) delete mode 100644 app/src/main/java/com/geeksville/mesh/util/AnyExtensions.kt delete mode 100644 app/src/main/java/com/geeksville/mesh/util/ByteArrayExtensions.kt create mode 100644 app/src/main/java/com/geeksville/mesh/util/Extensions.kt delete mode 100644 app/src/main/java/com/geeksville/mesh/util/anonymize.kt diff --git a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt index a11f69158..ea2a7aa4b 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt @@ -32,6 +32,7 @@ import com.geeksville.mesh.model.Channel import com.geeksville.mesh.model.ChannelOption import com.geeksville.mesh.model.ChannelSet import com.geeksville.mesh.model.UIViewModel +import com.geeksville.mesh.util.onEditorAction import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.protobuf.ByteString @@ -234,7 +235,7 @@ class ChannelFragment : ScreenFragment("Channel"), Logging { .show() } - binding.channelNameEdit.on(EditorInfo.IME_ACTION_DONE) { + binding.channelNameEdit.onEditorAction(EditorInfo.IME_ACTION_DONE) { requireActivity().hideKeyboard() } diff --git a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt index 008cb16af..787cd23ae 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt @@ -26,23 +26,13 @@ import com.geeksville.mesh.database.entity.QuickChatAction import com.geeksville.mesh.databinding.AdapterMessageLayoutBinding import com.geeksville.mesh.databinding.MessagesFragmentBinding import com.geeksville.mesh.model.UIViewModel +import com.geeksville.mesh.util.onEditorAction import com.google.android.material.chip.Chip import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import java.text.DateFormat import java.util.* -// Allows usage like email.on(EditorInfo.IME_ACTION_NEXT, { confirm() }) -fun EditText.on(actionId: Int, func: () -> Unit) { - setOnEditorActionListener { _, receivedActionId, _ -> - - if (actionId == receivedActionId) { - func() - } - true - } -} - @AndroidEntryPoint class MessagesFragment : Fragment(), Logging { @@ -59,17 +49,6 @@ class MessagesFragment : Fragment(), Logging { private var isConnected = false - // Allows textMultiline with IME_ACTION_SEND - private fun EditText.onActionSend(func: () -> Unit) { - setOnEditorActionListener { _, actionId, _ -> - - if (actionId == EditorInfo.IME_ACTION_SEND) { - func() - } - true - } - } - // Provide a direct reference to each of the views within a data item // Used to cache the views within the item layout for fast access class ViewHolder(itemView: AdapterMessageLayoutBinding) : @@ -276,8 +255,8 @@ class MessagesFragment : Fragment(), Logging { // requireActivity().hideKeyboard() } - binding.messageInputText.onActionSend { - debug("did IME action") + binding.messageInputText.onEditorAction(EditorInfo.IME_ACTION_SEND) { + debug("received IME_ACTION_SEND") val str = binding.messageInputText.text.toString().trim() if (str.isNotEmpty()) model.sendMessage(str, contactKey) diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 65ea15607..57eec136e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -43,6 +43,7 @@ import com.geeksville.mesh.repository.usb.UsbRepository import com.geeksville.mesh.service.MeshService import com.geeksville.mesh.service.SoftwareUpdateService import com.geeksville.mesh.util.exceptionToSnackbar +import com.geeksville.mesh.util.onEditorAction import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint @@ -369,11 +370,10 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { .show() } - binding.usernameEditText.on(EditorInfo.IME_ACTION_DONE) { - debug("did IME action") + binding.usernameEditText.onEditorAction(EditorInfo.IME_ACTION_DONE) { + debug("received IME_ACTION_DONE") val n = binding.usernameEditText.text.toString().trim() - if (n.isNotEmpty()) - model.setOwner(n) + if (n.isNotEmpty()) model.setOwner(n) requireActivity().hideKeyboard() } diff --git a/app/src/main/java/com/geeksville/mesh/util/AnyExtensions.kt b/app/src/main/java/com/geeksville/mesh/util/AnyExtensions.kt deleted file mode 100644 index db7e0929c..000000000 --- a/app/src/main/java/com/geeksville/mesh/util/AnyExtensions.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.geeksville.mesh.util - -import com.geeksville.mesh.BuildConfig - -/// A toString that makes sure all newlines are removed (for nice logging). -fun Any.toOneLineString() = this.toString().replace('\n', ' ') - -/// Return a one line string version of an object (but if a release build, just say 'might be PII) -fun Any.toPIIString() = - if (!BuildConfig.DEBUG) - "" - else - this.toOneLineString() - -fun formatAgo(lastSeenUnix: Int): String { - val currentTime = (System.currentTimeMillis() / 1000).toInt() - val diffMin = (currentTime - lastSeenUnix) / 60; - if (diffMin < 1) - return "now"; - if (diffMin < 100) - return diffMin.toString() + "m" - if (diffMin < 6000) - return (diffMin / 60).toString() + "h" - if (diffMin < 144000) - return (diffMin / (60 * 24)).toString() + "d"; - return "?"; -} diff --git a/app/src/main/java/com/geeksville/mesh/util/ByteArrayExtensions.kt b/app/src/main/java/com/geeksville/mesh/util/ByteArrayExtensions.kt deleted file mode 100644 index 21fb37b89..000000000 --- a/app/src/main/java/com/geeksville/mesh/util/ByteArrayExtensions.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.geeksville.mesh.util - -fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) } \ No newline at end of file diff --git a/app/src/main/java/com/geeksville/mesh/util/Extensions.kt b/app/src/main/java/com/geeksville/mesh/util/Extensions.kt new file mode 100644 index 000000000..a9bbf7ebd --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/util/Extensions.kt @@ -0,0 +1,57 @@ +package com.geeksville.mesh.util + +import android.widget.EditText +import com.geeksville.mesh.BuildConfig + +/** + * When printing strings to logs sometimes we want to print useful debugging information about users + * or positions. But we don't want to leak things like usernames or locations. So this function + * if given a string, will return a string which is a maximum of three characters long, taken from the tail + * of the string. Which should effectively hide real usernames and locations, + * but still let us see if values were zero, empty or different. + */ +val Any?.anonymize: String + get() = this.anonymize() + +/** + * A version of anonymize that allows passing in a custom minimum length + */ +fun Any?.anonymize(maxLen: Int = 3) = + if (this != null) ("..." + this.toString().takeLast(maxLen)) else "null" + +/// A toString that makes sure all newlines are removed (for nice logging). +fun Any.toOneLineString() = this.toString().replace('\n', ' ') + +/// Return a one line string version of an object (but if a release build, just say 'might be PII) +fun Any.toPIIString() = + if (!BuildConfig.DEBUG) + "" + else + this.toOneLineString() + +fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) } + +fun formatAgo(lastSeenUnix: Int): String { + val currentTime = (System.currentTimeMillis() / 1000).toInt() + val diffMin = (currentTime - lastSeenUnix) / 60 + if (diffMin < 1) + return "now" + if (diffMin < 100) + return diffMin.toString() + "m" + if (diffMin < 6000) + return (diffMin / 60).toString() + "h" + if (diffMin < 144000) + return (diffMin / (60 * 24)).toString() + "d" + return "?" +} + +/// Allows usage like email.onEditorAction(EditorInfo.IME_ACTION_NEXT, { confirm() }) +fun EditText.onEditorAction(actionId: Int, func: () -> Unit) { + setOnEditorActionListener { _, receivedActionId, _ -> + + if (actionId == receivedActionId) { + func() + } + true + } +} diff --git a/app/src/main/java/com/geeksville/mesh/util/anonymize.kt b/app/src/main/java/com/geeksville/mesh/util/anonymize.kt deleted file mode 100644 index 7283946ed..000000000 --- a/app/src/main/java/com/geeksville/mesh/util/anonymize.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.geeksville.mesh.util - -/** - * When printing strings to logs sometimes we want to print useful debugging information about users - * or positions. But we don't want to leak things like usernames or locations. So this function - * if given a string, will return a string which is a maximum of three characters long, taken from the tail - * of the string. Which should effectively hide real usernames and locations, - * but still let us see if values were zero, empty or different. - */ -val Any?.anonymize: String - get() = this.anonymize() - -/** - * A version of anonymize that allows passing in a custom minimum length - */ -fun Any?.anonymize(maxLen: Int = 3) = - if (this != null) ("..." + this.toString().takeLast(maxLen)) else "null" \ No newline at end of file