From bbdc6ceb8ece1d818b737e4012301c59d2dba2b8 Mon Sep 17 00:00:00 2001 From: gavine99 Date: Tue, 1 Apr 2025 06:44:16 +1100 Subject: [PATCH 1/3] upgrade to androidx.appcompat 1.6.1 --- build.gradle | 2 +- .../moez/QKSMS/common/util/QkActivityResultContracts.kt | 9 ++++----- .../com/moez/QKSMS/feature/backup/BackupController.kt | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index cc940d67..52b7959c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.androidx_appcompat_version = '1.3.1' + ext.androidx_appcompat_version = '1.6.1' ext.androidx_constraintlayout_version = '1.1.3' ext.androidx_core_version = '1.1.0' ext.androidx_documentfile_version = '1.0.1' diff --git a/presentation/src/main/java/com/moez/QKSMS/common/util/QkActivityResultContracts.kt b/presentation/src/main/java/com/moez/QKSMS/common/util/QkActivityResultContracts.kt index 21f16c52..a9cb11db 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/util/QkActivityResultContracts.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/util/QkActivityResultContracts.kt @@ -28,12 +28,11 @@ class QkActivityResultContracts { return intent } - override fun parseResult(resultCode: Int, intent: Intent?): Uri? { - if (intent == null || resultCode != Activity.RESULT_OK) { - return null - } + override fun parseResult(resultCode: Int, intent: Intent?): Uri { + if (resultCode != Activity.RESULT_OK) + return Uri.EMPTY - return intent.data + return intent?.data ?: Uri.EMPTY } } diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/backup/BackupController.kt b/presentation/src/main/java/com/moez/QKSMS/feature/backup/BackupController.kt index 989d0f4f..71b78813 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/backup/BackupController.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/backup/BackupController.kt @@ -104,7 +104,7 @@ class BackupController : QkController( .create() } - private lateinit var openDirectory: ActivityResultLauncher + private lateinit var openDirectory: ActivityResultLauncher private lateinit var openDocument: ActivityResultLauncher init { From 7d743a5969331b8f2b660ee5e9d9dde2af5278d1 Mon Sep 17 00:00:00 2001 From: gavine99 Date: Tue, 1 Apr 2025 06:59:27 +1100 Subject: [PATCH 2/3] remove deprecated androidx.emoji-appcompat - see https://developer.android.com/develop/ui/views/text-and-emoji/emoji-compat --- build.gradle | 1 - presentation/build.gradle | 1 - .../main/java/com/moez/QKSMS/common/QKApplication.kt | 10 ---------- .../java/com/moez/QKSMS/common/widget/QkTextView.kt | 4 ++-- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index 52b7959c..2cdad63f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,6 @@ buildscript { ext.androidx_constraintlayout_version = '1.1.3' ext.androidx_core_version = '1.1.0' ext.androidx_documentfile_version = '1.0.1' - ext.androidx_emoji_version = '1.0.0' ext.androidx_exifinterface_version = '1.0.0' ext.androidx_testrunner_version = '1.1.0-alpha3' ext.androidx_viewpager_version = '1.0.0-beta05' diff --git a/presentation/build.gradle b/presentation/build.gradle index 33e7d25f..df724297 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -125,7 +125,6 @@ dependencies { implementation "androidx.appcompat:appcompat:$androidx_appcompat_version" implementation "androidx.constraintlayout:constraintlayout:$androidx_constraintlayout_version" implementation "androidx.core:core-ktx:$androidx_core_version" - implementation "androidx.emoji:emoji-appcompat:$androidx_emoji_version" implementation "androidx.viewpager2:viewpager2:$androidx_viewpager_version" implementation "com.google.android.material:material:$material_version" implementation("androidx.work:work-runtime-ktx:$androidx_work_version") diff --git a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt index f9b7f8ef..9b7b197f 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt @@ -23,8 +23,6 @@ import android.app.Application import android.app.Service import android.content.BroadcastReceiver import androidx.core.provider.FontRequest -import androidx.emoji.text.EmojiCompat -import androidx.emoji.text.FontRequestEmojiCompatConfig import androidx.work.Configuration import androidx.work.WorkManager import androidx.work.WorkerFactory @@ -106,14 +104,6 @@ class QKApplication : Application(), HasActivityInjector, HasBroadcastReceiverIn nightModeManager.updateCurrentTheme() - val fontRequest = FontRequest( - "com.google.android.gms.fonts", - "com.google.android.gms", - "Noto Color Emoji Compat", - R.array.com_google_android_gms_fonts_certs) - - EmojiCompat.init(FontRequestEmojiCompatConfig(this, fontRequest)) - Timber.plant(Timber.DebugTree(), CrashlyticsTree(), fileLoggingTree) RxDogTag.builder() diff --git a/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt b/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt index 220e94ed..ffd7f86a 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt @@ -20,14 +20,14 @@ package dev.octoshrimpy.quik.common.widget import android.content.Context import android.util.AttributeSet -import androidx.emoji.widget.EmojiAppCompatTextView +import androidx.appcompat.widget.AppCompatTextView import dev.octoshrimpy.quik.common.util.TextViewStyler import dev.octoshrimpy.quik.injection.appComponent import javax.inject.Inject open class QkTextView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null -) : EmojiAppCompatTextView(context, attrs) { +) : AppCompatTextView(context, attrs) { @Inject lateinit var textViewStyler: TextViewStyler From 2c2c8e90a27fe5bcfcd84e42ad6d0bb8f5c9e601 Mon Sep 17 00:00:00 2001 From: gavine99 Date: Tue, 1 Apr 2025 10:02:34 +1100 Subject: [PATCH 3/3] use emoji2-bundled version for compatibility with non playstore/gsm os' emoji2 compat library to 1.4.0 (required compilesdk upgrade to 34) make qkedittext use appcompatedittext for emoji compatibility fix small incompatibilities introduced by new library versions --- android-smsmms/build.gradle | 2 +- build.gradle | 1 + data/build.gradle | 2 +- domain/build.gradle | 2 +- .../java/com/moez/QKSMS/util/Preferences.kt | 3 ++- presentation/build.gradle | 3 ++- .../com/moez/QKSMS/common/QKApplication.kt | 21 ++++++++++++++++++- .../moez/QKSMS/common/widget/QkEditText.kt | 5 +++-- .../QKSMS/feature/compose/ComposeActivity.kt | 2 +- .../extensions/CharSequenceExtensions.kt | 6 +++--- .../QKSMS/feature/qkreply/QkReplyActivity.kt | 2 +- 11 files changed, 36 insertions(+), 13 deletions(-) diff --git a/android-smsmms/build.gradle b/android-smsmms/build.gradle index 5f79535b..9c8c996f 100644 --- a/android-smsmms/build.gradle +++ b/android-smsmms/build.gradle @@ -20,7 +20,7 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdk 33 + compileSdk 34 defaultConfig { minSdkVersion 23 diff --git a/build.gradle b/build.gradle index 2cdad63f..1e6de0b2 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ buildscript { ext.androidx_appcompat_version = '1.6.1' + ext.androidx_emoji2_version = '1.4.0' ext.androidx_constraintlayout_version = '1.1.3' ext.androidx_core_version = '1.1.0' ext.androidx_documentfile_version = '1.0.1' diff --git a/data/build.gradle b/data/build.gradle index 1b333e5c..c376e7f4 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -21,7 +21,7 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { - compileSdk 33 + compileSdk 34 publishNonDefault true flavorDimensions "analytics" diff --git a/domain/build.gradle b/domain/build.gradle index d3d41487..2d07c9c1 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -23,7 +23,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { - compileSdk 33 + compileSdk 34 compileOptions { sourceCompatibility 1.8 diff --git a/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt b/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt index 16857073..a84826c2 100644 --- a/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt +++ b/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt @@ -156,7 +156,8 @@ class Preferences @Inject constructor( val keyChanges: Observable = Observable.create { emitter -> // Making this a lambda would cause it to be GCd val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> - emitter.onNext(key) + if (key != null) + emitter.onNext(key) } emitter.setCancellable { diff --git a/presentation/build.gradle b/presentation/build.gradle index df724297..c5f87ee6 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -23,7 +23,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { - compileSdk 33 + compileSdk 34 flavorDimensions "analytics" defaultConfig { @@ -123,6 +123,7 @@ dependencies { // androidx implementation "androidx.appcompat:appcompat:$androidx_appcompat_version" + implementation "androidx.emoji2:emoji2-bundled:$androidx_emoji2_version" implementation "androidx.constraintlayout:constraintlayout:$androidx_constraintlayout_version" implementation "androidx.core:core-ktx:$androidx_core_version" implementation "androidx.viewpager2:viewpager2:$androidx_viewpager_version" diff --git a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt index 9b7b197f..51eaf1da 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt @@ -22,7 +22,8 @@ import android.app.Activity import android.app.Application import android.app.Service import android.content.BroadcastReceiver -import androidx.core.provider.FontRequest +import androidx.emoji2.bundled.BundledEmojiCompatConfig +import androidx.emoji2.text.EmojiCompat import androidx.work.Configuration import androidx.work.WorkManager import androidx.work.WorkerFactory @@ -104,8 +105,26 @@ class QKApplication : Application(), HasActivityInjector, HasBroadcastReceiverIn nightModeManager.updateCurrentTheme() + // configure timber logging Timber.plant(Timber.DebugTree(), CrashlyticsTree(), fileLoggingTree) + // configure emoji compatibility with bundled package + // (bundled library works with no play-services/gsm os versions) + EmojiCompat.init(BundledEmojiCompatConfig(this) + .registerInitCallback(object: EmojiCompat.InitCallback() { + override fun onInitialized() { + super.onInitialized() + Timber.v("bundled emojicompat initialized") + } + + override fun onFailed(throwable: Throwable?) { + super.onFailed(throwable) + Timber.e("bundled emojicompat initialization failed") + } + }) + ) + + // rxdogtag provides 'look-back' for exceptions in rxjava2 'chains' RxDogTag.builder() .configureWith(AutoDisposeConfigurer::configure) .install() diff --git a/presentation/src/main/java/com/moez/QKSMS/common/widget/QkEditText.kt b/presentation/src/main/java/com/moez/QKSMS/common/widget/QkEditText.kt index 17d05b1f..a8bf7628 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/widget/QkEditText.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/widget/QkEditText.kt @@ -25,7 +25,7 @@ import android.view.KeyEvent import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputConnection import android.view.inputmethod.InputConnectionWrapper -import android.widget.EditText +import androidx.appcompat.widget.AppCompatEditText import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.inputmethod.InputConnectionCompat import androidx.core.view.inputmethod.InputContentInfoCompat @@ -44,7 +44,8 @@ import javax.inject.Inject * Beware of updating to extend AppCompatTextView, as this inexplicably breaks the view in * the contacts chip view */ -class QkEditText @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : EditText(context, attrs) { +class QkEditText @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) + : AppCompatEditText(context, attrs) { @Inject lateinit var textViewStyler: TextViewStyler diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeActivity.kt b/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeActivity.kt index f04fe1cc..f4bb4c16 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeActivity.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeActivity.kt @@ -824,7 +824,7 @@ class ComposeActivity : QkThemedActivity(), ComposeView { if (messageEditBox !== null) { // populate message box with data returned by STT, set cursor to end, and focus messageEditBox.append(match[0]) - messageEditBox.setSelection(messageEditBox.text.length) + messageEditBox.setSelection(messageEditBox.text?.length ?: 0) messageEditBox.requestFocus() } } diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/extensions/CharSequenceExtensions.kt b/presentation/src/main/java/com/moez/QKSMS/feature/extensions/CharSequenceExtensions.kt index 103e0612..cded1ce9 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/extensions/CharSequenceExtensions.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/extensions/CharSequenceExtensions.kt @@ -1,9 +1,9 @@ package dev.octoshrimpy.quik.feature.extensions import android.text.Spannable -import androidx.emoji.text.EmojiCompat -import androidx.emoji.text.EmojiCompat.REPLACE_STRATEGY_ALL -import androidx.emoji.text.EmojiSpan +import androidx.emoji2.text.EmojiCompat +import androidx.emoji2.text.EmojiCompat.REPLACE_STRATEGY_ALL +import androidx.emoji2.text.EmojiSpan fun CharSequence.isEmojiOnly(considerWhitespace: Boolean = false): Boolean { diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyActivity.kt b/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyActivity.kt index 5b8caa23..ab20b9b4 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyActivity.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/qkreply/QkReplyActivity.kt @@ -80,7 +80,7 @@ class QkReplyActivity : QkThemedActivity(), QkReplyView { // populate message box with data returned by STT, set cursor to end, and focus message.setText(match[0]) - message.setSelection(message.text.length) + message.setSelection(message.text?.length ?: 0) message.requestFocus() }