diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 8c01bfb4..bd9e8d6a 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -18,6 +18,8 @@ jobs: steps: - uses: actions/checkout@v3 + with: + submodules: true - name: set up JDK 17 uses: actions/setup-java@v3 diff --git a/.github/workflows/diffuse.yml b/.github/workflows/diffuse.yml index c1f99dce..b55a9bd0 100644 --- a/.github/workflows/diffuse.yml +++ b/.github/workflows/diffuse.yml @@ -15,6 +15,7 @@ jobs: steps: - uses: actions/checkout@v3 with: + submodules: true ref: ${{ github.event.pull_request.base.sha }} - name: set up JDK 17 @@ -45,6 +46,7 @@ jobs: - uses: actions/checkout@v3 with: + submodules: true clean: 'false' - name: Build with Gradle diff --git a/.gitignore b/.gitignore index 97aa4650..dd90f848 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ captures/ project.properties keystore.debug.properties keystore.staging.properties +nightly-url.txt .project .settings bin/ @@ -28,4 +29,4 @@ jni/libspeex/.deps/ pkcs11.password dev.keystore maps.key -local/ \ No newline at end of file +local/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..8024d270 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libwebp"] + path = libwebp + url = https://github.com/webmproject/libwebp.git diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index adffc8f6..10c8caf6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,6 +15,12 @@ Truths which we believe to be self-evident: 1. **There is no such thing as time.** Protocol ideas that require synchronized clocks are doomed to failure. +## Building + +1. You'll need to get the `libwebp` submodule after checking out the repository with `git submodule init && git submodule update` +1. Most things are pretty straightforward, and opening the project in Android Studio should get you most of the way there. +1. Depending on your configuration, you'll also likely need to install additional SDK Tool components, namely the versions of NDK and CMake we are currently using in our [Docker](https://github.com/signalapp/Signal-Android/blob/main/reproducible-builds/Dockerfile#L30) configuration. + ## Issues ### Useful bug reports diff --git a/README.md b/README.md index b68dfe94..f07ebd36 100644 --- a/README.md +++ b/README.md @@ -59,45 +59,3 @@ Copyright 2013-2023 Signal Licensed under the GNU AGPLv3: https://www.gnu.org/licenses/agpl-3.0.html Google Play and the Google Play logo are trademarks of Google LLC. - - -//**TM_SA**// -Signal – New Base-line -1. Download the Signal official open source from this link: - https://github.com/signalapp/Signal-Android - -2. Rename each folder at the next order: - a. thoughtcrime  tm - b. securesms  archive -3. Replace all old package mentions vie “replace all” function (Ctrl +Shift + R) - a. org.thoughtcrime.securesms -> org.tm.archive -4. Add our archiver SDK and Common library to new folder “libs” and compile them via dependencies. -5. Add Archiver folder with all archiving class with util etc. (Take them from src->main->java->org) -6. Search “ArchiveLogger.Companion.sendArchiveLog” in the current project and add all those mentions to the updated project. -7. Add launcher icon app and change the round icon path in the manifest -8. Add proguard-event_bus from the current project to the updated one. -9. Go to the current TeleMessage Signal project and search via ctrl+alt+F : //**TM_SA**// - -There are dozens of references to this string please move on the result one by one and replace or add the code with this string ( //**TM_SA**//, in order to create continuation to baseline updating method) - - -intune - -1. add dependencies using //**TM_SA**// -2. add MAMSDK folder with aar and jar -3. 1. register the app to intune server -2. https://aad.portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview3. Azure Active Directory > App registrations > New Registration -3. Authentication, add platform -> add uri -> package name. -4. then add auth-config file using the View button that show it. put it in resource-> raw -5. API permissions... - -4. 1. https://aad.portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps -2. then, App configuration policies -> create app configuration policy -> manage apps -> Settings -> add the values(managerID etc) -3. Then, Assignments -> include groups you want or assign everyone. - -5. http://everythingaboutintune.com/2021/07/guide-for-integrating-intune-sdk-and-msal-to-lob-application/ - -https://www.youtube.com/watch?v=1AyGpcdDRkY&t=741s&ab_channel=EverythingAboutIntune - -https://github.com/msintuneappsdk/Taskr-Sample-Intune-Android-App#readme - diff --git a/app/MAMSDK/Microsoft.Intune.MAM.SDK.aar b/app/MAMSDK/Microsoft.Intune.MAM.SDK.aar deleted file mode 100644 index e668847e..00000000 Binary files a/app/MAMSDK/Microsoft.Intune.MAM.SDK.aar and /dev/null differ diff --git a/app/MAMSDK/com.microsoft.intune.mam.build.jar b/app/MAMSDK/com.microsoft.intune.mam.build.jar deleted file mode 100644 index a8b7e09d..00000000 Binary files a/app/MAMSDK/com.microsoft.intune.mam.build.jar and /dev/null differ diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 210b5705..00000000 --- a/app/build.gradle +++ /dev/null @@ -1,761 +0,0 @@ -import com.android.build.api.dsl.ManagedVirtualDevice - -plugins { - id 'com.android.application' - id 'kotlin-android' - id 'kotlin-kapt' //**TM_SA** -// id 'com.microsoft.intune.mam' //**TM_SA** - id 'com.google.protobuf' - id 'androidx.navigation.safeargs' - id 'org.jlleitschuh.gradle.ktlint' - id 'org.jetbrains.kotlin.android' - id 'app.cash.exhaustive' - id 'kotlin-parcelize' - id 'com.squareup.wire' - id 'translations' -} - -apply from: 'static-ips.gradle' - -protobuf { - protoc { - artifact = 'com.google.protobuf:protoc:3.18.0' - } - generateProtoTasks { - all().each { task -> - task.builtins { - java { - option "lite" - } - } - } - } -} - -wire { - kotlin { - javaInterop = true - } - - sourcePath { - srcDir 'src/main/protowire' - } - - protoPath { - srcDir "${project.rootDir}/libsignal/service/src/main/protowire" - } -} - -ktlint { - version = "0.49.1" -} - -//**TM_SA**//Start - Change the version code and version name upon the current version -def canonicalVersionCode = 1336 -def canonicalVersionName = "6.31.3.6" -def signal_teleMessage_version = "6.31.3.6"//Change this param in Jenkins builder and delete it. -//**TM_SA**//end - -def postFixSize = 100 -def abiPostFix = ['universal' : 0, - 'armeabi-v7a' : 1, - 'arm64-v8a' : 2, - 'x86' : 3, - 'x86_64' : 4] - -def keystores = [ 'debug' : loadKeystoreProperties('keystore.debug.properties') ] - -def selectableVariants = [ - 'nightlyProdSpinner', - 'nightlyProdPerf', - 'nightlyProdRelease', - 'nightlyStagingRelease', - 'nightlyPnpPerf', - 'nightlyPnpRelease', - 'playProdDebug', - 'playProdSpinner', - 'playProdCanary', - 'playProdPerf', - 'playProdBenchmark', - 'playProdInstrumentation', - 'playProdRelease', - 'playStagingDebug', - 'playStagingCanary', - 'playStagingSpinner', - 'playStagingPerf', - 'playStagingInstrumentation', - 'playPnpDebug', - 'playPnpSpinner', - 'playStagingRelease', - 'websiteProdSpinner', - 'websiteProdRelease', -] - -android { - namespace 'org.tm.archive' - - buildToolsVersion = signalBuildToolsVersion - compileSdkVersion = signalCompileSdkVersion - - flavorDimensions 'distribution', 'environment' - useLibrary 'org.apache.http.legacy' - testBuildType 'instrumentation' - - kotlinOptions { - jvmTarget = signalKotlinJvmTarget - freeCompilerArgs = ["-Xallow-result-return-type"] - } - - signingConfigs { - if (keystores.debug != null) { - debug { - storeFile file("${project.rootDir}/${keystores.debug.storeFile}") - storePassword keystores.debug.storePassword - keyAlias keystores.debug.keyAlias - keyPassword keystores.debug.keyPassword - } - } - - //**TM_SA**//Start - release { - keyAlias 'telemessage brand' - keyPassword 'Granit08' - storeFile file('../../KeyStore/TelemessageBrand/telemessagebrand.keystore') - storePassword 'Granit08' - } - //**TM_SA**//End - } - - testOptions { - execution 'ANDROIDX_TEST_ORCHESTRATOR' - - unitTests { - includeAndroidResources = true - } - - managedDevices { - devices { - pixel3api30 (ManagedVirtualDevice) { - device = "Pixel 3" - apiLevel = 30 - systemImageSource = "google-atd" - require64Bit = false - } - } - } - } - - - sourceSets { - test { - java.srcDirs += "$projectDir/src/testShared" - } - - androidTest { - java.srcDirs += "$projectDir/src/testShared" - } - } - - compileOptions { - coreLibraryDesugaringEnabled true - sourceCompatibility signalJavaVersion - targetCompatibility signalJavaVersion - } - - packagingOptions { - resources { - excludes += ['LICENSE.txt', 'LICENSE', 'NOTICE', 'asm-license.txt', 'META-INF/LICENSE', 'META-INF/LICENSE.md', 'META-INF/NOTICE', 'META-INF/LICENSE-notice.md', 'META-INF/proguard/androidx-annotations.pro', 'libsignal_jni.dylib', 'signal_jni.dll'] - } - } - - - buildFeatures { - viewBinding true - compose true - } - - composeOptions { - kotlinCompilerExtensionVersion = '1.4.4' - } - - defaultConfig { - versionCode canonicalVersionCode * postFixSize - versionName canonicalVersionName - - minSdkVersion signalMinSdkVersion - targetSdkVersion signalTargetSdkVersion - - multiDexEnabled true - - vectorDrawables.useSupportLibrary = true - project.ext.set("archivesBaseName", "Signal") - //**TM_SA**// change key - manifestPlaceholders = [mapsKey:"AIzaSyAVa3EZMZWSbiUAfgiJTb-7Ljo0se6YWys"] - - buildConfigField "long", "BUILD_TIMESTAMP", getLastCommitTimestamp() + "L" - buildConfigField "String", "GIT_HASH", "\"${getGitHash()}\"" - buildConfigField "String", "SIGNAL_URL", "\"https://chat.signal.org\"" - buildConfigField "String", "STORAGE_URL", "\"https://storage.signal.org\"" - buildConfigField "String", "SIGNAL_CDN_URL", "\"https://cdn.signal.org\"" - buildConfigField "String", "SIGNAL_CDN2_URL", "\"https://cdn2.signal.org\"" - buildConfigField "String", "SIGNAL_CDSI_URL", "\"https://cdsi.signal.org\"" - buildConfigField "String", "SIGNAL_SERVICE_STATUS_URL", "\"uptime.signal.org\"" - buildConfigField "String", "SIGNAL_KEY_BACKUP_URL", "\"https://api.backup.signal.org\"" - buildConfigField "String", "SIGNAL_SVR2_URL", "\"https://svr2.signal.org\"" - buildConfigField "String", "SIGNAL_SFU_URL", "\"https://sfu.voip.signal.org\"" - buildConfigField "String", "SIGNAL_STAGING_SFU_URL", "\"https://sfu.staging.voip.signal.org\"" - buildConfigField "String[]", "SIGNAL_SFU_INTERNAL_NAMES", "new String[]{\"Test\", \"Staging\", \"Development\"}" - buildConfigField "String[]", "SIGNAL_SFU_INTERNAL_URLS", "new String[]{\"https://sfu.test.voip.signal.org\", \"https://sfu.staging.voip.signal.org\", \"https://sfu.staging.test.voip.signal.org\"}" - buildConfigField "String", "CONTENT_PROXY_HOST", "\"contentproxy.signal.org\"" - buildConfigField "int", "CONTENT_PROXY_PORT", "443" - buildConfigField "String[]", "SIGNAL_SERVICE_IPS", service_ips - buildConfigField "String[]", "SIGNAL_STORAGE_IPS", storage_ips - buildConfigField "String[]", "SIGNAL_CDN_IPS", cdn_ips - buildConfigField "String[]", "SIGNAL_CDN2_IPS", cdn2_ips - buildConfigField "String[]", "SIGNAL_KBS_IPS", kbs_ips - buildConfigField "String[]", "SIGNAL_SFU_IPS", sfu_ips - buildConfigField "String[]", "SIGNAL_CONTENT_PROXY_IPS", content_proxy_ips - buildConfigField "String[]", "SIGNAL_CDSI_IPS", cdsi_ips - buildConfigField "String[]", "SIGNAL_SVR2_IPS", svr2_ips - buildConfigField "String", "SIGNAL_AGENT", "\"OWA\"" - buildConfigField "String", "CDSI_MRENCLAVE", "\"0f6fd79cdfdaa5b2e6337f534d3baf999318b0c462a7ac1f41297a3e4b424a57\"" - buildConfigField "String", "SVR2_MRENCLAVE", "\"6ee1042f9e20f880326686dd4ba50c25359f01e9f733eeba4382bca001d45094\"" - buildConfigField "org.tm.archive.KbsEnclave", "KBS_ENCLAVE", "new org.tm.archive.KbsEnclave(\"e18376436159cda3ad7a45d9320e382e4a497f26b0dca34d8eab0bd0139483b5\", " + - "\"3a485adb56e2058ef7737764c738c4069dd62bc457637eafb6bbce1ce29ddb89\", " + - "\"45627094b2ea4a66f4cf0b182858a8dcf4b8479122c3820fe7fd0551a6d4cf5c\")" - buildConfigField "org.tm.archive.KbsEnclave[]", "KBS_FALLBACKS", "new org.tm.archive.KbsEnclave[] { new org.tm.archive.KbsEnclave(\"0cedba03535b41b67729ce9924185f831d7767928a1d1689acb689bc079c375f\", " + - "\"187d2739d22be65e74b65f0055e74d31310e4267e5fac2b1246cc8beba81af39\", " + - "\"ee19f1965b1eefa3dc4204eb70c04f397755f771b8c1909d080c04dad2a6a9ba\") }" - buildConfigField "String", "UNIDENTIFIED_SENDER_TRUST_ROOT", "\"BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF\"" - buildConfigField "String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X36nOoGPs54XsEGzPdEV+itQNGUFEjY6X9Uv+Acuks7NpyGvCoKxGwgKgE5XyJ+nNKlyHHOLb6N1NuHyBrZrgtY/JYJHRooo5CEqYKBqdFnmbTVGEkCvJKxLnjwKWf+fEPoWeQFj5ObDjcKMZf2Jm2Ae69x+ikU5gBXsRmoF94GXTLfN0/vLt98KDPnxwAQL9j5V1jGOY8jQl6MLxEs56cwXN0dqCnImzVH3TZT1cJ8SW1BRX6qIVxEzjsSGx3yxF3suAilPMqGRp4ffyopjMD1JXiKR2RwLKzizUe5e8XyGOy9fplzhw3jVzTRyUZTRSZKkMLWcQ/gv0E4aONNqs4P\"" - buildConfigField "String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AByD873dTilmOSG0TjKrvpeaKEsUmIO8Vx9BeMmftwUs9v7ikPwM8P3OHyT0+X3EUMZrSe9VUp26Wai51Q9I8mdk0hX/yo7CeFGJyzoOqn8e/i4Ygbn5HoAyXJx5eXfIbqpc0bIxzju4H/HOQeOpt6h742qii5u/cbwOhFZCsMIbElZTaeU+BWMBQiZHIGHT5IE0qCordQKZ5iPZom0HeFa8Yq0ShuEyAl0WINBiY6xE3H/9WnvzXBbMuuk//eRxXgzO8ieCeK8FwQNxbfXqZm6Ro1cMhCOF3u7xoX83QhpN\"" - buildConfigField "String[]", "LANGUAGES", "new String[]{\"" + autoResConfig().collect { s -> s.replace('-r', '_') }.join('", "') + '"}' - buildConfigField "int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode" - //**TM_SA**//Start - buildConfigField "String", "signal_teleMessage_version", "\"$signal_teleMessage_version\"" - //**TM_SA**//End - buildConfigField "String", "DEFAULT_CURRENCIES", "\"EUR,AUD,GBP,CAD,CNY\"" - buildConfigField "String", "GIPHY_API_KEY", "\"3o6ZsYH6U6Eri53TXy\"" - buildConfigField "String", "SIGNAL_CAPTCHA_URL", "\"https://signalcaptchas.org/registration/generate.html\"" - buildConfigField "String", "RECAPTCHA_PROOF_URL", "\"https://signalcaptchas.org/challenge/generate.html\"" - - buildConfigField "String", "BUILD_DISTRIBUTION_TYPE", "\"unset\"" - buildConfigField "String", "BUILD_ENVIRONMENT_TYPE", "\"unset\"" - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"unset\"" - buildConfigField "String", "BADGE_STATIC_ROOT", "\"https://updates2.signal.org/static/badges/\"" - buildConfigField "String", "STRIPE_PUBLISHABLE_KEY", "\"pk_live_6cmGZopuTsV8novGgJJW9JpC00vLIgtQ1D\"" - buildConfigField "boolean", "TRACING_ENABLED", "false" - - ndk { - abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' - } - resourceConfigurations += [] - - - splits { - abi { - enable !project.hasProperty('generateBaselineProfile') - reset() - include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' - universalApk true - } - } - - testInstrumentationRunner "org.tm.archive.testing.SignalTestRunner" - testInstrumentationRunnerArguments clearPackageData: 'true' - } - - buildTypes { - debug { - if (keystores['debug'] != null) { - signingConfig signingConfigs.debug - } - isDefault true - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), - 'proguard/proguard-firebase-messaging.pro', - 'proguard/proguard-google-play-services.pro', - 'proguard/proguard-jackson.pro', - 'proguard/proguard-sqlite.pro', - 'proguard/proguard-appcompat-v7.pro', - 'proguard/proguard-square-okhttp.pro', - 'proguard/proguard-square-okio.pro', - 'proguard/proguard-rounded-image-view.pro', - 'proguard/proguard-glide.pro', - 'proguard/proguard-shortcutbadger.pro', - 'proguard/proguard-retrofit.pro', - 'proguard/proguard-webrtc.pro', - 'proguard/proguard-klinker.pro', - 'proguard/proguard-mobilecoin.pro', - 'proguard/proguard-retrolambda.pro', - 'proguard/proguard-okhttp.pro', - 'proguard/proguard-ez-vcard.pro', - 'proguard/proguard.cfg' - testProguardFiles 'proguard/proguard-automation.pro', - 'proguard/proguard.cfg' - 'proguard/proguard-event_bus.pro' //**TM_SA**// ++++++++ADD THIS FILE TO THE PROGUARD FOLDER++++++++ - - manifestPlaceholders = [mapsKey:getMapsKey()] - - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"Debug\"" - } - - instrumentation { - initWith debug - isDefault false - minifyEnabled false - matchingFallbacks = ['debug'] - applicationIdSuffix ".instrumentation" - - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"Instrumentation\"" - } - - spinner { - initWith debug - isDefault false - minifyEnabled false - matchingFallbacks = ['debug'] - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"Spinner\"" - } - - release { - minifyEnabled true - proguardFiles = buildTypes.debug.proguardFiles - //**TM_SA**//Start - signingConfig signingConfigs.release - //**TM_SA**//End - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"Release\"" - } - - perf { - initWith debug - isDefault false - debuggable false - minifyEnabled true - matchingFallbacks = ['debug'] - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"Perf\"" - buildConfigField "boolean", "TRACING_ENABLED", "true" - } - - benchmark { - initWith debug - isDefault false - debuggable false - minifyEnabled true - matchingFallbacks = ['debug'] - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"Benchmark\"" - buildConfigField "boolean", "TRACING_ENABLED", "true" - } - - canary { - initWith debug - isDefault false - minifyEnabled false - matchingFallbacks = ['debug'] - buildConfigField "String", "BUILD_VARIANT_TYPE", "\"Canary\"" - } - } - - productFlavors { - play { - dimension 'distribution' - isDefault true - ext.websiteUpdateUrl = "null" - buildConfigField "boolean", "PLAY_STORE_DISABLED", "false" - buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl" - buildConfigField "String", "BUILD_DISTRIBUTION_TYPE", "\"play\"" - } - - website { - dimension 'distribution' - ext.websiteUpdateUrl = "https://updates.signal.org/android" - buildConfigField "boolean", "PLAY_STORE_DISABLED", "true" - buildConfigField "String", "NOPLAY_UPDATE_URL", "\"$ext.websiteUpdateUrl\"" - buildConfigField "String", "BUILD_DISTRIBUTION_TYPE", "\"website\"" - } - - nightly { - dimension 'distribution' - versionNameSuffix "-nightly-untagged-${getDateSuffix()}" - ext.websiteUpdateUrl = "null" - buildConfigField "boolean", "PLAY_STORE_DISABLED", "false" - buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl" - buildConfigField "String", "BUILD_DISTRIBUTION_TYPE", "\"nightly\"" - } - - prod { - dimension 'environment' -// applicationIdSuffix ".prodshilo" //**TM_SA**//to comment it. it's for intune debugs - isDefault true - - buildConfigField "String", "MOBILE_COIN_ENVIRONMENT", "\"mainnet\"" - buildConfigField "String", "BUILD_ENVIRONMENT_TYPE", "\"Prod\"" - } - - staging { - dimension 'environment' - - applicationIdSuffix ".staging" - - buildConfigField "String", "SIGNAL_URL", "\"https://chat.staging.signal.org\"" - buildConfigField "String", "STORAGE_URL", "\"https://storage-staging.signal.org\"" - buildConfigField "String", "SIGNAL_CDN_URL", "\"https://cdn-staging.signal.org\"" - buildConfigField "String", "SIGNAL_CDN2_URL", "\"https://cdn2-staging.signal.org\"" - buildConfigField "String", "SIGNAL_CDSI_URL", "\"https://cdsi.staging.signal.org\"" - buildConfigField "String", "SIGNAL_KEY_BACKUP_URL", "\"https://api-staging.backup.signal.org\"" - buildConfigField "String", "SIGNAL_SVR2_URL", "\"https://svr2.staging.signal.org\"" - buildConfigField "String", "SVR2_MRENCLAVE", "\"a8a261420a6bb9b61aa25bf8a79e8bd20d7652531feb3381cbffd446d270be95\"" - buildConfigField "org.tm.archive.KbsEnclave", "KBS_ENCLAVE", "new org.tm.archive.KbsEnclave(\"39963b736823d5780be96ab174869a9499d56d66497aa8f9b2244f777ebc366b\", " + - "\"ee1d0d972b7ea903615670de43ab1b6e7a825e811c70a29bb5fe0f819e0975fa\", " + - "\"45627094b2ea4a66f4cf0b182858a8dcf4b8479122c3820fe7fd0551a6d4cf5c\")" - buildConfigField "org.tm.archive.KbsEnclave[]", "KBS_FALLBACKS", "new org.tm.archive.KbsEnclave[] { new org.tm.archive.KbsEnclave(\"dd6f66d397d9e8cf6ec6db238e59a7be078dd50e9715427b9c89b409ffe53f99\", " + - "\"4200003414528c151e2dccafbc87aa6d3d66a5eb8f8c05979a6e97cb33cd493a\", " + - "\"ee19f1965b1eefa3dc4204eb70c04f397755f771b8c1909d080c04dad2a6a9ba\") }" - buildConfigField "String", "UNIDENTIFIED_SENDER_TRUST_ROOT", "\"BbqY1DzohE4NUZoVF+L18oUPrK3kILllLEJh2UnPSsEx\"" - buildConfigField "String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdlukrpzzsCIvEwjwQlJYVPOQPj4V0F4UXXBdHSLK05uoPBCQG8G9rYIGedYsClJXnbrgGYG3eMTG5hnx4X4ntARBgELuMWWUEEfSK0mjXg+/2lPmWcTZWR9nkqgQQP0tbzuiPm74H2wMO4u1Wafe+UwyIlIT9L7KLS19Aw8r4sPrXZSSsOZ6s7M1+rTJN0bI5CKY2PX29y5Ok3jSWufIKcgKOnWoP67d5b2du2ZVJjpjfibNIHbT/cegy/sBLoFwtHogVYUewANUAXIaMPyCLRArsKhfJ5wBtTminG/PAvuBdJ70Z/bXVPf8TVsR292zQ65xwvWTejROW6AZX6aqucUj\"" - buildConfigField "String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AHILOIrFPXX9laLbalbA9+L1CXpSbM/bTJXZGZiuyK1JaI6dK5FHHWL6tWxmHKYAZTSYmElmJ5z2A5YcirjO/yfoemE03FItyaf8W1fE4p14hzb5qnrmfXUSiAIVrhaXVwIwSzH6RL/+EO8jFIjJ/YfExfJ8aBl48CKHgu1+A6kWynhttonvWWx6h7924mIzW0Czj2ROuh4LwQyZypex4GuOPW8sgIT21KNZaafgg+KbV7XM1x1tF3XA17B4uGUaDbDw2O+nR1+U5p6qHPzmJ7ggFjSN6Utu+35dS1sS0P9N\"" - buildConfigField "String", "MOBILE_COIN_ENVIRONMENT", "\"testnet\"" - buildConfigField "String", "SIGNAL_CAPTCHA_URL", "\"https://signalcaptchas.org/staging/registration/generate.html\"" - buildConfigField "String", "RECAPTCHA_PROOF_URL", "\"https://signalcaptchas.org/staging/challenge/generate.html\"" - - buildConfigField "String", "BUILD_ENVIRONMENT_TYPE", "\"Staging\"" - buildConfigField "String", "STRIPE_PUBLISHABLE_KEY", "\"pk_test_sngOd8FnXNkpce9nPXawKrJD00kIDngZkD\"" - } - - pnp { - dimension 'environment' - - initWith staging - applicationIdSuffix ".pnp" - - buildConfigField "String", "BUILD_ENVIRONMENT_TYPE", "\"Pnp\"" - } - } - - lint { - abortOnError true - baseline file('lint-baseline.xml') - checkReleaseBuilds false - disable 'LintError' - } - - android.applicationVariants.all { variant -> - variant.outputs.each { output -> - if (output.baseName.contains('nightly')) { - output.versionCodeOverride = canonicalVersionCode * postFixSize + 5 - def tag = getCurrentGitTag() - if (tag != null && tag.length() > 0) { - if (tag.startsWith("v")) { - tag = tag.substring(1) - } - output.versionNameOverride = tag - } - } else { - output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk") - def abiName = output.getFilter("ABI") ?: 'universal' - def postFix = abiPostFix.get(abiName, 0) - - if (postFix >= postFixSize) throw new AssertionError("postFix is too large") - - output.versionCodeOverride = canonicalVersionCode * postFixSize + postFix - } - } - } - - android.variantFilter { variant -> - def distribution = variant.getFlavors().get(0).name - def environment = variant.getFlavors().get(1).name - def buildType = variant.buildType.name - def fullName = distribution + environment.capitalize() + buildType.capitalize() - - if (!selectableVariants.contains(fullName)) { - variant.setIgnore(true) - } - } - - android.buildTypes.each { - if (it.name != 'release') { - sourceSets.findByName(it.name).java.srcDirs += "$projectDir/src/debug/java" - } else { - sourceSets.findByName(it.name).java.srcDirs += "$projectDir/src/release/java" - } - } -} - -dependencies { - implementation libs.androidx.fragment.ktx - lintChecks project(':lintchecks') - - coreLibraryDesugaring libs.android.tools.desugar - - implementation (libs.androidx.appcompat) { - version { - strictly '1.6.1' - } - } - implementation libs.androidx.window.window - implementation libs.androidx.window.java - implementation libs.androidx.recyclerview - implementation libs.material.material - implementation libs.androidx.legacy.support - implementation libs.androidx.preference - implementation libs.androidx.legacy.preference - implementation libs.androidx.gridlayout - implementation libs.androidx.exifinterface - implementation libs.androidx.compose.rxjava3 - implementation libs.androidx.compose.runtime.livedata - implementation libs.androidx.constraintlayout - implementation libs.androidx.multidex - implementation libs.androidx.navigation.fragment.ktx - implementation libs.androidx.navigation.ui.ktx - implementation libs.androidx.lifecycle.viewmodel.ktx - implementation libs.androidx.lifecycle.livedata.ktx - implementation libs.androidx.lifecycle.process - implementation libs.androidx.lifecycle.viewmodel.savedstate - implementation libs.androidx.lifecycle.common.java8 - implementation libs.androidx.lifecycle.reactivestreams.ktx - implementation libs.androidx.camera.core - implementation libs.androidx.camera.camera2 - implementation libs.androidx.camera.lifecycle - implementation libs.androidx.camera.view - implementation libs.androidx.concurrent.futures - implementation libs.androidx.autofill - implementation libs.androidx.biometric - implementation libs.androidx.sharetarget - implementation libs.androidx.profileinstaller - implementation libs.androidx.asynclayoutinflater - implementation libs.androidx.asynclayoutinflater.appcompat - - implementation (libs.firebase.messaging) { - exclude group: 'com.google.firebase', module: 'firebase-core' - exclude group: 'com.google.firebase', module: 'firebase-analytics' - exclude group: 'com.google.firebase', module: 'firebase-measurement-connector' - } - - implementation libs.google.play.services.maps - implementation libs.google.play.services.auth - - implementation libs.bundles.media3 - - implementation libs.conscrypt.android - implementation libs.signal.aesgcmprovider - - implementation project(':libsignal-service') - implementation project(':paging') - implementation project(':core-util') - implementation project(':glide-config') - implementation project(':video') - implementation project(':device-transfer') - implementation project(':image-editor') - implementation project(':donations') - implementation project(':contacts') - implementation project(':qr') - implementation project(':sms-exporter') - implementation project(':sticky-header-grid') - implementation project(':photoview') - - implementation libs.libsignal.android - implementation libs.google.protobuf.javalite - - implementation(libs.mobilecoin) { - exclude group: 'com.google.protobuf' - } - - implementation libs.signal.ringrtc - - implementation libs.leolin.shortcutbadger - implementation libs.emilsjolander.stickylistheaders - implementation libs.apache.httpclient.android - implementation libs.glide.glide - implementation libs.roundedimageview - implementation libs.materialish.progress - implementation libs.greenrobot.eventbus - implementation libs.google.zxing.android.integration - implementation libs.google.zxing.core - implementation libs.google.flexbox - implementation (libs.subsampling.scale.image.view) { - exclude group: 'com.android.support', module: 'support-annotations' - } - implementation (libs.android.tooltips) { - exclude group: 'com.android.support', module: 'appcompat-v7' - } - implementation (libs.android.smsmms) { - exclude group: 'com.squareup.okhttp', module: 'okhttp' - exclude group: 'com.squareup.okhttp', module: 'okhttp-urlconnection' - } - implementation libs.stream - - implementation libs.lottie - - implementation libs.signal.android.database.sqlcipher - implementation libs.androidx.sqlite - - implementation (libs.google.ez.vcard) { - exclude group: 'com.fasterxml.jackson.core' - exclude group: 'org.freemarker' - } - implementation libs.dnsjava - implementation libs.kotlinx.collections.immutable - implementation libs.accompanist.permissions - - spinnerImplementation project(":spinner") - - canaryImplementation libs.square.leakcanary - - testImplementation testLibs.junit.junit - testImplementation testLibs.assertj.core - testImplementation testLibs.mockito.core - testImplementation testLibs.mockito.kotlin - - testImplementation testLibs.androidx.test.core - testImplementation (testLibs.robolectric.robolectric) { - exclude group: 'com.google.protobuf', module: 'protobuf-java' - } - testImplementation testLibs.robolectric.shadows.multidex - testImplementation (testLibs.bouncycastle.bcprov.jdk15on) { version { strictly "1.70" } } // Used by roboelectric - testImplementation (testLibs.bouncycastle.bcpkix.jdk15on) { version { strictly "1.70" } } // Used by roboelectric - testImplementation testLibs.hamcrest.hamcrest - testImplementation testLibs.mockk - - testImplementation(testFixtures(project(":libsignal-service"))) - - androidTestImplementation testLibs.androidx.test.ext.junit - androidTestImplementation testLibs.espresso.core - androidTestImplementation testLibs.androidx.test.core - androidTestImplementation testLibs.androidx.test.core.ktx - androidTestImplementation testLibs.androidx.test.ext.junit.ktx - androidTestImplementation testLibs.mockito.android - androidTestImplementation testLibs.mockito.kotlin - androidTestImplementation testLibs.mockk.android - androidTestImplementation testLibs.square.okhttp.mockserver - - instrumentationImplementation (libs.androidx.fragment.testing) { - exclude group: 'androidx.test', module: 'core' - } - - testImplementation testLibs.espresso.core - - implementation libs.kotlin.stdlib.jdk8 - implementation libs.kotlin.reflect - implementation libs.jackson.module.kotlin - - implementation libs.rxjava3.rxandroid - implementation libs.rxjava3.rxkotlin - implementation libs.rxdogtag - - androidTestUtil testLibs.androidx.test.orchestrator - - implementation project(':core-ui') - ktlintRuleset libs.ktlint.twitter.compose - - //**TM_SA**//Start - implementation 'com.squareup.okhttp3:okhttp:3.8.1' - implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.8.1' - implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1' - - implementation 'com.squareup.retrofit2:retrofit:2.6.1' - implementation 'com.squareup.retrofit2:converter-gson:2.1.0' - - implementation 'androidx.work:work-runtime:2.7.1' - - implementation 'org.tinylog:tinylog-impl:2.6.2' - implementation 'com.google.code.gson:gson:2.8.6' - implementation 'org.apache.commons:commons-lang3:3.12.0' - implementation 'commons-io:commons-io:2.6' - implementation 'org.apache.commons:commons-text:1.9' - implementation group: 'commons-io', name: 'commons-io', version: '2.6' //For test copy file - - - api fileTree(include: ['*.aar'], dir: 'libs') -// Include the MAM SDK - implementation files('MAMSDK/Microsoft.Intune.MAM.SDK.aar') - // Include MSAL - implementation 'com.microsoft.identity.client:msal:2.0.8' - - //**TM_SA**//End -} - -def getLastCommitTimestamp() { - if (!(new File('.git').exists())) { - return System.currentTimeMillis().toString() - } - - new ByteArrayOutputStream().withStream { os -> - exec { - executable = 'git' - args = ['log', '-1', '--pretty=format:%ct'] - standardOutput = os - } - - return os.toString() + "000" - } -} - -def getGitHash() { - if (!(new File('.git').exists())) { - throw new IllegalStateException("Must be a git repository to guarantee reproducible builds! (git hash is part of APK)") - } - - def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git', 'rev-parse', 'HEAD' - standardOutput = stdout - } - return stdout.toString().trim().substring(0, 12) -} - -def getCurrentGitTag() { - if (!(new File('.git').exists())) { - throw new IllegalStateException("Must be a git repository to guarantee reproducible builds! (git hash is part of APK)") - } - - def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git', 'tag', '--points-at', 'HEAD' - standardOutput = stdout - } - - def output = stdout.toString().trim() - - if (output != null && output.size() > 0) { - def tags = output.split('\n').toList() - return tags.stream().filter(t -> t.contains('nightly')).findFirst().orElse(tags.get(0)) - } else { - return null - } -} - -tasks.withType(Test) { - testLogging { - events "failed" - exceptionFormat "full" - showCauses true - showExceptions true - showStackTraces true - } -} - -def loadKeystoreProperties(filename) { - def keystorePropertiesFile = file("${project.rootDir}/${filename}") - if (keystorePropertiesFile.exists()) { - def keystoreProperties = new Properties() - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) - return keystoreProperties - } else { - return null - } -} - -static def getDateSuffix() { - def date = new Date() - def formattedDate = date.format('yyyy-MM-dd-HH:mm') - return formattedDate -} - -def getMapsKey() { - def mapKey = file("${project.rootDir}/maps.key") - if (mapKey.exists()) { - return mapKey.readLines()[0] - } - return "AIzaSyAVa3EZMZWSbiUAfgiJTb-7Ljo0se6YWys"//**TM_SA**// change key -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 00000000..2fd2b109 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,745 @@ +import com.android.build.api.dsl.ManagedVirtualDevice +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import java.io.ByteArrayOutputStream +import java.io.FileInputStream +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Properties + +plugins { + id("com.android.application") + id("kotlin-android") + id ("kotlin-kapt") //**TM_SA** +// id ("com.microsoft.intune.mam") //**TM_SA** + id("androidx.navigation.safeargs") + id("org.jlleitschuh.gradle.ktlint") + id("org.jetbrains.kotlin.android") + id("app.cash.exhaustive") + id("kotlin-parcelize") + id("com.squareup.wire") + id("translations") + id("licenses") +} + +apply(from = "static-ips.gradle.kts") + +val canonicalVersionCode = 1376 +val canonicalVersionName = "6.44.2" + +val postFixSize = 100 +val abiPostFix: Map = mapOf( + "universal" to 0, + "armeabi-v7a" to 1, + "arm64-v8a" to 2, + "x86" to 3, + "x86_64" to 4 +) + +val keystores: Map = mapOf("debug" to loadKeystoreProperties("keystore.debug.properties")) + +val selectableVariants = listOf( + "nightlyProdSpinner", + "nightlyProdPerf", + "nightlyProdRelease", + "nightlyStagingRelease", + "nightlyPnpPerf", + "nightlyPnpRelease", + "playProdDebug", + "playProdSpinner", + "playProdCanary", + "playProdPerf", + "playProdBenchmark", + "playProdInstrumentation", + "playProdRelease", + "playStagingDebug", + "playStagingCanary", + "playStagingSpinner", + "playStagingPerf", + "playStagingInstrumentation", + "playPnpDebug", + "playPnpSpinner", + "playStagingRelease", + "websiteProdSpinner", + "websiteProdRelease" +) + +val signalBuildToolsVersion: String by rootProject.extra +val signalCompileSdkVersion: String by rootProject.extra +val signalTargetSdkVersion: Int by rootProject.extra +val signalMinSdkVersion: Int by rootProject.extra +val signalJavaVersion: JavaVersion by rootProject.extra +val signalKotlinJvmTarget: String by rootProject.extra + +wire { + kotlin { + javaInterop = true + } + + sourcePath { + srcDir("src/main/protowire") + } + + protoPath { + srcDir("${project.rootDir}/libsignal-service/src/main/protowire") + } +} + +ktlint { + version.set("0.49.1") +} + +android { + namespace = "org.tm.archive" + + buildToolsVersion = signalBuildToolsVersion + compileSdkVersion = signalCompileSdkVersion + + flavorDimensions += listOf("distribution", "environment") + useLibrary("org.apache.http.legacy") + testBuildType = "instrumentation" + + kotlinOptions { + jvmTarget = signalKotlinJvmTarget + freeCompilerArgs = listOf("-Xallow-result-return-type") + } + + keystores["debug"]?.let { properties -> + signingConfigs.getByName("debug").apply { + storeFile = file("${project.rootDir}/${properties.getProperty("storeFile")}") + storePassword = properties.getProperty("storePassword") + keyAlias = properties.getProperty("keyAlias") + keyPassword = properties.getProperty("keyPassword") + } + } + + testOptions { + execution = "ANDROIDX_TEST_ORCHESTRATOR" + + unitTests { + isIncludeAndroidResources = true + } + + managedDevices { + devices { + create("pixel3api30") { + device = "Pixel 3" + apiLevel = 30 + systemImageSource = "google-atd" + require64Bit = false + } + } + } + } + + sourceSets { + getByName("test") { + java.srcDir("$projectDir/src/testShared") + } + + getByName("androidTest") { + java.srcDir("$projectDir/src/testShared") + } + } + + compileOptions { + isCoreLibraryDesugaringEnabled = true + sourceCompatibility = signalJavaVersion + targetCompatibility = signalJavaVersion + } + + packagingOptions { + resources { + excludes += setOf("LICENSE.txt", "LICENSE", "NOTICE", "asm-license.txt", "META-INF/LICENSE", "META-INF/LICENSE.md", "META-INF/NOTICE", "META-INF/LICENSE-notice.md", "META-INF/proguard/androidx-annotations.pro", "libsignal_jni.dylib", "signal_jni.dll") + } + } + + buildFeatures { + viewBinding = true + compose = true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.4.4" + } + + defaultConfig { + versionCode = canonicalVersionCode * postFixSize + versionName = canonicalVersionName + + minSdkVersion(signalMinSdkVersion) + targetSdkVersion(signalTargetSdkVersion) + + multiDexEnabled = true + + vectorDrawables.useSupportLibrary = true + project.ext.set("archivesBaseName", "Signal") + + manifestPlaceholders["mapsKey"] = "AIzaSyCSx9xea86GwDKGznCAULE9Y5a8b-TfN9U" + + buildConfigField("long", "BUILD_TIMESTAMP", getLastCommitTimestamp() + "L") + buildConfigField("String", "GIT_HASH", "\"${getGitHash()}\"") + buildConfigField("String", "SIGNAL_URL", "\"https://chat.signal.org\"") + buildConfigField("String", "STORAGE_URL", "\"https://storage.signal.org\"") + buildConfigField("String", "SIGNAL_CDN_URL", "\"https://cdn.signal.org\"") + buildConfigField("String", "SIGNAL_CDN2_URL", "\"https://cdn2.signal.org\"") + buildConfigField("String", "SIGNAL_CDN3_URL", "\"https://cdn3.signal.org\"") + buildConfigField("String", "SIGNAL_CDSI_URL", "\"https://cdsi.signal.org\"") + buildConfigField("String", "SIGNAL_SERVICE_STATUS_URL", "\"uptime.signal.org\"") + buildConfigField("String", "SIGNAL_KEY_BACKUP_URL", "\"https://api.backup.signal.org\"") + buildConfigField("String", "SIGNAL_SVR2_URL", "\"https://svr2.signal.org\"") + buildConfigField("String", "SIGNAL_SFU_URL", "\"https://sfu.voip.signal.org\"") + buildConfigField("String", "SIGNAL_STAGING_SFU_URL", "\"https://sfu.staging.voip.signal.org\"") + buildConfigField("String[]", "SIGNAL_SFU_INTERNAL_NAMES", "new String[]{\"Test\", \"Staging\", \"Development\"}") + buildConfigField("String[]", "SIGNAL_SFU_INTERNAL_URLS", "new String[]{\"https://sfu.test.voip.signal.org\", \"https://sfu.staging.voip.signal.org\", \"https://sfu.staging.test.voip.signal.org\"}") + buildConfigField("String", "CONTENT_PROXY_HOST", "\"contentproxy.signal.org\"") + buildConfigField("int", "CONTENT_PROXY_PORT", "443") + buildConfigField("String[]", "SIGNAL_SERVICE_IPS", rootProject.extra["service_ips"] as String) + buildConfigField("String[]", "SIGNAL_STORAGE_IPS", rootProject.extra["storage_ips"] as String) + buildConfigField("String[]", "SIGNAL_CDN_IPS", rootProject.extra["cdn_ips"] as String) + buildConfigField("String[]", "SIGNAL_CDN2_IPS", rootProject.extra["cdn2_ips"] as String) + buildConfigField("String[]", "SIGNAL_CDN3_IPS", rootProject.extra["cdn3_ips"] as String) + buildConfigField("String[]", "SIGNAL_SFU_IPS", rootProject.extra["sfu_ips"] as String) + buildConfigField("String[]", "SIGNAL_CONTENT_PROXY_IPS", rootProject.extra["content_proxy_ips"] as String) + buildConfigField("String[]", "SIGNAL_CDSI_IPS", rootProject.extra["cdsi_ips"] as String) + buildConfigField("String[]", "SIGNAL_SVR2_IPS", rootProject.extra["svr2_ips"] as String) + buildConfigField("String", "SIGNAL_AGENT", "\"OWA\"") + buildConfigField("String", "CDSI_MRENCLAVE", "\"0f6fd79cdfdaa5b2e6337f534d3baf999318b0c462a7ac1f41297a3e4b424a57\"") + buildConfigField("String", "SVR2_MRENCLAVE_DEPRECATED", "\"6ee1042f9e20f880326686dd4ba50c25359f01e9f733eeba4382bca001d45094\"") + buildConfigField("String", "SVR2_MRENCLAVE", "\"a6622ad4656e1abcd0bc0ff17c229477747d2ded0495c4ebee7ed35c1789fa97\"") + buildConfigField("String", "UNIDENTIFIED_SENDER_TRUST_ROOT", "\"BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF\"") + buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X36nOoGPs54XsEGzPdEV+itQNGUFEjY6X9Uv+Acuks7NpyGvCoKxGwgKgE5XyJ+nNKlyHHOLb6N1NuHyBrZrgtY/JYJHRooo5CEqYKBqdFnmbTVGEkCvJKxLnjwKWf+fEPoWeQFj5ObDjcKMZf2Jm2Ae69x+ikU5gBXsRmoF94GXTLfN0/vLt98KDPnxwAQL9j5V1jGOY8jQl6MLxEs56cwXN0dqCnImzVH3TZT1cJ8SW1BRX6qIVxEzjsSGx3yxF3suAilPMqGRp4ffyopjMD1JXiKR2RwLKzizUe5e8XyGOy9fplzhw3jVzTRyUZTRSZKkMLWcQ/gv0E4aONNqs4P+NameAZYOD12qRkxosQQP5uux6B2nRyZ7sAV54DgFyLiRcq1FvwKw2EPQdk4HDoePrO/RNUbyNddnM/mMgj4FW65xCoT1LmjrIjsv/Ggdlx46ueczhMgtBunx1/w8k8V+l8LVZ8gAT6wkU5J+DPQalQguMg12Jzug3q4TbdHiGCmD9EunCwOmsLuLJkz6EcSYXtrlDEnAM+hicw7iergYLLlMXpfTdGxJCWJmP4zqUFeTTmsmhsjGBt7NiEB/9pFFEB3pSbf4iiUukw63Eo8Aqnf4iwob6X1QviCWuc8t0I=\"") + buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AByD873dTilmOSG0TjKrvpeaKEsUmIO8Vx9BeMmftwUs9v7ikPwM8P3OHyT0+X3EUMZrSe9VUp26Wai51Q9I8mdk0hX/yo7CeFGJyzoOqn8e/i4Ygbn5HoAyXJx5eXfIbqpc0bIxzju4H/HOQeOpt6h742qii5u/cbwOhFZCsMIbElZTaeU+BWMBQiZHIGHT5IE0qCordQKZ5iPZom0HeFa8Yq0ShuEyAl0WINBiY6xE3H/9WnvzXBbMuuk//eRxXgzO8ieCeK8FwQNxbfXqZm6Ro1cMhCOF3u7xoX83QhpN\"") + buildConfigField("String", "BACKUP_SERVER_PUBLIC_PARAMS", "\"AJwNSU55fsFCbgaxGRD11wO1juAs8Yr5GF8FPlGzzvdJJIKH5/4CC7ZJSOe3yL2vturVaRU2Cx0n751Vt8wkj1bozK3CBV1UokxV09GWf+hdVImLGjXGYLLhnI1J2TWEe7iWHyb553EEnRb5oxr9n3lUbNAJuRmFM7hrr0Al0F0wrDD4S8lo2mGaXe0MJCOM166F8oYRQqpFeEHfiLnxA1O8ZLh7vMdv4g9jI5phpRBTsJ5IjiJrWeP0zdIGHEssUeprDZ9OUJ14m0v61eYJMKsf59Bn+mAT2a7YfB+Don9O\"") + buildConfigField("String[]", "LANGUAGES", "new String[]{ ${languageList().map { "\"$it\"" }.joinToString(separator = ", ")} }") + buildConfigField("int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode") + buildConfigField("String", "DEFAULT_CURRENCIES", "\"EUR,AUD,GBP,CAD,CNY\"") + buildConfigField("String", "GIPHY_API_KEY", "\"3o6ZsYH6U6Eri53TXy\"") + buildConfigField("String", "SIGNAL_CAPTCHA_URL", "\"https://signalcaptchas.org/registration/generate.html\"") + buildConfigField("String", "RECAPTCHA_PROOF_URL", "\"https://signalcaptchas.org/challenge/generate.html\"") + + buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"unset\"") + buildConfigField("String", "BUILD_ENVIRONMENT_TYPE", "\"unset\"") + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"unset\"") + buildConfigField("String", "BADGE_STATIC_ROOT", "\"https://updates2.signal.org/static/badges/\"") + buildConfigField("String", "STRIPE_PUBLISHABLE_KEY", "\"pk_live_6cmGZopuTsV8novGgJJW9JpC00vLIgtQ1D\"") + buildConfigField("boolean", "TRACING_ENABLED", "false") + + ndk { + abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + } + resourceConfigurations += listOf() + + splits { + abi { + isEnable = !project.hasProperty("generateBaselineProfile") + reset() + include("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + isUniversalApk = true + } + } + + testInstrumentationRunner = "org.tm.archive.testing.SignalTestRunner" + testInstrumentationRunnerArguments["clearPackageData"] = "true" + } + + buildTypes { + getByName("debug") { + if (keystores["debug"] != null) { + signingConfig = signingConfigs["debug"] + } + isDefault = true + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android.txt"), + "proguard/proguard-firebase-messaging.pro", + "proguard/proguard-google-play-services.pro", + "proguard/proguard-jackson.pro", + "proguard/proguard-sqlite.pro", + "proguard/proguard-appcompat-v7.pro", + "proguard/proguard-square-okhttp.pro", + "proguard/proguard-square-okio.pro", + "proguard/proguard-rounded-image-view.pro", + "proguard/proguard-glide.pro", + "proguard/proguard-shortcutbadger.pro", + "proguard/proguard-retrofit.pro", + "proguard/proguard-webrtc.pro", + "proguard/proguard-klinker.pro", + "proguard/proguard-mobilecoin.pro", + "proguard/proguard-retrolambda.pro", + "proguard/proguard-okhttp.pro", + "proguard/proguard-ez-vcard.pro", + "proguard/proguard.cfg" + ) + testProguardFiles( + "proguard/proguard-automation.pro", + "proguard/proguard.cfg" + ) + + manifestPlaceholders["mapsKey"] = getMapsKey() + + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Debug\"") + } + + getByName("release") { + isMinifyEnabled = true + proguardFiles(*buildTypes["debug"].proguardFiles.toTypedArray()) + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Release\"") + } + + create("instrumentation") { + initWith(getByName("debug")) + isDefault = false + isMinifyEnabled = false + matchingFallbacks += "debug" + applicationIdSuffix = ".instrumentation" + + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Instrumentation\"") + } + + create("spinner") { + initWith(getByName("debug")) + isDefault = false + isMinifyEnabled = false + matchingFallbacks += "debug" + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Spinner\"") + } + + create("perf") { + initWith(getByName("debug")) + isDefault = false + isDebuggable = false + isMinifyEnabled = true + matchingFallbacks += "debug" + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Perf\"") + buildConfigField("boolean", "TRACING_ENABLED", "true") + } + + create("benchmark") { + initWith(getByName("debug")) + isDefault = false + isDebuggable = false + isMinifyEnabled = true + matchingFallbacks += "debug" + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Benchmark\"") + buildConfigField("boolean", "TRACING_ENABLED", "true") + } + + create("canary") { + initWith(getByName("debug")) + isDefault = false + isMinifyEnabled = false + matchingFallbacks += "debug" + buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Canary\"") + } + } + + productFlavors { + create("play") { + dimension = "distribution" + isDefault = true + buildConfigField("boolean", "MANAGES_APP_UPDATES", "false") + buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "null") + buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"play\"") + } + + create("website") { + dimension = "distribution" + buildConfigField("boolean", "MANAGES_APP_UPDATES", "true") + buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "\"https://updates.signal.org/android/latest.json\"") + buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"website\"") + } + + create("nightly") { + val apkUpdateManifestUrl = if (file("${project.rootDir}/nightly-url.txt").exists()) { + file("${project.rootDir}/nightly-url.txt").readText().trim() + } else { + "" + } + + dimension = "distribution" + versionNameSuffix = "-nightly-untagged-${getDateSuffix()}" + buildConfigField("boolean", "MANAGES_APP_UPDATES", "true") + buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "\"${apkUpdateManifestUrl}\"") + buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"nightly\"") + } + + create("prod") { + dimension = "environment" + + isDefault = true + + buildConfigField("String", "MOBILE_COIN_ENVIRONMENT", "\"mainnet\"") + buildConfigField("String", "BUILD_ENVIRONMENT_TYPE", "\"Prod\"") + } + + create("staging") { + dimension = "environment" + + applicationIdSuffix = ".staging" + + buildConfigField("String", "SIGNAL_URL", "\"https://chat.staging.signal.org\"") + buildConfigField("String", "STORAGE_URL", "\"https://storage-staging.signal.org\"") + buildConfigField("String", "SIGNAL_CDN_URL", "\"https://cdn-staging.signal.org\"") + buildConfigField("String", "SIGNAL_CDN2_URL", "\"https://cdn2-staging.signal.org\"") + buildConfigField("String", "SIGNAL_CDN3_URL", "\"https://cdn3-staging.signal.org\"") + buildConfigField("String", "SIGNAL_CDSI_URL", "\"https://cdsi.staging.signal.org\"") + buildConfigField("String", "SIGNAL_KEY_BACKUP_URL", "\"https://api-staging.backup.signal.org\"") + buildConfigField("String", "SIGNAL_SVR2_URL", "\"https://svr2.staging.signal.org\"") + buildConfigField("String", "SVR2_MRENCLAVE_DEPRECATED", "\"a8a261420a6bb9b61aa25bf8a79e8bd20d7652531feb3381cbffd446d270be95\"") + buildConfigField("String", "SVR2_MRENCLAVE", "\"acb1973aa0bbbd14b3b4e06f145497d948fd4a98efc500fcce363b3b743ec482\"") + buildConfigField("String", "UNIDENTIFIED_SENDER_TRUST_ROOT", "\"BbqY1DzohE4NUZoVF+L18oUPrK3kILllLEJh2UnPSsEx\"") + buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdlukrpzzsCIvEwjwQlJYVPOQPj4V0F4UXXBdHSLK05uoPBCQG8G9rYIGedYsClJXnbrgGYG3eMTG5hnx4X4ntARBgELuMWWUEEfSK0mjXg+/2lPmWcTZWR9nkqgQQP0tbzuiPm74H2wMO4u1Wafe+UwyIlIT9L7KLS19Aw8r4sPrXZSSsOZ6s7M1+rTJN0bI5CKY2PX29y5Ok3jSWufIKcgKOnWoP67d5b2du2ZVJjpjfibNIHbT/cegy/sBLoFwtHogVYUewANUAXIaMPyCLRArsKhfJ5wBtTminG/PAvuBdJ70Z/bXVPf8TVsR292zQ65xwvWTejROW6AZX6aqucUjlENAErBme1YHmOSpU6tr6doJ66dPzVAWIanmO/5mgjNEDeK7DDqQdB1xd03HT2Qs2TxY3kCK8aAb/0iM0HQiXjxZ9HIgYhbtvGEnDKW5ILSUydqH/KBhW4Pb0jZWnqN/YgbWDKeJxnDbYcUob5ZY5Lt5ZCMKuaGUvCJRrCtuugSMaqjowCGRempsDdJEt+cMaalhZ6gczklJB/IbdwENW9KeVFPoFNFzhxWUIS5ML9riVYhAtE6JE5jX0xiHNVIIPthb458cfA8daR0nYfYAUKogQArm0iBezOO+mPk5vCM=\"") + buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AHILOIrFPXX9laLbalbA9+L1CXpSbM/bTJXZGZiuyK1JaI6dK5FHHWL6tWxmHKYAZTSYmElmJ5z2A5YcirjO/yfoemE03FItyaf8W1fE4p14hzb5qnrmfXUSiAIVrhaXVwIwSzH6RL/+EO8jFIjJ/YfExfJ8aBl48CKHgu1+A6kWynhttonvWWx6h7924mIzW0Czj2ROuh4LwQyZypex4GuOPW8sgIT21KNZaafgg+KbV7XM1x1tF3XA17B4uGUaDbDw2O+nR1+U5p6qHPzmJ7ggFjSN6Utu+35dS1sS0P9N\"") + buildConfigField("String", "BACKUP_SERVER_PUBLIC_PARAMS", "\"AHYrGb9IfugAAJiPKp+mdXUx+OL9zBolPYHYQz6GI1gWjpEu5me3zVNSvmYY4zWboZHif+HG1sDHSuvwFd0QszSwuSF4X4kRP3fJREdTZ5MCR0n55zUppTwfHRW2S4sdQ0JGz7YDQIJCufYSKh0pGNEHL6hv79Agrdnr4momr3oXdnkpVBIp3HWAQ6IbXQVSG18X36GaicI1vdT0UFmTwU2KTneluC2eyL9c5ff8PcmiS+YcLzh0OKYQXB5ZfQ06d6DiINvDQLy75zcfUOniLAj0lGJiHxGczin/RXisKSR8\"") + buildConfigField("String", "MOBILE_COIN_ENVIRONMENT", "\"testnet\"") + buildConfigField("String", "SIGNAL_CAPTCHA_URL", "\"https://signalcaptchas.org/staging/registration/generate.html\"") + buildConfigField("String", "RECAPTCHA_PROOF_URL", "\"https://signalcaptchas.org/staging/challenge/generate.html\"") + + buildConfigField("String", "BUILD_ENVIRONMENT_TYPE", "\"Staging\"") + buildConfigField("String", "STRIPE_PUBLISHABLE_KEY", "\"pk_test_sngOd8FnXNkpce9nPXawKrJD00kIDngZkD\"") + } + + create("pnp") { + dimension = "environment" + + initWith(getByName("staging")) + applicationIdSuffix = ".pnp" + + buildConfigField("String", "BUILD_ENVIRONMENT_TYPE", "\"Pnp\"") + } + } + + lint { + abortOnError = true + baseline = file("lint-baseline.xml") + checkReleaseBuilds = false + disable += "LintError" + } + + applicationVariants.all { + val variant = this + + variant.outputs + .map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl } + .forEach { output -> + if (output.baseName.contains("nightly")) { + output.versionCodeOverride = canonicalVersionCode * postFixSize + 5 + var tag = getCurrentGitTag() + if (!tag.isNullOrEmpty()) { + if (tag.startsWith("v")) { + tag = tag.substring(1) + } + output.versionNameOverride = tag + output.outputFileName = output.outputFileName.replace(".apk", "-${output.versionNameOverride}.apk") + } else { + output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk") + } + } else { + output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk") + + val abiName: String = output.getFilter("ABI") ?: "universal" + val postFix: Int = abiPostFix[abiName]!! + + if (postFix >= postFixSize) { + throw AssertionError("postFix is too large") + } + + output.versionCodeOverride = canonicalVersionCode * postFixSize + postFix + } + } + } + + android.variantFilter { + val distribution: String = flavors[0].name + val environment: String = flavors[1].name + val buildType: String = buildType.name + val fullName: String = distribution + environment.capitalize() + buildType.capitalize() + + if (!selectableVariants.contains(fullName)) { + ignore = true + } + } + + android.buildTypes.forEach { + val path: String = if (it.name == "release") { + "$projectDir/src/release/java" + } else { + "$projectDir/src/debug/java" + } + + sourceSets.findByName(it.name)!!.java.srcDir(path) + } +} + +dependencies { + lintChecks(project(":lintchecks")) + ktlintRuleset(libs.ktlint.twitter.compose) + coreLibraryDesugaring(libs.android.tools.desugar) + + implementation(project(":libsignal-service")) + implementation(project(":paging")) + implementation(project(":core-util")) + implementation(project(":glide-config")) + implementation(project(":video")) + implementation(project(":device-transfer")) + implementation(project(":image-editor")) + implementation(project(":donations")) + implementation(project(":contacts")) + implementation(project(":qr")) + implementation(project(":sms-exporter")) + implementation(project(":sticky-header-grid")) + implementation(project(":photoview")) + implementation(project(":glide-webp")) + implementation(project(":core-ui")) + + implementation(libs.androidx.fragment.ktx) + implementation(libs.androidx.appcompat) { + version { + strictly("1.6.1") + } + } + implementation(libs.androidx.window.window) + implementation(libs.androidx.window.java) + implementation(libs.androidx.recyclerview) + implementation(libs.material.material) + implementation(libs.androidx.legacy.support) + implementation(libs.androidx.preference) + implementation(libs.androidx.legacy.preference) + implementation(libs.androidx.gridlayout) + implementation(libs.androidx.exifinterface) + implementation(libs.androidx.compose.rxjava3) + implementation(libs.androidx.compose.runtime.livedata) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.multidex) + implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.lifecycle.process) + implementation(libs.androidx.lifecycle.viewmodel.savedstate) + implementation(libs.androidx.lifecycle.common.java8) + implementation(libs.androidx.lifecycle.reactivestreams.ktx) + implementation(libs.androidx.camera.core) + implementation(libs.androidx.camera.camera2) + implementation(libs.androidx.camera.lifecycle) + implementation(libs.androidx.camera.view) + implementation(libs.androidx.concurrent.futures) + implementation(libs.androidx.autofill) + implementation(libs.androidx.biometric) + implementation(libs.androidx.sharetarget) + implementation(libs.androidx.profileinstaller) + implementation(libs.androidx.asynclayoutinflater) + implementation(libs.androidx.asynclayoutinflater.appcompat) + implementation(libs.firebase.messaging) { + exclude(group = "com.google.firebase", module = "firebase-core") + exclude(group = "com.google.firebase", module = "firebase-analytics") + exclude(group = "com.google.firebase", module = "firebase-measurement-connector") + } + implementation(libs.google.play.services.maps) + implementation(libs.google.play.services.auth) + implementation(libs.bundles.media3) + implementation(libs.conscrypt.android) + implementation(libs.signal.aesgcmprovider) + implementation(libs.libsignal.android) + implementation(libs.mobilecoin) + implementation(libs.signal.ringrtc) + implementation(libs.leolin.shortcutbadger) + implementation(libs.emilsjolander.stickylistheaders) + implementation(libs.apache.httpclient.android) + implementation(libs.glide.glide) + implementation(libs.roundedimageview) + implementation(libs.materialish.progress) + implementation(libs.greenrobot.eventbus) + implementation(libs.google.zxing.android.integration) + implementation(libs.google.zxing.core) + implementation(libs.google.flexbox) + implementation(libs.subsampling.scale.image.view) { + exclude(group = "com.android.support", module = "support-annotations") + } + implementation(libs.android.tooltips) { + exclude(group = "com.android.support", module = "appcompat-v7") + } + implementation(libs.android.smsmms) { + exclude(group = "com.squareup.okhttp", module = "okhttp") + exclude(group = "com.squareup.okhttp", module = "okhttp-urlconnection") + } + implementation(libs.stream) + implementation(libs.lottie) + implementation(libs.signal.android.database.sqlcipher) + implementation(libs.androidx.sqlite) + implementation(libs.google.ez.vcard) { + exclude(group = "com.fasterxml.jackson.core") + exclude(group = "org.freemarker") + } + implementation(libs.dnsjava) + implementation(libs.kotlinx.collections.immutable) + implementation(libs.accompanist.permissions) + implementation(libs.kotlin.stdlib.jdk8) + implementation(libs.kotlin.reflect) + implementation(libs.jackson.module.kotlin) + implementation(libs.rxjava3.rxandroid) + implementation(libs.rxjava3.rxkotlin) + implementation(libs.rxdogtag) + + "spinnerImplementation"(project(":spinner")) + + "canaryImplementation"(libs.square.leakcanary) + + "instrumentationImplementation"(libs.androidx.fragment.testing) { + exclude(group = "androidx.test", module = "core") + } + + testImplementation(testLibs.junit.junit) + testImplementation(testLibs.assertj.core) + testImplementation(testLibs.mockito.core) + testImplementation(testLibs.mockito.kotlin) + testImplementation(testLibs.androidx.test.core) + testImplementation(testLibs.robolectric.robolectric) { + exclude(group = "com.google.protobuf", module = "protobuf-java") + } + testImplementation(testLibs.robolectric.shadows.multidex) + testImplementation(testLibs.bouncycastle.bcprov.jdk15on) { + version { + strictly("1.70") + } + } + testImplementation(testLibs.bouncycastle.bcpkix.jdk15on) { + version { + strictly("1.70") + } + } + testImplementation(testLibs.conscrypt.openjdk.uber) + testImplementation(testLibs.hamcrest.hamcrest) + testImplementation(testLibs.mockk) + testImplementation(testFixtures(project(":libsignal-service"))) + testImplementation(testLibs.espresso.core) + + androidTestImplementation(testLibs.androidx.test.ext.junit) + androidTestImplementation(testLibs.espresso.core) + androidTestImplementation(testLibs.androidx.test.core) + androidTestImplementation(testLibs.androidx.test.core.ktx) + androidTestImplementation(testLibs.androidx.test.ext.junit.ktx) + androidTestImplementation(testLibs.mockito.android) + androidTestImplementation(testLibs.mockito.kotlin) + androidTestImplementation(testLibs.mockk.android) + androidTestImplementation(testLibs.square.okhttp.mockserver) + + androidTestUtil(testLibs.androidx.test.orchestrator) +} + +fun assertIsGitRepo() { + if (!file("${project.rootDir}/.git").exists()) { + throw IllegalStateException("Must be a git repository to guarantee reproducible builds! (git hash is part of APK)") + } +} + +fun getLastCommitTimestamp(): String { + assertIsGitRepo() + + ByteArrayOutputStream().use { os -> + exec { + executable = "git" + args = listOf("log", "-1", "--pretty=format:%ct") + standardOutput = os + } + + return os.toString() + "000" + } +} + +fun getGitHash(): String { + assertIsGitRepo() + + val stdout = ByteArrayOutputStream() + exec { + commandLine = listOf("git", "rev-parse", "HEAD") + standardOutput = stdout + } + + return stdout.toString().trim().substring(0, 12) +} + +fun getCurrentGitTag(): String? { + assertIsGitRepo() + + val stdout = ByteArrayOutputStream() + exec { + commandLine = listOf("git", "tag", "--points-at", "HEAD") + standardOutput = stdout + } + + val output: String = stdout.toString().trim() + + return if (output.isNotEmpty()) { + val tags = output.split("\n").toList() + tags.firstOrNull { it.contains("nightly") } ?: tags[0] + } else { + null + } +} + +tasks.withType().configureEach { + testLogging { + events("failed") + exceptionFormat = TestExceptionFormat.FULL + showCauses = true + showExceptions = true + showStackTraces = true + } +} + +project.tasks.configureEach { + if (name.lowercase().contains("nightly") && name != "checkNightlyParams") { + dependsOn(tasks.getByName("checkNightlyParams")) + } +} + +tasks.register("checkNightlyParams") { + doFirst { + if (project.gradle.startParameter.taskNames.any { it.lowercase().contains("nightly") }) { + + if (!file("${project.rootDir}/nightly-url.txt").exists()) { + throw GradleException("Cannot find 'nightly-url.txt' for nightly build! It must exist in the root of this project and contain the location of the nightly manifest.") + } + } + } +} + +fun loadKeystoreProperties(filename: String): Properties? { + val keystorePropertiesFile = file("${project.rootDir}/$filename") + + return if (keystorePropertiesFile.exists()) { + val keystoreProperties = Properties() + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + keystoreProperties + } else { + null + } +} + +fun getDateSuffix(): String { + return SimpleDateFormat("yyyy-MM-dd-HH:mm").format(Date()) +} + +fun getMapsKey(): String { + val mapKey = file("${project.rootDir}/maps.key") + + return if (mapKey.exists()) { + mapKey.readLines()[0] + } else { + "AIzaSyCSx9xea86GwDKGznCAULE9Y5a8b-TfN9U" + } +} + +fun Project.languageList(): List { + return fileTree("src/main/res") { include("**/strings.xml") } + .map { stringFile -> stringFile.parentFile.name } + .map { valuesFolderName -> valuesFolderName.replace("values-", "") } + .filter { valuesFolderName -> valuesFolderName != "values" } + .map { languageCode -> languageCode.replace("-r", "_") } + .distinct() + "en" +} + +fun String.capitalize(): String { + return this.replaceFirstChar { it.uppercase() } +} diff --git a/app/jni/Android.mk b/app/jni/Android.mk index 35043add..cac4c9cb 100644 --- a/app/jni/Android.mk +++ b/app/jni/Android.mk @@ -7,7 +7,5 @@ LOCAL_C_INCLUDES := $(JNI_DIR)/utils/ LOCAL_CFLAGS += -Wall LOCAL_SRC_FILES := $(JNI_DIR)/utils/org_thoughtcrime_securesms_util_FileUtils.cpp -#//**TM_SA**//Start -LOCAL_SRC_FILES := $(JNI_DIR)/utils/org_tm_archive_util_FileUtils.cpp -# //**TM_SA**//End + include $(BUILD_SHARED_LIBRARY) \ No newline at end of file diff --git a/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp b/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp index ba2500d9..27ce4309 100644 --- a/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp +++ b/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp @@ -5,8 +5,8 @@ #include #include #include -//**TM_SA**//Change the package name to be our name. -jint JNICALL Java_org_tm_archive_util_FileUtils_getFileDescriptorOwner + +jint JNICALL Java_org_thoughtcrime_securesms_util_FileUtils_getFileDescriptorOwner (JNIEnv *env, jclass clazz, jobject fileDescriptor) { jclass fdClass = env->GetObjectClass(fileDescriptor); @@ -32,8 +32,7 @@ jint JNICALL Java_org_tm_archive_util_FileUtils_getFileDescriptorOwner return stat_struct.st_uid; } -//**TM_SA**//Change the package name to be our name. -JNIEXPORT jint JNICALL Java_org_tm_archive_util_FileUtils_createMemoryFileDescriptor +JNIEXPORT jint JNICALL Java_org_thoughtcrime_securesms_util_FileUtils_createMemoryFileDescriptor (JNIEnv *env, jclass clazz, jstring jname) { const char *name = env->GetStringUTFChars(jname, NULL); diff --git a/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h b/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h index 7ba158f7..12faa685 100644 --- a/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h +++ b/app/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h @@ -12,8 +12,7 @@ extern "C" { * Method: getFileDescriptorOwner * Signature: (Ljava/io/FileDescriptor;)I */ - //**TM_SA**//Change the package name to be our name. -JNIEXPORT jint JNICALL Java_org_tm_archive_util_FileUtils_getFileDescriptorOwner +JNIEXPORT jint JNICALL Java_org_thoughtcrime_securesms_util_FileUtils_getFileDescriptorOwner (JNIEnv *, jclass, jobject); /* @@ -21,8 +20,7 @@ JNIEXPORT jint JNICALL Java_org_tm_archive_util_FileUtils_getFileDescriptorOwner * Method: createMemoryFileDescriptor * Signature: (Ljava/lang/String;)I */ - //**TM_SA**//Change the package name to be our name. -JNIEXPORT jint JNICALL Java_org_tm_archive_util_FileUtils_createMemoryFileDescriptor +JNIEXPORT jint JNICALL Java_org_thoughtcrime_securesms_util_FileUtils_createMemoryFileDescriptor (JNIEnv *, jclass, jstring); #ifdef __cplusplus diff --git a/app/libs/androidcopysdk-signal-release5.aar b/app/libs/androidcopysdk-signal-release5.aar deleted file mode 100644 index 65d2ca00..00000000 Binary files a/app/libs/androidcopysdk-signal-release5.aar and /dev/null differ diff --git a/app/libs/authenticatorsdk-signal-release-mdm-off.aar b/app/libs/authenticatorsdk-signal-release-mdm-off.aar deleted file mode 100644 index 8ac92058..00000000 Binary files a/app/libs/authenticatorsdk-signal-release-mdm-off.aar and /dev/null differ diff --git a/app/libs/common-release.aar b/app/libs/common-release.aar deleted file mode 100644 index 3f02ebbe..00000000 Binary files a/app/libs/common-release.aar and /dev/null differ diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index 51b2bb66..be335599 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -19,12 +19,10 @@ message="Expected resource of type styleable" errorLine1=" drawables.getColor(1, 0xff000000);" errorLine2=" ~"> - - + column="36"/> - - - - - + + + + + diff --git a/app/proguard/proguard-event_bus.pro b/app/proguard/proguard-event_bus.pro deleted file mode 100644 index 03f6016e..00000000 --- a/app/proguard/proguard-event_bus.pro +++ /dev/null @@ -1,5 +0,0 @@ --keepattributes *Annotation* --keepclassmembers class * { - @org.greenrobot.eventbus.Subscribe ; -} --keep enum org.greenrobot.eventbus.ThreadMode { *; } \ No newline at end of file diff --git a/app/proguard/proguard.cfg b/app/proguard/proguard.cfg index ebd07e71..9d20109c 100644 --- a/app/proguard/proguard.cfg +++ b/app/proguard/proguard.cfg @@ -4,17 +4,10 @@ -keep class org.whispersystems.** { *; } -keep class org.signal.libsignal.protocol.** { *; } -keep class org.tm.archive.** { *; } +-keep class org.signal.donations.json.** { *; } -keepclassmembers class ** { public void onEvent*(**); } -#TM_SA start --keepclassmembers class com.tm.authenticatorsdk.** { - public (); -} --keepclassmembers class com.tm.androidcopysdk.** { - public (); -} -#TM_SA end # Protobuf lite -keep class * extends com.google.protobuf.GeneratedMessageLite { *; } @@ -26,50 +19,4 @@ -dontwarn org.apache.harmony.xnet.provider.jsse.SSLParametersImpl -dontwarn org.slf4j.impl.StaticLoggerBinder -dontwarn sun.net.spi.nameservice.NameService --dontwarn sun.net.spi.nameservice.NameServiceDescriptor - -#TM_SA start --dontwarn com.arthenica.mobileffmpeg.FFmpeg --dontwarn com.github.underscore.lodash.$ --dontwarn com.google.crypto.tink.subtle.Ed25519Sign$KeyPair --dontwarn com.google.crypto.tink.subtle.Ed25519Sign --dontwarn com.google.crypto.tink.subtle.Ed25519Verify --dontwarn com.google.crypto.tink.subtle.X25519 --dontwarn java.beans.BeanInfo --dontwarn java.beans.IntrospectionException --dontwarn java.beans.Introspector --dontwarn java.beans.PropertyDescriptor --dontwarn org.bouncycastle.asn1.ASN1Encodable --dontwarn org.bouncycastle.asn1.pkcs.PrivateKeyInfo --dontwarn org.bouncycastle.asn1.x509.AlgorithmIdentifier --dontwarn org.bouncycastle.asn1.x509.SubjectPublicKeyInfo --dontwarn org.bouncycastle.cert.X509CertificateHolder --dontwarn org.bouncycastle.cert.jcajce.JcaX509CertificateHolder --dontwarn org.bouncycastle.crypto.BlockCipher --dontwarn org.bouncycastle.crypto.CipherParameters --dontwarn org.bouncycastle.crypto.InvalidCipherTextException --dontwarn org.bouncycastle.crypto.engines.AESEngine --dontwarn org.bouncycastle.crypto.modes.GCMBlockCipher --dontwarn org.bouncycastle.crypto.params.AEADParameters --dontwarn org.bouncycastle.crypto.params.KeyParameter --dontwarn org.bouncycastle.jce.provider.BouncyCastleProvider --dontwarn org.bouncycastle.openssl.PEMException --dontwarn org.bouncycastle.openssl.PEMKeyPair --dontwarn org.bouncycastle.openssl.PEMParser --dontwarn org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter --dontwarn retrofit2.adapter.rxjava.RxJavaCallAdapterFactory --dontwarn rx.Observable --dontwarn rx.Observer --dontwarn rx.Scheduler --dontwarn rx.Subscription --dontwarn rx.android.schedulers.AndroidSchedulers --dontwarn rx.functions.Func1 --dontwarn rx.schedulers.Schedulers - --dontwarn javax.naming.NamingEnumeration --dontwarn javax.naming.NamingException --dontwarn javax.naming.directory.Attribute --dontwarn javax.naming.directory.Attributes --dontwarn javax.naming.directory.DirContext --dontwarn javax.naming.directory.InitialDirContext -#TM_SA end \ No newline at end of file +-dontwarn sun.net.spi.nameservice.NameServiceDescriptor \ No newline at end of file diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt index a9e4e89e..493e5be8 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt @@ -26,15 +26,13 @@ class SignalInstrumentationApplicationContext : ApplicationContext() { } override fun initializeLogging() { - persistentLogger = PersistentLogger(this) - - Log.initialize({ true }, AndroidLogger(), persistentLogger, inMemoryLogger) + Log.initialize({ true }, AndroidLogger(), PersistentLogger(this), inMemoryLogger) SignalProtocolLoggerProvider.setProvider(CustomSignalProtocolLogger()) SignalExecutors.UNBOUNDED.execute { Log.blockUntilAllWritesFinished() - LogDatabase.getInstance(this).trimToSize() + LogDatabase.getInstance(this).logs.trimToSize() } } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/BackupTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/BackupTest.kt new file mode 100644 index 00000000..6696183c --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/backup/v2/BackupTest.kt @@ -0,0 +1,675 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2 + +import android.content.ContentValues +import android.database.Cursor +import androidx.core.content.contentValuesOf +import net.zetetic.database.sqlcipher.SQLiteDatabase +import org.junit.Before +import org.junit.Test +import org.signal.core.util.Hex +import org.signal.core.util.SqlUtil +import org.signal.core.util.insertInto +import org.signal.core.util.readToList +import org.signal.core.util.readToSingleObject +import org.signal.core.util.requireBlob +import org.signal.core.util.requireLong +import org.signal.core.util.requireString +import org.signal.core.util.select +import org.signal.core.util.toInt +import org.signal.core.util.withinTransaction +import org.signal.libsignal.zkgroup.profiles.ProfileKey +import org.tm.archive.backup.v2.database.clearAllDataForBackupRestore +import org.tm.archive.database.CallTable +import org.tm.archive.database.EmojiSearchTable +import org.tm.archive.database.MessageTable +import org.tm.archive.database.MessageTypes +import org.tm.archive.database.RecipientTable +import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.model.databaseprotos.BodyRangeList +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.keyvalue.PhoneNumberPrivacyValues +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.mms.QuoteModel +import org.tm.archive.profiles.ProfileName +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId +import org.tm.archive.subscription.Subscriber +import org.tm.archive.testing.assertIs +import org.tm.archive.util.TextSecurePreferences +import org.whispersystems.signalservice.api.push.ServiceId.ACI +import org.whispersystems.signalservice.api.push.ServiceId.PNI +import org.whispersystems.signalservice.api.subscriptions.SubscriberId +import java.io.ByteArrayInputStream +import java.util.UUID +import kotlin.random.Random + +typealias DatabaseData = Map>> + +class BackupTest { + companion object { + val SELF_ACI = ACI.from(UUID.fromString("77770000-b477-4f35-a824-d92987a63641")) + val SELF_PNI = PNI.from(UUID.fromString("77771111-b014-41fb-bf73-05cb2ec52910")) + const val SELF_E164 = "+10000000000" + val SELF_PROFILE_KEY = ProfileKey(Random.nextBytes(32)) + + val ALICE_ACI = ACI.from(UUID.fromString("aaaa0000-5a76-47fa-a98a-7e72c948a82e")) + val ALICE_PNI = PNI.from(UUID.fromString("aaaa1111-c960-4f6c-8385-671ad2ffb999")) + val ALICE_E164 = "+12222222222" + + /** Columns that we don't need to check equality of */ + private val IGNORED_COLUMNS: Map> = mapOf( + RecipientTable.TABLE_NAME to setOf(RecipientTable.STORAGE_SERVICE_ID), + MessageTable.TABLE_NAME to setOf(MessageTable.FROM_DEVICE_ID) + ) + + /** Tables we don't need to check equality of */ + private val IGNORED_TABLES: Set = setOf( + EmojiSearchTable.TABLE_NAME, + "sqlite_sequence", + "message_fts_data", + "message_fts_idx", + "message_fts_docsize" + ) + } + + @Before + fun setup() { + SignalStore.account().setE164(SELF_E164) + SignalStore.account().setAci(SELF_ACI) + SignalStore.account().setPni(SELF_PNI) + SignalStore.account().generateAciIdentityKeyIfNecessary() + SignalStore.account().generatePniIdentityKeyIfNecessary() + } + + @Test + fun emptyDatabase() { + backupTest { } + } + + @Test + fun noteToSelf() { + backupTest { + individualChat(aci = SELF_ACI, givenName = "Note to Self") { + standardMessage(outgoing = true, body = "A") + standardMessage(outgoing = true, body = "B") + standardMessage(outgoing = true, body = "C") + } + } + } + + @Test + fun individualChat() { + backupTest { + individualChat(aci = ALICE_ACI, givenName = "Alice") { + val m1 = standardMessage(outgoing = true, body = "Outgoing 1") + val m2 = standardMessage(outgoing = false, body = "Incoming 1", read = true) + standardMessage(outgoing = true, body = "Outgoing 2", quotes = m2) + standardMessage(outgoing = false, body = "Incoming 2", quotes = m1, quoteTargetMissing = true, read = false) + standardMessage(outgoing = true, body = "Outgoing 3, with mention", randomMention = true) + standardMessage(outgoing = false, body = "Incoming 3, with style", read = false, randomStyling = true) + remoteDeletedMessage(outgoing = true) + remoteDeletedMessage(outgoing = false) + } + } + } + + @Test + fun individualRecipients() { + backupTest { + // Comprehensive example + individualRecipient( + aci = ALICE_ACI, + pni = ALICE_PNI, + e164 = ALICE_E164, + givenName = "Alice", + familyName = "Smith", + username = "alice.99", + hidden = false, + registeredState = RecipientTable.RegisteredState.REGISTERED, + profileKey = ProfileKey(Random.nextBytes(32)), + profileSharing = true, + hideStory = false + ) + + // Trying to get coverage of all the various values + individualRecipient(aci = ACI.from(UUID.randomUUID()), registeredState = RecipientTable.RegisteredState.NOT_REGISTERED) + individualRecipient(aci = ACI.from(UUID.randomUUID()), registeredState = RecipientTable.RegisteredState.UNKNOWN) + individualRecipient(pni = PNI.from(UUID.randomUUID())) + individualRecipient(e164 = "+15551234567") + individualRecipient(aci = ACI.from(UUID.randomUUID()), givenName = "Bob") + individualRecipient(aci = ACI.from(UUID.randomUUID()), familyName = "Smith") + individualRecipient(aci = ACI.from(UUID.randomUUID()), profileSharing = false) + individualRecipient(aci = ACI.from(UUID.randomUUID()), hideStory = true) + individualRecipient(aci = ACI.from(UUID.randomUUID()), hidden = true) + } + } + + @Test + fun individualCallLogs() { + backupTest { + val aliceId = individualRecipient( + aci = ALICE_ACI, + pni = ALICE_PNI, + e164 = ALICE_E164, + givenName = "Alice", + familyName = "Smith", + username = "alice.99", + hidden = false, + registeredState = RecipientTable.RegisteredState.REGISTERED, + profileKey = ProfileKey(Random.nextBytes(32)), + profileSharing = true, + hideStory = false + ) + insertOneToOneCallVariations(1, 1, aliceId) + } + } + + private fun insertOneToOneCallVariations(callId: Long, timestamp: Long, id: RecipientId): Long { + val directions = arrayOf(CallTable.Direction.INCOMING, CallTable.Direction.OUTGOING) + val callTypes = arrayOf(CallTable.Type.AUDIO_CALL, CallTable.Type.VIDEO_CALL) + val events = arrayOf( + CallTable.Event.MISSED, + CallTable.Event.OUTGOING_RING, + CallTable.Event.ONGOING, + CallTable.Event.ACCEPTED, + CallTable.Event.NOT_ACCEPTED + ) + var callTimestamp: Long = timestamp + var currentCallId = callId + for (direction in directions) { + for (event in events) { + for (type in callTypes) { + insertOneToOneCall(callId = currentCallId, callTimestamp, id, type, direction, event) + callTimestamp++ + currentCallId++ + } + } + } + + return currentCallId + } + + private fun insertOneToOneCall(callId: Long, timestamp: Long, peer: RecipientId, type: CallTable.Type, direction: CallTable.Direction, event: CallTable.Event) { + val messageType: Long = CallTable.Call.getMessageType(type, direction, event) + + SignalDatabase.rawDatabase.withinTransaction { + val recipient = Recipient.resolved(peer) + val threadId = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) + val outgoing = direction == CallTable.Direction.OUTGOING + + val messageValues = contentValuesOf( + MessageTable.FROM_RECIPIENT_ID to if (outgoing) Recipient.self().id.serialize() else peer.serialize(), + MessageTable.FROM_DEVICE_ID to 1, + MessageTable.TO_RECIPIENT_ID to if (outgoing) peer.serialize() else Recipient.self().id.serialize(), + MessageTable.DATE_RECEIVED to timestamp, + MessageTable.DATE_SENT to timestamp, + MessageTable.READ to 1, + MessageTable.TYPE to messageType, + MessageTable.THREAD_ID to threadId + ) + + val messageId = SignalDatabase.rawDatabase.insert(MessageTable.TABLE_NAME, null, messageValues) + + val values = contentValuesOf( + CallTable.CALL_ID to callId, + CallTable.MESSAGE_ID to messageId, + CallTable.PEER to peer.serialize(), + CallTable.TYPE to CallTable.Type.serialize(type), + CallTable.DIRECTION to CallTable.Direction.serialize(direction), + CallTable.EVENT to CallTable.Event.serialize(event), + CallTable.TIMESTAMP to timestamp + ) + + SignalDatabase.rawDatabase.insert(CallTable.TABLE_NAME, null, values) + + SignalDatabase.threads.update(threadId, true) + } + } + + @Test + fun accountData() { + val context = ApplicationDependencies.getApplication() + + backupTest(validateKeyValue = true) { + val self = Recipient.self() + + // TODO note-to-self archived + // TODO note-to-self unread + + SignalStore.account().setAci(SELF_ACI) + SignalStore.account().setPni(SELF_PNI) + SignalStore.account().setE164(SELF_E164) + SignalStore.account().generateAciIdentityKeyIfNecessary() + SignalStore.account().generatePniIdentityKeyIfNecessary() + + SignalDatabase.recipients.setProfileKey(self.id, ProfileKey(Random.nextBytes(32))) + SignalDatabase.recipients.setProfileName(self.id, ProfileName.fromParts("Peter", "Parker")) + SignalDatabase.recipients.setProfileAvatar(self.id, "https://example.com/") + + SignalStore.donationsValues().markUserManuallyCancelled() + SignalStore.donationsValues().setSubscriber(Subscriber(SubscriberId.generate(), "USD")) + SignalStore.donationsValues().setDisplayBadgesOnProfile(false) + + SignalStore.phoneNumberPrivacy().phoneNumberListingMode = PhoneNumberPrivacyValues.PhoneNumberListingMode.UNLISTED + SignalStore.phoneNumberPrivacy().phoneNumberSharingMode = PhoneNumberPrivacyValues.PhoneNumberSharingMode.NOBODY + + SignalStore.settings().isLinkPreviewsEnabled = false + SignalStore.settings().isPreferSystemContactPhotos = true + SignalStore.settings().universalExpireTimer = 42 + SignalStore.settings().setKeepMutedChatsArchived(true) + + SignalStore.storyValues().viewedReceiptsEnabled = false + SignalStore.storyValues().userHasViewedOnboardingStory = true + SignalStore.storyValues().isFeatureDisabled = false + SignalStore.storyValues().userHasBeenNotifiedAboutStories = true + SignalStore.storyValues().userHasSeenGroupStoryEducationSheet = true + + SignalStore.emojiValues().reactions = listOf("a", "b", "c") + + TextSecurePreferences.setTypingIndicatorsEnabled(context, false) + TextSecurePreferences.setReadReceiptsEnabled(context, false) + TextSecurePreferences.setShowUnidentifiedDeliveryIndicatorsEnabled(context, true) + } + + // Have to check TextSecurePreferences ourselves, since they're not in a database + TextSecurePreferences.isTypingIndicatorsEnabled(context) assertIs false + TextSecurePreferences.isReadReceiptsEnabled(context) assertIs false + TextSecurePreferences.isShowUnidentifiedDeliveryIndicatorsEnabled(context) assertIs true + } + + /** + * Sets up the database, then executes your setup code, then compares snapshots of the database + * before an after an import to ensure that no data was lost/changed. + * + * @param validateKeyValue If true, this will also validate the KeyValueDatabase. You only want to do this if you + * intend on setting most of the values. Otherwise stuff tends to not match since values are lazily written. + */ + private fun backupTest(validateKeyValue: Boolean = false, content: () -> Unit) { + // Under normal circumstances, My Story ends up being the first recipient in the table, and is added automatically. + // This screws with the tests by offsetting all the recipientIds in the initial state. + // Easiest way to get around this is to make the DB a true clean slate by clearing everything. + // (We only really need to clear Recipient/dlists, but doing everything to be consistent.) + SignalDatabase.distributionLists.clearAllDataForBackupRestore() + SignalDatabase.recipients.clearAllDataForBackupRestore() + SignalDatabase.messages.clearAllDataForBackupRestore() + SignalDatabase.threads.clearAllDataForBackupRestore() + + // Again, for comparison purposes, because we always import self first, we want to ensure it's the first item + // in the table when we export. + individualRecipient( + aci = SELF_ACI, + pni = SELF_PNI, + e164 = SELF_E164, + profileKey = SELF_PROFILE_KEY, + profileSharing = true + ) + + content() + + val startingMainData: DatabaseData = SignalDatabase.rawDatabase.readAllContents() + val startingKeyValueData: DatabaseData = if (validateKeyValue) SignalDatabase.rawDatabase.readAllContents() else emptyMap() + + val exported: ByteArray = BackupRepository.export() + BackupRepository.import(length = exported.size.toLong(), inputStreamFactory = { ByteArrayInputStream(exported) }, selfData = BackupRepository.SelfData(SELF_ACI, SELF_PNI, SELF_E164, SELF_PROFILE_KEY)) + + val endingData: DatabaseData = SignalDatabase.rawDatabase.readAllContents() + val endingKeyValueData: DatabaseData = if (validateKeyValue) SignalDatabase.rawDatabase.readAllContents() else emptyMap() + + assertDatabaseMatches(startingMainData, endingData) + assertDatabaseMatches(startingKeyValueData, endingKeyValueData) + } + + private fun individualChat(aci: ACI, givenName: String, familyName: String? = null, init: IndividualChatCreator.() -> Unit) { + val recipientId = individualRecipient(aci = aci, givenName = givenName, familyName = familyName, profileSharing = true) + + val threadId: Long = SignalDatabase.threads.getOrCreateThreadIdFor(recipientId, false) + + IndividualChatCreator(SignalDatabase.rawDatabase, recipientId, threadId).init() + + SignalDatabase.threads.update(threadId, false) + } + + private fun individualRecipient( + aci: ACI? = null, + pni: PNI? = null, + e164: String? = null, + givenName: String? = null, + familyName: String? = null, + username: String? = null, + hidden: Boolean = false, + registeredState: RecipientTable.RegisteredState = RecipientTable.RegisteredState.UNKNOWN, + profileKey: ProfileKey? = null, + profileSharing: Boolean = false, + hideStory: Boolean = false + ): RecipientId { + check(aci != null || pni != null || e164 != null) + + val recipientId = SignalDatabase.recipients.getAndPossiblyMerge(aci, pni, e164, pniVerified = true, changeSelf = true) + + if (givenName != null || familyName != null) { + SignalDatabase.recipients.setProfileName(recipientId, ProfileName.fromParts(givenName, familyName)) + } + + if (username != null) { + SignalDatabase.recipients.setUsername(recipientId, username) + } + + if (registeredState == RecipientTable.RegisteredState.REGISTERED) { + SignalDatabase.recipients.markRegistered(recipientId, aci ?: pni!!) + } else if (registeredState == RecipientTable.RegisteredState.NOT_REGISTERED) { + SignalDatabase.recipients.markUnregistered(recipientId) + } + + if (profileKey != null) { + SignalDatabase.recipients.setProfileKey(recipientId, profileKey) + } + + SignalDatabase.recipients.setProfileSharing(recipientId, profileSharing) + SignalDatabase.recipients.setHideStory(recipientId, hideStory) + + if (hidden) { + SignalDatabase.recipients.markHidden(recipientId) + } + + return recipientId + } + + private inner class IndividualChatCreator( + private val db: SQLiteDatabase, + private val recipientId: RecipientId, + private val threadId: Long + ) { + fun standardMessage( + outgoing: Boolean, + sentTimestamp: Long = System.currentTimeMillis(), + receivedTimestamp: Long = if (outgoing) sentTimestamp else sentTimestamp + 1, + serverTimestamp: Long = sentTimestamp, + body: String? = null, + read: Boolean = true, + quotes: Long? = null, + quoteTargetMissing: Boolean = false, + randomMention: Boolean = false, + randomStyling: Boolean = false + ): Long { + return db.insertMessage( + from = if (outgoing) Recipient.self().id else recipientId, + to = if (outgoing) recipientId else Recipient.self().id, + outgoing = outgoing, + threadId = threadId, + sentTimestamp = sentTimestamp, + receivedTimestamp = receivedTimestamp, + serverTimestamp = serverTimestamp, + body = body, + read = read, + quotes = quotes, + quoteTargetMissing = quoteTargetMissing, + randomMention = randomMention, + randomStyling = randomStyling + ) + } + + fun remoteDeletedMessage( + outgoing: Boolean, + sentTimestamp: Long = System.currentTimeMillis(), + receivedTimestamp: Long = if (outgoing) sentTimestamp else sentTimestamp + 1, + serverTimestamp: Long = sentTimestamp + ): Long { + return db.insertMessage( + from = if (outgoing) Recipient.self().id else recipientId, + to = if (outgoing) recipientId else Recipient.self().id, + outgoing = outgoing, + threadId = threadId, + sentTimestamp = sentTimestamp, + receivedTimestamp = receivedTimestamp, + serverTimestamp = serverTimestamp, + remoteDeleted = true + ) + } + } + + private fun SQLiteDatabase.insertMessage( + from: RecipientId, + to: RecipientId, + outgoing: Boolean, + threadId: Long, + sentTimestamp: Long = System.currentTimeMillis(), + receivedTimestamp: Long = if (outgoing) sentTimestamp else sentTimestamp + 1, + serverTimestamp: Long = sentTimestamp, + body: String? = null, + read: Boolean = true, + quotes: Long? = null, + quoteTargetMissing: Boolean = false, + randomMention: Boolean = false, + randomStyling: Boolean = false, + remoteDeleted: Boolean = false + ): Long { + val type = if (outgoing) { + MessageTypes.BASE_SENT_TYPE + } else { + MessageTypes.BASE_INBOX_TYPE + } or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT + + val contentValues = ContentValues() + contentValues.put(MessageTable.DATE_SENT, sentTimestamp) + contentValues.put(MessageTable.DATE_RECEIVED, receivedTimestamp) + contentValues.put(MessageTable.FROM_RECIPIENT_ID, from.serialize()) + contentValues.put(MessageTable.TO_RECIPIENT_ID, to.serialize()) + contentValues.put(MessageTable.THREAD_ID, threadId) + contentValues.put(MessageTable.BODY, body) + contentValues.put(MessageTable.TYPE, type) + contentValues.put(MessageTable.READ, if (read) 1 else 0) + + if (!outgoing) { + contentValues.put(MessageTable.DATE_SERVER, serverTimestamp) + } + + if (remoteDeleted) { + contentValues.put(MessageTable.REMOTE_DELETED, 1) + return this + .insertInto(MessageTable.TABLE_NAME) + .values(contentValues) + .run() + } + + if (quotes != null) { + val quoteDetails = this.getQuoteDetailsFor(quotes) + contentValues.put(MessageTable.QUOTE_ID, if (quoteTargetMissing) MessageTable.QUOTE_TARGET_MISSING_ID else quoteDetails.quotedSentTimestamp) + contentValues.put(MessageTable.QUOTE_AUTHOR, quoteDetails.authorId.serialize()) + contentValues.put(MessageTable.QUOTE_BODY, quoteDetails.body) + contentValues.put(MessageTable.QUOTE_BODY_RANGES, quoteDetails.bodyRanges) + contentValues.put(MessageTable.QUOTE_TYPE, quoteDetails.type) + contentValues.put(MessageTable.QUOTE_MISSING, quoteTargetMissing.toInt()) + } + + if (body != null && (randomMention || randomStyling)) { + val ranges: MutableList = mutableListOf() + + if (randomMention) { + ranges += BodyRangeList.BodyRange( + start = 0, + length = Random.nextInt(body.length), + mentionUuid = if (outgoing) Recipient.resolved(to).requireAci().toString() else Recipient.resolved(from).requireAci().toString() + ) + } + + if (randomStyling) { + ranges += BodyRangeList.BodyRange( + start = 0, + length = Random.nextInt(body.length), + style = BodyRangeList.BodyRange.Style.fromValue(Random.nextInt(BodyRangeList.BodyRange.Style.values().size)) + ) + } + + contentValues.put(MessageTable.MESSAGE_RANGES, BodyRangeList(ranges = ranges).encode()) + } + + return this + .insertInto(MessageTable.TABLE_NAME) + .values(contentValues) + .run() + } + + private fun assertDatabaseMatches(expected: DatabaseData, actual: DatabaseData) { + assert(expected.keys.size == actual.keys.size) { "Mismatched table count! Expected: ${expected.keys} || Actual: ${actual.keys}" } + assert(expected.keys.containsAll(actual.keys)) { "Table names differ! Expected: ${expected.keys} || Actual: ${actual.keys}" } + + val tablesToCheck = expected.keys.filter { !IGNORED_TABLES.contains(it) } + + for (table in tablesToCheck) { + val expectedTable: List> = expected[table]!! + val actualTable: List> = actual[table]!! + + assert(expectedTable.size == actualTable.size) { "Mismatched number of rows for table '$table'! Expected: ${expectedTable.size} || Actual: ${actualTable.size}\n $actualTable" } + + val expectedFiltered: List> = expectedTable.withoutExcludedColumns(IGNORED_COLUMNS[table]) + val actualFiltered: List> = actualTable.withoutExcludedColumns(IGNORED_COLUMNS[table]) + + assert(contentEquals(expectedFiltered, actualFiltered)) { "Data did not match for table '$table'!\n${prettyDiff(expectedFiltered, actualFiltered)}" } + } + } + + private fun contentEquals(expectedRows: List>, actualRows: List>): Boolean { + if (expectedRows == actualRows) { + return true + } + + assert(expectedRows.size == actualRows.size) + + for (i in expectedRows.indices) { + val expectedRow = expectedRows[i] + val actualRow = actualRows[i] + + for (key in expectedRow.keys) { + val expectedValue = expectedRow[key] + val actualValue = actualRow[key] + + if (!contentEquals(expectedValue, actualValue)) { + return false + } + } + } + + return true + } + + private fun contentEquals(lhs: Any?, rhs: Any?): Boolean { + return if (lhs is ByteArray && rhs is ByteArray) { + lhs.contentEquals(rhs) + } else { + lhs == rhs + } + } + + private fun prettyDiff(expectedRows: List>, actualRows: List>): String { + val builder = StringBuilder() + + assert(expectedRows.size == actualRows.size) + + for (i in expectedRows.indices) { + val expectedRow = expectedRows[i] + val actualRow = actualRows[i] + var describedRow = false + + for (key in expectedRow.keys) { + val expectedValue = expectedRow[key] + val actualValue = actualRow[key] + + if (!contentEquals(expectedValue, actualValue)) { + if (!describedRow) { + builder.append("-- ROW ${i + 1}\n") + describedRow = true + } + builder.append("  [$key] Expected: ${expectedValue.prettyPrint()} || Actual: ${actualValue.prettyPrint()} \n") + } + } + + if (describedRow) { + builder.append("\n") + builder.append("Expected: $expectedRow\n") + builder.append("Actual: $actualRow\n") + } + } + + return builder.toString() + } + + private fun Any?.prettyPrint(): String { + return when (this) { + is ByteArray -> "Bytes(${Hex.toString(this)})" + else -> this.toString() + } + } + + private fun List>.withoutExcludedColumns(ignored: Set?): List> { + return if (ignored != null) { + this.map { row -> + row.filterKeys { !ignored.contains(it) } + } + } else { + this + } + } + + private fun SQLiteDatabase.getQuoteDetailsFor(messageId: Long): QuoteDetails { + return this + .select( + MessageTable.DATE_SENT, + MessageTable.FROM_RECIPIENT_ID, + MessageTable.BODY, + MessageTable.MESSAGE_RANGES + ) + .from(MessageTable.TABLE_NAME) + .where("${MessageTable.ID} = ?", messageId) + .run() + .readToSingleObject { cursor -> + QuoteDetails( + quotedSentTimestamp = cursor.requireLong(MessageTable.DATE_SENT), + authorId = RecipientId.from(cursor.requireLong(MessageTable.FROM_RECIPIENT_ID)), + body = cursor.requireString(MessageTable.BODY), + bodyRanges = cursor.requireBlob(MessageTable.MESSAGE_RANGES), + type = QuoteModel.Type.NORMAL.code + ) + }!! + } + + private fun SQLiteDatabase.readAllContents(): DatabaseData { + return SqlUtil.getAllTables(this).associateWith { table -> this.getAllTableData(table) } + } + + private fun SQLiteDatabase.getAllTableData(table: String): List> { + return this + .select() + .from(table) + .run() + .readToList { cursor -> + val map: MutableMap = mutableMapOf() + + for (i in 0 until cursor.columnCount) { + val column = cursor.getColumnName(i) + + when (cursor.getType(i)) { + Cursor.FIELD_TYPE_INTEGER -> map[column] = cursor.getInt(i) + Cursor.FIELD_TYPE_FLOAT -> map[column] = cursor.getFloat(i) + Cursor.FIELD_TYPE_STRING -> map[column] = cursor.getString(i) + Cursor.FIELD_TYPE_BLOB -> map[column] = cursor.getBlob(i) + Cursor.FIELD_TYPE_NULL -> map[column] = null + } + } + + map + } + } + + private data class QuoteDetails( + val quotedSentTimestamp: Long, + val authorId: RecipientId, + val body: String?, + val bodyRanges: ByteArray?, + val type: Int + ) +} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt index 49db11bc..d3198c70 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt @@ -50,7 +50,6 @@ class ChangeNumberViewModelTest { @Before fun setUp() { - ApplicationDependencies.getSignalServiceAccountManager().setSoTimeoutMillis(1000) ThreadUtil.runOnMainSync { viewModel = ChangeNumberViewModel( localNumber = harness.self.requireE164(), @@ -231,8 +230,6 @@ class ChangeNumberViewModelTest { lateinit var changeNumberRequest: ChangePhoneNumberRequest lateinit var setPreKeysRequest: PreKeyState - MockProvider.mockGetRegistrationLockStringFlow() - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( Post("/v1/verification/session") { MockResponse().success(MockProvider.sessionMetadataJson.copy(verified = false)) }, Put("/v1/verification/session/${MockProvider.sessionMetadataJson.id}/code") { MockResponse().success(MockProvider.sessionMetadataJson) }, @@ -319,8 +316,6 @@ class ChangeNumberViewModelTest { lateinit var changeNumberRequest: ChangePhoneNumberRequest lateinit var setPreKeysRequest: PreKeyState - MockProvider.mockGetRegistrationLockStringFlow() - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( Post("/v1/verification/session") { MockResponse().success(MockProvider.sessionMetadataJson.copy(verified = false)) }, Put("/v1/verification/session/${MockProvider.sessionMetadataJson.id}/code") { MockResponse().success(MockProvider.sessionMetadataJson) }, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt index e6d8fd78..72118732 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt @@ -9,8 +9,9 @@ import org.junit.runner.RunWith import org.signal.core.util.ThreadUtil import org.tm.archive.attachments.PointerAttachment import org.tm.archive.conversation.v2.ConversationActivity +import org.tm.archive.database.MessageType import org.tm.archive.database.SignalDatabase -import org.tm.archive.mms.IncomingMediaMessage +import org.tm.archive.mms.IncomingMessage import org.tm.archive.mms.OutgoingMessage import org.tm.archive.profiles.ProfileName import org.tm.archive.recipients.Recipient @@ -64,7 +65,8 @@ class ConversationItemPreviewer { attachment() } - val message = IncomingMediaMessage( + val message = IncomingMessage( + type = MessageType.NORMAL, from = other.id, body = body, sentTimeMillis = System.currentTimeMillis(), @@ -73,7 +75,7 @@ class ConversationItemPreviewer { attachments = PointerAttachment.forPointers(Optional.of(attachments)) ) - SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() + SignalDatabase.messages.insertMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() ThreadUtil.sleep(1) } @@ -83,7 +85,8 @@ class ConversationItemPreviewer { attachment() } - val message = IncomingMediaMessage( + val message = IncomingMessage( + type = MessageType.NORMAL, from = other.id, body = body, sentTimeMillis = System.currentTimeMillis(), @@ -92,7 +95,7 @@ class ConversationItemPreviewer { attachments = PointerAttachment.forPointers(Optional.of(attachments)) ) - val insert = SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() + val insert = SignalDatabase.messages.insertMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() SignalDatabase.attachments.getAttachmentsForMessage(insert.messageId).forEachIndexed { index, attachment -> // if (index != 1) { @@ -144,6 +147,7 @@ class ConversationItemPreviewer { 1024, Optional.empty(), Optional.empty(), + 0, Optional.of("/not-there.jpg"), false, false, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt index b036d997..b129f9bb 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt @@ -8,7 +8,7 @@ package org.tm.archive.conversation.v2.items import android.net.Uri import android.view.View import androidx.lifecycle.Observer -import androidx.test.platform.app.InstrumentationRegistry +import io.mockk.mockk import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test @@ -29,7 +29,6 @@ import org.tm.archive.groups.GroupId import org.tm.archive.groups.GroupMigrationMembershipChange import org.tm.archive.linkpreview.LinkPreview import org.tm.archive.mediapreview.MediaIntentFactory -import org.tm.archive.mms.GlideApp import org.tm.archive.mms.GlideRequests import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientId @@ -48,7 +47,6 @@ class V2ConversationItemShapeTest { val expected = V2ConversationItemShape.MessageShape.SINGLE val actual = testSubject.setMessageShape( - isLtr = true, currentMessage = getMessageRecord(), isGroupThread = false, adapterPosition = 5 @@ -70,7 +68,6 @@ class V2ConversationItemShapeTest { val expected = V2ConversationItemShape.MessageShape.END val actual = testSubject.setMessageShape( - isLtr = true, currentMessage = getMessageRecord(now), isGroupThread = false, adapterPosition = 5 @@ -92,7 +89,6 @@ class V2ConversationItemShapeTest { val expected = V2ConversationItemShape.MessageShape.START val actual = testSubject.setMessageShape( - isLtr = true, currentMessage = getMessageRecord(prev), isGroupThread = false, adapterPosition = 5 @@ -116,7 +112,6 @@ class V2ConversationItemShapeTest { val expected = V2ConversationItemShape.MessageShape.MIDDLE val actual = testSubject.setMessageShape( - isLtr = true, currentMessage = getMessageRecord(now), isGroupThread = false, adapterPosition = 5 @@ -138,7 +133,6 @@ class V2ConversationItemShapeTest { val expected = V2ConversationItemShape.MessageShape.SINGLE val actual = testSubject.setMessageShape( - isLtr = true, currentMessage = getMessageRecord(now), isGroupThread = false, adapterPosition = 5 @@ -160,7 +154,6 @@ class V2ConversationItemShapeTest { val expected = V2ConversationItemShape.MessageShape.SINGLE val actual = testSubject.setMessageShape( - isLtr = true, currentMessage = getMessageRecord(prev), isGroupThread = false, adapterPosition = 5 @@ -184,7 +177,6 @@ class V2ConversationItemShapeTest { val expected = V2ConversationItemShape.MessageShape.SINGLE val actual = testSubject.setMessageShape( - isLtr = true, currentMessage = getMessageRecord(now), isGroupThread = false, adapterPosition = 5 @@ -211,13 +203,14 @@ class V2ConversationItemShapeTest { private val colorizer = Colorizer() - override val displayMode: ConversationItemDisplayMode = ConversationItemDisplayMode.STANDARD + override val displayMode: ConversationItemDisplayMode = ConversationItemDisplayMode.Standard override val clickListener: ConversationAdapter.ItemClickListener = FakeConversationItemClickListener override val selectedItems: Set = emptySet() override val isMessageRequestAccepted: Boolean = true override val searchQuery: String? = null - override val glideRequests: GlideRequests = GlideApp.with(InstrumentationRegistry.getInstrumentation().context) + override val glideRequests: GlideRequests = mockk() + override val isParentInScroll: Boolean = false override fun onStartExpirationTimeout(messageRecord: MessageRecord) = Unit diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt index 8c458d9e..bdcefe3b 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt @@ -61,8 +61,8 @@ class AttachmentTableTest { false ) - val attachment1Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment.attachmentId, AttachmentTable.DATA) - val attachment2Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment2.attachmentId, AttachmentTable.DATA) + val attachment1Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment.attachmentId, AttachmentTable.DATA_FILE) + val attachment2Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment2.attachmentId, AttachmentTable.DATA_FILE) assertNotEquals(attachment1Info, attachment2Info) } @@ -89,8 +89,8 @@ class AttachmentTableTest { true ) - val attachment1Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment.attachmentId, AttachmentTable.DATA) - val attachment2Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment2.attachmentId, AttachmentTable.DATA) + val attachment1Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment.attachmentId, AttachmentTable.DATA_FILE) + val attachment2Info = SignalDatabase.attachments.getAttachmentDataFileInfo(attachment2.attachmentId, AttachmentTable.DATA_FILE) assertNotEquals(attachment1Info, attachment2Info) } @@ -124,9 +124,9 @@ class AttachmentTableTest { SignalDatabase.attachments.updateAttachmentData(standardDatabaseAttachment, createMediaStream(compressedData), false) // THEN - val previousInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(previousDatabaseAttachmentId, AttachmentTable.DATA)!! - val standardInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(standardDatabaseAttachment.attachmentId, AttachmentTable.DATA)!! - val highInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(highDatabaseAttachment.attachmentId, AttachmentTable.DATA)!! + val previousInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(previousDatabaseAttachmentId, AttachmentTable.DATA_FILE)!! + val standardInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(standardDatabaseAttachment.attachmentId, AttachmentTable.DATA_FILE)!! + val highInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(highDatabaseAttachment.attachmentId, AttachmentTable.DATA_FILE)!! assertNotEquals(standardInfo, highInfo) standardInfo.file assertIs previousInfo.file @@ -158,9 +158,9 @@ class AttachmentTableTest { val secondHighDatabaseAttachment = SignalDatabase.attachments.insertAttachmentForPreUpload(secondHighQualityPreUpload) // THEN - val standardInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(standardDatabaseAttachment.attachmentId, AttachmentTable.DATA)!! - val highInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(highDatabaseAttachment.attachmentId, AttachmentTable.DATA)!! - val secondHighInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(secondHighDatabaseAttachment.attachmentId, AttachmentTable.DATA)!! + val standardInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(standardDatabaseAttachment.attachmentId, AttachmentTable.DATA_FILE)!! + val highInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(highDatabaseAttachment.attachmentId, AttachmentTable.DATA_FILE)!! + val secondHighInfo = SignalDatabase.attachments.getAttachmentDataFileInfo(secondHighDatabaseAttachment.attachmentId, AttachmentTable.DATA_FILE)!! highInfo.file assertIsNot standardInfo.file secondHighInfo.file assertIs highInfo.file diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt index a9b4fd70..1b535ba2 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt @@ -214,6 +214,175 @@ class CallTableTest { assertEquals(CallTable.Event.JOINED, acceptedCall?.event) } + @Test + fun givenAnOutgoingRingCall_whenIAcceptedOutgoingGroupCall_thenIExpectOutgoingRing() { + val callId = 1L + SignalDatabase.calls.insertAcceptedGroupCall( + callId = callId, + recipientId = groupRecipientId, + direction = CallTable.Direction.OUTGOING, + timestamp = 1 + ) + + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertNotNull(call) + assertEquals(CallTable.Event.OUTGOING_RING, call?.event) + + SignalDatabase.calls.acceptOutgoingGroupCall( + call!! + ) + + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertEquals(CallTable.Event.OUTGOING_RING, acceptedCall?.event) + } + + @Test + fun givenARingingCall_whenIAcceptedOutgoingGroupCall_thenIExpectAccepted() { + val callId = 1L + SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( + ringId = callId, + groupRecipientId = groupRecipientId, + ringerRecipient = harness.others[1], + dateReceived = System.currentTimeMillis(), + ringState = CallManager.RingUpdate.REQUESTED + ) + + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertNotNull(call) + assertEquals(CallTable.Event.RINGING, call?.event) + + SignalDatabase.calls.acceptOutgoingGroupCall( + call!! + ) + + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) + } + + @Test + fun givenAMissedCall_whenIAcceptedOutgoingGroupCall_thenIExpectAccepted() { + val callId = 1L + SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( + ringId = callId, + groupRecipientId = groupRecipientId, + ringerRecipient = harness.others[1], + dateReceived = System.currentTimeMillis(), + ringState = CallManager.RingUpdate.EXPIRED_REQUEST + ) + + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertNotNull(call) + assertEquals(CallTable.Event.MISSED, call?.event) + + SignalDatabase.calls.acceptOutgoingGroupCall( + call!! + ) + + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) + } + + @Test + fun givenADeclinedCall_whenIAcceptedOutgoingGroupCall_thenIExpectAccepted() { + val callId = 1L + SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( + ringId = callId, + groupRecipientId = groupRecipientId, + ringerRecipient = harness.others[1], + dateReceived = System.currentTimeMillis(), + ringState = CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE + ) + + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertNotNull(call) + assertEquals(CallTable.Event.DECLINED, call?.event) + + SignalDatabase.calls.acceptOutgoingGroupCall( + call!! + ) + + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) + } + + @Test + fun givenAnAcceptedCall_whenIAcceptedOutgoingGroupCall_thenIExpectAccepted() { + val callId = 1L + SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( + ringId = callId, + groupRecipientId = groupRecipientId, + ringerRecipient = harness.others[1], + dateReceived = System.currentTimeMillis(), + ringState = CallManager.RingUpdate.REQUESTED + ) + + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertNotNull(call) + assertEquals(CallTable.Event.RINGING, call?.event) + + SignalDatabase.calls.acceptIncomingGroupCall( + call!! + ) + + SignalDatabase.calls.acceptOutgoingGroupCall( + SignalDatabase.calls.getCallById(callId, groupRecipientId)!! + ) + + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) + } + + @Test + fun givenAGenericGroupCall_whenIAcceptedOutgoingGroupCall_thenIExpectOutgoingRing() { + val era = "aaa" + val callId = CallId.fromEra(era).longValue() + SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( + groupRecipientId = groupRecipientId, + sender = harness.others[1], + timestamp = System.currentTimeMillis(), + peekGroupCallEraId = "aaa", + peekJoinedUuids = emptyList(), + isCallFull = false + ) + + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertNotNull(call) + assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) + + SignalDatabase.calls.acceptOutgoingGroupCall( + call!! + ) + + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertEquals(CallTable.Event.OUTGOING_RING, acceptedCall?.event) + } + + @Test + fun givenAJoinedGroupCall_whenIAcceptedOutgoingGroupCall_thenIExpectOutgoingRing() { + val era = "aaa" + val callId = CallId.fromEra(era).longValue() + SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( + groupRecipientId = groupRecipientId, + sender = harness.others[1], + timestamp = System.currentTimeMillis(), + peekGroupCallEraId = "aaa", + peekJoinedUuids = emptyList(), + isCallFull = false + ) + + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertNotNull(call) + assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) + + SignalDatabase.calls.acceptIncomingGroupCall( + call!! + ) + + SignalDatabase.calls.acceptOutgoingGroupCall(SignalDatabase.calls.getCallById(callId, groupRecipientId)!!) + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) + assertEquals(CallTable.Event.OUTGOING_RING, acceptedCall?.event) + } + @Test fun givenNoPriorCallEvent_whenIReceiveAGroupCallUpdateMessage_thenIExpectAGenericGroupCall() { val era = "aaa" diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt index 4978d5f9..73970cde 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt @@ -293,22 +293,22 @@ class GroupTableTest { private fun insertPushGroup( members: List = listOf( - DecryptedMember.newBuilder() - .setAciBytes(harness.self.requireAci().toByteString()) - .setJoinedAtRevision(0) - .setRole(Member.Role.DEFAULT) + DecryptedMember.Builder() + .aciBytes(harness.self.requireAci().toByteString()) + .joinedAtRevision(0) + .role(Member.Role.DEFAULT) .build(), - DecryptedMember.newBuilder() - .setAciBytes(Recipient.resolved(harness.others[0]).requireAci().toByteString()) - .setJoinedAtRevision(0) - .setRole(Member.Role.DEFAULT) + DecryptedMember.Builder() + .aciBytes(Recipient.resolved(harness.others[0]).requireAci().toByteString()) + .joinedAtRevision(0) + .role(Member.Role.DEFAULT) .build() ) ): GroupId { val groupMasterKey = GroupMasterKey(Random.nextBytes(GroupMasterKey.SIZE)) - val decryptedGroupState = DecryptedGroup.newBuilder() - .addAllMembers(members) - .setRevision(0) + val decryptedGroupState = DecryptedGroup.Builder() + .members(members) + .revision(0) .build() return groupTable.create(groupMasterKey, decryptedGroupState)!! @@ -317,23 +317,23 @@ class GroupTableTest { private fun insertPushGroupWithSelfAndOthers(others: List): GroupId { val groupMasterKey = GroupMasterKey(Random.nextBytes(GroupMasterKey.SIZE)) - val selfMember: DecryptedMember = DecryptedMember.newBuilder() - .setAciBytes(harness.self.requireAci().toByteString()) - .setJoinedAtRevision(0) - .setRole(Member.Role.DEFAULT) + val selfMember: DecryptedMember = DecryptedMember.Builder() + .aciBytes(harness.self.requireAci().toByteString()) + .joinedAtRevision(0) + .role(Member.Role.DEFAULT) .build() val otherMembers: List = others.map { id -> - DecryptedMember.newBuilder() - .setAciBytes(Recipient.resolved(id).requireAci().toByteString()) - .setJoinedAtRevision(0) - .setRole(Member.Role.DEFAULT) + DecryptedMember.Builder() + .aciBytes(Recipient.resolved(id).requireAci().toByteString()) + .joinedAtRevision(0) + .role(Member.Role.DEFAULT) .build() } - val decryptedGroupState = DecryptedGroup.newBuilder() - .addAllMembers(listOf(selfMember) + otherMembers) - .setRevision(0) + val decryptedGroupState = DecryptedGroup.Builder() + .members(listOf(selfMember) + otherMembers) + .revision(0) .build() return groupTable.create(groupMasterKey, decryptedGroupState)!! diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/LogDatabaseTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/LogDatabaseTest.kt new file mode 100644 index 00000000..3563ffdb --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/LogDatabaseTest.kt @@ -0,0 +1,288 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.database + +import org.junit.Test +import org.signal.core.util.forEach +import org.signal.core.util.requireLong +import org.signal.core.util.requireNonNullString +import org.signal.core.util.select +import org.signal.core.util.update +import org.tm.archive.crash.CrashConfig +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.testing.assertIs + +class LogDatabaseTest { + + private val db: LogDatabase = LogDatabase.getInstance(ApplicationDependencies.getApplication()) + + @Test + fun crashTable_matchesNamePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs true + } + + @Test + fun crashTable_matchesMessagePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(messagePattern = "Message") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs true + } + + @Test + fun crashTable_matchesStackTracePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(stackTracePattern = "stack") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs true + } + + @Test + fun crashTable_matchesNameAndMessagePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test", messagePattern = "Message") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs true + } + + @Test + fun crashTable_matchesNameAndStackTracePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test", stackTracePattern = "stack") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs true + } + + @Test + fun crashTable_matchesNameAndMessageAndStackTracePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test", messagePattern = "Message", stackTracePattern = "stack") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs true + } + + @Test + fun crashTable_doesNotMatchNamePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Blah") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs false + } + + @Test + fun crashTable_matchesNameButNotMessagePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test", messagePattern = "Blah") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs false + } + + @Test + fun crashTable_matchesNameButNotStackTracePattern() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test", stackTracePattern = "Blah") + ), + promptThreshold = currentTime + ) + + foundMatch assertIs false + } + + @Test + fun crashTable_matchesNamePatternButPromptedTooRecently() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + db.writableDatabase + .update(LogDatabase.CrashTable.TABLE_NAME) + .values(LogDatabase.CrashTable.LAST_PROMPTED_AT to currentTime) + .run() + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test") + ), + promptThreshold = currentTime - 100 + ) + + foundMatch assertIs false + } + + @Test + fun crashTable_noMatches() { + val currentTime = System.currentTimeMillis() + + val foundMatch = db.crashes.anyMatch( + listOf( + CrashConfig.CrashPattern(namePattern = "Test") + ), + promptThreshold = currentTime - 100 + ) + + foundMatch assertIs false + } + + @Test + fun crashTable_updatesLastPromptTime() { + val currentTime = System.currentTimeMillis() + + db.crashes.saveCrash( + createdAt = currentTime, + name = "TestName", + message = "Test Message", + stackTrace = "test\nstack\ntrace" + ) + + db.crashes.saveCrash( + createdAt = currentTime, + name = "XXX", + message = "XXX", + stackTrace = "XXX" + ) + + db.crashes.markAsPrompted( + listOf( + CrashConfig.CrashPattern(namePattern = "Test") + ), + promptedAt = currentTime + ) + + db.writableDatabase + .select(LogDatabase.CrashTable.NAME, LogDatabase.CrashTable.LAST_PROMPTED_AT) + .from(LogDatabase.CrashTable.TABLE_NAME) + .run() + .forEach { + if (it.requireNonNullString(LogDatabase.CrashTable.NAME) == "TestName") { + it.requireLong(LogDatabase.CrashTable.LAST_PROMPTED_AT) assertIs currentTime + } else { + it.requireLong(LogDatabase.CrashTable.LAST_PROMPTED_AT) assertIs 0 + } + } + } +} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt index 72788cba..cabcb90a 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt @@ -48,7 +48,7 @@ class MessageTableTest_gifts { val messageId = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 1, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val result = mms.setOutgoingGiftsRevealed(listOf(messageId)) @@ -62,7 +62,7 @@ class MessageTableTest_gifts { val messageId = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 1, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) mms.setOutgoingGiftsRevealed(listOf(messageId)) @@ -76,13 +76,13 @@ class MessageTableTest_gifts { val messageId = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 1, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 2, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val result = mms.setOutgoingGiftsRevealed(listOf(messageId)) @@ -96,13 +96,13 @@ class MessageTableTest_gifts { val messageId = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 1, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val messageId2 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 2, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val result = mms.setOutgoingGiftsRevealed(listOf(messageId, messageId2)) @@ -115,13 +115,13 @@ class MessageTableTest_gifts { val messageId = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 1, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val messageId2 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 2, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) MmsHelper.insert( @@ -140,13 +140,13 @@ class MessageTableTest_gifts { val messageId = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 1, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val messageId2 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 2, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val messageId3 = MmsHelper.insert( @@ -165,13 +165,13 @@ class MessageTableTest_gifts { MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 1, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), sentTimeMillis = 2, - giftBadge = GiftBadge.getDefaultInstance() + giftBadge = GiftBadge() ) val messageId3 = MmsHelper.insert( diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt index a3cb2f39..0272c6d8 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt @@ -3,7 +3,7 @@ package org.tm.archive.database import org.tm.archive.database.model.ParentStoryId import org.tm.archive.database.model.StoryType import org.tm.archive.database.model.databaseprotos.GiftBadge -import org.tm.archive.mms.IncomingMediaMessage +import org.tm.archive.mms.IncomingMessage import org.tm.archive.mms.OutgoingMessage import org.tm.archive.recipients.Recipient import java.util.Optional @@ -55,9 +55,9 @@ object MmsHelper { } fun insert( - message: IncomingMediaMessage, + message: IncomingMessage, threadId: Long ): Optional { - return SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, threadId) + return SignalDatabase.messages.insertMessageInbox(message, threadId) } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt index 73913529..42f2dad5 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt @@ -13,7 +13,7 @@ import org.tm.archive.database.model.DistributionListId import org.tm.archive.database.model.ParentStoryId import org.tm.archive.database.model.StoryType import org.tm.archive.keyvalue.SignalStore -import org.tm.archive.mms.IncomingMediaMessage +import org.tm.archive.mms.IncomingMessage import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientId import org.whispersystems.signalservice.api.push.ServiceId.ACI @@ -73,7 +73,8 @@ class MmsTableTest_stories { ) MmsHelper.insert( - IncomingMediaMessage( + IncomingMessage( + type = MessageType.NORMAL, from = sender, sentTimeMillis = 2, serverTimeMillis = 2, @@ -95,7 +96,8 @@ class MmsTableTest_stories { // GIVEN val sender = recipients[0] val messageId = MmsHelper.insert( - IncomingMediaMessage( + IncomingMessage( + type = MessageType.NORMAL, from = sender, sentTimeMillis = 2, serverTimeMillis = 2, @@ -122,7 +124,8 @@ class MmsTableTest_stories { // GIVEN val messageIds = recipients.take(5).map { MmsHelper.insert( - IncomingMediaMessage( + IncomingMessage( + type = MessageType.NORMAL, from = it, sentTimeMillis = 2, serverTimeMillis = 2, @@ -154,7 +157,8 @@ class MmsTableTest_stories { val unviewedIds: List = (0 until 5).map { Thread.sleep(5) MmsHelper.insert( - IncomingMediaMessage( + IncomingMessage( + type = MessageType.NORMAL, from = recipients[it], sentTimeMillis = System.currentTimeMillis(), serverTimeMillis = 2, @@ -168,7 +172,8 @@ class MmsTableTest_stories { val viewedIds: List = (0 until 5).map { Thread.sleep(5) MmsHelper.insert( - IncomingMediaMessage( + IncomingMessage( + type = MessageType.NORMAL, from = recipients[it], sentTimeMillis = System.currentTimeMillis(), serverTimeMillis = 2, @@ -213,7 +218,8 @@ class MmsTableTest_stories { fun givenNoOutgoingStories_whenICheckIsOutgoingStoryAlreadyInDatabase_thenIExpectFalse() { // GIVEN MmsHelper.insert( - IncomingMediaMessage( + IncomingMessage( + type = MessageType.NORMAL, from = recipients[0], sentTimeMillis = 200, serverTimeMillis = 2, @@ -321,7 +327,8 @@ class MmsTableTest_stories { ) MmsHelper.insert( - IncomingMediaMessage( + IncomingMessage( + type = MessageType.NORMAL, from = myStory.id, sentTimeMillis = 201, serverTimeMillis = 201, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_applyStorageSyncContactUpdate.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_applyStorageSyncContactUpdate.kt index 1f510a23..d7926209 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_applyStorageSyncContactUpdate.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_applyStorageSyncContactUpdate.kt @@ -38,8 +38,8 @@ class RecipientTableTest_applyStorageSyncContactUpdate { val newProto = oldRecord .toProto() - .toBuilder() - .setIdentityState(ContactRecord.IdentityState.DEFAULT) + .newBuilder() + .identityState(ContactRecord.IdentityState.DEFAULT) .build() val newRecord = SignalContactRecord(oldRecord.id, newProto) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt index bd138234..c5b5d19e 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt @@ -14,8 +14,10 @@ import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.signal.core.util.Base64 import org.signal.core.util.SqlUtil import org.signal.core.util.exists +import org.signal.core.util.orNull import org.signal.core.util.requireLong import org.signal.core.util.requireNonNullString import org.signal.core.util.select @@ -34,12 +36,10 @@ import org.tm.archive.database.model.databaseprotos.ThreadMergeEvent import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.groups.GroupId import org.tm.archive.keyvalue.SignalStore -import org.tm.archive.mms.IncomingMediaMessage +import org.tm.archive.mms.IncomingMessage import org.tm.archive.notifications.profiles.NotificationProfile import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientId -import org.tm.archive.sms.IncomingTextMessage -import org.tm.archive.util.Base64 import org.tm.archive.util.FeatureFlags import org.tm.archive.util.FeatureFlagsAccessor import org.tm.archive.util.Util @@ -142,6 +142,30 @@ class RecipientTableTest_getAndPossiblyMerge { process(null, null, null) } + test("pni matches, pni+aci provided, no pni session") { + given(E164_A, PNI_A, null) + process(null, PNI_A, ACI_A) + expect(E164_A, PNI_A, ACI_A) + + expectNoSessionSwitchoverEvent() + } + + test("pni matches, pni+aci provided, pni session") { + given(E164_A, PNI_A, null, pniSession = true) + process(null, PNI_A, ACI_A) + expect(E164_A, PNI_A, ACI_A) + + expectSessionSwitchoverEvent(E164_A) + } + + test("pni matches, pni+aci provided, pni session, pni-verified") { + given(E164_A, PNI_A, null, pniSession = true) + process(null, PNI_A, ACI_A, pniVerified = true) + expect(E164_A, PNI_A, ACI_A) + + expectNoSessionSwitchoverEvent() + } + test("no match, all fields") { process(E164_A, PNI_A, ACI_A) expect(E164_A, PNI_A, ACI_A) @@ -502,6 +526,18 @@ class RecipientTableTest_getAndPossiblyMerge { expectNoSessionSwitchoverEvent() } + test("steal, e164+pni+aci * pni+aci, all provided, aci sessions but not pni sessions, no SSE expected") { + given(E164_A, PNI_A, ACI_A, createThread = true, aciSession = true, pniSession = false) + given(null, PNI_B, ACI_B, createThread = false, aciSession = true, pniSession = false) + + process(E164_A, PNI_B, ACI_A) + + expect(E164_A, PNI_B, ACI_A) + expect(null, null, ACI_B) + + expectNoSessionSwitchoverEvent() + } + test("merge, e164 & pni & aci, all provided") { given(E164_A, null, null) given(null, PNI_A, null) @@ -789,9 +825,9 @@ class RecipientTableTest_getAndPossiblyMerge { val smsId2: Long = SignalDatabase.messages.insertMessageInbox(smsMessage(sender = recipientIdE164, time = 1, body = "1")).get().messageId val smsId3: Long = SignalDatabase.messages.insertMessageInbox(smsMessage(sender = recipientIdAci, time = 2, body = "2")).get().messageId - val mmsId1: Long = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mmsMessage(sender = recipientIdAci, time = 3, body = "3"), -1).get().messageId - val mmsId2: Long = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mmsMessage(sender = recipientIdE164, time = 4, body = "4"), -1).get().messageId - val mmsId3: Long = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mmsMessage(sender = recipientIdAci, time = 5, body = "5"), -1).get().messageId + val mmsId1: Long = SignalDatabase.messages.insertMessageInbox(mmsMessage(sender = recipientIdAci, time = 3, body = "3"), -1).get().messageId + val mmsId2: Long = SignalDatabase.messages.insertMessageInbox(mmsMessage(sender = recipientIdE164, time = 4, body = "4"), -1).get().messageId + val mmsId3: Long = SignalDatabase.messages.insertMessageInbox(mmsMessage(sender = recipientIdAci, time = 5, body = "5"), -1).get().messageId val threadIdAci: Long = SignalDatabase.threads.getThreadIdFor(recipientIdAci)!! val threadIdE164: Long = SignalDatabase.threads.getThreadIdFor(recipientIdE164)!! @@ -911,12 +947,30 @@ class RecipientTableTest_getAndPossiblyMerge { MatcherAssert.assertThat("Distribution list should have updated $recipientIdE164 to $recipientIdAci", updatedList.members, Matchers.containsInAnyOrder(recipientIdAci, recipientIdAciB)) } - private fun smsMessage(sender: RecipientId, time: Long = 0, body: String = "", groupId: Optional = Optional.empty()): IncomingTextMessage { - return IncomingTextMessage(sender, 1, time, time, time, body, groupId, 0, true, null) + private fun smsMessage(sender: RecipientId, time: Long = 0, body: String = "", groupId: Optional = Optional.empty()): IncomingMessage { + return IncomingMessage( + type = MessageType.NORMAL, + from = sender, + sentTimeMillis = time, + serverTimeMillis = time, + receivedTimeMillis = time, + body = body, + groupId = groupId.orNull(), + isUnidentified = true + ) } - private fun mmsMessage(sender: RecipientId, time: Long = 0, body: String = "", groupId: Optional = Optional.empty()): IncomingMediaMessage { - return IncomingMediaMessage(sender, groupId, body, time, time, time, emptyList(), 0, 0, false, false, true, Optional.empty(), false, false) + private fun mmsMessage(sender: RecipientId, time: Long = 0, body: String = "", groupId: Optional = Optional.empty()): IncomingMessage { + return IncomingMessage( + type = MessageType.NORMAL, + from = sender, + groupId = groupId.orNull(), + body = body, + sentTimeMillis = time, + receivedTimeMillis = time, + serverTimeMillis = time, + isUnidentified = true + ) } private fun identityKey(value: Byte): IdentityKey { @@ -1228,7 +1282,7 @@ class RecipientTableTest_getAndPossiblyMerge { .use { cursor: Cursor -> if (cursor.moveToFirst()) { val bytes = Base64.decode(cursor.requireNonNullString(MessageTable.BODY)) - ThreadMergeEvent.parseFrom(bytes) + ThreadMergeEvent.ADAPTER.decode(bytes) } else { null } @@ -1246,7 +1300,7 @@ class RecipientTableTest_getAndPossiblyMerge { .use { cursor: Cursor -> if (cursor.moveToFirst()) { val bytes = Base64.decode(cursor.requireNonNullString(MessageTable.BODY)) - SessionSwitchoverEvent.parseFrom(bytes) + SessionSwitchoverEvent.ADAPTER.decode(bytes) } else { null } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt index cb6ee1a4..5ca43dab 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt @@ -18,12 +18,10 @@ import org.tm.archive.database.model.databaseprotos.groupChange import org.tm.archive.database.model.databaseprotos.groupContext import org.tm.archive.groups.GroupId import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.mms.IncomingMessage import org.tm.archive.recipients.RecipientId -import org.tm.archive.sms.IncomingGroupUpdateMessage -import org.tm.archive.sms.IncomingTextMessage import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.PNI -import java.util.Optional import java.util.UUID @Suppress("ClassName", "TestFunctionName") @@ -272,13 +270,28 @@ class SmsDatabaseTest_collapseJoinRequestEventsIfPossible { assertThat("latest message should be deleted", sms.getMessageRecordOrNull(latestMessage.messageId), nullValue()) } - private fun smsMessage(sender: RecipientId, body: String? = ""): IncomingTextMessage { + private fun smsMessage(sender: RecipientId, body: String? = ""): IncomingMessage { wallClock++ - return IncomingTextMessage(sender, 1, wallClock, wallClock, wallClock, body, Optional.of(groupId), 0, true, null) + return IncomingMessage( + type = MessageType.NORMAL, + from = sender, + sentTimeMillis = wallClock, + serverTimeMillis = wallClock, + receivedTimeMillis = wallClock, + body = body, + groupId = groupId, + isUnidentified = true + ) } - private fun groupUpdateMessage(sender: RecipientId, groupContext: DecryptedGroupV2Context): IncomingGroupUpdateMessage { - return IncomingGroupUpdateMessage(smsMessage(sender, null), groupContext) + private fun groupUpdateMessage(sender: RecipientId, groupContext: DecryptedGroupV2Context): IncomingMessage { + wallClock++ + return IncomingMessage.groupUpdate( + from = sender, + timestamp = wallClock, + groupId = groupId, + groupContext = groupContext + ) } companion object { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt index 3c9c09e5..3083038c 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt @@ -13,9 +13,9 @@ import okio.ByteString import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock +import org.signal.core.util.Base64 import org.signal.core.util.logging.Log import org.tm.archive.BuildConfig -import org.tm.archive.KbsEnclave import org.tm.archive.push.SignalServiceNetworkAccess import org.tm.archive.push.SignalServiceTrustStore import org.tm.archive.recipients.LiveRecipientCache @@ -23,32 +23,25 @@ import org.tm.archive.testing.Get import org.tm.archive.testing.Verb import org.tm.archive.testing.runSync import org.tm.archive.testing.success -import org.tm.archive.util.Base64 -import org.whispersystems.signalservice.api.KeyBackupService -import org.whispersystems.signalservice.api.SignalServiceAccountManager import org.whispersystems.signalservice.api.push.TrustStore import org.whispersystems.signalservice.internal.configuration.SignalCdnUrl import org.whispersystems.signalservice.internal.configuration.SignalCdsiUrl -import org.whispersystems.signalservice.internal.configuration.SignalKeyBackupServiceUrl import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl import org.whispersystems.signalservice.internal.configuration.SignalStorageUrl import org.whispersystems.signalservice.internal.configuration.SignalSvr2Url -import java.security.KeyStore import java.util.Optional /** * Dependency provider used for instrumentation tests (aka androidTests). * - * Handles setting up a mock web server for API calls, and provides mockable versions of [SignalServiceNetworkAccess] and - * [KeyBackupService]. + * Handles setting up a mock web server for API calls, and provides mockable versions of [SignalServiceNetworkAccess]. */ class InstrumentationApplicationDependencyProvider(application: Application, default: ApplicationDependencyProvider) : ApplicationDependencies.Provider by default { private val serviceTrustStore: TrustStore private val uncensoredConfiguration: SignalServiceConfiguration private val serviceNetworkAccessMock: SignalServiceNetworkAccess - private val keyBackupService: KeyBackupService private val recipientCache: LiveRecipientCache init { @@ -80,7 +73,6 @@ class InstrumentationApplicationDependencyProvider(application: Application, def 0 to arrayOf(SignalCdnUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), 2 to arrayOf(SignalCdnUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)) ), - signalKeyBackupServiceUrls = arrayOf(SignalKeyBackupServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), signalStorageUrls = arrayOf(SignalStorageUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), signalCdsiUrls = arrayOf(SignalCdsiUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), signalSvr2Urls = arrayOf(SignalSvr2Url(baseUrl, serviceTrustStore, "localhost", ConnectionSpec.CLEARTEXT)), @@ -88,7 +80,8 @@ class InstrumentationApplicationDependencyProvider(application: Application, def dns = Optional.of(SignalServiceNetworkAccess.DNS), signalProxy = Optional.empty(), zkGroupServerPublicParams = Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS), - genericServerPublicParams = Base64.decode(BuildConfig.GENERIC_SERVER_PUBLIC_PARAMS) + genericServerPublicParams = Base64.decode(BuildConfig.GENERIC_SERVER_PUBLIC_PARAMS), + backupServerPublicParams = Base64.decode(BuildConfig.BACKUP_SERVER_PUBLIC_PARAMS) ) serviceNetworkAccessMock = mock { @@ -97,8 +90,6 @@ class InstrumentationApplicationDependencyProvider(application: Application, def on { uncensoredConfiguration } doReturn uncensoredConfiguration } - keyBackupService = mock() - recipientCache = LiveRecipientCache(application) { r -> r.run() } } @@ -106,10 +97,6 @@ class InstrumentationApplicationDependencyProvider(application: Application, def return serviceNetworkAccessMock } - override fun provideKeyBackupService(signalServiceAccountManager: SignalServiceAccountManager, keyStore: KeyStore, enclave: KbsEnclave): KeyBackupService { - return keyBackupService - } - override fun provideRecipientCache(): LiveRecipientCache { return recipientCache } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob__checkUsernameIsInSyncTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob__checkUsernameIsInSyncTest.kt deleted file mode 100644 index 352dd44c..00000000 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob__checkUsernameIsInSyncTest.kt +++ /dev/null @@ -1,181 +0,0 @@ -package org.tm.archive.jobs - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import okhttp3.mockwebserver.MockResponse -import org.junit.After -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.signal.libsignal.usernames.Username -import org.tm.archive.database.SignalDatabase -import org.tm.archive.dependencies.InstrumentationApplicationDependencyProvider -import org.tm.archive.keyvalue.SignalStore -import org.tm.archive.testing.Delete -import org.tm.archive.testing.Get -import org.tm.archive.testing.Put -import org.tm.archive.testing.SignalActivityRule -import org.tm.archive.testing.failure -import org.tm.archive.testing.success -import org.whispersystems.signalservice.internal.push.ReserveUsernameResponse -import org.whispersystems.signalservice.internal.push.WhoAmIResponse -import org.whispersystems.util.Base64UrlSafe - -@Suppress("ClassName") -@RunWith(AndroidJUnit4::class) -class RefreshOwnProfileJob__checkUsernameIsInSyncTest { - - @get:Rule - val harness = SignalActivityRule() - - @After - fun tearDown() { - InstrumentationApplicationDependencyProvider.clearHandlers() - SignalStore.phoneNumberPrivacy().clearUsernameOutOfSync() - } - - @Test - fun givenNoLocalUsername_whenICheckUsernameIsInSync_thenIExpectNoFailures() { - // GIVEN - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Delete("/v1/accounts/username_hash") { MockResponse().success() } - ) - - // WHEN - RefreshOwnProfileJob.checkUsernameIsInSync() - } - - @Test - fun givenLocalUsernameDoesNotMatchServerUsername_whenICheckUsernameIsInSync_thenIExpectRetry() { - // GIVEN - var didReserve = false - var didConfirm = false - val username = "hello.32" - val serverUsername = "hello.3232" - SignalDatabase.recipients.setUsername(harness.self.id, username) - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Get("/v1/accounts/whoami") { r -> - MockResponse().success( - WhoAmIResponse().apply { - usernameHash = Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(serverUsername)) - } - ) - }, - Put("/v1/accounts/username_hash/reserve") { r -> - didReserve = true - MockResponse().success(ReserveUsernameResponse(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(username)))) - }, - Put("/v1/accounts/username_hash/confirm") { r -> - didConfirm = true - MockResponse().success() - } - ) - - // WHEN - RefreshOwnProfileJob.checkUsernameIsInSync() - - // THEN - assertTrue(didReserve) - assertTrue(didConfirm) - assertFalse(SignalStore.phoneNumberPrivacy().isUsernameOutOfSync) - } - - @Test - fun givenLocalAndNoServer_whenICheckUsernameIsInSync_thenIExpectRetry() { - // GIVEN - var didReserve = false - var didConfirm = false - val username = "hello.32" - SignalDatabase.recipients.setUsername(harness.self.id, username) - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Get("/v1/accounts/whoami") { r -> - MockResponse().success(WhoAmIResponse()) - }, - Put("/v1/accounts/username_hash/reserve") { r -> - didReserve = true - MockResponse().success(ReserveUsernameResponse(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(username)))) - }, - Put("/v1/accounts/username_hash/confirm") { r -> - didConfirm = true - MockResponse().success() - } - ) - - // WHEN - RefreshOwnProfileJob.checkUsernameIsInSync() - - // THEN - assertTrue(didReserve) - assertTrue(didConfirm) - assertFalse(SignalStore.phoneNumberPrivacy().isUsernameOutOfSync) - } - - @Test - fun givenLocalAndServerMatch_whenICheckUsernameIsInSync_thenIExpectNoRetry() { - // GIVEN - var didReserve = false - var didConfirm = false - val username = "hello.32" - SignalDatabase.recipients.setUsername(harness.self.id, username) - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Get("/v1/accounts/whoami") { r -> - MockResponse().success( - WhoAmIResponse().apply { - usernameHash = Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(username)) - } - ) - }, - Put("/v1/accounts/username_hash/reserve") { r -> - didReserve = true - MockResponse().success(ReserveUsernameResponse(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(username)))) - }, - Put("/v1/accounts/username_hash/confirm") { r -> - didConfirm = true - MockResponse().success() - } - ) - - // WHEN - RefreshOwnProfileJob.checkUsernameIsInSync() - - // THEN - assertFalse(didReserve) - assertFalse(didConfirm) - assertFalse(SignalStore.phoneNumberPrivacy().isUsernameOutOfSync) - } - - @Test - fun givenMismatchAndReservationFails_whenICheckUsernameIsInSync_thenIExpectNoConfirm() { - // GIVEN - var didReserve = false - var didConfirm = false - val username = "hello.32" - SignalDatabase.recipients.setUsername(harness.self.id, username) - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Get("/v1/accounts/whoami") { r -> - MockResponse().success( - WhoAmIResponse().apply { - usernameHash = Base64UrlSafe.encodeBytesWithoutPadding(Username.hash("${username}23")) - } - ) - }, - Put("/v1/accounts/username_hash/reserve") { r -> - didReserve = true - MockResponse().failure(418) - }, - Put("/v1/accounts/username_hash/confirm") { r -> - didConfirm = true - MockResponse().success() - } - ) - - // WHEN - RefreshOwnProfileJob.checkUsernameIsInSync() - - // THEN - assertTrue(didReserve) - assertFalse(didConfirm) - assertTrue(SignalStore.phoneNumberPrivacy().isUsernameOutOfSync) - } -} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/EditMessageSyncProcessorTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/EditMessageSyncProcessorTest.kt index 793e4bd9..84d84d87 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/EditMessageSyncProcessorTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/EditMessageSyncProcessorTest.kt @@ -22,8 +22,9 @@ import org.tm.archive.testing.MessageContentFuzzer import org.tm.archive.testing.SignalActivityRule import org.tm.archive.testing.assertIs import org.tm.archive.util.MessageTableTestUtils -import org.whispersystems.signalservice.internal.push.SignalServiceProtos -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.EditMessage +import org.whispersystems.signalservice.internal.push.Content +import org.whispersystems.signalservice.internal.push.EditMessage +import org.whispersystems.signalservice.internal.push.SyncMessage import kotlin.time.Duration.Companion.seconds @RunWith(AndroidJUnit4::class) @@ -38,7 +39,6 @@ class EditMessageSyncProcessorTest { ) private val IGNORE_ATTACHMENT_COLUMNS = listOf( - AttachmentTable.UNIQUE_ID, AttachmentTable.TRANSFER_FILE ) } @@ -67,16 +67,17 @@ class EditMessageSyncProcessorTest { val content = MessageContentFuzzer.fuzzTextMessage() val metadata = MessageContentFuzzer.envelopeMetadata(harness.self.id, toRecipient.id) - val syncContent = SignalServiceProtos.Content.newBuilder().setSyncMessage( - SignalServiceProtos.SyncMessage.newBuilder().setSent( - SignalServiceProtos.SyncMessage.Sent.newBuilder() - .setDestinationServiceId(metadata.destinationServiceId.toString()) - .setTimestamp(originalTimestamp) - .setExpirationStartTimestamp(originalTimestamp) - .setMessage(content.dataMessage) - ) + val syncContent = Content.Builder().syncMessage( + SyncMessage.Builder().sent( + SyncMessage.Sent.Builder() + .destinationServiceId(metadata.destinationServiceId.toString()) + .timestamp(originalTimestamp) + .expirationStartTimestamp(originalTimestamp) + .message(content.dataMessage) + .build() + ).build() ).build() - SignalDatabase.recipients.setExpireMessages(toRecipient.id, content.dataMessage.expireTimer) + SignalDatabase.recipients.setExpireMessages(toRecipient.id, content.dataMessage?.expireTimer ?: 0) val syncTextMessage = TestMessage( envelope = MessageContentFuzzer.envelope(originalTimestamp), content = syncContent, @@ -86,18 +87,20 @@ class EditMessageSyncProcessorTest { val editTimestamp = originalTimestamp + 200 val editedContent = MessageContentFuzzer.fuzzTextMessage() - val editSyncContent = SignalServiceProtos.Content.newBuilder().setSyncMessage( - SignalServiceProtos.SyncMessage.newBuilder().setSent( - SignalServiceProtos.SyncMessage.Sent.newBuilder() - .setDestinationServiceId(metadata.destinationServiceId.toString()) - .setTimestamp(editTimestamp) - .setExpirationStartTimestamp(editTimestamp) - .setEditMessage( - EditMessage.newBuilder() - .setDataMessage(editedContent.dataMessage) - .setTargetSentTimestamp(originalTimestamp) + val editSyncContent = Content.Builder().syncMessage( + SyncMessage.Builder().sent( + SyncMessage.Sent.Builder() + .destinationServiceId(metadata.destinationServiceId.toString()) + .timestamp(editTimestamp) + .expirationStartTimestamp(editTimestamp) + .editMessage( + EditMessage.Builder() + .dataMessage(editedContent.dataMessage) + .targetSentTimestamp(originalTimestamp) + .build() ) - ) + .build() + ).build() ).build() val syncEditMessage = TestMessage( @@ -109,38 +112,38 @@ class EditMessageSyncProcessorTest { testResult.runSync(listOf(syncTextMessage, syncEditMessage)) - SignalDatabase.recipients.setExpireMessages(toRecipient.id, content.dataMessage.expireTimer / 1000) + SignalDatabase.recipients.setExpireMessages(toRecipient.id, (content.dataMessage?.expireTimer ?: 0) / 1000) val originalTextMessage = OutgoingMessage( threadRecipient = toRecipient, sentTimeMillis = originalTimestamp, - body = content.dataMessage.body, - expiresIn = content.dataMessage.expireTimer.seconds.inWholeMilliseconds, + body = content.dataMessage?.body ?: "", + expiresIn = content.dataMessage?.expireTimer?.seconds?.inWholeMilliseconds ?: 0, isUrgent = true, isSecure = true, - bodyRanges = content.dataMessage.bodyRangesList.toBodyRangeList() + bodyRanges = content.dataMessage?.bodyRanges.toBodyRangeList() ) val threadId = SignalDatabase.threads.getOrCreateThreadIdFor(toRecipient) val originalMessageId = SignalDatabase.messages.insertMessageOutbox(originalTextMessage, threadId, false, null) SignalDatabase.messages.markAsSent(originalMessageId, true) - if (content.dataMessage.expireTimer > 0) { + if ((content.dataMessage?.expireTimer ?: 0) > 0) { SignalDatabase.messages.markExpireStarted(originalMessageId, originalTimestamp) } val editMessage = OutgoingMessage( threadRecipient = toRecipient, sentTimeMillis = editTimestamp, - body = editedContent.dataMessage.body, - expiresIn = content.dataMessage.expireTimer.seconds.inWholeMilliseconds, + body = editedContent.dataMessage?.body ?: "", + expiresIn = content.dataMessage?.expireTimer?.seconds?.inWholeMilliseconds ?: 0, isUrgent = true, isSecure = true, - bodyRanges = editedContent.dataMessage.bodyRangesList.toBodyRangeList(), + bodyRanges = editedContent.dataMessage?.bodyRanges.toBodyRangeList(), messageToEdit = originalMessageId ) val editMessageId = SignalDatabase.messages.insertMessageOutbox(editMessage, threadId, false, null) SignalDatabase.messages.markAsSent(editMessageId, true) - if (content.dataMessage.expireTimer > 0) { + if ((content.dataMessage?.expireTimer ?: 0) > 0) { SignalDatabase.messages.markExpireStarted(editMessageId, originalTimestamp) } testResult.collectLocal() @@ -167,7 +170,7 @@ class EditMessageSyncProcessorTest { fun runSync(messages: List) { messages.forEach { (envelope, content, metadata, serverDeliveredTimestamp) -> - if (content.hasSyncMessage()) { + if (content.syncMessage != null) { processorV2.process( envelope, content, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__recipientStatusTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__recipientStatusTest.kt index a1f2c248..8f555697 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__recipientStatusTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__recipientStatusTest.kt @@ -1,13 +1,13 @@ package org.tm.archive.messages import androidx.test.ext.junit.runners.AndroidJUnit4 +import okio.ByteString.Companion.toByteString import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.tm.archive.database.GroupReceiptTable import org.tm.archive.database.SignalDatabase -import org.tm.archive.database.model.toProtoByteString import org.tm.archive.messages.SignalServiceProtoUtil.buildWith import org.tm.archive.testing.GroupTestingUtils import org.tm.archive.testing.GroupTestingUtils.asMember @@ -15,8 +15,8 @@ import org.tm.archive.testing.MessageContentFuzzer import org.tm.archive.testing.SignalActivityRule import org.tm.archive.testing.assertIs import org.tm.archive.util.MessageTableTestUtils -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.DataMessage -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupContextV2 +import org.whispersystems.signalservice.internal.push.DataMessage +import org.whispersystems.signalservice.internal.push.GroupContextV2 @Suppress("ClassName") @RunWith(AndroidJUnit4::class) @@ -41,9 +41,9 @@ class MessageContentProcessor__recipientStatusTest { @Test fun syncGroupSentTextMessageWithRecipientUpdateFollowup() { val (groupId, masterKey, groupRecipientId) = GroupTestingUtils.insertGroup(revision = 0, harness.self.asMember(), harness.others[0].asMember(), harness.others[1].asMember()) - val groupContextV2 = GroupContextV2.newBuilder().setRevision(0).setMasterKey(masterKey.serialize().toProtoByteString()).build() + val groupContextV2 = GroupContextV2.Builder().revision(0).masterKey(masterKey.serialize().toByteString()).build() - val initialTextMessage = DataMessage.newBuilder().buildWith { + val initialTextMessage = DataMessage.Builder().buildWith { body = MessageContentFuzzer.string() groupV2 = groupContextV2 timestamp = envelopeTimestamp diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt index c2ef56e3..154ce37a 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt @@ -6,7 +6,6 @@ import io.mockk.mockkObject import io.mockk.mockkStatic import io.mockk.unmockkStatic import okio.ByteString -import okio.ByteString.Companion.toByteString import org.junit.After import org.junit.Before import org.junit.Ignore @@ -26,7 +25,7 @@ import org.tm.archive.testing.Entry import org.tm.archive.testing.FakeClientHelpers import org.tm.archive.testing.SignalActivityRule import org.tm.archive.testing.awaitFor -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope +import org.whispersystems.signalservice.internal.push.Envelope import org.whispersystems.signalservice.internal.websocket.WebSocketMessage import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage import java.util.regex.Pattern @@ -93,7 +92,7 @@ class MessageProcessingPerformanceTest { val messageCount = 100 val envelopes = generateInboundEnvelopes(bobClient, messageCount) val firstTimestamp = envelopes.first().timestamp - val lastTimestamp = envelopes.last().timestamp + val lastTimestamp = envelopes.last().timestamp ?: 0 // Inject the envelopes into the websocket Thread { @@ -190,7 +189,7 @@ class MessageProcessingPerformanceTest { path = "/api/v1/message", id = Random(System.currentTimeMillis()).nextLong(), headers = listOf("X-Signal-Timestamp: ${this.timestamp}"), - body = this.toByteArray().toByteString() + body = this.encodeByteString() ) ).encodeByteString() } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TestMessage.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TestMessage.kt index ef20788b..7779f0f6 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TestMessage.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TestMessage.kt @@ -1,11 +1,12 @@ package org.tm.archive.messages import org.whispersystems.signalservice.api.crypto.EnvelopeMetadata -import org.whispersystems.signalservice.internal.push.SignalServiceProtos +import org.whispersystems.signalservice.internal.push.Content +import org.whispersystems.signalservice.internal.push.Envelope data class TestMessage( - val envelope: SignalServiceProtos.Envelope, - val content: SignalServiceProtos.Content, + val envelope: Envelope, + val content: Content, val metadata: EnvelopeMetadata, val serverDeliveredTimestamp: Long ) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TimingMessageContentProcessor.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TimingMessageContentProcessor.kt index f1cd8f9e..1f614b80 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TimingMessageContentProcessor.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/TimingMessageContentProcessor.kt @@ -5,7 +5,8 @@ import org.signal.core.util.logging.Log import org.tm.archive.testing.LogPredicate import org.tm.archive.util.SignalLocalMetrics import org.whispersystems.signalservice.api.crypto.EnvelopeMetadata -import org.whispersystems.signalservice.internal.push.SignalServiceProtos +import org.whispersystems.signalservice.internal.push.Content +import org.whispersystems.signalservice.internal.push.Envelope class TimingMessageContentProcessor(context: Context) : MessageContentProcessor(context) { companion object { @@ -19,9 +20,9 @@ class TimingMessageContentProcessor(context: Context) : MessageContentProcessor( fun endTag(timestamp: Long) = "$timestamp end" } - override fun process(envelope: SignalServiceProtos.Envelope, content: SignalServiceProtos.Content, metadata: EnvelopeMetadata, serverDeliveredTimestamp: Long, processingEarlyContent: Boolean, localMetric: SignalLocalMetrics.MessageReceive?) { - Log.d(TAG, startTag(envelope.timestamp)) + override fun process(envelope: Envelope, content: Content, metadata: EnvelopeMetadata, serverDeliveredTimestamp: Long, processingEarlyContent: Boolean, localMetric: SignalLocalMetrics.MessageReceive?) { + Log.d(TAG, startTag(envelope.timestamp!!)) super.process(envelope, content, metadata, serverDeliveredTimestamp, processingEarlyContent, localMetric) - Log.d(TAG, endTag(envelope.timestamp)) + Log.d(TAG, endTag(envelope.timestamp!!)) } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt index d2088cec..f1d60065 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt @@ -33,6 +33,7 @@ import org.tm.archive.testing.SignalActivityRule import org.tm.archive.testing.assertIsNotNull import org.tm.archive.testing.assertIsNull import org.tm.archive.testing.success +import org.whispersystems.signalservice.api.util.Usernames import org.whispersystems.signalservice.internal.push.ReserveUsernameResponse import java.util.concurrent.TimeUnit @@ -96,7 +97,7 @@ class UsernameEditFragmentTest { fun testNicknameUpdateHappyPath() { val nickname = "Spiderman" val discriminator = "4578" - val username = "$nickname${UsernameState.DELIMITER}$discriminator" + val username = "$nickname${Usernames.DELIMITER}$discriminator" InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( Put("/v1/accounts/username/reserved") { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt index d7959256..ecd8e96c 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt @@ -6,12 +6,12 @@ import org.junit.Assert.assertNotEquals import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.signal.core.util.Base64 import org.signal.core.util.update import org.tm.archive.database.RecipientTable import org.tm.archive.database.SignalDatabase import org.tm.archive.keyvalue.SignalStore import org.tm.archive.recipients.RecipientId -import org.tm.archive.util.Base64 import org.tm.archive.util.FeatureFlags import org.tm.archive.util.FeatureFlagsAccessor import org.whispersystems.signalservice.api.push.ServiceId.ACI @@ -38,15 +38,21 @@ class ContactRecordProcessorTest { val originalId = SignalDatabase.recipients.getAndPossiblyMerge(ACI_A, PNI_A, E164_A) setStorageId(originalId, STORAGE_ID_A) - val remote1 = buildRecord(STORAGE_ID_B) { - setAci(ACI_A.toString()) - setUnregisteredAtTimestamp(100) - } + val remote1 = buildRecord( + STORAGE_ID_B, + ContactRecord( + aci = ACI_A.toString(), + unregisteredAtTimestamp = 100 + ) + ) - val remote2 = buildRecord(STORAGE_ID_C) { - setPni(PNI_A.toString()) - setE164(E164_A) - } + val remote2 = buildRecord( + STORAGE_ID_C, + ContactRecord( + pni = PNI_A.toString(), + e164 = E164_A + ) + ) // WHEN val subject = ContactRecordProcessor() @@ -69,16 +75,22 @@ class ContactRecordProcessorTest { val originalId = SignalDatabase.recipients.getAndPossiblyMerge(ACI_A, PNI_A, E164_A) setStorageId(originalId, STORAGE_ID_A) - val remote1 = buildRecord(STORAGE_ID_B) { - setAci(ACI_A.toString()) - setUnregisteredAtTimestamp(0) - } + val remote1 = buildRecord( + STORAGE_ID_B, + ContactRecord( + aci = ACI_A.toString(), + unregisteredAtTimestamp = 0 + ) + ) - val remote2 = buildRecord(STORAGE_ID_C) { - setAci(PNI_A.toString()) - setPni(PNI_A.toString()) - setE164(E164_A) - } + val remote2 = buildRecord( + STORAGE_ID_C, + ContactRecord( + aci = PNI_A.toString(), + pni = PNI_A.toString(), + e164 = E164_A + ) + ) // WHEN val subject = ContactRecordProcessor() @@ -94,14 +106,14 @@ class ContactRecordProcessorTest { assertEquals(byAci, byE164) } - private fun buildRecord(id: StorageId, applyParams: ContactRecord.Builder.() -> ContactRecord.Builder): SignalContactRecord { - return SignalContactRecord(id, ContactRecord.getDefaultInstance().toBuilder().applyParams().build()) + private fun buildRecord(id: StorageId, record: ContactRecord): SignalContactRecord { + return SignalContactRecord(id, record) } private fun setStorageId(recipientId: RecipientId, storageId: StorageId) { SignalDatabase.rawDatabase .update(RecipientTable.TABLE_NAME) - .values(RecipientTable.STORAGE_SERVICE_ID to Base64.encodeBytes(storageId.raw)) + .values(RecipientTable.STORAGE_SERVICE_ID to Base64.encodeWithPadding(storageId.raw)) .where("${RecipientTable.ID} = ?", recipientId) .run() } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt index 4024e981..e2800800 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt @@ -11,7 +11,7 @@ import org.tm.archive.recipients.Recipient import org.tm.archive.testing.FakeClientHelpers.toEnvelope import org.whispersystems.signalservice.api.push.ServiceId import org.whispersystems.signalservice.api.push.SignalServiceAddress -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope +import org.whispersystems.signalservice.internal.push.Envelope /** * Welcome to Alice's Client. diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/BobClient.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/BobClient.kt index 35c39571..7e5e9516 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/BobClient.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/BobClient.kt @@ -31,11 +31,10 @@ import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess import org.whispersystems.signalservice.api.push.DistributionId import org.whispersystems.signalservice.api.push.ServiceId import org.whispersystems.signalservice.api.push.SignalServiceAddress -import org.whispersystems.signalservice.internal.push.SignalServiceProtos +import org.whispersystems.signalservice.internal.push.Envelope import java.util.Optional import java.util.UUID import java.util.concurrent.locks.ReentrantLock -import kotlin.UnsupportedOperationException /** * Welcome to Bob's Client. @@ -61,7 +60,7 @@ class BobClient(val serviceId: ServiceId, val e164: String, val identityKeyPair: } /** Inspired by SignalServiceMessageSender#getEncryptedMessage */ - fun encrypt(now: Long): SignalServiceProtos.Envelope { + fun encrypt(now: Long): Envelope { val envelopeContent = FakeClientHelpers.encryptedTextMessage(now) val cipher = SignalServiceCipher(serviceAddress, 1, aciStore, sessionLock, null) @@ -72,10 +71,10 @@ class BobClient(val serviceId: ServiceId, val e164: String, val identityKeyPair: } return cipher.encrypt(getAliceProtocolAddress(), getAliceUnidentifiedAccess(), envelopeContent) - .toEnvelope(envelopeContent.content.get().dataMessage.timestamp, getAliceServiceId()) + .toEnvelope(envelopeContent.content.get().dataMessage!!.timestamp!!, getAliceServiceId()) } - fun decrypt(envelope: SignalServiceProtos.Envelope, serverDeliveredTimestamp: Long) { + fun decrypt(envelope: Envelope, serverDeliveredTimestamp: Long) { val cipher = SignalServiceCipher(serviceAddress, 1, aciStore, sessionLock, UnidentifiedAccessUtil.getCertificateValidator()) cipher.decrypt(envelope, serverDeliveredTimestamp) } @@ -166,7 +165,7 @@ class BobClient(val serviceId: ServiceId, val e164: String, val identityKeyPair: override fun storeSenderKey(sender: SignalProtocolAddress?, distributionId: UUID?, record: SenderKeyRecord?) = throw UnsupportedOperationException() override fun loadSenderKey(sender: SignalProtocolAddress?, distributionId: UUID?): SenderKeyRecord = throw UnsupportedOperationException() override fun archiveSession(address: SignalProtocolAddress?) = throw UnsupportedOperationException() - override fun getAllAddressesWithActiveSessions(addressNames: MutableList?): MutableSet = throw UnsupportedOperationException() + override fun getAllAddressesWithActiveSessions(addressNames: MutableList?): MutableMap = throw UnsupportedOperationException() override fun getSenderKeySharedWith(distributionId: DistributionId?): MutableSet = throw UnsupportedOperationException() override fun markSenderKeySharedWith(distributionId: DistributionId?, addresses: MutableCollection?) = throw UnsupportedOperationException() override fun clearSenderKeySharedWith(addresses: MutableCollection?) = throw UnsupportedOperationException() diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/FakeClientHelpers.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/FakeClientHelpers.kt index 113db45a..cd1c0edd 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/FakeClientHelpers.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/FakeClientHelpers.kt @@ -1,5 +1,7 @@ package org.tm.archive.testing +import okio.ByteString.Companion.toByteString +import org.signal.core.util.Base64 import org.signal.libsignal.internal.Native import org.signal.libsignal.internal.NativeHandleGuard import org.signal.libsignal.metadata.certificate.CertificateValidator @@ -9,16 +11,16 @@ import org.signal.libsignal.protocol.ecc.Curve import org.signal.libsignal.protocol.ecc.ECKeyPair import org.signal.libsignal.protocol.ecc.ECPublicKey import org.signal.libsignal.zkgroup.profiles.ProfileKey -import org.tm.archive.database.model.toProtoByteString +import org.tm.archive.messages.SignalServiceProtoUtil.buildWith import org.whispersystems.signalservice.api.crypto.ContentHint import org.whispersystems.signalservice.api.crypto.EnvelopeContent import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess import org.whispersystems.signalservice.api.crypto.UnidentifiedAccessPair import org.whispersystems.signalservice.api.push.ServiceId +import org.whispersystems.signalservice.internal.push.Content +import org.whispersystems.signalservice.internal.push.DataMessage +import org.whispersystems.signalservice.internal.push.Envelope import org.whispersystems.signalservice.internal.push.OutgoingPushMessage -import org.whispersystems.signalservice.internal.push.SignalServiceProtos -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope -import org.whispersystems.util.Base64 import java.util.Optional import java.util.UUID @@ -52,9 +54,9 @@ object FakeClientHelpers { } fun encryptedTextMessage(now: Long, message: String = "Test body message"): EnvelopeContent { - val content = SignalServiceProtos.Content.newBuilder().apply { - setDataMessage( - SignalServiceProtos.DataMessage.newBuilder().apply { + val content = Content.Builder().apply { + dataMessage( + DataMessage.Builder().buildWith { body = message timestamp = now } @@ -64,16 +66,16 @@ object FakeClientHelpers { } fun OutgoingPushMessage.toEnvelope(timestamp: Long, destination: ServiceId): Envelope { - return Envelope.newBuilder() - .setType(Envelope.Type.valueOf(this.type)) - .setSourceDevice(1) - .setTimestamp(timestamp) - .setServerTimestamp(timestamp + 1) - .setDestinationServiceId(destination.toString()) - .setServerGuid(UUID.randomUUID().toString()) - .setContent(Base64.decode(this.content).toProtoByteString()) - .setUrgent(true) - .setStory(false) + return Envelope.Builder() + .type(Envelope.Type.fromValue(this.type)) + .sourceDevice(1) + .timestamp(timestamp) + .serverTimestamp(timestamp + 1) + .destinationServiceId(destination.toString()) + .serverGuid(UUID.randomUUID().toString()) + .content(Base64.decode(this.content).toByteString()) + .urgent(true) + .story(false) .build() } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/GroupTestingUtils.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/GroupTestingUtils.kt index 7fe45020..2dab3533 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/GroupTestingUtils.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/GroupTestingUtils.kt @@ -16,19 +16,19 @@ import kotlin.random.Random */ object GroupTestingUtils { fun member(aci: ACI, revision: Int = 0, role: Member.Role = Member.Role.ADMINISTRATOR): DecryptedMember { - return DecryptedMember.newBuilder() - .setAciBytes(aci.toByteString()) - .setJoinedAtRevision(revision) - .setRole(role) + return DecryptedMember.Builder() + .aciBytes(aci.toByteString()) + .joinedAtRevision(revision) + .role(role) .build() } fun insertGroup(revision: Int = 0, vararg members: DecryptedMember): TestGroupInfo { val groupMasterKey = GroupMasterKey(Random.nextBytes(GroupMasterKey.SIZE)) - val decryptedGroupState = DecryptedGroup.newBuilder() - .addAllMembers(members.toList()) - .setRevision(revision) - .setTitle(MessageContentFuzzer.string()) + val decryptedGroupState = DecryptedGroup.Builder() + .members(members.toList()) + .revision(revision) + .title(MessageContentFuzzer.string()) .build() val groupId = SignalDatabase.groups.create(groupMasterKey, decryptedGroupState)!! diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MessageContentFuzzer.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MessageContentFuzzer.kt index dc490615..0e952de5 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MessageContentFuzzer.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MessageContentFuzzer.kt @@ -1,21 +1,20 @@ package org.tm.archive.testing -import com.google.protobuf.ByteString -import org.tm.archive.database.model.toProtoByteString +import okio.ByteString +import okio.ByteString.Companion.toByteString import org.tm.archive.groups.GroupId import org.tm.archive.messages.SignalServiceProtoUtil.buildWith import org.tm.archive.messages.TestMessage import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientId import org.whispersystems.signalservice.api.crypto.EnvelopeMetadata -import org.whispersystems.signalservice.api.util.UuidUtil -import org.whispersystems.signalservice.internal.push.SignalServiceProtos -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.AttachmentPointer -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Content -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.DataMessage -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupContextV2 -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.SyncMessage +import org.whispersystems.signalservice.internal.push.AttachmentPointer +import org.whispersystems.signalservice.internal.push.BodyRange +import org.whispersystems.signalservice.internal.push.Content +import org.whispersystems.signalservice.internal.push.DataMessage +import org.whispersystems.signalservice.internal.push.Envelope +import org.whispersystems.signalservice.internal.push.GroupContextV2 +import org.whispersystems.signalservice.internal.push.SyncMessage import java.util.UUID import kotlin.random.Random import kotlin.random.nextInt @@ -35,10 +34,10 @@ object MessageContentFuzzer { * Create an [Envelope]. */ fun envelope(timestamp: Long): Envelope { - return Envelope.newBuilder() - .setTimestamp(timestamp) - .setServerTimestamp(timestamp + 5) - .setServerGuidBytes(UuidUtil.toByteString(UUID.randomUUID())) + return Envelope.Builder() + .timestamp(timestamp) + .serverTimestamp(timestamp + 5) + .serverGuid(UUID.randomUUID().toString()) .build() } @@ -62,20 +61,22 @@ object MessageContentFuzzer { * - Bold style body ranges */ fun fuzzTextMessage(groupContextV2: GroupContextV2? = null): Content { - return Content.newBuilder() - .setDataMessage( - DataMessage.newBuilder().buildWith { + return Content.Builder() + .dataMessage( + DataMessage.Builder().buildWith { body = string() if (random.nextBoolean()) { expireTimer = random.nextInt(0..28.days.inWholeSeconds.toInt()) } if (random.nextBoolean()) { - addBodyRanges( - SignalServiceProtos.BodyRange.newBuilder().buildWith { - start = 0 - length = 1 - style = SignalServiceProtos.BodyRange.Style.BOLD - } + bodyRanges( + listOf( + BodyRange.Builder().buildWith { + start = 0 + length = 1 + style = BodyRange.Style.BOLD + } + ) ) } if (groupContextV2 != null) { @@ -95,16 +96,16 @@ object MessageContentFuzzer { recipientUpdate: Boolean = false ): Content { return Content - .newBuilder() - .setSyncMessage( - SyncMessage.newBuilder().buildWith { - sent = SyncMessage.Sent.newBuilder().buildWith { + .Builder() + .syncMessage( + SyncMessage.Builder().buildWith { + sent = SyncMessage.Sent.Builder().buildWith { timestamp = textMessage.timestamp message = textMessage isRecipientUpdate = recipientUpdate - addAllUnidentifiedStatus( + unidentifiedStatus( deliveredTo.map { - SyncMessage.Sent.UnidentifiedDeliveryStatus.newBuilder().buildWith { + SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder().buildWith { destinationServiceId = Recipient.resolved(it).requireServiceId().toString() unidentified = true } @@ -123,9 +124,9 @@ object MessageContentFuzzer { * - A message with 0-2 attachment pointers and may contain a text body */ fun fuzzMediaMessageWithBody(quoteAble: List = emptyList()): Content { - return Content.newBuilder() - .setDataMessage( - DataMessage.newBuilder().buildWith { + return Content.Builder() + .dataMessage( + DataMessage.Builder().buildWith { if (random.nextBoolean()) { body = string() } @@ -133,28 +134,28 @@ object MessageContentFuzzer { if (random.nextBoolean() && quoteAble.isNotEmpty()) { body = string() val quoted = quoteAble.random(random) - quote = DataMessage.Quote.newBuilder().buildWith { + quote = DataMessage.Quote.Builder().buildWith { id = quoted.envelope.timestamp authorAci = quoted.metadata.sourceServiceId.toString() - text = quoted.content.dataMessage.body - addAllAttachments(quoted.content.dataMessage.attachmentsList) - addAllBodyRanges(quoted.content.dataMessage.bodyRangesList) + text = quoted.content.dataMessage?.body + attachments(quoted.content.dataMessage?.attachments ?: emptyList()) + bodyRanges(quoted.content.dataMessage?.bodyRanges ?: emptyList()) type = DataMessage.Quote.Type.NORMAL } } if (random.nextFloat() < 0.1 && quoteAble.isNotEmpty()) { val quoted = quoteAble.random(random) - quote = DataMessage.Quote.newBuilder().buildWith { - id = random.nextLong(quoted.envelope.timestamp - 1000000, quoted.envelope.timestamp) + quote = DataMessage.Quote.Builder().buildWith { + id = random.nextLong(quoted.envelope.timestamp!! - 1000000, quoted.envelope.timestamp!!) authorAci = quoted.metadata.sourceServiceId.toString() - text = quoted.content.dataMessage.body + text = quoted.content.dataMessage?.body } } if (random.nextFloat() < 0.25) { val total = random.nextInt(1, 2) - (0..total).forEach { _ -> addAttachments(attachmentPointer()) } + attachments((0..total).map { attachmentPointer() }) } } ) @@ -166,12 +167,12 @@ object MessageContentFuzzer { * - A reaction to a prior message */ fun fuzzMediaMessageNoContent(previousMessages: List = emptyList()): Content { - return Content.newBuilder() - .setDataMessage( - DataMessage.newBuilder().buildWith { + return Content.Builder() + .dataMessage( + DataMessage.Builder().buildWith { if (random.nextFloat() < 0.25) { val reactTo = previousMessages.random(random) - reaction = DataMessage.Reaction.newBuilder().buildWith { + reaction = DataMessage.Reaction.Builder().buildWith { emoji = emojis.random(random) remove = false targetAuthorAci = reactTo.metadata.sourceServiceId.toString() @@ -187,15 +188,15 @@ object MessageContentFuzzer { * - A sticker */ fun fuzzMediaMessageNoText(previousMessages: List = emptyList()): Content { - return Content.newBuilder() - .setDataMessage( - DataMessage.newBuilder().buildWith { + return Content.Builder() + .dataMessage( + DataMessage.Builder().buildWith { if (random.nextFloat() < 0.9) { - sticker = DataMessage.Sticker.newBuilder().buildWith { + sticker = DataMessage.Sticker.Builder().buildWith { packId = byteString(length = 24) packKey = byteString(length = 128) stickerId = random.nextInt() - data = attachmentPointer() + data_ = attachmentPointer() emoji = emojis.random(random) } } @@ -223,14 +224,14 @@ object MessageContentFuzzer { * Generate a random [ByteString]. */ fun byteString(length: Int = 512): ByteString { - return random.nextBytes(length).toProtoByteString() + return random.nextBytes(length).toByteString() } /** * Generate a random [AttachmentPointer]. */ fun attachmentPointer(): AttachmentPointer { - return AttachmentPointer.newBuilder().run { + return AttachmentPointer.Builder().run { cdnKey = string() contentType = mediaTypes.random(random) key = byteString() diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt index 393c53ee..db989eda 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt @@ -1,22 +1,12 @@ package org.tm.archive.testing -import org.mockito.kotlin.anyOrNull -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.stub -import org.signal.core.util.Hex import org.signal.libsignal.protocol.IdentityKeyPair import org.signal.libsignal.protocol.ecc.Curve import org.signal.libsignal.protocol.state.PreKeyRecord import org.signal.libsignal.protocol.util.KeyHelper import org.signal.libsignal.protocol.util.Medium -import org.signal.libsignal.svr2.PinHash import org.tm.archive.crypto.PreKeyUtil -import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.keyvalue.SignalStore -import org.tm.archive.test.BuildConfig -import org.whispersystems.signalservice.api.KeyBackupService -import org.whispersystems.signalservice.api.SvrPinData -import org.whispersystems.signalservice.api.kbs.MasterKey import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo import org.whispersystems.signalservice.api.push.ServiceId import org.whispersystems.signalservice.api.push.SignedPreKeyEntity @@ -78,18 +68,6 @@ object MockProvider { } } - fun mockGetRegistrationLockStringFlow() { - val session: KeyBackupService.RestoreSession = object : KeyBackupService.RestoreSession { - override fun hashSalt(): ByteArray = Hex.fromStringCondensed("cba811749042b303a6a7efa5ccd160aea5e3ea243c8d2692bd13d515732f51a8") - override fun restorePin(hashedPin: PinHash?): SvrPinData = SvrPinData(MasterKey.createNew(SecureRandom()), null) - } - - val kbsService = ApplicationDependencies.getKeyBackupService(BuildConfig.KBS_ENCLAVE) - kbsService.stub { - on { newRegistrationSession(anyOrNull(), anyOrNull()) } doReturn session - } - } - fun createPreKeyResponse(identity: IdentityKeyPair = SignalStore.account().aciIdentityKey, deviceId: Int): PreKeyResponse { val signedPreKeyRecord = PreKeyUtil.generateSignedPreKey(SecureRandom().nextInt(Medium.MAX_VALUE), identity.privateKey) val oneTimePreKey = PreKeyRecord(SecureRandom().nextInt(Medium.MAX_VALUE), Curve.generateKeyPair()) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/TestProtos.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/TestProtos.kt deleted file mode 100644 index cb1fce8e..00000000 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/TestProtos.kt +++ /dev/null @@ -1,70 +0,0 @@ -package org.tm.archive.testing - -import com.google.protobuf.ByteString -import org.signal.libsignal.zkgroup.groups.GroupMasterKey -import org.whispersystems.signalservice.api.push.ServiceId.ACI -import org.whispersystems.signalservice.internal.push.SignalServiceProtos -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.DataMessage -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupContextV2 -import org.whispersystems.signalservice.internal.serialize.protos.AddressProto -import org.whispersystems.signalservice.internal.serialize.protos.MetadataProto -import org.whispersystems.signalservice.internal.serialize.protos.SignalServiceContentProto -import java.util.UUID -import kotlin.random.Random - -class TestProtos private constructor() { - fun address( - uuid: UUID = UUID.randomUUID() - ): AddressProto.Builder { - return AddressProto.newBuilder() - .setUuid(ACI.from(uuid).toByteString()) - } - - fun metadata( - address: AddressProto = address().build() - ): MetadataProto.Builder { - return MetadataProto.newBuilder() - .setAddress(address) - } - - fun groupContextV2( - revision: Int = 0, - masterKeyBytes: ByteArray = Random.Default.nextBytes(GroupMasterKey.SIZE) - ): GroupContextV2.Builder { - return GroupContextV2.newBuilder() - .setRevision(revision) - .setMasterKey(ByteString.copyFrom(masterKeyBytes)) - } - - fun storyContext( - sentTimestamp: Long = Random.nextLong(), - authorUuid: String = UUID.randomUUID().toString() - ): DataMessage.StoryContext.Builder { - return DataMessage.StoryContext.newBuilder() - .setAuthorAci(authorUuid) - .setSentTimestamp(sentTimestamp) - } - - fun dataMessage(): DataMessage.Builder { - return DataMessage.newBuilder() - } - - fun content(): SignalServiceProtos.Content.Builder { - return SignalServiceProtos.Content.newBuilder() - } - - fun serviceContent( - localAddress: AddressProto = address().build(), - metadata: MetadataProto = metadata().build() - ): SignalServiceContentProto.Builder { - return SignalServiceContentProto.newBuilder() - .setLocalAddress(localAddress) - .setMetadata(metadata) - } - - companion object { - fun build(buildFn: TestProtos.() -> T): T { - return TestProtos().buildFn() - } - } -} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/util/MessageTableTestUtils.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/util/MessageTableTestUtils.kt index 06816051..89feed4a 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/util/MessageTableTestUtils.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/util/MessageTableTestUtils.kt @@ -38,10 +38,8 @@ object MessageTableTestUtils { isKeyExchangeType:${type and MessageTypes.KEY_EXCHANGE_BIT != 0L} isIdentityVerified:${type and MessageTypes.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT != 0L} isIdentityDefault:${type and MessageTypes.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT != 0L} - isCorruptedKeyExchange:${type and MessageTypes.KEY_EXCHANGE_CORRUPTED_BIT != 0L} isInvalidVersionKeyExchange:${type and MessageTypes.KEY_EXCHANGE_INVALID_VERSION_BIT != 0L} isBundleKeyExchange:${type and MessageTypes.KEY_EXCHANGE_BUNDLE_BIT != 0L} - isContentBundleKeyExchange:${type and MessageTypes.KEY_EXCHANGE_CONTENT_FORMAT != 0L} isIdentityUpdate:${type and MessageTypes.KEY_EXCHANGE_IDENTITY_UPDATE_BIT != 0L} isRateLimited:${type and MessageTypes.MESSAGE_RATE_LIMITED_BIT != 0L} isExpirationTimerUpdate:${type and MessageTypes.EXPIRATION_TIMER_UPDATE_BIT != 0L} diff --git a/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt b/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt index d457362a..c0dc6fd8 100644 --- a/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt +++ b/app/src/benchmark/java/org/signal/benchmark/setup/TestMessages.kt @@ -2,9 +2,10 @@ package org.signal.benchmark.setup import org.tm.archive.attachments.PointerAttachment import org.tm.archive.database.AttachmentTable +import org.tm.archive.database.MessageType import org.tm.archive.database.SignalDatabase import org.tm.archive.database.TestDbUtils -import org.tm.archive.mms.IncomingMediaMessage +import org.tm.archive.mms.IncomingMessage import org.tm.archive.mms.OutgoingMessage import org.tm.archive.mms.QuoteModel import org.tm.archive.recipients.Recipient @@ -65,7 +66,8 @@ object TestMessages { return insert } fun insertIncomingTextMessage(other: Recipient, body: String, timestamp: Long? = null) { - val message = IncomingMediaMessage( + val message = IncomingMessage( + type = MessageType.NORMAL, from = other.id, body = body, sentTimeMillis = timestamp ?: System.currentTimeMillis(), @@ -73,10 +75,11 @@ object TestMessages { receivedTimeMillis = timestamp ?: System.currentTimeMillis() ) - SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get().messageId + SignalDatabase.messages.insertMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get().messageId } fun insertIncomingQuoteTextMessage(other: Recipient, body: String, quote: QuoteModel, timestamp: Long?) { - val message = IncomingMediaMessage( + val message = IncomingMessage( + type = MessageType.NORMAL, from = other.id, body = body, sentTimeMillis = timestamp ?: System.currentTimeMillis(), @@ -90,28 +93,30 @@ object TestMessages { val attachments: List = (0 until attachmentCount).map { imageAttachment() } - val message = IncomingMediaMessage( + val message = IncomingMessage( + type = MessageType.NORMAL, from = other.id, sentTimeMillis = timestamp ?: System.currentTimeMillis(), serverTimeMillis = timestamp ?: System.currentTimeMillis(), receivedTimeMillis = timestamp ?: System.currentTimeMillis(), attachments = PointerAttachment.forPointers(Optional.of(attachments)) ) - return insertIncomingMediaMessage(recipient = other, message = message, failed = failed) + return insertIncomingMessage(recipient = other, message = message, failed = failed) } fun insertIncomingVoiceMessage(other: Recipient, timestamp: Long? = null): Long { - val message = IncomingMediaMessage( + val message = IncomingMessage( + type = MessageType.NORMAL, from = other.id, sentTimeMillis = timestamp ?: System.currentTimeMillis(), serverTimeMillis = timestamp ?: System.currentTimeMillis(), receivedTimeMillis = timestamp ?: System.currentTimeMillis(), attachments = PointerAttachment.forPointers(Optional.of(Collections.singletonList(voiceAttachment()) as List)) ) - return insertIncomingMediaMessage(recipient = other, message = message, failed = false) + return insertIncomingMessage(recipient = other, message = message, failed = false) } - private fun insertIncomingMediaMessage(recipient: Recipient, message: IncomingMediaMessage, failed: Boolean = false): Long { + private fun insertIncomingMessage(recipient: Recipient, message: IncomingMessage, failed: Boolean = false): Long { val id = insertIncomingMessage(recipient = recipient, message = message) if (failed) { setMessageMediaFailed(id) @@ -122,8 +127,8 @@ object TestMessages { return id } - private fun insertIncomingMessage(recipient: Recipient, message: IncomingMediaMessage): Long { - return SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(recipient)).get().messageId + private fun insertIncomingMessage(recipient: Recipient, message: IncomingMessage): Long { + return SignalDatabase.messages.insertMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(recipient)).get().messageId } private fun setMessageMediaFailed(messageId: Long) { @@ -149,6 +154,7 @@ object TestMessages { 1024, Optional.empty(), Optional.empty(), + 0, Optional.of("/not-there.jpg"), false, false, @@ -171,6 +177,7 @@ object TestMessages { 1024, Optional.empty(), Optional.empty(), + 0, Optional.of("/not-there.aac"), true, false, diff --git a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt index 4cc5d6af..e7f82ecd 100644 --- a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt +++ b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt @@ -10,7 +10,7 @@ import org.tm.archive.conversation.v2.data.ConversationElementKey import org.tm.archive.conversation.v2.data.IncomingTextOnly import org.tm.archive.conversation.v2.data.OutgoingTextOnly import org.tm.archive.database.MessageTypes -import org.tm.archive.database.model.MediaMmsMessageRecord +import org.tm.archive.database.model.MmsMessageRecord import org.tm.archive.database.model.StoryType import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.mms.SlideDeck @@ -78,7 +78,7 @@ class ConversationElementGenerator { val isIncoming = random.nextBoolean() - val record = MediaMmsMessageRecord( + val record = MmsMessageRecord( messageId, if (isIncoming) Recipient.UNKNOWN else Recipient.self(), 0, @@ -86,7 +86,7 @@ class ConversationElementGenerator { now, now, now, - 1, + true, 1, testMessage, SlideDeck(), @@ -97,7 +97,7 @@ class ConversationElementGenerator { 0, 0, false, - 1, + true, null, emptyList(), emptyList(), @@ -106,7 +106,7 @@ class ConversationElementGenerator { false, false, now, - 1, + true, now, null, StoryType.NONE, @@ -117,7 +117,8 @@ class ConversationElementGenerator { -1, null, null, - 0 + 0, + false ) val conversationMessage = ConversationMessageFactory.createWithUnresolvedData( diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8c414f4c..ca9d05bf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,12 +1,12 @@ + xmlns:tools="http://schemas.android.com/tools"> + android:label="Access to TextSecure Secrets" + android:protectionLevel="signature" /> @@ -23,7 +23,7 @@ + tools:ignore="ProtectedPermissions"/> @@ -37,13 +37,15 @@ + android:maxSdkVersion="28" /> + + @@ -93,209 +95,181 @@ - + + + + + + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:resizeableActivity="true" + android:fullBackupOnly="false" + android:allowBackup="true" + android:backupAgent=".absbackup.SignalBackupAgent" + android:theme="@style/TextSecure.LightTheme" + android:largeHeap="true"> - - - - - - - - - - - - - - - - - - - - - + - + - + - - - + + + - + - + - - - + + + - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - + - + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + + - - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - - - + + + + + - - + + - + - + - + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - - + + + + + + - - - - - - - + + + + + + + - - + + + + + + + - - + + - - - - - + + - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/baseline-prof.txt b/app/src/main/baseline-prof.txt index 0fe7f1bf..96cdd6f5 100644 --- a/app/src/main/baseline-prof.txt +++ b/app/src/main/baseline-prof.txt @@ -1,459 +1,35 @@ HPLandroidx/appcompat/app/AppCompatViewInflater;->themifyContext(Landroid/content/Context;Landroid/util/AttributeSet;ZZ)Landroid/content/Context; -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->onMeasure(II)V -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->setItemInvoker(Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker;)V -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->setTitle(Ljava/lang/CharSequence;)V -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->shouldAllowTextWithIcon()Z -HPLandroidx/appcompat/view/menu/ActionMenuItemView;->updateTextButtonVisibility()V -HPLandroidx/appcompat/view/menu/BaseMenuPresenter;->createItemView(Landroid/view/ViewGroup;)Landroidx/appcompat/view/menu/MenuView$ItemView; -HPLandroidx/appcompat/view/menu/BaseMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; -HPLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; -HPLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View; -HPLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable; -HPLandroidx/appcompat/view/menu/MenuItemImpl;->getSupportActionProvider()Landroidx/core/view/ActionProvider; -HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence; -HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTooltipText()Ljava/lang/CharSequence; -HPLandroidx/appcompat/view/menu/MenuItemImpl;->showsTextAsAction()Z -HPLandroidx/appcompat/widget/ActionMenuPresenter;->bindItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroidx/appcompat/view/menu/MenuView$ItemView;)V -HPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; -HPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/ActionMenuView$LayoutParams; -HPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(IIII)V -HPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HPLandroidx/appcompat/widget/TintTypedArray;->(Landroid/content/Context;Landroid/content/res/TypedArray;)V -HPLandroidx/appcompat/widget/TintTypedArray;->getFont(IILandroidx/core/content/res/ResourcesCompat$FontCallback;)Landroid/graphics/Typeface; -HPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasResolvedTargets(II)Z -HPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMaxVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V -HPLandroidx/constraintlayout/core/widgets/Guideline;->addToSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V -HPLandroidx/constraintlayout/core/widgets/Guideline;->getAnchor(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/core/widgets/ConstraintAnchor; -HPLandroidx/constraintlayout/core/widgets/Guideline;->updateFromSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V -HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; -HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V -HPLandroidx/core/view/AccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; -HPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -HPLandroidx/core/view/ViewCompat;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; -HPLandroidx/core/view/ViewCompat;->isAccessibilityHeading(Landroid/view/View;)Z -HPLandroidx/core/view/ViewCompat;->isScreenReaderFocusable(Landroid/view/View;)Z -HPLandroidx/core/view/ViewCompat;->stateDescriptionProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; -HPLandroidx/core/view/ViewGroupKt$children$1;->(Landroid/view/ViewGroup;)V -HPLandroidx/core/view/ViewGroupKt$children$1;->iterator()Ljava/util/Iterator; -HPLandroidx/core/view/ViewGroupKt$descendants$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/core/view/ViewGroupKt$descendants$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HPLandroidx/core/view/ViewGroupKt$iterator$1;->(Landroid/view/ViewGroup;)V -HPLandroidx/core/view/ViewGroupKt$iterator$1;->hasNext()Z -HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Landroid/view/View; -HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Ljava/lang/Object; -HPLandroidx/core/view/ViewGroupKt;->getChildren(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; -HPLandroidx/core/view/ViewGroupKt;->iterator(Landroid/view/ViewGroup;)Ljava/util/Iterator; -HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V +HPLandroidx/core/view/ViewGroupKt;->getDescendants(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; HPLandroidx/customview/poolingcontainer/PoolingContainer;->callPoolingContainerOnRelease(Landroid/view/View;)V HPLandroidx/customview/poolingcontainer/PoolingContainer;->getPoolingContainerListenerHolder(Landroid/view/View;)Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; -HPLandroidx/fragment/app/FragmentManager;->saveAllStateInternal()Landroid/os/Bundle; -HPLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HPLandroidx/recyclerview/widget/AdapterHelper;->applyPendingUpdatesToPosition(I)I -HPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getChangePayload(II)Ljava/lang/Object; -HPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onChanged(IILjava/lang/Object;)V -HPLandroidx/recyclerview/widget/DiffUtil;->backward(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;I)Landroidx/recyclerview/widget/DiffUtil$Snake; -HPLandroidx/recyclerview/widget/ListAdapter;->getCurrentList()Ljava/util/List; -HPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAbsoluteAdapterPosition()I -HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAdapterPosition()I -HPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getBindingAdapterPosition()I -HPLandroidx/recyclerview/widget/RecyclerView;->getChildAdapterPosition(Landroid/view/View;)I -HPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolder(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -HPLandroidx/recyclerview/widget/RecyclerView;->viewRangeUpdate(IILjava/lang/Object;)V -HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; -HPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V +HPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->onRelease()V HPLandroidx/recyclerview/widget/ViewInfoStore;->addToPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V -HPLandroidx/recyclerview/widget/ViewInfoStore;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z HPLandroidx/recyclerview/widget/ViewInfoStore;->popFromLayoutStep(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; -HPLcom/google/android/material/animation/ArgbEvaluatorCompat;->evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer; -HPLcom/google/common/collect/Sets$2;->(Ljava/util/Set;Ljava/util/Set;)V -HPLcom/google/common/collect/Sets$2;->isEmpty()Z -HPLcom/google/common/collect/Sets;->intersection(Ljava/util/Set;Ljava/util/Set;)Lcom/google/common/collect/Sets$SetView; -HPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->chooseFormattingPatternForNumber(Ljava/util/List;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; -HPLcom/pnikosis/materialishprogress/ProgressWheel;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HPLcom/pnikosis/materialishprogress/ProgressWheel;->parseAttributes(Landroid/content/res/TypedArray;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->drain()V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->innerNext(ILjava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->drainFused()V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->replay(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->isDisposed()Z -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->add(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)Z -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplaySource;->subscribe(Lio/reactivex/rxjava3/core/Observer;)V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->drain()V -HPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->onNext(Ljava/lang/Object;)V -HPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Observable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; -HPLj$/time/Instant;->atZone(Lj$/time/ZoneId;)Lj$/time/ZonedDateTime; -HPLj$/time/LocalDate;->toEpochDay()J -HPLj$/time/LocalDate;->w()Z -HPLj$/time/LocalDateTime;->v()Lj$/time/LocalDate; -HPLj$/time/ZonedDateTime;->(Lj$/time/LocalDateTime;Lj$/time/ZoneId;Lj$/time/ZoneOffset;)V -HPLj$/time/ZonedDateTime;->m(JILj$/time/ZoneId;)Lj$/time/ZonedDateTime; -HPLj$/time/ZonedDateTime;->n(Lj$/time/Instant;Lj$/time/ZoneId;)Lj$/time/ZonedDateTime; -HPLj$/time/ZonedDateTime;->toLocalDate()Lj$/time/LocalDate; -HPLj$/util/S;->s(Lj$/util/function/Consumer;)Z -HPLj$/util/stream/X1;->n(Lj$/util/function/BinaryOperator;)Lj$/util/Optional; -HPLj$/util/stream/g2;->(Lj$/util/stream/h2;Lj$/util/stream/f2;)V -HPLj$/util/stream/g2;->n(J)V +HPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->createMapDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/type/MapType;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; +HPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/util/Map; +HPLcom/squareup/wire/internal/Internal;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)I +HPLkotlin/collections/AbstractList$IteratorImpl;->next()Ljava/lang/Object; +HPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I HPLkotlin/sequences/SequenceBuilderIterator;->yieldAll(Ljava/util/Iterator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->(Ljava/lang/Class;)V -HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; -HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HPLkotlin/sequences/SequencesKt___SequencesJvmKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; -HPLorg/signal/core/util/CursorExtensionsKt;->requireBlob(Landroid/database/Cursor;Ljava/lang/String;)[B -HPLorg/signal/core/util/OptionalExtensionsKt;->orNull(Lj$/util/Optional;)Ljava/lang/Object; -HPLorg/signal/core/util/OptionalExtensionsKt;->toOptional(Ljava/lang/Object;)Lj$/util/Optional; -HPLorg/signal/core/util/ThreadUtil;->postToMain(Ljava/lang/Runnable;)V -HPLorg/signal/core/util/ToolbarExtensionsKt;->setActionItemTint(Landroidx/appcompat/widget/Toolbar;I)V -HPLorg/signal/core/util/concurrent/DeadlockDetector;->hasPotentialLock([Ljava/lang/StackTraceElement;)Z -HPLorg/signal/core/util/concurrent/SignalExecutors;->$r8$lambda$0Q0afsv1raKIrq3aP-SuMcT2Ad0(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V +HPLkotlin/sequences/SequenceScope;->yieldAll(Lkotlin/sequences/Sequence;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +HPLnet/zetetic/database/sqlcipher/SQLiteProgram;->clearBindings()V +HPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getSession()Lnet/zetetic/database/sqlcipher/SQLiteSession; HPLorg/signal/core/util/concurrent/SignalExecutors;->lambda$newCachedBoundedExecutor$1(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V -HPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;->-$$Nest$msetName(Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;Ljava/lang/String;)V -HPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;->-$$Nest$sfgetDEFAULT_INSTANCE()Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation; -HPLorg/signal/libsignal/protocol/ecc/ECPublicKey;->equals(Ljava/lang/Object;)Z -HPLorg/signal/paging/FixedSizePagingController;->lambda$onDataItemChanged$2(Ljava/lang/Object;)V -HPLorg/thoughtcrime/securesms/attachments/AttachmentId;->hashCode()I -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getAnimationState$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Map; -HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCorners()V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCornersForSizeClass2()V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->getCells()[Lorg/thoughtcrime/securesms/components/ThumbnailView; -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setCellBackgroundColor(I)V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRadii(IIII)V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRelativeRadii(Lorg/thoughtcrime/securesms/components/ThumbnailView;IIII)V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlide(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;I)V -HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlides(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;Z)V -HPLorg/thoughtcrime/securesms/components/AvatarImageView;->disableQuickContact()V -HPLorg/thoughtcrime/securesms/components/ComposeText;->onDraw(Landroid/graphics/Canvas;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDate(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/Locale;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDeliveryStatus(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->dispatchDraw(Landroid/graphics/Canvas;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setClickable(Z)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setConversationColor(I)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCorners(IIII)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setDownloadClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setFocusable(Z)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;ZZ)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMaximumThumbnailHeight(I)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMinimumThumbnailWidth(I)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailBounds([I)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showThumbnailView()V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->(ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIII)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIIIILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->copy(ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIII)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIIIIII)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIIIIIIILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->copy(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIIIIII)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;Lorg/thoughtcrime/securesms/util/views/Stub;)V -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getAlbumViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; -HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getThumbnailViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; -HPLorg/thoughtcrime/securesms/components/CornerMask;->mask(Landroid/graphics/Canvas;)V -HPLorg/thoughtcrime/securesms/components/Outliner;->draw(Landroid/graphics/Canvas;IIII)V -HPLorg/thoughtcrime/securesms/components/Outliner;->setColor(I)V -HPLorg/thoughtcrime/securesms/components/QuoteView;->applyColorTheme()V -HPLorg/thoughtcrime/securesms/components/QuoteView;->dismiss()V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->hasSameContents(Lorg/thoughtcrime/securesms/mms/Slide;Lorg/thoughtcrime/securesms/mms/Slide;)Z -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->onMeasure(II)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setBounds(IIII)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setClickable(Z)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setDownloadClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setFocusable(Z)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;ZZII)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setRadii(IIII)V -HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V -HPLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->(ZZLorg/thoughtcrime/securesms/mms/Slide;Landroid/view/View$OnClickListener;Z)V -HPLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V -HPLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->copy$default(Lorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;ZZLorg/thoughtcrime/securesms/mms/Slide;Landroid/view/View$OnClickListener;ZILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState; -HPLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->copy(ZZLorg/thoughtcrime/securesms/mms/Slide;Landroid/view/View$OnClickListener;Z)Lorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState; -HPLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->withClickable(Z)Lorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState; -HPLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->withFocusable(Z)Lorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState; -HPLorg/thoughtcrime/securesms/components/TransferControlView;->getTransferState(Ljava/util/List;)I -HPLorg/thoughtcrime/securesms/components/TransferControlView;->setSlides(Ljava/util/List;)V -HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->getLongestLineWidth(Ljava/lang/CharSequence;)F -HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setTextColor(I)V -HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setTextSize(IF)V -HPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->updateFromTextColor()V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lj$/util/Optional;Lj$/util/Optional;Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;ZZZZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->forceFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getActiveFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/components/ConversationItemFooter; -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBodyBubbleCorners(IIII)Lorg/thoughtcrime/securesms/util/Projection$Corners; -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getGiftId()J -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getOpenableGiftProjection(Z)Lorg/thoughtcrime/securesms/util/Projection; -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getSnapshotProjections(Landroid/view/ViewGroup;ZZ)Lorg/thoughtcrime/securesms/util/ProjectionList; -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasAudio(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasNoBubble(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasSharedContact(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isCaptionlessMms(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isEndOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isFooterVisible(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isStartOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isWithinClusteringTime(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->onMeasure(II)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->readDimen(I)I -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setAuthor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;ZZ)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setBodyText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/String;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setBubbleState(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setContactPhoto(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Ljava/util/Locale;ZZ)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGroupAuthorColor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGutterSizes(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setHasBeenQuoted(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setInteractionState(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMediaAttributes(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;ZZZZ)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMessageShape(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMessageSpacing(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setReactions(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setStatusIcons(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setThumbnailCorners(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->shouldInterceptClicks(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->showProjectionArea()V -HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->unbind()V -HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onDrawForeground(Landroid/graphics/Canvas;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setQuoteViewProjection(Lorg/thoughtcrime/securesms/util/Projection;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setVideoPlayerProjection(Lorg/thoughtcrime/securesms/util/Projection;)V -HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getConversationTimestamp()J -HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getMessageRecord()Lorg/thoughtcrime/securesms/database/model/MessageRecord; -HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hashCode()I -HPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->onCreateMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V -HPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->getLatestTimestamp(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;Landroidx/recyclerview/widget/LinearLayoutManager;)Lj$/util/Optional; -HPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->asSingleColor()I -HPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getDefaultColor(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)I -HPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingBodyTextColor(Landroid/content/Context;Z)I -HPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingFooterIconColor(Landroid/content/Context;Z)I -HPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingFooterTextColor(Landroid/content/Context;Z)I -HPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingGroupSenderColor(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)I -HPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->drawShaderMask(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V -HPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->(Lorg/thoughtcrime/securesms/attachments/AttachmentId;JZZLjava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;[B[BILjava/lang/String;ZZZIIZLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;Lorg/thoughtcrime/securesms/audio/AudioHash;Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;IJ)V HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateChange(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animatePersistence(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z -HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateSlide(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z -HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->isRunning()Z -HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->getMmsParts(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord;)Ljava/util/Set; -HPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->getParts(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->toSet()Ljava/util/Set; -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->cleanPulseAnimators()V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getCurrentSelection(Landroidx/recyclerview/widget/RecyclerView;)Ljava/util/Set; -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getDifferenceForPart(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->hasRunningPulseRequestAnimators()Z -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->invalidateIfEnterExitAnimatorsAreRunning(Landroidx/recyclerview/widget/RecyclerView;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->resolveMultiselectable(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselectable; -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateChildOffsets(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateMultiselectPartAnimator(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)V -HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->hashCode()I -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->bindPayloadsIfAvailable()Z -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getBindable()Lorg/thoughtcrime/securesms/BindableConversationItem; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getDisplayMode()Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getNextMessage()Lj$/util/Optional; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getPreviousMessage()Lj$/util/Optional; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingTextOnlyViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getConversationMessage(I)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSelectedItems()Ljava/util/Set; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->invoke()Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Boolean; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->()V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getBinding(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->doAfterFirstRender()V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getBinding()Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeConversationThreadUi()V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getItemView()Landroid/view/View; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHeader(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->hasHeader(I)Z -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->isFirstUnread(I)Z -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->timestamp(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->toEpochDay(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords$lambda$11(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Single; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder$lambda$10(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)Lio/reactivex/rxjava3/core/Single; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Lkotlin/Unit;Lorg/thoughtcrime/securesms/recipients/Recipient;Lj$/util/Optional;)Lkotlin/Pair; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/SingleSource; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$8;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;Lj$/util/Optional;)Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9;->accept(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)Lio/reactivex/rxjava3/core/SingleSource; -HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->(JILorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;)V -HPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;Z)V HPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->equals(Ljava/lang/Object;)Z -HPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZZ)V HPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->equals(Ljava/lang/Object;)Z -HPLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->load(IIILorg/signal/paging/PagedDataSource$CancellationSignal;)Ljava/util/List; -HPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -HPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; -HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V -HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->getIdentityRecords(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/identity/IdentityRecordList; HPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$17(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HPLorg/thoughtcrime/securesms/database/EmojiSearchTable$setSearchIndex$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V -HPLorg/thoughtcrime/securesms/database/GroupTable;->getGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZ)Ljava/util/List; -HPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->(Ljava/util/Collection;)V -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getDateSent()J -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isBoostRequest()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isChangeNumber()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isEndSession()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isExpirationTimerUpdate()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isFailed()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isGroupCall()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingAudioCall()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingVideoCall()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isJoined()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedAudioCall()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedVideoCall()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoing()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoingAudioCall()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoingVideoCall()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPendingInsecureSmsFallback()Z -HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isProfileChange()Z HPLorg/thoughtcrime/securesms/database/model/IdentityRecord;->equals(Ljava/lang/Object;)Z -HPLorg/thoughtcrime/securesms/database/model/IdentityStoreRecord;->toIdentityRecord(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/IdentityRecord; -HPLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->getUpdateDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Lorg/thoughtcrime/securesms/database/model/UpdateDescription; -HPLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->withAttachments(Landroid/content/Context;Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord; -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getReactions()Ljava/util/List; -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getUpdateDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Lorg/thoughtcrime/securesms/database/model/UpdateDescription; -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isBadDecryptType()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isChatSessionRefresh()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isDisplayBodyEmpty(Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isGroupV1MigrationEvent()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityDefault()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityUpdate()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityVerified()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isRateLimited()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSecure()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSessionSwitchoverEventType()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSmsExportType()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isThreadMergeEventType()Z -HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isUpdate()Z -HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getLinkPreviews()Ljava/util/List; -HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getQuote()Lorg/thoughtcrime/securesms/database/model/Quote; -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->setParentRecyclerTranslationY(Landroidx/recyclerview/widget/RecyclerView;)V -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Integer;Ljava/lang/Integer;)I -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSet(Ljava/util/Set;II)Ljava/util/Set; -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->performPlaybackUpdate(Landroidx/recyclerview/widget/RecyclerView;)V -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->injectVideoViews(Landroid/content/Context;Landroidx/lifecycle/Lifecycle;Landroid/view/ViewGroup;I)Ljava/util/List; -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->getCurrentHolder(I)Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder; -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->stopAndReleaseAssignedVideos(Ljava/util/Set;)V -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->update(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/List;Ljava/util/Set;)V -HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->updateVideoDisplayPositionAndSize(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4Playable;)V -HPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageFontSize()I -HPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageNotificationsPrivacy()Lorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference; -HPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->hasWallpaperSet()Z -HPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getMessageRequestState(Lorg/thoughtcrime/securesms/recipients/Recipient;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; -HPLorg/thoughtcrime/securesms/mms/ImageSlide;->isBorderless()Z +HPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->equals(Ljava/lang/Object;)Z +HPLorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest;->getCreateTime()J HPLorg/thoughtcrime/securesms/mms/Slide;->equals(Ljava/lang/Object;)Z -HPLorg/thoughtcrime/securesms/mms/SlideDeck;->getTextSlide()Lorg/thoughtcrime/securesms/mms/TextSlide; -HPLorg/thoughtcrime/securesms/mms/SlideDeck;->getThumbnailSlides()Ljava/util/List; -HPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrintFormat(Ljava/lang/String;)Ljava/lang/String; -HPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->clear()V -HPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V -HPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V -HPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->observeForever(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V -HPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->removeForeverObserver(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V -HPLorg/thoughtcrime/securesms/recipients/Recipient;->hasWallpaper()Z -HPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isMessageRequestAccepted(Landroid/content/Context;J)Z -HPLorg/thoughtcrime/securesms/util/BubbleUtil;->canBubble(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Long;)Z -HPLorg/thoughtcrime/securesms/util/DateUtils;->getDateFormat()Ljava/text/SimpleDateFormat; -HPLorg/thoughtcrime/securesms/util/DateUtils;->isSameDay(JJ)Z -HPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate$default(JLj$/time/ZoneId;ILjava/lang/Object;)Lj$/time/LocalDate; -HPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate(JLj$/time/ZoneId;)Lj$/time/LocalDate; -HPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState$lambda$7$lambda$6(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V -HPLorg/thoughtcrime/securesms/util/MediaUtil;->isLongTextType(Ljava/lang/String;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasAudio(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasDocument(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasLinkPreview(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasLocation(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasNoBubble(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasOnlyThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasSharedContact(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isBorderless(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isCaptionlessMms(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isEditMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isTextOnly(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isViewOnceMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HPLorg/thoughtcrime/securesms/util/Projection$Corners;->(FFFF)V -HPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMessageBodyTextSize(Landroid/content/Context;)I -HPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->drawAsTopItemDecoration(Landroid/view/View;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;I)V -HPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->layoutIn(Landroid/view/View;Landroid/view/View;)V -HPLorg/thoughtcrime/securesms/util/ViewUtil;->getTopMargin(Landroid/view/View;)I -HPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/view/View;)Z -HPLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/content/Context;)Z -HPLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/view/View;)Z -HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingBottom(Landroid/view/View;I)V -HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingEnd(Landroid/view/View;I)V -HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingStart(Landroid/view/View;I)V -HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingTop(Landroid/view/View;I)V -HPLorg/thoughtcrime/securesms/util/ViewUtil;->setTopMargin(Landroid/view/View;I)V -HPLorg/thoughtcrime/securesms/util/ViewUtil;->updateLayoutParams(Landroid/view/View;II)V -HPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->setPayload(Ljava/util/List;)V -HPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItem(I)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel; -HPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItemViewType(I)I -HPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->(Ljava/lang/Object;)V -HPLorg/thoughtcrime/securesms/util/views/NullableStub;->get()Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/util/views/NullableStub;->require()Ljava/lang/Object; -HPLorg/thoughtcrime/securesms/util/views/NullableStub;->resolved()Z -HPLorg/thoughtcrime/securesms/util/views/Stub;->setVisibility(I)V -HPLrxdogtag2/RxDogTag;->lambda$installWithBuilder$3(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; +HPLorg/thoughtcrime/securesms/profiles/ProfileName;->equals(Ljava/lang/Object;)Z +HPLorg/thoughtcrime/securesms/recipients/Recipient;->hasSameContent(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z HSPLandroid/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$$ExternalSyntheticThrowCCEIfNotNull0;->m(Ljava/lang/Object;)V HSPLandroid/support/v4/media/session/IMediaSession$Stub;->()V HSPLandroid/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21;->(Landroid/content/Context;Landroid/support/v4/media/session/MediaSessionCompat$Token;)V @@ -528,6 +104,7 @@ HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->(Landr HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->run()V HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->(Landroidx/activity/ComponentActivity;)V +HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->saveState()Landroid/os/Bundle; HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda3;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda3;->onContextAvailable(Landroid/content/Context;)V HSPLandroidx/activity/ComponentActivity$1;->(Landroidx/activity/ComponentActivity;)V @@ -541,6 +118,7 @@ HSPLandroidx/activity/ComponentActivity$5;->onStateChanged(Landroidx/lifecycle/L HSPLandroidx/activity/ComponentActivity$Api19Impl;->cancelPendingInputEvents(Landroid/view/View;)V HSPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->activityDestroyed()V +HSPLandroidx/activity/ComponentActivity;->$r8$lambda$OnwlVMZzrLePIRy-6IUDTtLLUV0(Landroidx/activity/ComponentActivity;)Landroid/os/Bundle; HSPLandroidx/activity/ComponentActivity;->$r8$lambda$h2i_RK2mddCIbAsGubaI4eL8_cU(Landroidx/activity/ComponentActivity;Landroid/content/Context;)V HSPLandroidx/activity/ComponentActivity;->()V HSPLandroidx/activity/ComponentActivity;->addMenuProvider(Landroidx/core/view/MenuProvider;)V @@ -560,15 +138,19 @@ HSPLandroidx/activity/ComponentActivity;->getOnBackPressedDispatcher()Landroidx/ HSPLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; HSPLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; HSPLandroidx/activity/ComponentActivity;->invalidateMenu()V +HSPLandroidx/activity/ComponentActivity;->lambda$new$1()Landroid/os/Bundle; HSPLandroidx/activity/ComponentActivity;->lambda$new$2(Landroid/content/Context;)V HSPLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V HSPLandroidx/activity/ComponentActivity;->onCreatePanelMenu(ILandroid/view/Menu;)Z HSPLandroidx/activity/ComponentActivity;->onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z +HSPLandroidx/activity/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/activity/ComponentActivity;->removeMenuProvider(Landroidx/core/view/MenuProvider;)V HSPLandroidx/activity/ComponentActivity;->removeOnConfigurationChangedListener(Landroidx/core/util/Consumer;)V HSPLandroidx/activity/ComponentActivity;->removeOnMultiWindowModeChangedListener(Landroidx/core/util/Consumer;)V HSPLandroidx/activity/ComponentActivity;->removeOnPictureInPictureModeChangedListener(Landroidx/core/util/Consumer;)V HSPLandroidx/activity/ComponentActivity;->removeOnTrimMemoryListener(Landroidx/core/util/Consumer;)V +HSPLandroidx/activity/ComponentActivity;->startActivityForResult(Landroid/content/Intent;I)V +HSPLandroidx/activity/ComponentActivity;->startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V HSPLandroidx/activity/FullyDrawnReporter$$ExternalSyntheticLambda0;->(Landroidx/activity/FullyDrawnReporter;)V HSPLandroidx/activity/FullyDrawnReporter;->(Ljava/util/concurrent/Executor;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/activity/OnBackPressedCallback;->(Z)V @@ -602,6 +184,7 @@ HSPLandroidx/activity/result/ActivityResultRegistry$LifecycleContainer;->addObse HSPLandroidx/activity/result/ActivityResultRegistry;->()V HSPLandroidx/activity/result/ActivityResultRegistry;->bindRcKey(ILjava/lang/String;)V HSPLandroidx/activity/result/ActivityResultRegistry;->generateRandomNumber()I +HSPLandroidx/activity/result/ActivityResultRegistry;->onSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; HSPLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; HSPLandroidx/activity/result/ActivityResultRegistry;->registerKey(Ljava/lang/String;)V @@ -620,6 +203,7 @@ HSPLandroidx/appcompat/app/ActionBar$LayoutParams;->(II)V HSPLandroidx/appcompat/app/ActionBar$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/app/ActionBar;->()V HSPLandroidx/appcompat/app/AppCompatActivity$1;->(Landroidx/appcompat/app/AppCompatActivity;)V +HSPLandroidx/appcompat/app/AppCompatActivity$1;->saveState()Landroid/os/Bundle; HSPLandroidx/appcompat/app/AppCompatActivity$2;->(Landroidx/appcompat/app/AppCompatActivity;)V HSPLandroidx/appcompat/app/AppCompatActivity$2;->onContextAvailable(Landroid/content/Context;)V HSPLandroidx/appcompat/app/AppCompatActivity;->()V @@ -659,6 +243,7 @@ HSPLandroidx/appcompat/app/AppCompatDelegate;->setDefaultNightMode(I)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->run()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V +HSPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->onAttachedFromWindow()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->onDetachedFromWindow()V @@ -710,6 +295,7 @@ HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreateView(Landroid/view/Vi HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onDestroy()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostCreate(Landroid/os/Bundle;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostResume()V +HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onStart()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onStop()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onSubDecorInstalled(Landroid/view/ViewGroup;)V @@ -723,11 +309,13 @@ HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTheme(I)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateAppConfiguration(ILandroidx/core/os/LocaleListCompat;Z)Z +HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I HSPLandroidx/appcompat/app/AppCompatViewInflater;->()V HSPLandroidx/appcompat/app/AppCompatViewInflater;->()V HSPLandroidx/appcompat/app/AppCompatViewInflater;->backportAccessibilityAttributes(Landroid/content/Context;Landroid/view/View;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/app/AppCompatViewInflater;->checkOnClickListener(Landroid/view/View;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/app/AppCompatViewInflater;->createEditText(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatEditText; +HSPLandroidx/appcompat/app/AppCompatViewInflater;->createImageButton(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatImageButton; HSPLandroidx/appcompat/app/AppCompatViewInflater;->createImageView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatImageView; HSPLandroidx/appcompat/app/AppCompatViewInflater;->createTextView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatTextView; HSPLandroidx/appcompat/app/AppCompatViewInflater;->createView(Landroid/content/Context;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View; @@ -768,8 +356,10 @@ HSPLandroidx/appcompat/view/ContextThemeWrapper;->isEmptyConfiguration(Landroid/ HSPLandroidx/appcompat/view/ContextThemeWrapper;->onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->(Landroidx/appcompat/view/SupportMenuInflater;Landroid/view/Menu;)V HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->addItem()V +HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->addSubMenuItem()Landroid/view/SubMenu; HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->getShortcut(Ljava/lang/String;)C HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->hasAddedItem()Z +HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->newInstance(Ljava/lang/String;[Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->readItem(Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->resetGroup()V HSPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->setItem(Landroid/view/MenuItem;)V @@ -779,6 +369,7 @@ HSPLandroidx/appcompat/view/SupportMenuInflater;->inflate(ILandroid/view/Menu;)V HSPLandroidx/appcompat/view/SupportMenuInflater;->parseMenu(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/view/Menu;)V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->(Landroid/view/Window$Callback;)V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z +HSPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/appcompat/view/WindowCallbackWrapper;->getWrapped()Landroid/view/Window$Callback; HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onAttachedToWindow()V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onCreatePanelMenu(ILandroid/view/Menu;)Z @@ -787,42 +378,86 @@ HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onPreparePanel(ILandroid/vie HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowFocusChanged(Z)V HSPLandroidx/appcompat/view/menu/ActionMenuItem;->(Landroid/content/Context;IIIILjava/lang/CharSequence;)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;->()V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->onMeasure(II)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->prefersCondensedTitle()Z +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setItemInvoker(Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker;)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setPopupCallback(Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setTitle(Ljava/lang/CharSequence;)V +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->shouldAllowTextWithIcon()Z +HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->updateTextButtonVisibility()V HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->(Landroid/content/Context;II)V +HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->addItemView(Landroid/view/View;I)V +HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->createItemView(Landroid/view/ViewGroup;)Landroidx/appcompat/view/menu/MenuView$ItemView; +HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z +HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->setCallback(Landroidx/appcompat/view/menu/MenuPresenter$Callback;)V +HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->updateMenuView(Z)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->()V HSPLandroidx/appcompat/view/menu/MenuBuilder;->(Landroid/content/Context;)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuBuilder;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuBuilder;->addMenuPresenter(Landroidx/appcompat/view/menu/MenuPresenter;Landroid/content/Context;)V +HSPLandroidx/appcompat/view/menu/MenuBuilder;->addSubMenu(IIILjava/lang/CharSequence;)Landroid/view/SubMenu; HSPLandroidx/appcompat/view/menu/MenuBuilder;->clear()V +HSPLandroidx/appcompat/view/menu/MenuBuilder;->clearHeader()V HSPLandroidx/appcompat/view/menu/MenuBuilder;->createNewMenuItem(IIIILjava/lang/CharSequence;I)Landroidx/appcompat/view/menu/MenuItemImpl; HSPLandroidx/appcompat/view/menu/MenuBuilder;->dispatchPresenterUpdate(Z)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->findInsertIndex(Ljava/util/ArrayList;I)I HSPLandroidx/appcompat/view/menu/MenuBuilder;->findItem(I)Landroid/view/MenuItem; +HSPLandroidx/appcompat/view/menu/MenuBuilder;->findItemIndex(I)I HSPLandroidx/appcompat/view/menu/MenuBuilder;->flagActionItems()V HSPLandroidx/appcompat/view/menu/MenuBuilder;->getActionItems()Ljava/util/ArrayList; +HSPLandroidx/appcompat/view/menu/MenuBuilder;->getContext()Landroid/content/Context; +HSPLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuBuilder;->getNonActionItems()Ljava/util/ArrayList; HSPLandroidx/appcompat/view/menu/MenuBuilder;->getOrdering(I)I +HSPLandroidx/appcompat/view/menu/MenuBuilder;->getResources()Landroid/content/res/Resources; HSPLandroidx/appcompat/view/menu/MenuBuilder;->getVisibleItems()Ljava/util/ArrayList; HSPLandroidx/appcompat/view/menu/MenuBuilder;->hasVisibleItems()Z +HSPLandroidx/appcompat/view/menu/MenuBuilder;->onItemActionRequestChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->onItemVisibleChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->onItemsChanged(Z)V +HSPLandroidx/appcompat/view/menu/MenuBuilder;->removeItem(I)V +HSPLandroidx/appcompat/view/menu/MenuBuilder;->removeItemAtInt(IZ)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->setCallback(Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V +HSPLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderInternal(ILjava/lang/CharSequence;ILandroid/graphics/drawable/Drawable;Landroid/view/View;)V +HSPLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderTitleInt(Ljava/lang/CharSequence;)Landroidx/appcompat/view/menu/MenuBuilder; HSPLandroidx/appcompat/view/menu/MenuBuilder;->setOverrideVisibleItems(Z)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->setShortcutsVisibleInner(Z)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->size()I HSPLandroidx/appcompat/view/menu/MenuBuilder;->startDispatchingItemsChanged()V HSPLandroidx/appcompat/view/menu/MenuBuilder;->stopDispatchingItemsChanged()V HSPLandroidx/appcompat/view/menu/MenuItemImpl;->(Landroidx/appcompat/view/menu/MenuBuilder;IIIILjava/lang/CharSequence;I)V +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getContentDescription()Ljava/lang/CharSequence; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getItemId()I HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getOrdering()I +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getSubMenu()Landroid/view/SubMenu; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getSupportActionProvider()Landroidx/core/view/ActionProvider; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleCondensed()Ljava/lang/CharSequence; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleForItemView(Landroidx/appcompat/view/menu/MenuView$ItemView;)Ljava/lang/CharSequence; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTooltipText()Ljava/lang/CharSequence; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->hasSubMenu()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isActionButton()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isActionViewExpanded()Z +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isVisible()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->requestsActionButton()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->requiresActionButton()Z +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroid/view/MenuItem; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroidx/core/internal/view/SupportMenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setAlphabeticShortcut(CI)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckable(Z)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setChecked(Z)Landroid/view/MenuItem; @@ -830,20 +465,34 @@ HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckedInt(Z)V HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setContentDescription(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setEnabled(Z)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setIcon(I)Landroid/view/MenuItem; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setIsActionButton(Z)V HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setNumericShortcut(CI)Landroid/view/MenuItem; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem; +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setSubMenu(Landroidx/appcompat/view/menu/SubMenuBuilder;)V +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setTitle(Ljava/lang/CharSequence;)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setTooltipText(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisible(Z)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisibleInt(Z)Z +HSPLandroidx/appcompat/view/menu/MenuItemImpl;->showsTextAsAction()Z +HSPLandroidx/appcompat/view/menu/SubMenuBuilder;->(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;Landroidx/appcompat/view/menu/MenuItemImpl;)V +HSPLandroidx/appcompat/view/menu/SubMenuBuilder;->getItem()Landroid/view/MenuItem; +HSPLandroidx/appcompat/view/menu/SubMenuBuilder;->setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/SubMenu; +HSPLandroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton$1;->(Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;Landroid/view/View;Landroidx/appcompat/widget/ActionMenuPresenter;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;->(Landroidx/appcompat/widget/ActionMenuPresenter;Landroid/content/Context;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;->setFrame(IIII)Z HSPLandroidx/appcompat/widget/ActionMenuPresenter$PopupPresenterCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter;->(Landroid/content/Context;)V +HSPLandroidx/appcompat/widget/ActionMenuPresenter;->bindItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroidx/appcompat/view/menu/MenuView$ItemView;)V +HSPLandroidx/appcompat/widget/ActionMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z HSPLandroidx/appcompat/widget/ActionMenuPresenter;->flagActionItems()Z +HSPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; HSPLandroidx/appcompat/widget/ActionMenuPresenter;->getOverflowIcon()Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ActionMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V +HSPLandroidx/appcompat/widget/ActionMenuPresenter;->isOverflowMenuShowing()Z HSPLandroidx/appcompat/widget/ActionMenuPresenter;->setExpandedActionViewsExclusive(Z)V HSPLandroidx/appcompat/widget/ActionMenuPresenter;->setMenuView(Landroidx/appcompat/widget/ActionMenuView;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter;->setReserveOverflow(Z)V @@ -851,15 +500,19 @@ HSPLandroidx/appcompat/widget/ActionMenuPresenter;->shouldIncludeItem(ILandroidx HSPLandroidx/appcompat/widget/ActionMenuPresenter;->updateMenuView(Z)V HSPLandroidx/appcompat/widget/ActionMenuView$ActionMenuPresenterCallback;->()V HSPLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(II)V +HSPLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/ActionMenuView$MenuBuilderCallback;->(Landroidx/appcompat/widget/ActionMenuView;)V HSPLandroidx/appcompat/widget/ActionMenuView;->(Landroid/content/Context;)V HSPLandroidx/appcompat/widget/ActionMenuView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/ActionMenuView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HSPLandroidx/appcompat/widget/ActionMenuView;->generateDefaultLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams; +HSPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +HSPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/ActionMenuView$LayoutParams; HSPLandroidx/appcompat/widget/ActionMenuView;->generateOverflowButtonLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams; HSPLandroidx/appcompat/widget/ActionMenuView;->getMenu()Landroid/view/Menu; HSPLandroidx/appcompat/widget/ActionMenuView;->getOverflowIcon()Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ActionMenuView;->initialize(Landroidx/appcompat/view/menu/MenuBuilder;)V +HSPLandroidx/appcompat/widget/ActionMenuView;->isOverflowMenuShowing()Z HSPLandroidx/appcompat/widget/ActionMenuView;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/ActionMenuView;->onMeasure(II)V HSPLandroidx/appcompat/widget/ActionMenuView;->peekMenu()Landroidx/appcompat/view/menu/MenuBuilder; @@ -868,13 +521,19 @@ HSPLandroidx/appcompat/widget/ActionMenuView;->setMenuCallbacks(Landroidx/appcom HSPLandroidx/appcompat/widget/ActionMenuView;->setOnMenuItemClickListener(Landroidx/appcompat/widget/ActionMenuView$OnMenuItemClickListener;)V HSPLandroidx/appcompat/widget/ActionMenuView;->setOverflowReserved(Z)V HSPLandroidx/appcompat/widget/ActionMenuView;->setPopupTheme(I)V +HSPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->()V +HSPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->initEmojiKeyListener(Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper;)V +HSPLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/View;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundResource(I)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->shouldApplyFrameworkTintUsingColorFilter()Z HSPLandroidx/appcompat/widget/AppCompatButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V HSPLandroidx/appcompat/widget/AppCompatButton;->getEmojiTextViewHelper()Landroidx/appcompat/widget/AppCompatEmojiTextHelper; HSPLandroidx/appcompat/widget/AppCompatButton;->onTextChanged(Ljava/lang/CharSequence;III)V HSPLandroidx/appcompat/widget/AppCompatButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V @@ -894,12 +553,14 @@ HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->()V HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->arrayContains([II)Z HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->createDrawableFor(Landroidx/appcompat/widget/ResourceManagerInternal;Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintListForDrawableRes(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintModeForDrawableRes(I)Landroid/graphics/PorterDuff$Mode; HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawable(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->access$000()Landroid/graphics/PorterDuff$Mode; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager; +HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->preload()V @@ -910,19 +571,30 @@ HSPLandroidx/appcompat/widget/AppCompatEditText;->drawableStateChanged()V HSPLandroidx/appcompat/widget/AppCompatEditText;->getText()Landroid/text/Editable; HSPLandroidx/appcompat/widget/AppCompatEditText;->getText()Ljava/lang/CharSequence; HSPLandroidx/appcompat/widget/AppCompatEditText;->initEmojiKeyListener(Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper;)V +HSPLandroidx/appcompat/widget/AppCompatEditText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/appcompat/widget/AppCompatEditText;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatEditText;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/widget/AppCompatEditText;->setCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;)V +HSPLandroidx/appcompat/widget/AppCompatEditText;->setEmojiCompatEnabled(Z)V HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->(Landroid/widget/EditText;)V HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->isEmojiCapableKeyListener(Landroid/text/method/KeyListener;)Z HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->setEnabled(Z)V HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->(Landroid/widget/TextView;)V HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter; HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->setEnabled(Z)V +HSPLandroidx/appcompat/widget/AppCompatHintHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroid/view/View;)Landroid/view/inputmethod/InputConnection; +HSPLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/AppCompatImageButton;->drawableStateChanged()V +HSPLandroidx/appcompat/widget/AppCompatImageButton;->hasOverlappingRendering()Z HSPLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundResource(I)V +HSPLandroidx/appcompat/widget/AppCompatImageButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/widget/AppCompatImageButton;->setImageResource(I)V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->(Landroid/widget/ImageView;)V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->applyImageLevel()V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->applySupportImageTint()V @@ -937,15 +609,32 @@ HSPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z HSPLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatImageView;->setImageResource(I)V +HSPLandroidx/appcompat/widget/AppCompatProgressBarHelper;->()V +HSPLandroidx/appcompat/widget/AppCompatProgressBarHelper;->(Landroid/widget/ProgressBar;)V +HSPLandroidx/appcompat/widget/AppCompatProgressBarHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/AppCompatSeekBar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/appcompat/widget/AppCompatSeekBar;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/AppCompatSeekBar;->drawableStateChanged()V +HSPLandroidx/appcompat/widget/AppCompatSeekBar;->jumpDrawablesToCurrentState()V +HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->(Landroid/widget/SeekBar;)V +HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->applyTickMarkTint()V +HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->drawableStateChanged()V +HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->jumpDrawablesToCurrentState()V +HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->setTickMark(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextClassifierHelper$Api26Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroidx/appcompat/widget/AppCompatTextClassifierHelper;->(Landroid/widget/TextView;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper$1;->(Landroidx/appcompat/widget/AppCompatTextHelper;IILjava/lang/ref/WeakReference;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper$1;->onFontRetrievalFailed(I)V +HSPLandroidx/appcompat/widget/AppCompatTextHelper$Api17Impl;->getCompoundDrawablesRelative(Landroid/widget/TextView;)[Landroid/graphics/drawable/Drawable; +HSPLandroidx/appcompat/widget/AppCompatTextHelper$Api17Impl;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->(Landroid/widget/TextView;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints()V +HSPLandroidx/appcompat/widget/AppCompatTextHelper;->createTintInfo(Landroid/content/Context;Landroidx/appcompat/widget/AppCompatDrawableManager;I)Landroidx/appcompat/widget/TintInfo; HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetCompoundDrawables()V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V +HSPLandroidx/appcompat/widget/AppCompatTextHelper;->populateSurroundingTextIfNeeded(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V @@ -958,10 +647,12 @@ HSPLandroidx/appcompat/widget/AppCompatTextView;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/AppCompatTextView;->onMeasure(II)V HSPLandroidx/appcompat/widget/AppCompatTextView;->onTextChanged(Ljava/lang/CharSequence;III)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundResource(I)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(IIII)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(IIII)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setEmojiCompatEnabled(Z)V HSPLandroidx/appcompat/widget/AppCompatTextView;->setFilters([Landroid/text/InputFilter;)V @@ -986,16 +677,26 @@ HSPLandroidx/appcompat/widget/ContentFrameLayout;->onDetachedFromWindow()V HSPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V HSPLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener;)V HSPLandroidx/appcompat/widget/ContentFrameLayout;->setDecorPadding(IIII)V +HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I +HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline1;->m(Landroid/graphics/Insets;)I +HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline2;->m(Landroid/graphics/Insets;)I +HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline3;->m(Landroid/graphics/Insets;)I HSPLandroidx/appcompat/widget/DrawableUtils;->()V HSPLandroidx/appcompat/widget/DrawableUtils;->canSafelyMutateDrawable(Landroid/graphics/drawable/Drawable;)Z HSPLandroidx/appcompat/widget/DrawableUtils;->fixDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/FitWindowsFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/appcompat/widget/FitWindowsFrameLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z HSPLandroidx/appcompat/widget/ForwardingListener;->(Landroid/view/View;)V HSPLandroidx/appcompat/widget/ForwardingListener;->onViewAttachedToWindow(Landroid/view/View;)V +HSPLandroidx/appcompat/widget/ForwardingListener;->onViewDetachedFromWindow(Landroid/view/View;)V HSPLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(II)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HSPLandroidx/appcompat/widget/LinearLayoutCompat;->drawDividersHorizontal(Landroid/graphics/Canvas;)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/LinearLayoutCompat$LayoutParams; HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getChildrenSkipCount(Landroid/view/View;I)I HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getLocationOffset(Landroid/view/View;)I HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getNextLocationOffset(Landroid/view/View;)I @@ -1003,21 +704,26 @@ HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildAt(I)Landroid/ HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildCount()I HSPLandroidx/appcompat/widget/LinearLayoutCompat;->hasDividerBeforeChildAt(I)Z HSPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutHorizontal(IIII)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutVertical(IIII)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureChildBeforeLayout(Landroid/view/View;IIIII)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureHorizontal(II)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureVertical(II)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onDraw(Landroid/graphics/Canvas;)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onMeasure(II)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->setBaselineAligned(Z)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->setChildFrame(Landroid/view/View;IIII)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->setDividerDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->setGravity(I)V +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->setOrientation(I)V HSPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->(I)V HSPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->generateCacheKey(ILandroid/graphics/PorterDuff$Mode;)I HSPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->get(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; HSPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->put(ILandroid/graphics/PorterDuff$Mode;Landroid/graphics/PorterDuffColorFilter;)Landroid/graphics/PorterDuffColorFilter; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->()V HSPLandroidx/appcompat/widget/ResourceManagerInternal;->()V +HSPLandroidx/appcompat/widget/ResourceManagerInternal;->addTintListToCache(Landroid/content/Context;ILandroid/content/res/ColorStateList;)V HSPLandroidx/appcompat/widget/ResourceManagerInternal;->checkVectorDrawableSetup(Landroid/content/Context;)V HSPLandroidx/appcompat/widget/ResourceManagerInternal;->createCacheKey(Landroid/util/TypedValue;)J HSPLandroidx/appcompat/widget/ResourceManagerInternal;->createDrawableIfNeeded(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; @@ -1029,6 +735,7 @@ HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/con HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getPorterDuffColorFilter(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintListFromCache(Landroid/content/Context;I)Landroid/content/res/ColorStateList; +HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintMode(I)Landroid/graphics/PorterDuff$Mode; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->installDefaultInflateDelegates(Landroidx/appcompat/widget/ResourceManagerInternal;)V HSPLandroidx/appcompat/widget/ResourceManagerInternal;->isVectorDrawable(Landroid/graphics/drawable/Drawable;)Z HSPLandroidx/appcompat/widget/ResourceManagerInternal;->loadDrawableFromDelegates(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; @@ -1042,12 +749,43 @@ HSPLandroidx/appcompat/widget/RtlSpacingHelper;->getStart()I HSPLandroidx/appcompat/widget/RtlSpacingHelper;->setAbsolute(II)V HSPLandroidx/appcompat/widget/RtlSpacingHelper;->setDirection(Z)V HSPLandroidx/appcompat/widget/RtlSpacingHelper;->setRelative(II)V +HSPLandroidx/appcompat/widget/SearchView$10;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$1;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$2;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$3;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$4;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$5;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$6;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$7;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$8;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$9;->(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView$SearchAutoComplete$1;->(Landroidx/appcompat/widget/SearchView$SearchAutoComplete;)V +HSPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->enoughToFilter()Z +HSPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->getSearchViewTextMinWidthDp()I +HSPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->onFinishInflate()V +HSPLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->setSearchView(Landroidx/appcompat/widget/SearchView;)V +HSPLandroidx/appcompat/widget/SearchView;->()V +HSPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/appcompat/widget/SearchView;->getDecoratedHint(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +HSPLandroidx/appcompat/widget/SearchView;->getQueryHint()Ljava/lang/CharSequence; +HSPLandroidx/appcompat/widget/SearchView;->isSubmitAreaEnabled()Z +HSPLandroidx/appcompat/widget/SearchView;->setIconifiedByDefault(Z)V +HSPLandroidx/appcompat/widget/SearchView;->setMaxWidth(I)V +HSPLandroidx/appcompat/widget/SearchView;->updateCloseButton()V +HSPLandroidx/appcompat/widget/SearchView;->updateQueryHint()V +HSPLandroidx/appcompat/widget/SearchView;->updateSubmitArea()V +HSPLandroidx/appcompat/widget/SearchView;->updateSubmitButton(Z)V +HSPLandroidx/appcompat/widget/SearchView;->updateViewsVisibility(Z)V +HSPLandroidx/appcompat/widget/SearchView;->updateVoiceButton(Z)V HSPLandroidx/appcompat/widget/ThemeUtils;->()V HSPLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/view/View;Landroid/content/Context;)V HSPLandroidx/appcompat/widget/TintContextWrapper;->()V HSPLandroidx/appcompat/widget/TintContextWrapper;->shouldWrap(Landroid/content/Context;)Z HSPLandroidx/appcompat/widget/TintContextWrapper;->wrap(Landroid/content/Context;)Landroid/content/Context; HSPLandroidx/appcompat/widget/TintInfo;->()V +HSPLandroidx/appcompat/widget/TintTypedArray;->(Landroid/content/Context;Landroid/content/res/TypedArray;)V HSPLandroidx/appcompat/widget/TintTypedArray;->getBoolean(IZ)Z HSPLandroidx/appcompat/widget/TintTypedArray;->getColorStateList(I)Landroid/content/res/ColorStateList; HSPLandroidx/appcompat/widget/TintTypedArray;->getDimensionPixelOffset(II)I @@ -1055,6 +793,7 @@ HSPLandroidx/appcompat/widget/TintTypedArray;->getDimensionPixelSize(II)I HSPLandroidx/appcompat/widget/TintTypedArray;->getDrawable(I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/TintTypedArray;->getDrawableIfKnown(I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/TintTypedArray;->getFloat(IF)F +HSPLandroidx/appcompat/widget/TintTypedArray;->getFont(IILandroidx/core/content/res/ResourcesCompat$FontCallback;)Landroid/graphics/Typeface; HSPLandroidx/appcompat/widget/TintTypedArray;->getInt(II)I HSPLandroidx/appcompat/widget/TintTypedArray;->getInteger(II)I HSPLandroidx/appcompat/widget/TintTypedArray;->getResourceId(II)I @@ -1067,6 +806,7 @@ HSPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/c HSPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III)Landroidx/appcompat/widget/TintTypedArray; HSPLandroidx/appcompat/widget/TintTypedArray;->recycle()V HSPLandroidx/appcompat/widget/Toolbar$$ExternalSyntheticLambda0;->(Landroidx/appcompat/widget/Toolbar;)V +HSPLandroidx/appcompat/widget/Toolbar$$ExternalSyntheticLambda0;->run()V HSPLandroidx/appcompat/widget/Toolbar$1;->(Landroidx/appcompat/widget/Toolbar;)V HSPLandroidx/appcompat/widget/Toolbar$2;->(Landroidx/appcompat/widget/Toolbar;)V HSPLandroidx/appcompat/widget/Toolbar$3;->(Landroidx/appcompat/widget/Toolbar;)V @@ -1076,9 +816,13 @@ HSPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->initForM HSPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->updateMenuView(Z)V HSPLandroidx/appcompat/widget/Toolbar$LayoutParams;->(II)V HSPLandroidx/appcompat/widget/Toolbar$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/appcompat/widget/Toolbar$SavedState$1;->()V +HSPLandroidx/appcompat/widget/Toolbar$SavedState;->()V +HSPLandroidx/appcompat/widget/Toolbar$SavedState;->(Landroid/os/Parcelable;)V HSPLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/Toolbar;->addCustomViewsWithGravity(Ljava/util/List;I)V +HSPLandroidx/appcompat/widget/Toolbar;->addMenuProvider(Landroidx/core/view/MenuProvider;)V HSPLandroidx/appcompat/widget/Toolbar;->addSystemView(Landroid/view/View;Z)V HSPLandroidx/appcompat/widget/Toolbar;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HSPLandroidx/appcompat/widget/Toolbar;->ensureContentInsets()V @@ -1097,8 +841,10 @@ HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetEnd()I HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetLeft()I HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetRight()I HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetStart()I +HSPLandroidx/appcompat/widget/Toolbar;->getCurrentMenuItems()Ljava/util/ArrayList; HSPLandroidx/appcompat/widget/Toolbar;->getHorizontalMargins(Landroid/view/View;)I HSPLandroidx/appcompat/widget/Toolbar;->getMenu()Landroid/view/Menu; +HSPLandroidx/appcompat/widget/Toolbar;->getMenuInflater()Landroid/view/MenuInflater; HSPLandroidx/appcompat/widget/Toolbar;->getNavigationContentDescription()Ljava/lang/CharSequence; HSPLandroidx/appcompat/widget/Toolbar;->getNavigationIcon()Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/Toolbar;->getOverflowIcon()Landroid/graphics/drawable/Drawable; @@ -1106,21 +852,31 @@ HSPLandroidx/appcompat/widget/Toolbar;->getSubtitle()Ljava/lang/CharSequence; HSPLandroidx/appcompat/widget/Toolbar;->getTitle()Ljava/lang/CharSequence; HSPLandroidx/appcompat/widget/Toolbar;->getVerticalMargins(Landroid/view/View;)I HSPLandroidx/appcompat/widget/Toolbar;->getViewListMeasuredWidth(Ljava/util/List;[I)I +HSPLandroidx/appcompat/widget/Toolbar;->invalidateMenu()V HSPLandroidx/appcompat/widget/Toolbar;->isChildOrHidden(Landroid/view/View;)Z +HSPLandroidx/appcompat/widget/Toolbar;->isOverflowMenuShowing()Z HSPLandroidx/appcompat/widget/Toolbar;->layoutChildLeft(Landroid/view/View;I[II)I HSPLandroidx/appcompat/widget/Toolbar;->layoutChildRight(Landroid/view/View;I[II)I HSPLandroidx/appcompat/widget/Toolbar;->measureChildCollapseMargins(Landroid/view/View;IIII[I)I HSPLandroidx/appcompat/widget/Toolbar;->measureChildConstrained(Landroid/view/View;IIIII)V HSPLandroidx/appcompat/widget/Toolbar;->onAttachedToWindow()V +HSPLandroidx/appcompat/widget/Toolbar;->onCreateMenu()V HSPLandroidx/appcompat/widget/Toolbar;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/Toolbar;->onMeasure(II)V HSPLandroidx/appcompat/widget/Toolbar;->onRtlPropertiesChanged(I)V +HSPLandroidx/appcompat/widget/Toolbar;->onSaveInstanceState()Landroid/os/Parcelable; HSPLandroidx/appcompat/widget/Toolbar;->setBackInvokedCallbackEnabled(Z)V HSPLandroidx/appcompat/widget/Toolbar;->setMenuCallbacks(Landroidx/appcompat/view/menu/MenuPresenter$Callback;Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V +HSPLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(I)V +HSPLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(Ljava/lang/CharSequence;)V +HSPLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(I)V +HSPLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/Toolbar;->setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V HSPLandroidx/appcompat/widget/Toolbar;->setOnMenuItemClickListener(Landroidx/appcompat/widget/Toolbar$OnMenuItemClickListener;)V HSPLandroidx/appcompat/widget/Toolbar;->setPopupTheme(I)V HSPLandroidx/appcompat/widget/Toolbar;->setTitle(Ljava/lang/CharSequence;)V +HSPLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(I)V +HSPLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(Landroid/content/res/ColorStateList;)V HSPLandroidx/appcompat/widget/Toolbar;->shouldCollapse()Z HSPLandroidx/appcompat/widget/Toolbar;->shouldLayout(Landroid/view/View;)Z HSPLandroidx/appcompat/widget/Toolbar;->updateBackInvokedCallbackState()V @@ -1226,6 +982,7 @@ HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater;->(Landroid/cont HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater;->inflate(ILandroid/view/ViewGroup;Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$OnInflateFinishedListener;)V HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater;->inflateInternal(ILandroid/view/ViewGroup;Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$OnInflateFinishedListener;Landroid/view/LayoutInflater;Ljava/util/concurrent/Executor;)V HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater;->triggerCallbacks(Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateRequest;Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateThread;)V +HSPLandroidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl$OutputConfigurationParamsApi24$$ExternalSyntheticBackport1;->m(J)I HSPLandroidx/camera/view/PreviewView$1$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/cardview/R$styleable;->()V HSPLandroidx/cardview/widget/CardView$1;->(Landroidx/cardview/widget/CardView;)V @@ -1285,9 +1042,11 @@ HSPLandroidx/collection/ArraySet;->allocArrays(I)V HSPLandroidx/collection/ArraySet;->binarySearch(I)I HSPLandroidx/collection/ArraySet;->clear()V HSPLandroidx/collection/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V +HSPLandroidx/collection/ArraySet;->indexOf(Ljava/lang/Object;)I HSPLandroidx/collection/ArraySet;->indexOf(Ljava/lang/Object;I)I HSPLandroidx/collection/ArraySet;->isEmpty()Z HSPLandroidx/collection/ArraySet;->iterator()Ljava/util/Iterator; +HSPLandroidx/collection/ArraySet;->remove(Ljava/lang/Object;)Z HSPLandroidx/collection/ArraySet;->removeAt(I)Ljava/lang/Object; HSPLandroidx/collection/ArraySet;->toArray()[Ljava/lang/Object; HSPLandroidx/collection/ArraySet;->valueAt(I)Ljava/lang/Object; @@ -1344,6 +1103,7 @@ HSPLandroidx/collection/SimpleArrayMap;->valueAt(I)Ljava/lang/Object; HSPLandroidx/collection/SparseArrayCompat;->()V HSPLandroidx/collection/SparseArrayCompat;->()V HSPLandroidx/collection/SparseArrayCompat;->(I)V +HSPLandroidx/collection/SparseArrayCompat;->append(ILjava/lang/Object;)V HSPLandroidx/collection/SparseArrayCompat;->containsValue(Ljava/lang/Object;)Z HSPLandroidx/collection/SparseArrayCompat;->get(I)Ljava/lang/Object; HSPLandroidx/collection/SparseArrayCompat;->get(ILjava/lang/Object;)Ljava/lang/Object; @@ -1356,11 +1116,11 @@ HSPLandroidx/collection/SparseArrayKt$valueIterator$1;->(Landroidx/collect HSPLandroidx/collection/SparseArrayKt$valueIterator$1;->hasNext()Z HSPLandroidx/collection/SparseArrayKt$valueIterator$1;->next()Ljava/lang/Object; HSPLandroidx/collection/SparseArrayKt;->valueIterator(Landroidx/collection/SparseArrayCompat;)Ljava/util/Iterator; -HSPLandroidx/compose/animation/FlingCalculator$FlingInfo$$ExternalSyntheticBackport0;->m(J)I HSPLandroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/View;I)V HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/Bitmap$Config; HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline1;->m()Landroid/graphics/Bitmap$Config; HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/res/Configuration;)I +HSPLandroidx/compose/ui/platform/coreshims/SoftwareKeyboardControllerCompat$Impl30$$ExternalSyntheticApiModelOutline1;->m()I HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline0;->m()Landroid/os/LocaleList; HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline1;->m(Landroid/os/LocaleList;)I HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline2;->m(Landroid/os/LocaleList;I)Ljava/util/Locale; @@ -1369,7 +1129,6 @@ HSPLandroidx/compose/ui/text/platform/extensions/LocaleListHelperMethods$$Extern HSPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->()V HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->(Landroidx/constraintlayout/core/ArrayRow;Landroidx/constraintlayout/core/Cache;)V -HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->add(Landroidx/constraintlayout/core/SolverVariable;FZ)V HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->clear()V HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->contains(Landroidx/constraintlayout/core/SolverVariable;)Z HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->divideByAmount(F)V @@ -1385,6 +1144,7 @@ HSPLandroidx/constraintlayout/core/ArrayRow;->chooseSubject(Landroidx/constraint HSPLandroidx/constraintlayout/core/ArrayRow;->chooseSubjectInVariables(Landroidx/constraintlayout/core/LinearSystem;)Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/ArrayRow;->createRowCentering(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IFLandroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/ArrayRow;->createRowEqualMatchDimensions(FFFLandroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;)Landroidx/constraintlayout/core/ArrayRow; +HSPLandroidx/constraintlayout/core/ArrayRow;->createRowEquals(Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/ArrayRow;->createRowEquals(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/ArrayRow;->createRowGreaterThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/ArrayRow;->createRowLowerThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; @@ -1405,7 +1165,9 @@ HSPLandroidx/constraintlayout/core/LinearSystem;->addCentering(Landroidx/constra HSPLandroidx/constraintlayout/core/LinearSystem;->addConstraint(Landroidx/constraintlayout/core/ArrayRow;)V HSPLandroidx/constraintlayout/core/LinearSystem;->addEquality(Landroidx/constraintlayout/core/SolverVariable;I)V HSPLandroidx/constraintlayout/core/LinearSystem;->addEquality(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;II)Landroidx/constraintlayout/core/ArrayRow; +HSPLandroidx/constraintlayout/core/LinearSystem;->addGreaterBarrier(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IZ)V HSPLandroidx/constraintlayout/core/LinearSystem;->addGreaterThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;II)V +HSPLandroidx/constraintlayout/core/LinearSystem;->addLowerBarrier(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IZ)V HSPLandroidx/constraintlayout/core/LinearSystem;->addLowerThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;II)V HSPLandroidx/constraintlayout/core/LinearSystem;->addRow(Landroidx/constraintlayout/core/ArrayRow;)V HSPLandroidx/constraintlayout/core/LinearSystem;->addSingleError(Landroidx/constraintlayout/core/ArrayRow;II)V @@ -1441,7 +1203,6 @@ HSPLandroidx/constraintlayout/core/PriorityGoalRow;->clear()V HSPLandroidx/constraintlayout/core/PriorityGoalRow;->getPivotCandidate(Landroidx/constraintlayout/core/LinearSystem;[Z)Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/PriorityGoalRow;->isEmpty()Z HSPLandroidx/constraintlayout/core/PriorityGoalRow;->removeGoal(Landroidx/constraintlayout/core/SolverVariable;)V -HSPLandroidx/constraintlayout/core/PriorityGoalRow;->updateFromRow(Landroidx/constraintlayout/core/LinearSystem;Landroidx/constraintlayout/core/ArrayRow;Z)V HSPLandroidx/constraintlayout/core/SolverVariable$Type;->()V HSPLandroidx/constraintlayout/core/SolverVariable$Type;->(Ljava/lang/String;I)V HSPLandroidx/constraintlayout/core/SolverVariable;->()V @@ -1466,6 +1227,7 @@ HSPLandroidx/constraintlayout/core/widgets/ChainHead;->(Landroidx/constrai HSPLandroidx/constraintlayout/core/widgets/ChainHead;->define()V HSPLandroidx/constraintlayout/core/widgets/ChainHead;->defineChainProperties()V HSPLandroidx/constraintlayout/core/widgets/ChainHead;->isMatchConstraintEqualityCandidate(Landroidx/constraintlayout/core/widgets/ConstraintWidget;I)Z +HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$1;->()V HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;->()V HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;->(Ljava/lang/String;I)V HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;->values()[Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type; @@ -1474,8 +1236,10 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->connect(Landroidx/ HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getDependents()Ljava/util/HashSet; HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getFinalValue()I HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getMargin()I +HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getOpposite()Landroidx/constraintlayout/core/widgets/ConstraintAnchor; HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getSolverVariable()Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getTarget()Landroidx/constraintlayout/core/widgets/ConstraintAnchor; +HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasCenteredDependents()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasDependents()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasFinalValue()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->isConnected()Z @@ -1510,6 +1274,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getMinWidth()I HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getParent()Landroidx/constraintlayout/core/widgets/ConstraintWidget; HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalBiasPercent()F HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalDimensionBehaviour()Landroidx/constraintlayout/core/widgets/ConstraintWidget$DimensionBehaviour; +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalMargin()I HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVisibility()I HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getWidth()I HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getX()I @@ -1518,6 +1283,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasBaseline()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasDanglingDimension(I)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasDependencies()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasDimensionOverride()Z +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasResolvedTargets(II)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->immediateConnect(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;Landroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;II)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->isChainHead(I)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->isHorizontalSolvingPassDone()Z @@ -1533,11 +1299,13 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->isVerticalSolvingP HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->markHorizontalSolvingPassDone()V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->markVerticalSolvingPassDone()V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->reset()V +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->resetFinalResolution()V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->resetSolverVariables(Landroidx/constraintlayout/core/Cache;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setBaselineDistance(I)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setCompanionWidget(Ljava/lang/Object;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setDimensionRatio(Ljava/lang/String;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalHorizontal(II)V +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalLeft(I)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalTop(I)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalVertical(II)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFrame(IIII)V @@ -1559,6 +1327,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setMinWidth(I)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setParent(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalBiasPercent(F)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalChainStyle(I)V +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalDimension(II)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalDimensionBehaviour(Landroidx/constraintlayout/core/widgets/ConstraintWidget$DimensionBehaviour;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalMatchStyle(IIIF)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalWeight(F)V @@ -1573,6 +1342,8 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->()V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addChain(Landroidx/constraintlayout/core/widgets/ConstraintWidget;I)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addChildrenToSolver(Landroidx/constraintlayout/core/LinearSystem;)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalChain(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMaxVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMinVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addMaxWrap(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;Landroidx/constraintlayout/core/SolverVariable;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addMinWrap(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;Landroidx/constraintlayout/core/SolverVariable;)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addVerticalChain(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V @@ -1585,7 +1356,6 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->invalidat HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isHeightMeasuredTooSmall()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isRtl()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isWidthMeasuredTooSmall()Z -HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->layout()V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->measure(IIIIIIIII)J HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->measure(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;I)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->optimizeFor(I)Z @@ -1596,6 +1366,19 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->setPass(I HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->setRtl(Z)V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->updateChildrenFromSolver(Landroidx/constraintlayout/core/LinearSystem;[Z)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->updateHierarchy()V +HSPLandroidx/constraintlayout/core/widgets/Guideline$1;->()V +HSPLandroidx/constraintlayout/core/widgets/Guideline;->()V +HSPLandroidx/constraintlayout/core/widgets/Guideline;->addToSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V +HSPLandroidx/constraintlayout/core/widgets/Guideline;->getAnchor(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/core/widgets/ConstraintAnchor; +HSPLandroidx/constraintlayout/core/widgets/Guideline;->getOrientation()I +HSPLandroidx/constraintlayout/core/widgets/Guideline;->getRelativeBegin()I +HSPLandroidx/constraintlayout/core/widgets/Guideline;->getRelativeEnd()I +HSPLandroidx/constraintlayout/core/widgets/Guideline;->isResolvedVertically()Z +HSPLandroidx/constraintlayout/core/widgets/Guideline;->setFinalValue(I)V +HSPLandroidx/constraintlayout/core/widgets/Guideline;->setGuideBegin(I)V +HSPLandroidx/constraintlayout/core/widgets/Guideline;->setGuideEnd(I)V +HSPLandroidx/constraintlayout/core/widgets/Guideline;->setOrientation(I)V +HSPLandroidx/constraintlayout/core/widgets/Guideline;->updateFromSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V HSPLandroidx/constraintlayout/core/widgets/HelperWidget;->()V HSPLandroidx/constraintlayout/core/widgets/HelperWidget;->add(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V HSPLandroidx/constraintlayout/core/widgets/HelperWidget;->removeAllIds()V @@ -1612,7 +1395,6 @@ HSPLandroidx/constraintlayout/core/widgets/WidgetContainer;->resetSolverVariable HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;->()V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;->()V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;)V -HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->measure(Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;I)Z HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->measureChildren(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->solveLinearSystem(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;Ljava/lang/String;III)V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->solverMeasure(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;IIIIIIIII)J @@ -1622,7 +1404,6 @@ HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph;->invalidate HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph;->invalidateMeasures()V HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph;->setMeasurer(Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->()V -HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->canMeasure(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;)Z HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->horizontalSolvingPass(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Z)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveBarrier(ILandroidx/constraintlayout/core/widgets/Barrier;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;IZ)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveHorizontalCenterConstraints(ILandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;Z)V @@ -1630,7 +1411,6 @@ HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveHorizontalMatc HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveVerticalCenterConstraints(ILandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveVerticalMatchConstraint(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solvingPass(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V -HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->verticalSolvingPass(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V HSPLandroidx/constraintlayout/widget/Barrier;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/constraintlayout/widget/Barrier;->init(Landroid/util/AttributeSet;)V HSPLandroidx/constraintlayout/widget/Barrier;->resolveRtl(Landroidx/constraintlayout/core/widgets/ConstraintWidget;Z)V @@ -1653,8 +1433,7 @@ HSPLandroidx/constraintlayout/widget/ConstraintHelper;->updatePreLayout(Landroid HSPLandroidx/constraintlayout/widget/ConstraintHelper;->validateParams()V HSPLandroidx/constraintlayout/widget/ConstraintLayout$1;->()V HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table;->()V -HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->resolveLayoutDirection(I)V -HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->validate()V +HSPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->(Landroidx/constraintlayout/widget/ConstraintLayout;Landroidx/constraintlayout/widget/ConstraintLayout;)V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->captureLayoutInfo(IIIIII)V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->didMeasures()V @@ -1662,6 +1441,7 @@ HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->isSimilarSpec(I HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->measure(Landroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->()V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/constraintlayout/widget/ConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->access$000(Landroidx/constraintlayout/widget/ConstraintLayout;)I HSPLandroidx/constraintlayout/widget/ConstraintLayout;->access$100(Landroidx/constraintlayout/widget/ConstraintLayout;)Ljava/util/ArrayList; HSPLandroidx/constraintlayout/widget/ConstraintLayout;->applyConstraintsFromLayoutParams(ZLandroid/view/View;Landroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;Landroid/util/SparseArray;)V @@ -1682,8 +1462,8 @@ HSPLandroidx/constraintlayout/widget/ConstraintLayout;->onViewRemoved(Landroid/v HSPLandroidx/constraintlayout/widget/ConstraintLayout;->requestLayout()V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->resolveMeasuredDimension(IIIIZZ)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->resolveSystem(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;III)V -HSPLandroidx/constraintlayout/widget/ConstraintLayout;->setChildrenConstraints()V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->setConstraintSet(Landroidx/constraintlayout/widget/ConstraintSet;)V +HSPLandroidx/constraintlayout/widget/ConstraintLayout;->setId(I)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->setMinHeight(I)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->setSelfDimensionBehaviour(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;IIII)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->updateHierarchy()Z @@ -1704,30 +1484,50 @@ HSPLandroidx/constraintlayout/widget/ConstraintSet;->applyTo(Landroidx/constrain HSPLandroidx/constraintlayout/widget/ConstraintSet;->applyToInternal(Landroidx/constraintlayout/widget/ConstraintLayout;Z)V HSPLandroidx/constraintlayout/widget/ConstraintSet;->clone(Landroid/content/Context;I)V HSPLandroidx/constraintlayout/widget/ConstraintSet;->clone(Landroidx/constraintlayout/widget/ConstraintLayout;)V +HSPLandroidx/constraintlayout/widget/Guideline;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/constraintlayout/widget/Guideline;->setGuidelineBegin(I)V +HSPLandroidx/constraintlayout/widget/Guideline;->setGuidelineEnd(I)V HSPLandroidx/constraintlayout/widget/R$styleable;->()V HSPLandroidx/coordinatorlayout/R$styleable;->()V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->blocksInteractionBelow(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->getScrimOpacity(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)F HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onAttachedToLayoutParams(Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onNestedScrollAccepted(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;I)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onNestedScrollAccepted(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;I)Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->onChildViewAdded(Landroid/view/View;Landroid/view/View;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->checkAnchorChanged()Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->dependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->didBlockInteraction()Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->findAnchorView(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Landroid/view/View; HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->getBehavior()Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->getChangedAfterNestedScroll()Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->getLastChildRect()Landroid/graphics/Rect; +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->isBlockingInteractionBelow(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->isNestedScrollAccepted(I)Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->resetChangedAfterNestedScroll()V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->resetNestedScroll(I)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->resetTouchBehaviorTracking()V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->setLastChildRect(Landroid/graphics/Rect;)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->setNestedScrollAccepted(IZ)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->shouldDodge(Landroid/view/View;I)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$OnPreDrawListener;->(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$OnPreDrawListener;->onPreDraw()Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState$1;->()V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->()V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->(Landroid/os/Parcelable;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;->()V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;->compare(Landroid/view/View;Landroid/view/View;)I +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->()V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -1748,15 +1548,24 @@ HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getLastWindowInsets()L HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getResolvedLayoutParams(Landroid/view/View;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams; HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumHeight()I HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumWidth()I +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getTopSortedChildren(Ljava/util/List;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->hasDependencies(Landroid/view/View;)Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->isPointInChildBounds(Landroid/view/View;II)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->layoutChild(Landroid/view/View;I)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onAttachedToWindow()V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onChildViewsChanged(I)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayout(ZIIII)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayoutChild(Landroid/view/View;I)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasure(II)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasureChild(Landroid/view/View;IIII)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;II)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onSaveInstanceState()Landroid/os/Parcelable; +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;II)Z +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onStopNestedScroll(Landroid/view/View;I)V +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->parseBehavior(Landroid/content/Context;Landroid/util/AttributeSet;Ljava/lang/String;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; +HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->performIntercept(Landroid/view/MotionEvent;I)Z HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->prepareChildren()V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->recordLastChildRect(Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->releaseTempRect(Landroid/graphics/Rect;)V @@ -1780,15 +1589,18 @@ HSPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->getDescendantRect(Landroi HSPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->offsetDescendantMatrix(Landroid/view/ViewParent;Landroid/view/View;Landroid/graphics/Matrix;)V HSPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->offsetDescendantRect(Landroid/view/ViewGroup;Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroidx/core/R$styleable;->()V +HSPLandroidx/core/app/ActivityCompat$Api21Impl;->postponeEnterTransition(Landroid/app/Activity;)V +HSPLandroidx/core/app/ActivityCompat$Api21Impl;->startPostponedEnterTransition(Landroid/app/Activity;)V +HSPLandroidx/core/app/ActivityCompat;->postponeEnterTransition(Landroid/app/Activity;)V +HSPLandroidx/core/app/ActivityCompat;->startPostponedEnterTransition(Landroid/app/Activity;)V HSPLandroidx/core/app/AppOpsManagerCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/core/app/AppOpsManagerCompat$Api23Impl;->permissionToOp(Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/core/app/AppOpsManagerCompat;->permissionToOp(Ljava/lang/String;)Ljava/lang/String; -HSPLandroidx/core/app/BundleCompat$Api18Impl;->getBinder(Landroid/os/Bundle;Ljava/lang/String;)Landroid/os/IBinder; -HSPLandroidx/core/app/BundleCompat$Api18Impl;->putBinder(Landroid/os/Bundle;Ljava/lang/String;Landroid/os/IBinder;)V HSPLandroidx/core/app/BundleCompat;->getBinder(Landroid/os/Bundle;Ljava/lang/String;)Landroid/os/IBinder; HSPLandroidx/core/app/BundleCompat;->putBinder(Landroid/os/Bundle;Ljava/lang/String;Landroid/os/IBinder;)V HSPLandroidx/core/app/ComponentActivity;->()V HSPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V +HSPLandroidx/core/app/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/core/app/CoreComponentFactory;->()V HSPLandroidx/core/app/CoreComponentFactory;->checkCompatWrapper(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity; @@ -1804,8 +1616,6 @@ HSPLandroidx/core/app/NotificationManagerCompat;->cancel(I)V HSPLandroidx/core/app/NotificationManagerCompat;->cancel(Ljava/lang/String;I)V HSPLandroidx/core/app/NotificationManagerCompat;->from(Landroid/content/Context;)Landroidx/core/app/NotificationManagerCompat; HSPLandroidx/core/content/ContentValuesKt;->contentValuesOf([Lkotlin/Pair;)Landroid/content/ContentValues; -HSPLandroidx/core/content/ContextCompat$Api19Impl;->getExternalCacheDirs(Landroid/content/Context;)[Ljava/io/File; -HSPLandroidx/core/content/ContextCompat$Api19Impl;->getExternalFilesDirs(Landroid/content/Context;Ljava/lang/String;)[Ljava/io/File; HSPLandroidx/core/content/ContextCompat$Api21Impl;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/core/content/ContextCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/content/Context;I)I HSPLandroidx/core/content/ContextCompat$Api23Impl;->getColor(Landroid/content/Context;I)I @@ -1818,23 +1628,15 @@ HSPLandroidx/core/content/ContextCompat;->checkSelfPermission(Landroid/content/C HSPLandroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I HSPLandroidx/core/content/ContextCompat;->getColorStateList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; HSPLandroidx/core/content/ContextCompat;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; -HSPLandroidx/core/content/ContextCompat;->getExternalCacheDirs(Landroid/content/Context;)[Ljava/io/File; -HSPLandroidx/core/content/ContextCompat;->getExternalFilesDirs(Landroid/content/Context;Ljava/lang/String;)[Ljava/io/File; HSPLandroidx/core/content/ContextCompat;->getMainExecutor(Landroid/content/Context;)Ljava/util/concurrent/Executor; HSPLandroidx/core/content/ContextCompat;->getSystemService(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroidx/core/content/ContextCompat;->obtainAndCheckReceiverPermission(Landroid/content/Context;)Ljava/lang/String; HSPLandroidx/core/content/ContextCompat;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent; HSPLandroidx/core/content/ContextCompat;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent; -HSPLandroidx/core/content/FileProvider$SimplePathStrategy;->(Ljava/lang/String;)V -HSPLandroidx/core/content/FileProvider$SimplePathStrategy;->addRoot(Ljava/lang/String;Ljava/io/File;)V HSPLandroidx/core/content/FileProvider;->()V HSPLandroidx/core/content/FileProvider;->()V HSPLandroidx/core/content/FileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V -HSPLandroidx/core/content/FileProvider;->buildPath(Ljava/io/File;[Ljava/lang/String;)Ljava/io/File; -HSPLandroidx/core/content/FileProvider;->getFileProviderPathsMetaData(Landroid/content/Context;Ljava/lang/String;Landroid/content/pm/ProviderInfo;I)Landroid/content/res/XmlResourceParser; -HSPLandroidx/core/content/FileProvider;->getPathStrategy(Landroid/content/Context;Ljava/lang/String;I)Landroidx/core/content/FileProvider$PathStrategy; HSPLandroidx/core/content/FileProvider;->onCreate()Z -HSPLandroidx/core/content/FileProvider;->parsePathStrategy(Landroid/content/Context;Ljava/lang/String;I)Landroidx/core/content/FileProvider$PathStrategy; HSPLandroidx/core/content/PermissionChecker;->checkPermission(Landroid/content/Context;Ljava/lang/String;IILjava/lang/String;)I HSPLandroidx/core/content/PermissionChecker;->checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I HSPLandroidx/core/content/res/ColorStateListInflaterCompat;->()V @@ -1877,6 +1679,10 @@ HSPLandroidx/core/graphics/ColorUtils;->compositeAlpha(II)I HSPLandroidx/core/graphics/ColorUtils;->compositeColors(II)I HSPLandroidx/core/graphics/ColorUtils;->compositeComponent(IIIII)I HSPLandroidx/core/graphics/ColorUtils;->setAlphaComponent(II)I +HSPLandroidx/core/graphics/Insets;->()V +HSPLandroidx/core/graphics/Insets;->(IIII)V +HSPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; +HSPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; HSPLandroidx/core/graphics/TypefaceCompat;->()V HSPLandroidx/core/graphics/TypefaceCompat;->create(Landroid/content/Context;Landroid/graphics/Typeface;I)Landroid/graphics/Typeface; HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->()V @@ -1899,13 +1705,22 @@ HSPLandroidx/core/graphics/drawable/DrawableCompat;->unwrap(Landroid/graphics/dr HSPLandroidx/core/graphics/drawable/DrawableCompat;->wrap(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; HSPLandroidx/core/math/MathUtils;->clamp(FFF)F HSPLandroidx/core/math/MathUtils;->clamp(III)I -HSPLandroidx/core/os/BuildCompat$Extensions30Impl$$ExternalSyntheticApiModelOutline0;->m(I)I -HSPLandroidx/core/os/BuildCompat$Extensions30Impl;->()V +HSPLandroidx/core/os/BuildCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(I)I +HSPLandroidx/core/os/BuildCompat$Api30Impl;->()V +HSPLandroidx/core/os/BuildCompat$Api30Impl;->()V +HSPLandroidx/core/os/BuildCompat$Api30Impl;->getExtensionVersion(I)I HSPLandroidx/core/os/BuildCompat;->()V +HSPLandroidx/core/os/BuildCompat;->()V HSPLandroidx/core/os/BuildCompat;->isAtLeastT()Z +HSPLandroidx/core/os/BundleCompat$Api18Impl;->getBinder(Landroid/os/Bundle;Ljava/lang/String;)Landroid/os/IBinder; +HSPLandroidx/core/os/BundleCompat$Api18Impl;->putBinder(Landroid/os/Bundle;Ljava/lang/String;Landroid/os/IBinder;)V +HSPLandroidx/core/os/BundleCompat;->getBinder(Landroid/os/Bundle;Ljava/lang/String;)Landroid/os/IBinder; +HSPLandroidx/core/os/BundleCompat;->putBinder(Landroid/os/Bundle;Ljava/lang/String;Landroid/os/IBinder;)V +HSPLandroidx/core/os/BundleKt;->bundleOf([Lkotlin/Pair;)Landroid/os/Bundle; HSPLandroidx/core/os/CancellationSignal;->()V HSPLandroidx/core/os/CancellationSignal;->setOnCancelListener(Landroidx/core/os/CancellationSignal$OnCancelListener;)V HSPLandroidx/core/os/CancellationSignal;->waitForCancelFinishedLocked()V +HSPLandroidx/core/os/ConfigurationCompat$Api24Impl$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/os/LocaleList; HSPLandroidx/core/os/ConfigurationCompat$Api24Impl;->getLocales(Landroid/content/res/Configuration;)Landroid/os/LocaleList; HSPLandroidx/core/os/ConfigurationCompat;->getLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; HSPLandroidx/core/os/LocaleListCompat$Api21Impl;->()V @@ -1922,7 +1737,6 @@ HSPLandroidx/core/os/LocaleListCompat;->getFirstMatch([Ljava/lang/String;)Ljava/ HSPLandroidx/core/os/LocaleListCompat;->size()I HSPLandroidx/core/os/LocaleListCompat;->wrap(Landroid/os/LocaleList;)Landroidx/core/os/LocaleListCompat; HSPLandroidx/core/os/LocaleListPlatformWrapper$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/LocaleList;[Ljava/lang/String;)Ljava/util/Locale; -HSPLandroidx/core/os/LocaleListPlatformWrapper$$ExternalSyntheticApiModelOutline2;->m(Ljava/lang/Object;)Landroid/os/LocaleList; HSPLandroidx/core/os/LocaleListPlatformWrapper;->(Ljava/lang/Object;)V HSPLandroidx/core/os/LocaleListPlatformWrapper;->get(I)Ljava/util/Locale; HSPLandroidx/core/os/LocaleListPlatformWrapper;->getFirstMatch([Ljava/lang/String;)Ljava/util/Locale; @@ -1935,6 +1749,10 @@ HSPLandroidx/core/os/TraceCompat;->endSection()V HSPLandroidx/core/os/UserManagerCompat$Api24Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/UserManager;)Z HSPLandroidx/core/os/UserManagerCompat$Api24Impl;->isUserUnlocked(Landroid/content/Context;)Z HSPLandroidx/core/os/UserManagerCompat;->isUserUnlocked(Landroid/content/Context;)Z +HSPLandroidx/core/text/util/LinkifyCompat$$ExternalSyntheticLambda0;->()V +HSPLandroidx/core/text/util/LinkifyCompat;->()V +HSPLandroidx/core/text/util/LinkifyCompat;->addLinks(Landroid/text/Spannable;I)Z +HSPLandroidx/core/text/util/LinkifyCompat;->shouldAddLinksFallbackToFramework()Z HSPLandroidx/core/util/ObjectsCompat$Api19Impl;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/core/util/ObjectsCompat$Api19Impl;->hash([Ljava/lang/Object;)I HSPLandroidx/core/util/ObjectsCompat;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z @@ -1952,19 +1770,33 @@ HSPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lan HSPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/core/util/Preconditions;->checkState(ZLjava/lang/String;)V HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEvent(Landroid/view/View;I)V HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat$Api16Impl;->getAccessibilityNodeProvider(Landroid/view/View$AccessibilityDelegate;Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->(Landroid/view/View$AccessibilityDelegate;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +HSPLandroidx/core/view/AccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +HSPLandroidx/core/view/AccessibilityDelegateCompat;->getActionList(Landroid/view/View;)Ljava/util/List; HSPLandroidx/core/view/AccessibilityDelegateCompat;->getBridge()Landroid/view/View$AccessibilityDelegate; HSPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/core/view/AccessibilityDelegateCompat;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/AccessibilityDelegateCompat;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +HSPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEvent(Landroid/view/View;I)V HSPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2;->(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V +HSPLandroidx/core/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2;->onTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/core/view/GestureDetectorCompat;->(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;)V HSPLandroidx/core/view/GestureDetectorCompat;->(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V +HSPLandroidx/core/view/GestureDetectorCompat;->onTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/core/view/GravityCompat$Api17Impl;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V HSPLandroidx/core/view/GravityCompat;->apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V HSPLandroidx/core/view/GravityCompat;->getAbsoluteGravity(II)I @@ -1980,21 +1812,40 @@ HSPLandroidx/core/view/MenuHostHelper;->onPrepareMenu(Landroid/view/Menu;)V HSPLandroidx/core/view/MenuHostHelper;->removeMenuProvider(Landroidx/core/view/MenuProvider;)V HSPLandroidx/core/view/MenuItemCompat;->setAlphabeticShortcut(Landroid/view/MenuItem;CI)V HSPLandroidx/core/view/MenuItemCompat;->setContentDescription(Landroid/view/MenuItem;Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/MenuItemCompat;->setIconTintList(Landroid/view/MenuItem;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/view/MenuItemCompat;->setNumericShortcut(Landroid/view/MenuItem;CI)V HSPLandroidx/core/view/MenuItemCompat;->setTooltipText(Landroid/view/MenuItem;Ljava/lang/CharSequence;)V HSPLandroidx/core/view/NestedScrollingChildHelper;->(Landroid/view/View;)V +HSPLandroidx/core/view/NestedScrollingChildHelper;->getNestedScrollingParentForType(I)Landroid/view/ViewParent; +HSPLandroidx/core/view/NestedScrollingChildHelper;->hasNestedScrollingParent(I)Z +HSPLandroidx/core/view/NestedScrollingChildHelper;->isNestedScrollingEnabled()Z HSPLandroidx/core/view/NestedScrollingChildHelper;->setNestedScrollingEnabled(Z)V +HSPLandroidx/core/view/NestedScrollingChildHelper;->setNestedScrollingParentForType(ILandroid/view/ViewParent;)V +HSPLandroidx/core/view/NestedScrollingChildHelper;->startNestedScroll(II)Z +HSPLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll(I)V HSPLandroidx/core/view/NestedScrollingParentHelper;->(Landroid/view/ViewGroup;)V +HSPLandroidx/core/view/NestedScrollingParentHelper;->onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;II)V +HSPLandroidx/core/view/NestedScrollingParentHelper;->onStopNestedScroll(Landroid/view/View;I)V HSPLandroidx/core/view/OneShotPreDrawListener;->(Landroid/view/View;Ljava/lang/Runnable;)V HSPLandroidx/core/view/OneShotPreDrawListener;->add(Landroid/view/View;Ljava/lang/Runnable;)Landroidx/core/view/OneShotPreDrawListener; HSPLandroidx/core/view/OneShotPreDrawListener;->onPreDraw()Z HSPLandroidx/core/view/OneShotPreDrawListener;->onViewAttachedToWindow(Landroid/view/View;)V HSPLandroidx/core/view/OneShotPreDrawListener;->removeListener()V HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda1;->()V +HSPLandroidx/core/view/ViewCompat$1;->(ILjava/lang/Class;I)V +HSPLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; +HSPLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; HSPLandroidx/core/view/ViewCompat$2;->(ILjava/lang/Class;II)V HSPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; HSPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +HSPLandroidx/core/view/ViewCompat$3;->(ILjava/lang/Class;II)V +HSPLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; +HSPLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; +HSPLandroidx/core/view/ViewCompat$4;->(ILjava/lang/Class;I)V +HSPLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; +HSPLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; HSPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->()V +HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;I)V HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;II)V HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->frameworkAvailable()Z HSPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->get(Landroid/view/View;)Ljava/lang/Object; @@ -2016,23 +1867,37 @@ HSPLandroidx/core/view/ViewCompat$Api19Impl;->getAccessibilityLiveRegion(Landroi HSPLandroidx/core/view/ViewCompat$Api19Impl;->isAttachedToWindow(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat$Api19Impl;->isLaidOut(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat$Api19Impl;->notifySubtreeAccessibilityStateChanged(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;I)V +HSPLandroidx/core/view/ViewCompat$Api20Impl;->dispatchApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +HSPLandroidx/core/view/ViewCompat$Api20Impl;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLandroidx/core/view/ViewCompat$Api20Impl;->requestApplyInsets(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V +HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLandroidx/core/view/ViewCompat$Api21Impl;->getElevation(Landroid/view/View;)F +HSPLandroidx/core/view/ViewCompat$Api21Impl;->getZ(Landroid/view/View;)F HSPLandroidx/core/view/ViewCompat$Api21Impl;->setBackgroundTintList(Landroid/view/View;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V +HSPLandroidx/core/view/ViewCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/View;)Landroid/view/WindowInsets; +HSPLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat$Api26Impl;->getImportantForAutofill(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat$Api26Impl;->setImportantForAutofill(Landroid/view/View;I)V +HSPLandroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline10;->m(Landroid/view/View;)Ljava/lang/CharSequence; HSPLandroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/View;Landroid/view/View$OnUnhandledKeyEventListener;)V -HSPLandroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline9;->m(Landroid/view/View;)Ljava/lang/CharSequence; +HSPLandroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline4;->m(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat$Api28Impl;->getAccessibilityPaneTitle(Landroid/view/View;)Ljava/lang/CharSequence; -HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; -HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +HSPLandroidx/core/view/ViewCompat$Api28Impl;->isAccessibilityHeading(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat$Api28Impl;->isScreenReaderFocusable(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; +HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V HSPLandroidx/core/view/ViewCompat$Api29Impl;->getAccessibilityDelegate(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; HSPLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +HSPLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/View;)Ljava/lang/CharSequence; +HSPLandroidx/core/view/ViewCompat$Api30Impl;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; HSPLandroidx/core/view/ViewCompat;->()V +HSPLandroidx/core/view/ViewCompat;->accessibilityHeadingProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; HSPLandroidx/core/view/ViewCompat;->addAccessibilityAction(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V +HSPLandroidx/core/view/ViewCompat;->dispatchApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/ViewCompat;->ensureAccessibilityDelegateCompat(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->getAccessibilityDelegate(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat; HSPLandroidx/core/view/ViewCompat;->getAccessibilityDelegateInternal(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate; @@ -2049,13 +1914,19 @@ HSPLandroidx/core/view/ViewCompat;->getMinimumHeight(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat;->getMinimumWidth(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat;->getPaddingEnd(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat;->getPaddingStart(Landroid/view/View;)I +HSPLandroidx/core/view/ViewCompat;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/ViewCompat;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; +HSPLandroidx/core/view/ViewCompat;->getZ(Landroid/view/View;)F HSPLandroidx/core/view/ViewCompat;->hasAccessibilityDelegate(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->hasOnClickListeners(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat;->isAccessibilityHeading(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->isAttachedToWindow(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->isLaidOut(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewCompat;->isScreenReaderFocusable(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->notifyViewAccessibilityStateChangedIfNeeded(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat;->offsetLeftAndRight(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat;->offsetTopAndBottom(Landroid/view/View;I)V +HSPLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/ViewCompat;->paneTitleProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; HSPLandroidx/core/view/ViewCompat;->postInvalidateOnAnimation(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->postOnAnimation(Landroid/view/View;Ljava/lang/Runnable;)V @@ -2064,14 +1935,18 @@ HSPLandroidx/core/view/ViewCompat;->removeActionWithId(ILandroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->replaceAccessibilityAction(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;Ljava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;)V HSPLandroidx/core/view/ViewCompat;->requestApplyInsets(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V +HSPLandroidx/core/view/ViewCompat;->screenReaderFocusableProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; HSPLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V HSPLandroidx/core/view/ViewCompat;->setBackground(Landroid/view/View;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/core/view/ViewCompat;->setBackgroundTintList(Landroid/view/View;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/view/ViewCompat;->setFitsSystemWindows(Landroid/view/View;Z)V HSPLandroidx/core/view/ViewCompat;->setImportantForAccessibility(Landroid/view/View;I)V +HSPLandroidx/core/view/ViewCompat;->setImportantForAccessibilityIfNeeded(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->setImportantForAutofill(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V HSPLandroidx/core/view/ViewCompat;->setPaddingRelative(Landroid/view/View;IIII)V +HSPLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +HSPLandroidx/core/view/ViewCompat;->stateDescriptionProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/ViewConfiguration;)F HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/ViewConfiguration;)F HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;)F @@ -2082,9 +1957,85 @@ HSPLandroidx/core/view/ViewConfigurationCompat;->()V HSPLandroidx/core/view/ViewConfigurationCompat;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F HSPLandroidx/core/view/ViewConfigurationCompat;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F HSPLandroidx/core/view/ViewConfigurationCompat;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;Landroid/content/Context;)Z +HSPLandroidx/core/view/ViewGroupKt$children$1;->(Landroid/view/ViewGroup;)V +HSPLandroidx/core/view/ViewGroupKt$children$1;->iterator()Ljava/util/Iterator; +HSPLandroidx/core/view/ViewGroupKt$iterator$1;->(Landroid/view/ViewGroup;)V +HSPLandroidx/core/view/ViewGroupKt$iterator$1;->hasNext()Z +HSPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Landroid/view/View; +HSPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Ljava/lang/Object; +HSPLandroidx/core/view/ViewGroupKt;->getChildren(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; +HSPLandroidx/core/view/ViewGroupKt;->iterator(Landroid/view/ViewGroup;)Ljava/util/Iterator; HSPLandroidx/core/view/ViewKt$doOnPreDraw$1;->(Lkotlin/jvm/functions/Function1;Landroid/view/View;)V HSPLandroidx/core/view/ViewKt$doOnPreDraw$1;->run()V HSPLandroidx/core/view/ViewKt;->doOnPreDraw(Landroid/view/View;Lkotlin/jvm/functions/Function1;)Landroidx/core/view/OneShotPreDrawListener; +HSPLandroidx/core/view/ViewKt;->isVisible(Landroid/view/View;)Z +HSPLandroidx/core/view/ViewParentCompat;->onNestedScrollAccepted(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;II)V +HSPLandroidx/core/view/ViewParentCompat;->onStartNestedScroll(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;II)Z +HSPLandroidx/core/view/ViewParentCompat;->onStopNestedScroll(Landroid/view/ViewParent;Landroid/view/View;I)V +HSPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->(I)V +HSPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->getDispatchMode()I +HSPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/View;Landroid/view/WindowInsetsAnimation$Callback;)V +HSPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +HSPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +HSPLandroidx/core/view/WindowInsetsAnimationCompat;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +HSPLandroidx/core/view/WindowInsetsCompat$Builder;->()V +HSPLandroidx/core/view/WindowInsetsCompat$Builder;->build()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets; +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline6;->m()Landroid/view/WindowInsets$Builder; +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline8;->m()V +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V +HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V +HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->()V +HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets; +HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->isConsumed()Z +HSPLandroidx/core/view/WindowInsetsCompat$Impl28$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline1;->m()Landroid/view/WindowInsets; +HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; +HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->()V +HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V +HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsets(I)Landroidx/core/graphics/Insets; +HSPLandroidx/core/view/WindowInsetsCompat$Impl;->()V +HSPLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V +HSPLandroidx/core/view/WindowInsetsCompat$Type;->displayCutout()I +HSPLandroidx/core/view/WindowInsetsCompat$Type;->ime()I +HSPLandroidx/core/view/WindowInsetsCompat$Type;->systemBars()I +HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline0;->m()I +HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline1;->m()I +HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline2;->m()I +HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline6;->m()I +HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30;->toPlatformType(I)I +HSPLandroidx/core/view/WindowInsetsCompat;->()V +HSPLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V +HSPLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInsetsCompat;)V +HSPLandroidx/core/view/WindowInsetsCompat;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat;->copyRootViewBounds(Landroid/view/View;)V +HSPLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets; +HSPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I +HSPLandroidx/core/view/WindowInsetsCompat;->isConsumed()Z +HSPLandroidx/core/view/WindowInsetsCompat;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V +HSPLandroidx/core/view/WindowInsetsCompat;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V +HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; +HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline11;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline6;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline11;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline13;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; @@ -2108,18 +2059,53 @@ HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityAc HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->createReplacementAction(Ljava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->getId()I -HSPLandroidx/core/view/animation/PathInterpolatorCompat$Api21Impl;->createPathInterpolator(FFFF)Landroid/view/animation/PathInterpolator; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->(Ljava/lang/Object;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->()V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(I)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addSpansToExtras(Ljava/lang/CharSequence;Landroid/view/View;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setHeading(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScreenReaderFocusable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScrollable(Z)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landroid/view/accessibility/AccessibilityNodeInfo; +HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->wrap(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; +HSPLandroidx/core/view/animation/PathInterpolatorCompat$Api21Impl;->createPathInterpolator(FFFF)Landroid/view/animation/Interpolator; HSPLandroidx/core/view/animation/PathInterpolatorCompat;->create(FFFF)Landroid/view/animation/Interpolator; +HSPLandroidx/core/view/inputmethod/EditorInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V +HSPLandroidx/core/view/inputmethod/EditorInfoCompat;->()V +HSPLandroidx/core/view/inputmethod/EditorInfoCompat;->setContentMimeTypes(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V +HSPLandroidx/core/view/inputmethod/InputConnectionCompat$1;->(Landroid/view/inputmethod/InputConnection;ZLandroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)V +HSPLandroidx/core/view/inputmethod/InputConnectionCompat;->createWrapper(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/core/widget/ImageViewCompat$Api21Impl;->setImageTintList(Landroid/widget/ImageView;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/widget/ImageViewCompat;->setImageTintList(Landroid/widget/ImageView;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/widget/TextViewCompat$Api16Impl;->getMaxLines(Landroid/widget/TextView;)I HSPLandroidx/core/widget/TextViewCompat$Api17Impl;->getCompoundDrawablesRelative(Landroid/widget/TextView;)[Landroid/graphics/drawable/Drawable; +HSPLandroidx/core/widget/TextViewCompat$Api17Impl;->setCompoundDrawablesRelative(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/core/widget/TextViewCompat$Api23Impl$$ExternalSyntheticApiModelOutline5;->m(Landroid/widget/TextView;Landroid/content/res/ColorStateList;)V +HSPLandroidx/core/widget/TextViewCompat$Api23Impl;->setCompoundDrawableTintList(Landroid/widget/TextView;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/widget/TextViewCompat;->getCompoundDrawablesRelative(Landroid/widget/TextView;)[Landroid/graphics/drawable/Drawable; HSPLandroidx/core/widget/TextViewCompat;->getMaxLines(Landroid/widget/TextView;)I +HSPLandroidx/core/widget/TextViewCompat;->setCompoundDrawableTintList(Landroid/widget/TextView;Landroid/content/res/ColorStateList;)V +HSPLandroidx/core/widget/TextViewCompat;->setCompoundDrawablesRelative(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/core/widget/TextViewCompat;->setLineHeight(Landroid/widget/TextView;I)V +HSPLandroidx/core/widget/TextViewCompat;->wrapCustomSelectionActionModeCallback(Landroid/widget/TextView;Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode$Callback; HSPLandroidx/core/widget/TextViewOnReceiveContentListener;->()V HSPLandroidx/customview/poolingcontainer/PoolingContainer;->()V HSPLandroidx/customview/poolingcontainer/PoolingContainer;->setPoolingContainer(Landroid/view/View;Z)V +HSPLandroidx/customview/view/AbsSavedState$1;->()V +HSPLandroidx/customview/view/AbsSavedState$2;->()V +HSPLandroidx/customview/view/AbsSavedState;->()V +HSPLandroidx/customview/view/AbsSavedState;->()V +HSPLandroidx/customview/view/AbsSavedState;->(Landroid/os/Parcelable;)V +HSPLandroidx/customview/view/AbsSavedState;->(Landroidx/customview/view/AbsSavedState$1;)V HSPLandroidx/customview/widget/ExploreByTouchHelper$1;->()V HSPLandroidx/customview/widget/ExploreByTouchHelper$2;->()V HSPLandroidx/customview/widget/ExploreByTouchHelper;->()V @@ -2165,6 +2151,7 @@ HSPLandroidx/emoji2/text/EmojiCompat;->isInitialized()Z HSPLandroidx/emoji2/text/EmojiCompat;->load()V HSPLandroidx/emoji2/text/EmojiCompat;->loadMetadata()V HSPLandroidx/emoji2/text/EmojiCompat;->onMetadataLoadFailed(Ljava/lang/Throwable;)V +HSPLandroidx/emoji2/text/EmojiCompat;->updateEditorInfo(Landroid/view/inputmethod/EditorInfo;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V @@ -2189,24 +2176,33 @@ HSPLandroidx/emoji2/text/SpannableBuilder$WatcherWrapper;->(Ljava/lang/Obj HSPLandroidx/emoji2/text/SpannableBuilder$WatcherWrapper;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V HSPLandroidx/emoji2/text/SpannableBuilder;->(Ljava/lang/Class;Ljava/lang/CharSequence;)V HSPLandroidx/emoji2/text/SpannableBuilder;->create(Ljava/lang/Class;Ljava/lang/CharSequence;)Landroidx/emoji2/text/SpannableBuilder; +HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanEnd(Ljava/lang/Object;)I HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanFlags(Ljava/lang/Object;)I HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanStart(Ljava/lang/Object;)I HSPLandroidx/emoji2/text/SpannableBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object; +HSPLandroidx/emoji2/text/SpannableBuilder;->getWatcherFor(Ljava/lang/Object;)Landroidx/emoji2/text/SpannableBuilder$WatcherWrapper; HSPLandroidx/emoji2/text/SpannableBuilder;->isWatcher(Ljava/lang/Class;)Z HSPLandroidx/emoji2/text/SpannableBuilder;->isWatcher(Ljava/lang/Object;)Z +HSPLandroidx/emoji2/text/SpannableBuilder;->nextSpanTransition(IILjava/lang/Class;)I HSPLandroidx/emoji2/text/SpannableBuilder;->removeSpan(Ljava/lang/Object;)V HSPLandroidx/emoji2/text/SpannableBuilder;->setSpan(Ljava/lang/Object;III)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->(Landroid/widget/EditText;Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; +HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->setEnabled(Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal;->()V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->(Landroid/widget/EditText;Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; +HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->setEnabled(Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->()V HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->()V HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->getInstance()Landroid/text/Editable$Factory; HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable; +HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->()V +HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->updateEditorInfoAttrs(Landroid/view/inputmethod/EditorInfo;)V +HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V +HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;)V HSPLandroidx/emoji2/viewsintegration/EmojiInputFilter;->(Landroid/widget/TextView;)V HSPLandroidx/emoji2/viewsintegration/EmojiInputFilter;->filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence; HSPLandroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper;->()V @@ -2271,6 +2267,7 @@ HSPLandroidx/fragment/app/Fragment$7;->apply(Ljava/lang/Void;)Landroidx/activity HSPLandroidx/fragment/app/Fragment$9;->(Landroidx/fragment/app/Fragment;Landroidx/arch/core/util/Function;Ljava/util/concurrent/atomic/AtomicReference;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)V HSPLandroidx/fragment/app/Fragment$9;->onPreAttached()V HSPLandroidx/fragment/app/Fragment$AnimationInfo;->()V +HSPLandroidx/fragment/app/Fragment$Api19Impl;->cancelPendingInputEvents(Landroid/view/View;)V HSPLandroidx/fragment/app/Fragment$OnPreAttachedListener;->()V HSPLandroidx/fragment/app/Fragment$OnPreAttachedListener;->(Landroidx/fragment/app/Fragment$1;)V HSPLandroidx/fragment/app/Fragment;->$r8$lambda$Cl7MxTaA6NVZ8I5KAGBxRTLl1sc(Landroidx/fragment/app/Fragment;)V @@ -2287,6 +2284,7 @@ HSPLandroidx/fragment/app/Fragment;->getChildFragmentManager()Landroidx/fragment HSPLandroidx/fragment/app/Fragment;->getContext()Landroid/content/Context; HSPLandroidx/fragment/app/Fragment;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; HSPLandroidx/fragment/app/Fragment;->getFocusedView()Landroid/view/View; +HSPLandroidx/fragment/app/Fragment;->getHost()Ljava/lang/Object; HSPLandroidx/fragment/app/Fragment;->getId()I HSPLandroidx/fragment/app/Fragment;->getLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; HSPLandroidx/fragment/app/Fragment;->getLifecycle()Landroidx/lifecycle/Lifecycle; @@ -2320,9 +2318,12 @@ HSPLandroidx/fragment/app/Fragment;->onCreate(Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; HSPLandroidx/fragment/app/Fragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; HSPLandroidx/fragment/app/Fragment;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V +HSPLandroidx/fragment/app/Fragment;->onPause()V HSPLandroidx/fragment/app/Fragment;->onPrimaryNavigationFragmentChanged(Z)V HSPLandroidx/fragment/app/Fragment;->onResume()V +HSPLandroidx/fragment/app/Fragment;->onSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->onStart()V +HSPLandroidx/fragment/app/Fragment;->onStop()V HSPLandroidx/fragment/app/Fragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->onViewStateRestored(Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->performActivityCreated(Landroid/os/Bundle;)V @@ -2331,15 +2332,19 @@ HSPLandroidx/fragment/app/Fragment;->performCreate(Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->performCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z HSPLandroidx/fragment/app/Fragment;->performCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->performGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; +HSPLandroidx/fragment/app/Fragment;->performPause()V HSPLandroidx/fragment/app/Fragment;->performPrepareOptionsMenu(Landroid/view/Menu;)Z HSPLandroidx/fragment/app/Fragment;->performPrimaryNavigationFragmentChanged()V HSPLandroidx/fragment/app/Fragment;->performResume()V +HSPLandroidx/fragment/app/Fragment;->performSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->performStart()V +HSPLandroidx/fragment/app/Fragment;->performStop()V HSPLandroidx/fragment/app/Fragment;->performViewCreated()V HSPLandroidx/fragment/app/Fragment;->prepareCallInternal(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/arch/core/util/Function;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; HSPLandroidx/fragment/app/Fragment;->registerForActivityResult(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; HSPLandroidx/fragment/app/Fragment;->registerOnPreAttachListener(Landroidx/fragment/app/Fragment$OnPreAttachedListener;)V HSPLandroidx/fragment/app/Fragment;->requireActivity()Landroidx/fragment/app/FragmentActivity; +HSPLandroidx/fragment/app/Fragment;->requireArguments()Landroid/os/Bundle; HSPLandroidx/fragment/app/Fragment;->requireContext()Landroid/content/Context; HSPLandroidx/fragment/app/Fragment;->requireView()Landroid/view/View; HSPLandroidx/fragment/app/Fragment;->restoreChildFragmentState()V @@ -2354,6 +2359,7 @@ HSPLandroidx/fragment/app/Fragment;->setPopDirection(Z)V HSPLandroidx/fragment/app/Fragment;->setPostOnViewCreatedAlpha(F)V HSPLandroidx/fragment/app/Fragment;->setSharedElementNames(Ljava/util/ArrayList;Ljava/util/ArrayList;)V HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda0;->(Landroidx/fragment/app/FragmentActivity;)V +HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda0;->saveState()Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda1;->(Landroidx/fragment/app/FragmentActivity;)V HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda2;->(Landroidx/fragment/app/FragmentActivity;)V HSPLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda3;->(Landroidx/fragment/app/FragmentActivity;)V @@ -2371,7 +2377,11 @@ HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getSavedStateRegistry HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->invalidateMenu()V HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V +HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onFindViewById(I)Landroid/view/View; +HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onGetHost()Landroidx/fragment/app/FragmentActivity; +HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onGetHost()Ljava/lang/Object; HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onGetLayoutInflater()Landroid/view/LayoutInflater; +HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onHasView()Z HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onSupportInvalidateOptionsMenu()V HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeMenuProvider(Landroidx/core/view/MenuProvider;)V HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnConfigurationChangedListener(Landroidx/core/util/Consumer;)V @@ -2379,10 +2389,12 @@ HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnMultiWindowMo HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnPictureInPictureModeChangedListener(Landroidx/core/util/Consumer;)V HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->removeOnTrimMemoryListener(Landroidx/core/util/Consumer;)V HSPLandroidx/fragment/app/FragmentActivity;->$r8$lambda$euPNEtWNfVdMY89Jt5kWt_WEHqw(Landroidx/fragment/app/FragmentActivity;Landroid/content/Context;)V +HSPLandroidx/fragment/app/FragmentActivity;->$r8$lambda$t3WwJ1XbNlapyNW0l552nMkkXdo(Landroidx/fragment/app/FragmentActivity;)Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentActivity;->()V HSPLandroidx/fragment/app/FragmentActivity;->dispatchFragmentsOnCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HSPLandroidx/fragment/app/FragmentActivity;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManager; HSPLandroidx/fragment/app/FragmentActivity;->init()V +HSPLandroidx/fragment/app/FragmentActivity;->lambda$init$0()Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentActivity;->lambda$init$3(Landroid/content/Context;)V HSPLandroidx/fragment/app/FragmentActivity;->markFragmentsCreated()V HSPLandroidx/fragment/app/FragmentActivity;->markState(Landroidx/fragment/app/FragmentManager;Landroidx/lifecycle/Lifecycle$State;)Z @@ -2398,13 +2410,17 @@ HSPLandroidx/fragment/app/FragmentActivity;->onResumeFragments()V HSPLandroidx/fragment/app/FragmentActivity;->onStart()V HSPLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V HSPLandroidx/fragment/app/FragmentActivity;->onStop()V +HSPLandroidx/fragment/app/FragmentActivity;->supportPostponeEnterTransition()V +HSPLandroidx/fragment/app/FragmentActivity;->supportStartPostponedEnterTransition()V HSPLandroidx/fragment/app/FragmentContainer;->()V HSPLandroidx/fragment/app/FragmentContainer;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/fragment/app/Fragment; HSPLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;)V HSPLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;Landroid/util/AttributeSet;Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentContainerView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +HSPLandroidx/fragment/app/FragmentContainerView;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLandroidx/fragment/app/FragmentContainerView;->dispatchDraw(Landroid/graphics/Canvas;)V HSPLandroidx/fragment/app/FragmentContainerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z +HSPLandroidx/fragment/app/FragmentContainerView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLandroidx/fragment/app/FragmentContainerView;->setDrawDisappearingViewsLast(Z)V HSPLandroidx/fragment/app/FragmentController;->(Landroidx/fragment/app/FragmentHostCallback;)V HSPLandroidx/fragment/app/FragmentController;->attachHost(Landroidx/fragment/app/Fragment;)V @@ -2435,16 +2451,20 @@ HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->(Landroid HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentActivityCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentAttached(Landroidx/fragment/app/Fragment;Z)V HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V +HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentPaused(Landroidx/fragment/app/Fragment;Z)V HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentPreAttached(Landroidx/fragment/app/Fragment;Z)V HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentPreCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentResumed(Landroidx/fragment/app/Fragment;Z)V +HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentSaveInstanceState(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentStarted(Landroidx/fragment/app/Fragment;Z)V +HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentStopped(Landroidx/fragment/app/Fragment;Z)V HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentViewCreated(Landroidx/fragment/app/Fragment;Landroid/view/View;Landroid/os/Bundle;Z)V HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda0;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda1;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda2;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda3;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda4;->(Landroidx/fragment/app/FragmentManager;)V +HSPLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda4;->saveState()Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentManager$10;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$1;->(Landroidx/fragment/app/FragmentManager;Z)V HSPLandroidx/fragment/app/FragmentManager$2;->(Landroidx/fragment/app/FragmentManager;)V @@ -2455,13 +2475,18 @@ HSPLandroidx/fragment/app/FragmentManager$3;->instantiate(Ljava/lang/ClassLoader HSPLandroidx/fragment/app/FragmentManager$4;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$4;->createController(Landroid/view/ViewGroup;)Landroidx/fragment/app/SpecialEffectsController; HSPLandroidx/fragment/app/FragmentManager$5;->(Landroidx/fragment/app/FragmentManager;)V +HSPLandroidx/fragment/app/FragmentManager$6;->(Landroidx/fragment/app/FragmentManager;Ljava/lang/String;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/Lifecycle;)V +HSPLandroidx/fragment/app/FragmentManager$6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/fragment/app/FragmentManager$7;->(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentManager$7;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentManager$8;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$9;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;->()V +HSPLandroidx/fragment/app/FragmentManager$LifecycleAwareResultListener;->(Landroidx/lifecycle/Lifecycle;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/LifecycleEventObserver;)V +HSPLandroidx/fragment/app/FragmentManager;->$r8$lambda$sido8p6zuWx0PQxIkv4qM-BRiGM(Landroidx/fragment/app/FragmentManager;)Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentManager;->()V HSPLandroidx/fragment/app/FragmentManager;->()V +HSPLandroidx/fragment/app/FragmentManager;->access$000(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; HSPLandroidx/fragment/app/FragmentManager;->addFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentStateManager; HSPLandroidx/fragment/app/FragmentManager;->addFragmentOnAttachListener(Landroidx/fragment/app/FragmentOnAttachListener;)V HSPLandroidx/fragment/app/FragmentManager;->addOnBackStackChangedListener(Landroidx/fragment/app/FragmentManager$OnBackStackChangedListener;)V @@ -2501,6 +2526,7 @@ HSPLandroidx/fragment/app/FragmentManager;->findActiveFragment(Ljava/lang/String HSPLandroidx/fragment/app/FragmentManager;->findFragment(Landroid/view/View;)Landroidx/fragment/app/Fragment; HSPLandroidx/fragment/app/FragmentManager;->findFragmentById(I)Landroidx/fragment/app/Fragment; HSPLandroidx/fragment/app/FragmentManager;->findViewFragment(Landroid/view/View;)Landroidx/fragment/app/Fragment; +HSPLandroidx/fragment/app/FragmentManager;->forcePostponedTransactions()V HSPLandroidx/fragment/app/FragmentManager;->generateOpsForPendingActions(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z HSPLandroidx/fragment/app/FragmentManager;->getBackStackEntryCount()I HSPLandroidx/fragment/app/FragmentManager;->getChildNonConfig(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentManagerViewModel; @@ -2523,17 +2549,23 @@ HSPLandroidx/fragment/app/FragmentManager;->isParentMenuVisible(Landroidx/fragme HSPLandroidx/fragment/app/FragmentManager;->isPrimaryNavigation(Landroidx/fragment/app/Fragment;)Z HSPLandroidx/fragment/app/FragmentManager;->isStateAtLeast(I)Z HSPLandroidx/fragment/app/FragmentManager;->isStateSaved()Z +HSPLandroidx/fragment/app/FragmentManager;->lambda$attachController$4()Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentManager;->moveToState(IZ)V HSPLandroidx/fragment/app/FragmentManager;->noteStateNotSaved()V HSPLandroidx/fragment/app/FragmentManager;->onContainerAvailable(Landroidx/fragment/app/FragmentContainerView;)V HSPLandroidx/fragment/app/FragmentManager;->performPendingDeferredStart(Landroidx/fragment/app/FragmentStateManager;)V HSPLandroidx/fragment/app/FragmentManager;->removeRedundantOperationsAndExecute(Ljava/util/ArrayList;Ljava/util/ArrayList;)V +HSPLandroidx/fragment/app/FragmentManager;->saveAllStateInternal()Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentManager;->scheduleCommit()V HSPLandroidx/fragment/app/FragmentManager;->setExitAnimationOrder(Landroidx/fragment/app/Fragment;Z)V +HSPLandroidx/fragment/app/FragmentManager;->setFragmentResultListener(Ljava/lang/String;Landroidx/lifecycle/LifecycleOwner;Landroidx/fragment/app/FragmentResultListener;)V HSPLandroidx/fragment/app/FragmentManager;->setPrimaryNavigationFragment(Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentManager;->startPendingDeferredFragments()V HSPLandroidx/fragment/app/FragmentManager;->updateOnBackPressedCallbackEnabled()V HSPLandroidx/fragment/app/FragmentManagerImpl;->()V +HSPLandroidx/fragment/app/FragmentManagerState$1;->()V +HSPLandroidx/fragment/app/FragmentManagerState;->()V +HSPLandroidx/fragment/app/FragmentManagerState;->()V HSPLandroidx/fragment/app/FragmentManagerViewModel$1;->()V HSPLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; HSPLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; @@ -2545,6 +2577,9 @@ HSPLandroidx/fragment/app/FragmentManagerViewModel;->getViewModelStore(Landroidx HSPLandroidx/fragment/app/FragmentManagerViewModel;->isCleared()Z HSPLandroidx/fragment/app/FragmentManagerViewModel;->onCleared()V HSPLandroidx/fragment/app/FragmentManagerViewModel;->setIsStateSaved(Z)V +HSPLandroidx/fragment/app/FragmentState$1;->()V +HSPLandroidx/fragment/app/FragmentState;->()V +HSPLandroidx/fragment/app/FragmentState;->(Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentStateManager$1;->(Landroidx/fragment/app/FragmentStateManager;Landroid/view/View;)V HSPLandroidx/fragment/app/FragmentStateManager$1;->onViewAttachedToWindow(Landroid/view/View;)V HSPLandroidx/fragment/app/FragmentStateManager$2;->()V @@ -2557,11 +2592,16 @@ HSPLandroidx/fragment/app/FragmentStateManager;->create()V HSPLandroidx/fragment/app/FragmentStateManager;->createView()V HSPLandroidx/fragment/app/FragmentStateManager;->ensureInflatedView()V HSPLandroidx/fragment/app/FragmentStateManager;->getFragment()Landroidx/fragment/app/Fragment; +HSPLandroidx/fragment/app/FragmentStateManager;->isFragmentViewChild(Landroid/view/View;)Z HSPLandroidx/fragment/app/FragmentStateManager;->moveToExpectedState()V +HSPLandroidx/fragment/app/FragmentStateManager;->pause()V HSPLandroidx/fragment/app/FragmentStateManager;->restoreState(Ljava/lang/ClassLoader;)V HSPLandroidx/fragment/app/FragmentStateManager;->resume()V +HSPLandroidx/fragment/app/FragmentStateManager;->saveState()Landroid/os/Bundle; +HSPLandroidx/fragment/app/FragmentStateManager;->saveViewState()V HSPLandroidx/fragment/app/FragmentStateManager;->setFragmentManagerState(I)V HSPLandroidx/fragment/app/FragmentStateManager;->start()V +HSPLandroidx/fragment/app/FragmentStateManager;->stop()V HSPLandroidx/fragment/app/FragmentStore;->()V HSPLandroidx/fragment/app/FragmentStore;->addFragment(Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentStore;->burpActive()V @@ -2572,11 +2612,14 @@ HSPLandroidx/fragment/app/FragmentStore;->findFragmentById(I)Landroidx/fragment/ HSPLandroidx/fragment/app/FragmentStore;->findFragmentIndexInContainer(Landroidx/fragment/app/Fragment;)I HSPLandroidx/fragment/app/FragmentStore;->getActiveFragmentStateManagers()Ljava/util/List; HSPLandroidx/fragment/app/FragmentStore;->getActiveFragments()Ljava/util/List; +HSPLandroidx/fragment/app/FragmentStore;->getAllSavedState()Ljava/util/HashMap; HSPLandroidx/fragment/app/FragmentStore;->getFragmentStateManager(Ljava/lang/String;)Landroidx/fragment/app/FragmentStateManager; HSPLandroidx/fragment/app/FragmentStore;->getFragments()Ljava/util/List; HSPLandroidx/fragment/app/FragmentStore;->getNonConfig()Landroidx/fragment/app/FragmentManagerViewModel; HSPLandroidx/fragment/app/FragmentStore;->makeActive(Landroidx/fragment/app/FragmentStateManager;)V HSPLandroidx/fragment/app/FragmentStore;->moveToExpectedState()V +HSPLandroidx/fragment/app/FragmentStore;->saveActiveFragments()Ljava/util/ArrayList; +HSPLandroidx/fragment/app/FragmentStore;->saveAddedFragments()Ljava/util/ArrayList; HSPLandroidx/fragment/app/FragmentStore;->setNonConfig(Landroidx/fragment/app/FragmentManagerViewModel;)V HSPLandroidx/fragment/app/FragmentStore;->setSavedState(Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle; HSPLandroidx/fragment/app/FragmentTransaction$Op;->(ILandroidx/fragment/app/Fragment;)V @@ -2587,6 +2630,7 @@ HSPLandroidx/fragment/app/FragmentTransaction;->add(Landroid/view/ViewGroup;Land HSPLandroidx/fragment/app/FragmentTransaction;->addOp(Landroidx/fragment/app/FragmentTransaction$Op;)V HSPLandroidx/fragment/app/FragmentTransaction;->disallowAddToBackStack()Landroidx/fragment/app/FragmentTransaction; HSPLandroidx/fragment/app/FragmentTransaction;->doAddOp(ILandroidx/fragment/app/Fragment;Ljava/lang/String;I)V +HSPLandroidx/fragment/app/FragmentTransaction;->replace(ILandroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentTransaction; HSPLandroidx/fragment/app/FragmentTransaction;->replace(ILandroidx/fragment/app/Fragment;Ljava/lang/String;)Landroidx/fragment/app/FragmentTransaction; HSPLandroidx/fragment/app/FragmentTransaction;->setPrimaryNavigationFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentTransaction; HSPLandroidx/fragment/app/FragmentTransaction;->setReorderingAllowed(Z)Landroidx/fragment/app/FragmentTransaction; @@ -2596,6 +2640,8 @@ HSPLandroidx/fragment/app/FragmentViewLifecycleOwner;->getSavedStateRegistry()La HSPLandroidx/fragment/app/FragmentViewLifecycleOwner;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/fragment/app/FragmentViewLifecycleOwner;->initialize()V HSPLandroidx/fragment/app/FragmentViewLifecycleOwner;->performRestore(Landroid/os/Bundle;)V +HSPLandroidx/fragment/app/FragmentViewLifecycleOwner;->performSave(Landroid/os/Bundle;)V +HSPLandroidx/fragment/app/FragmentViewLifecycleOwner;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V HSPLandroidx/fragment/app/FragmentViewModelLazyKt;->access$viewModels$lambda-1(Lkotlin/Lazy;)Landroidx/lifecycle/ViewModelStoreOwner; HSPLandroidx/fragment/app/FragmentViewModelLazyKt;->createViewModelLazy(Landroidx/fragment/app/Fragment;Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; HSPLandroidx/fragment/app/FragmentViewModelLazyKt;->viewModels$lambda-1(Lkotlin/Lazy;)Landroidx/lifecycle/ViewModelStoreOwner; @@ -2648,6 +2694,7 @@ HSPLandroidx/fragment/app/SpecialEffectsController;->executePendingOperations()V HSPLandroidx/fragment/app/SpecialEffectsController;->findPendingOperation(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/SpecialEffectsController$Operation; HSPLandroidx/fragment/app/SpecialEffectsController;->findRunningOperation(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/SpecialEffectsController$Operation; HSPLandroidx/fragment/app/SpecialEffectsController;->forceCompleteAllOperations()V +HSPLandroidx/fragment/app/SpecialEffectsController;->forcePostponedExecutePendingOperations()V HSPLandroidx/fragment/app/SpecialEffectsController;->getAwaitingCompletionLifecycleImpact(Landroidx/fragment/app/FragmentStateManager;)Landroidx/fragment/app/SpecialEffectsController$Operation$LifecycleImpact; HSPLandroidx/fragment/app/SpecialEffectsController;->getOrCreateController(Landroid/view/ViewGroup;Landroidx/fragment/app/FragmentManager;)Landroidx/fragment/app/SpecialEffectsController; HSPLandroidx/fragment/app/SpecialEffectsController;->getOrCreateController(Landroid/view/ViewGroup;Landroidx/fragment/app/SpecialEffectsControllerFactory;)Landroidx/fragment/app/SpecialEffectsController; @@ -2665,6 +2712,13 @@ HSPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->( HSPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V HSPLandroidx/interpolator/view/animation/LookupTableInterpolator;->([F)V HSPLandroidx/interpolator/view/animation/LookupTableInterpolator;->getInterpolation(F)F +HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory$Companion;->()V +HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->()V +HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V +HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +HSPLandroidx/lifecycle/AndroidViewModel;->(Landroid/app/Application;)V HSPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->(Ljava/util/Map;)V HSPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->invokeCallbacks(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Object;)V HSPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->invokeMethodsForEvent(Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Object;)V @@ -2679,8 +2733,10 @@ HSPLandroidx/lifecycle/ClassesInfoCache;->getInfo(Ljava/lang/Class;)Landroidx/li HSPLandroidx/lifecycle/ClassesInfoCache;->hasLifecycleMethods(Ljava/lang/Class;)Z HSPLandroidx/lifecycle/ClassesInfoCache;->verifyAndPutHandler(Ljava/util/Map;Landroidx/lifecycle/ClassesInfoCache$MethodReference;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Class;)V HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onCreate(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V +HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onPause(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onResume(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onStart(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V +HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onStop(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;->()V HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleEventObserver;)V HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V @@ -2689,11 +2745,14 @@ HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landr HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V HSPLandroidx/lifecycle/LegacySavedStateHandleController;->()V HSPLandroidx/lifecycle/LegacySavedStateHandleController;->()V HSPLandroidx/lifecycle/LegacySavedStateHandleController;->attachHandleIfNeeded(Landroidx/lifecycle/ViewModel;Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V +HSPLandroidx/lifecycle/LegacySavedStateHandleController;->create(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandleController; +HSPLandroidx/lifecycle/LegacySavedStateHandleController;->tryToAddRecreator(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/lifecycle/Lifecycle$Event$Companion$WhenMappings;->()V HSPLandroidx/lifecycle/Lifecycle$Event$Companion;->()V HSPLandroidx/lifecycle/Lifecycle$Event$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -2733,6 +2792,7 @@ HSPLandroidx/lifecycle/LifecycleRegistry;->forwardPass(Landroidx/lifecycle/Lifec HSPLandroidx/lifecycle/LifecycleRegistry;->getCurrentState()Landroidx/lifecycle/Lifecycle$State; HSPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/LifecycleRegistry;->isSynced()Z +HSPLandroidx/lifecycle/LifecycleRegistry;->markState(Landroidx/lifecycle/Lifecycle$State;)V HSPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V HSPLandroidx/lifecycle/LifecycleRegistry;->popParentState()V HSPLandroidx/lifecycle/LifecycleRegistry;->pushParentState(Landroidx/lifecycle/Lifecycle$State;)V @@ -2780,6 +2840,7 @@ HSPLandroidx/lifecycle/MediatorLiveData$Source;->unplug()V HSPLandroidx/lifecycle/MediatorLiveData;->()V HSPLandroidx/lifecycle/MediatorLiveData;->addSource(Landroidx/lifecycle/LiveData;Landroidx/lifecycle/Observer;)V HSPLandroidx/lifecycle/MediatorLiveData;->onActive()V +HSPLandroidx/lifecycle/MediatorLiveData;->onInactive()V HSPLandroidx/lifecycle/MediatorLiveData;->removeSource(Landroidx/lifecycle/LiveData;)V HSPLandroidx/lifecycle/MutableLiveData;->()V HSPLandroidx/lifecycle/MutableLiveData;->(Ljava/lang/Object;)V @@ -2839,6 +2900,7 @@ HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreDestroye HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPrePaused(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreStopped(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ReportFragment;->()V @@ -2854,8 +2916,23 @@ HSPLandroidx/lifecycle/ReportFragment;->onPause()V HSPLandroidx/lifecycle/ReportFragment;->onResume()V HSPLandroidx/lifecycle/ReportFragment;->onStart()V HSPLandroidx/lifecycle/ReportFragment;->onStop()V +HSPLandroidx/lifecycle/SavedStateHandle$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/SavedStateHandle;)V +HSPLandroidx/lifecycle/SavedStateHandle$Companion;->()V +HSPLandroidx/lifecycle/SavedStateHandle$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/lifecycle/SavedStateHandle$Companion;->createHandle(Landroid/os/Bundle;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandle; +HSPLandroidx/lifecycle/SavedStateHandle$Companion;->validateValue(Ljava/lang/Object;)Z +HSPLandroidx/lifecycle/SavedStateHandle;->()V +HSPLandroidx/lifecycle/SavedStateHandle;->()V +HSPLandroidx/lifecycle/SavedStateHandle;->access$getACCEPTABLE_CLASSES$cp()[Ljava/lang/Class; +HSPLandroidx/lifecycle/SavedStateHandle;->get(Ljava/lang/String;)Ljava/lang/Object; +HSPLandroidx/lifecycle/SavedStateHandle;->savedStateProvider()Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; +HSPLandroidx/lifecycle/SavedStateHandle;->set(Ljava/lang/String;Ljava/lang/Object;)V HSPLandroidx/lifecycle/SavedStateHandleAttacher;->(Landroidx/lifecycle/SavedStateHandlesProvider;)V HSPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +HSPLandroidx/lifecycle/SavedStateHandleController;->(Ljava/lang/String;Landroidx/lifecycle/SavedStateHandle;)V +HSPLandroidx/lifecycle/SavedStateHandleController;->attachToLifecycle(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V +HSPLandroidx/lifecycle/SavedStateHandleController;->getHandle()Landroidx/lifecycle/SavedStateHandle; +HSPLandroidx/lifecycle/SavedStateHandleController;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;->()V HSPLandroidx/lifecycle/SavedStateHandleSupport$SAVED_STATE_REGISTRY_OWNER_KEY$1;->()V HSPLandroidx/lifecycle/SavedStateHandleSupport$VIEW_MODEL_STORE_OWNER_KEY$1;->()V @@ -2872,11 +2949,14 @@ HSPLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;->invoke()Ljava/lan HSPLandroidx/lifecycle/SavedStateHandlesProvider;->(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/ViewModelStoreOwner;)V HSPLandroidx/lifecycle/SavedStateHandlesProvider;->getViewModel()Landroidx/lifecycle/SavedStateHandlesVM; HSPLandroidx/lifecycle/SavedStateHandlesProvider;->performRestore()V +HSPLandroidx/lifecycle/SavedStateHandlesProvider;->saveState()Landroid/os/Bundle; HSPLandroidx/lifecycle/SavedStateHandlesVM;->()V +HSPLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/Map; HSPLandroidx/lifecycle/SavedStateViewModelFactory;->(Landroid/app/Application;Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V HSPLandroidx/lifecycle/SavedStateViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/SavedStateViewModelFactory;->onRequery(Landroidx/lifecycle/ViewModel;)V HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->()V +HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->access$getANDROID_VIEWMODEL_SIGNATURE$p()Ljava/util/List; HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->access$getVIEWMODEL_SIGNATURE$p()Ljava/util/List; HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->findMatchingConstructor(Ljava/lang/Class;Ljava/util/List;)Ljava/lang/reflect/Constructor; HSPLandroidx/lifecycle/Transformations$map$1;->(Landroidx/lifecycle/MediatorLiveData;Lkotlin/jvm/functions/Function1;)V @@ -2895,6 +2975,7 @@ HSPLandroidx/lifecycle/ViewModel;->()V HSPLandroidx/lifecycle/ViewModel;->clear()V HSPLandroidx/lifecycle/ViewModel;->getTag(Ljava/lang/String;)Ljava/lang/Object; HSPLandroidx/lifecycle/ViewModel;->onCleared()V +HSPLandroidx/lifecycle/ViewModel;->setTagIfAbsent(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/lifecycle/ViewModelLazy;->(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/lifecycle/ViewModelLazy;->getValue()Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/ViewModelLazy;->getValue()Ljava/lang/Object; @@ -3434,6 +3515,7 @@ HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->(Ljava/lang/O HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->equals(Ljava/lang/Object;)Z HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->invoke(ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->iterationFinished(Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V +HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->release(Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V HSPLandroidx/media3/common/util/ListenerSet;->$r8$lambda$AlaP-gu7Lfe4GahLPmVnd_l2pLA(Ljava/util/concurrent/CopyOnWriteArraySet;ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet;->$r8$lambda$bio3pd12v5B_9b5UeFaPn9XBQ90(Landroidx/media3/common/util/ListenerSet;Landroid/os/Message;)Z HSPLandroidx/media3/common/util/ListenerSet;->(Landroid/os/Looper;Landroidx/media3/common/util/Clock;Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V @@ -3445,6 +3527,7 @@ HSPLandroidx/media3/common/util/ListenerSet;->flushEvents()V HSPLandroidx/media3/common/util/ListenerSet;->handleMessage(Landroid/os/Message;)Z HSPLandroidx/media3/common/util/ListenerSet;->lambda$queueEvent$0(Ljava/util/concurrent/CopyOnWriteArraySet;ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet;->queueEvent(ILandroidx/media3/common/util/ListenerSet$Event;)V +HSPLandroidx/media3/common/util/ListenerSet;->release()V HSPLandroidx/media3/common/util/ListenerSet;->sendEvent(ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet;->verifyCurrentThread()V HSPLandroidx/media3/common/util/Log$Logger$1;->()V @@ -3501,12 +3584,15 @@ HSPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline4;->m(Land HSPLandroidx/media3/common/util/Util;->()V HSPLandroidx/media3/common/util/Util;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/media3/common/util/Util;->createHandler(Landroid/os/Looper;Landroid/os/Handler$Callback;)Landroid/os/Handler; +HSPLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper()Landroid/os/Handler; +HSPLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper(Landroid/os/Handler$Callback;)Landroid/os/Handler; HSPLandroidx/media3/common/util/Util;->generateAudioSessionIdV21(Landroid/content/Context;)I HSPLandroidx/media3/common/util/Util;->getCountryCode(Landroid/content/Context;)Ljava/lang/String; HSPLandroidx/media3/common/util/Util;->getCurrentDisplayModeSize(Landroid/content/Context;)Landroid/graphics/Point; HSPLandroidx/media3/common/util/Util;->getCurrentDisplayModeSize(Landroid/content/Context;Landroid/view/Display;)Landroid/graphics/Point; HSPLandroidx/media3/common/util/Util;->getCurrentOrMainLooper()Landroid/os/Looper; HSPLandroidx/media3/common/util/Util;->getDisplaySizeV23(Landroid/view/Display;Landroid/graphics/Point;)V +HSPLandroidx/media3/common/util/Util;->getStreamTypeForAudioUsage(I)I HSPLandroidx/media3/common/util/Util;->intToStringMaxRadix(I)Ljava/lang/String; HSPLandroidx/media3/common/util/Util;->isAutomotive(Landroid/content/Context;)Z HSPLandroidx/media3/common/util/Util;->isEncodingLinearPcm(I)Z @@ -3529,6 +3615,11 @@ HSPLandroidx/media3/decoder/DecoderInputBuffer;->newNoDataInstance()Landroidx/me HSPLandroidx/media3/exoplayer/AudioBecomingNoisyManager$AudioBecomingNoisyReceiver;->(Landroidx/media3/exoplayer/AudioBecomingNoisyManager;Landroid/os/Handler;Landroidx/media3/exoplayer/AudioBecomingNoisyManager$EventListener;)V HSPLandroidx/media3/exoplayer/AudioBecomingNoisyManager;->(Landroid/content/Context;Landroid/os/Handler;Landroidx/media3/exoplayer/AudioBecomingNoisyManager$EventListener;)V HSPLandroidx/media3/exoplayer/AudioBecomingNoisyManager;->setEnabled(Z)V +HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline1;->m(I)Landroid/media/AudioFocusRequest$Builder; +HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline2;->m()V +HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline3;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder; +HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline5;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder; +HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline6;->m(Landroid/media/AudioFocusRequest$Builder;)Landroid/media/AudioFocusRequest; HSPLandroidx/media3/exoplayer/AudioFocusManager$AudioFocusListener;->(Landroidx/media3/exoplayer/AudioFocusManager;Landroid/os/Handler;)V HSPLandroidx/media3/exoplayer/AudioFocusManager;->(Landroid/content/Context;Landroid/os/Handler;Landroidx/media3/exoplayer/AudioFocusManager$PlayerControl;)V HSPLandroidx/media3/exoplayer/AudioFocusManager;->abandonAudioFocusIfHeld()V @@ -3859,6 +3950,7 @@ HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$$ExternalSyntheticApiMod HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$$ExternalSyntheticApiModelOutline2;->m(Landroid/media/MediaCodecInfo;)Z HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$$ExternalSyntheticApiModelOutline3;->m(Landroid/media/MediaCodecInfo;)Z HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$CodecKey;->(Ljava/lang/String;ZZ)V +HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$CodecKey;->equals(Ljava/lang/Object;)Z HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$CodecKey;->hashCode()I HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$MediaCodecListCompatV21;->(ZZ)V HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$MediaCodecListCompatV21;->ensureMediaCodecInfosInitialized()V @@ -4044,7 +4136,10 @@ HSPLandroidx/media3/session/CommandButton;->(Landroidx/media3/session/Sess HSPLandroidx/media3/session/CommandButton;->(Landroidx/media3/session/SessionCommand;IILjava/lang/CharSequence;Landroid/os/Bundle;ZLandroidx/media3/session/CommandButton$1;)V HSPLandroidx/media3/session/CommandButton;->fromBundle(Landroid/os/Bundle;)Landroidx/media3/session/CommandButton; HSPLandroidx/media3/session/CommandButton;->toBundle()Landroid/os/Bundle; +HSPLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V +HSPLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->run()V HSPLandroidx/media3/session/ConnectedControllersManager$ConnectedControllerRecord;->(Ljava/lang/Object;Landroidx/media3/session/SequencedFutureManager;Landroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)V +HSPLandroidx/media3/session/ConnectedControllersManager;->$r8$lambda$Vom81RksdvuIVXyQfAu6pd1M7BY(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/ConnectedControllersManager;->(Landroidx/media3/session/MediaSessionImpl;)V HSPLandroidx/media3/session/ConnectedControllersManager;->addController(Ljava/lang/Object;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)V HSPLandroidx/media3/session/ConnectedControllersManager;->getAvailablePlayerCommands(Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/common/Player$Commands; @@ -4053,6 +4148,10 @@ HSPLandroidx/media3/session/ConnectedControllersManager;->getController(Ljava/la HSPLandroidx/media3/session/ConnectedControllersManager;->getSequencedFutureManager(Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/session/SequencedFutureManager; HSPLandroidx/media3/session/ConnectedControllersManager;->getSequencedFutureManager(Ljava/lang/Object;)Landroidx/media3/session/SequencedFutureManager; HSPLandroidx/media3/session/ConnectedControllersManager;->isConnected(Landroidx/media3/session/MediaSession$ControllerInfo;)Z +HSPLandroidx/media3/session/ConnectedControllersManager;->isSessionCommandAvailable(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;)Z +HSPLandroidx/media3/session/ConnectedControllersManager;->lambda$removeController$0(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V +HSPLandroidx/media3/session/ConnectedControllersManager;->removeController(Landroidx/media3/session/MediaSession$ControllerInfo;)V +HSPLandroidx/media3/session/ConnectedControllersManager;->removeController(Ljava/lang/Object;)V HSPLandroidx/media3/session/ConnectionRequest$$ExternalSyntheticLambda0;->()V HSPLandroidx/media3/session/ConnectionRequest$$ExternalSyntheticLambda0;->fromBundle(Landroid/os/Bundle;)Landroidx/media3/common/Bundleable; HSPLandroidx/media3/session/ConnectionRequest;->$r8$lambda$2A3KvllqTYxjJdHPpYs14G1Hda8(Landroid/os/Bundle;)Landroidx/media3/session/ConnectionRequest; @@ -4081,9 +4180,12 @@ HSPLandroidx/media3/session/IMediaSession$Stub;->asInterface(Landroid/os/IBinder HSPLandroidx/media3/session/IMediaSessionService$Stub;->()V HSPLandroidx/media3/session/IMediaSessionService$Stub;->asBinder()Landroid/os/IBinder; HSPLandroidx/media3/session/IMediaSessionService$Stub;->asInterface(Landroid/os/IBinder;)Landroidx/media3/session/IMediaSessionService; +HSPLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaController;)V +HSPLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V HSPLandroidx/media3/session/MediaController$Builder$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaControllerHolder;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Builder$$ExternalSyntheticLambda0;->run()V HSPLandroidx/media3/session/MediaController$Builder$1;->(Landroidx/media3/session/MediaController$Builder;)V +HSPLandroidx/media3/session/MediaController$Builder$1;->onDisconnected(Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Builder$1;->onSetCustomLayout(Landroidx/media3/session/MediaController;Ljava/util/List;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaController$Builder;->$r8$lambda$zyVzcB3Sb8jhbB9a-kIcWAaXt7s(Landroidx/media3/session/MediaControllerHolder;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Builder;->(Landroid/content/Context;Landroidx/media3/session/SessionToken;)V @@ -4091,7 +4193,9 @@ HSPLandroidx/media3/session/MediaController$Builder;->buildAsync()Lcom/google/co HSPLandroidx/media3/session/MediaController$Builder;->lambda$buildAsync$0(Landroidx/media3/session/MediaControllerHolder;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Builder;->setApplicationLooper(Landroid/os/Looper;)Landroidx/media3/session/MediaController$Builder; HSPLandroidx/media3/session/MediaController$Builder;->setListener(Landroidx/media3/session/MediaController$Listener;)Landroidx/media3/session/MediaController$Builder; +HSPLandroidx/media3/session/MediaController$Listener$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaController$Listener;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Listener$-CC;->$default$onSetCustomLayout(Landroidx/media3/session/MediaController$Listener;Landroidx/media3/session/MediaController;Ljava/util/List;)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaController;->$r8$lambda$7Poy_IVrU20FjlOzoqG4RzKma48(Landroidx/media3/session/MediaController;Landroidx/media3/session/MediaController$Listener;)V HSPLandroidx/media3/session/MediaController;->(Landroid/content/Context;Landroidx/media3/session/SessionToken;Landroid/os/Bundle;Landroidx/media3/session/MediaController$Listener;Landroid/os/Looper;Landroidx/media3/session/MediaController$ConnectionCallback;Landroidx/media3/common/util/BitmapLoader;)V HSPLandroidx/media3/session/MediaController;->addListener(Landroidx/media3/common/Player$Listener;)V HSPLandroidx/media3/session/MediaController;->createImpl(Landroid/content/Context;Landroidx/media3/session/SessionToken;Landroid/os/Bundle;Landroid/os/Looper;Landroidx/media3/common/util/BitmapLoader;)Landroidx/media3/session/MediaController$MediaControllerImpl; @@ -4101,8 +4205,12 @@ HSPLandroidx/media3/session/MediaController;->getCurrentTimeline()Landroidx/medi HSPLandroidx/media3/session/MediaController;->getPlaybackState()I HSPLandroidx/media3/session/MediaController;->isConnected()Z HSPLandroidx/media3/session/MediaController;->isPlaying()Z +HSPLandroidx/media3/session/MediaController;->lambda$release$0(Landroidx/media3/session/MediaController$Listener;)V HSPLandroidx/media3/session/MediaController;->notifyAccepted()V HSPLandroidx/media3/session/MediaController;->notifyControllerListener(Landroidx/media3/common/util/Consumer;)V +HSPLandroidx/media3/session/MediaController;->release()V +HSPLandroidx/media3/session/MediaController;->runOnApplicationLooper(Ljava/lang/Runnable;)V +HSPLandroidx/media3/session/MediaController;->sendCustomCommand(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaController;->verifyApplicationThread()V HSPLandroidx/media3/session/MediaControllerHolder$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaControllerHolder;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaControllerHolder$$ExternalSyntheticLambda0;->run()V @@ -4122,35 +4230,52 @@ HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda118; HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda118;->run()V HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda38;->(Landroidx/media3/session/MediaControllerImplBase;)V HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda39;->(Landroidx/media3/session/MediaControllerImplBase;)V +HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda41;->(Landroidx/media3/session/MediaControllerImplBase;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)V +HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda41;->run(Landroidx/media3/session/IMediaSession;I)V +HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda81;->(Landroidx/media3/session/MediaControllerImplBase;)V +HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda82;->(Landroidx/media3/session/MediaControllerImplBase;I)V +HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda82;->run()V HSPLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;)V HSPLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;->(Landroidx/media3/session/MediaControllerImplBase;Landroid/os/Looper;)V +HSPLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;->release()V HSPLandroidx/media3/session/MediaControllerImplBase$SessionServiceConnection;->(Landroidx/media3/session/MediaControllerImplBase;Landroid/os/Bundle;)V HSPLandroidx/media3/session/MediaControllerImplBase$SessionServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V HSPLandroidx/media3/session/MediaControllerImplBase$SurfaceCallback;->(Landroidx/media3/session/MediaControllerImplBase;)V HSPLandroidx/media3/session/MediaControllerImplBase$SurfaceCallback;->(Landroidx/media3/session/MediaControllerImplBase;Landroidx/media3/session/MediaControllerImplBase$1;)V +HSPLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$8ePI85Zvn-Y2ZOUzRdQ90F2A8_A(Landroidx/media3/session/MediaControllerImplBase;I)V HSPLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$h98tQpKckSTD3e3SDer5Lqnajhs(Landroidx/media3/session/MediaControllerImplBase;Lcom/google/common/util/concurrent/ListenableFuture;I)V +HSPLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$mXQX_Ogg1Zjg5n58ylw_9v5Iv2Y(Landroidx/media3/session/MediaControllerImplBase;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/IMediaSession;I)V HSPLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$vt4LFlOFWDb7FYoJD4Ps6YPbQNk(Landroidx/media3/session/MediaControllerImplBase;Ljava/util/List;ILandroidx/media3/session/MediaController$Listener;)V HSPLandroidx/media3/session/MediaControllerImplBase;->(Landroid/content/Context;Landroidx/media3/session/MediaController;Landroidx/media3/session/SessionToken;Landroid/os/Bundle;Landroid/os/Looper;)V HSPLandroidx/media3/session/MediaControllerImplBase;->access$300(Landroidx/media3/session/MediaControllerImplBase;)Landroidx/media3/session/SessionToken; HSPLandroidx/media3/session/MediaControllerImplBase;->addListener(Landroidx/media3/common/Player$Listener;)V HSPLandroidx/media3/session/MediaControllerImplBase;->connect()V HSPLandroidx/media3/session/MediaControllerImplBase;->createIntersectedCommands(Landroidx/media3/common/Player$Commands;Landroidx/media3/common/Player$Commands;)Landroidx/media3/common/Player$Commands; +HSPLandroidx/media3/session/MediaControllerImplBase;->dispatchRemoteSessionTask(Landroidx/media3/session/IMediaSession;Landroidx/media3/session/MediaControllerImplBase$RemoteSessionTask;Z)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaControllerImplBase;->dispatchRemoteSessionTaskWithSessionCommand(Landroidx/media3/session/SessionCommand;Landroidx/media3/session/MediaControllerImplBase$RemoteSessionTask;)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaControllerImplBase;->dispatchRemoteSessionTaskWithSessionCommandInternal(ILandroidx/media3/session/SessionCommand;Landroidx/media3/session/MediaControllerImplBase$RemoteSessionTask;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaControllerImplBase;->getContext()Landroid/content/Context; HSPLandroidx/media3/session/MediaControllerImplBase;->getCurrentTimeline()Landroidx/media3/common/Timeline; HSPLandroidx/media3/session/MediaControllerImplBase;->getInstance()Landroidx/media3/session/MediaController; HSPLandroidx/media3/session/MediaControllerImplBase;->getPlaybackState()I +HSPLandroidx/media3/session/MediaControllerImplBase;->getSessionInterfaceWithSessionCommandIfAble(Landroidx/media3/session/SessionCommand;)Landroidx/media3/session/IMediaSession; HSPLandroidx/media3/session/MediaControllerImplBase;->isConnected()Z HSPLandroidx/media3/session/MediaControllerImplBase;->isPlaying()Z HSPLandroidx/media3/session/MediaControllerImplBase;->isReleased()Z HSPLandroidx/media3/session/MediaControllerImplBase;->lambda$onSetCustomLayout$116(Ljava/util/List;ILandroidx/media3/session/MediaController$Listener;)V HSPLandroidx/media3/session/MediaControllerImplBase;->lambda$sendControllerResultWhenReady$84(Lcom/google/common/util/concurrent/ListenableFuture;I)V +HSPLandroidx/media3/session/MediaControllerImplBase;->lambda$sendCustomCommand$21(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/IMediaSession;I)V +HSPLandroidx/media3/session/MediaControllerImplBase;->lambda$setFutureResult$83(I)V HSPLandroidx/media3/session/MediaControllerImplBase;->onConnected(Landroidx/media3/session/ConnectionState;)V HSPLandroidx/media3/session/MediaControllerImplBase;->onPlayerInfoChanged(Landroidx/media3/session/PlayerInfo;Landroidx/media3/session/PlayerInfo$BundlingExclusions;)V HSPLandroidx/media3/session/MediaControllerImplBase;->onSetCustomLayout(ILjava/util/List;)V +HSPLandroidx/media3/session/MediaControllerImplBase;->release()V HSPLandroidx/media3/session/MediaControllerImplBase;->requestConnectToService()Z HSPLandroidx/media3/session/MediaControllerImplBase;->requestConnectToSession(Landroid/os/Bundle;)Z HSPLandroidx/media3/session/MediaControllerImplBase;->sendControllerResult(ILandroidx/media3/session/SessionResult;)V HSPLandroidx/media3/session/MediaControllerImplBase;->sendControllerResultWhenReady(ILcom/google/common/util/concurrent/ListenableFuture;)V +HSPLandroidx/media3/session/MediaControllerImplBase;->sendCustomCommand(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaControllerImplBase;->setFutureResult(ILjava/lang/Object;)V HSPLandroidx/media3/session/MediaControllerStub$$ExternalSyntheticLambda0;->(Landroidx/media3/session/PlayerInfo;Landroidx/media3/session/PlayerInfo$BundlingExclusions;)V HSPLandroidx/media3/session/MediaControllerStub$$ExternalSyntheticLambda0;->run(Landroidx/media3/session/MediaControllerImplBase;)V HSPLandroidx/media3/session/MediaControllerStub$$ExternalSyntheticLambda13;->(Landroidx/media3/session/MediaControllerImplBase;Landroidx/media3/session/MediaControllerStub$ControllerTask;)V @@ -4171,7 +4296,9 @@ HSPLandroidx/media3/session/MediaControllerStub;->lambda$onPlayerInfoChangedWith HSPLandroidx/media3/session/MediaControllerStub;->lambda$onSetCustomLayout$2(ILjava/util/List;Landroidx/media3/session/MediaControllerImplBase;)V HSPLandroidx/media3/session/MediaControllerStub;->onConnected(ILandroid/os/Bundle;)V HSPLandroidx/media3/session/MediaControllerStub;->onPlayerInfoChangedWithExclusions(ILandroid/os/Bundle;Landroid/os/Bundle;)V +HSPLandroidx/media3/session/MediaControllerStub;->onSessionResult(ILandroid/os/Bundle;)V HSPLandroidx/media3/session/MediaControllerStub;->onSetCustomLayout(ILjava/util/List;)V +HSPLandroidx/media3/session/MediaControllerStub;->setControllerFutureResult(ILjava/lang/Object;)V HSPLandroidx/media3/session/MediaNotificationManager$$ExternalSyntheticLambda3;->(Landroid/os/Handler;)V HSPLandroidx/media3/session/MediaNotificationManager$$ExternalSyntheticLambda3;->execute(Ljava/lang/Runnable;)V HSPLandroidx/media3/session/MediaNotificationManager$$ExternalSyntheticLambda6;->(Landroidx/media3/session/MediaNotificationManager;Lcom/google/common/util/concurrent/ListenableFuture;Landroidx/media3/session/MediaNotificationManager$MediaControllerListener;Landroidx/media3/session/MediaSession;)V @@ -4200,6 +4327,7 @@ HSPLandroidx/media3/session/MediaSession$Builder;->setId(Ljava/lang/String;)Land HSPLandroidx/media3/session/MediaSession$BuilderBase;->(Landroid/content/Context;Landroidx/media3/common/Player;Landroidx/media3/session/MediaSession$Callback;)V HSPLandroidx/media3/session/MediaSession$BuilderBase;->setCallback(Landroidx/media3/session/MediaSession$Callback;)Landroidx/media3/session/MediaSession$BuilderBase; HSPLandroidx/media3/session/MediaSession$BuilderBase;->setId(Ljava/lang/String;)Landroidx/media3/session/MediaSession$BuilderBase; +HSPLandroidx/media3/session/MediaSession$Callback$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaSession$Callback;Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/MediaSession$ConnectionResult;->(ZLandroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)V HSPLandroidx/media3/session/MediaSession$ConnectionResult;->accept(Landroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)Landroidx/media3/session/MediaSession$ConnectionResult; HSPLandroidx/media3/session/MediaSession$ControllerInfo;->(Landroidx/media/MediaSessionManager$RemoteUserInfo;IIZLandroidx/media3/session/MediaSession$ControllerCb;Landroid/os/Bundle;)V @@ -4265,6 +4393,8 @@ HSPLandroidx/media3/session/MediaSessionImpl;->lambda$new$0(Landroidx/media3/ses HSPLandroidx/media3/session/MediaSessionImpl;->lambda$setCustomLayout$4(Ljava/util/List;Landroidx/media3/session/MediaSession$ControllerCb;I)V HSPLandroidx/media3/session/MediaSessionImpl;->lambda$setPlayerInternal$1(Landroidx/media3/session/PlayerWrapper;Landroidx/media3/session/PlayerWrapper;Landroidx/media3/session/MediaSession$ControllerCb;I)V HSPLandroidx/media3/session/MediaSessionImpl;->onConnectOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/session/MediaSession$ConnectionResult; +HSPLandroidx/media3/session/MediaSessionImpl;->onCustomCommandOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaSessionImpl;->onDisconnectedOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/MediaSessionImpl;->onPostConnectOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/MediaSessionImpl;->schedulePeriodicSessionPositionInfoChanges()V HSPLandroidx/media3/session/MediaSessionImpl;->setCustomLayout(Landroidx/media3/session/MediaSession$ControllerInfo;Ljava/util/List;)Lcom/google/common/util/concurrent/ListenableFuture; @@ -4323,21 +4453,53 @@ HSPLandroidx/media3/session/MediaSessionService;->onUpdateNotification(Landroidx HSPLandroidx/media3/session/MediaSessionService;->onUpdateNotificationInternal(Landroidx/media3/session/MediaSession;Z)Z HSPLandroidx/media3/session/MediaSessionService;->setListener(Landroidx/media3/session/MediaSessionService$Listener;)V HSPLandroidx/media3/session/MediaSessionService;->setMediaNotificationProvider(Landroidx/media3/session/MediaNotification$Provider;)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->run()V HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda19;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/IMediaController;)V HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda19;->run()V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda25;->(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda25;->run(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Ljava/lang/Object; +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda68;->(Landroidx/media3/session/MediaSessionStub$SessionTask;)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda68;->run(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Ljava/lang/Object; +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda72;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;IILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda72;->run()V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda76;->(Landroidx/media3/session/MediaSession$ControllerInfo;I)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda76;->accept(Ljava/lang/Object;)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda81;->(Landroidx/media3/session/MediaSessionImpl;Lcom/google/common/util/concurrent/SettableFuture;Landroidx/media3/common/util/Consumer;Lcom/google/common/util/concurrent/ListenableFuture;)V +HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda81;->run()V HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->(Landroidx/media3/session/IMediaController;)V HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->getCallbackBinder()Landroid/os/IBinder; HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->hashCode()I HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->onPlayerInfoChanged(ILandroidx/media3/session/PlayerInfo;Landroidx/media3/common/Player$Commands;ZZI)V +HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->onSessionResult(ILandroidx/media3/session/SessionResult;)V HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->setCustomLayout(ILjava/util/List;)V HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$5u7ZOZu1E3qtXLejtiVCfQspblM(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/IMediaController;)V +HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$RagmTrsP9kOCYea3J9OJn28bc5c(Landroidx/media3/session/MediaSession$ControllerInfo;ILcom/google/common/util/concurrent/ListenableFuture;)V +HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$Uz2_vcr_OU9Iuz1uNRDrsZj31fE(Landroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$VrGmk0e1imzW80ACT-qbuXd3aCA(Landroidx/media3/session/MediaSessionImpl;Lcom/google/common/util/concurrent/SettableFuture;Landroidx/media3/common/util/Consumer;Lcom/google/common/util/concurrent/ListenableFuture;)V +HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$g1w8aI30ygWD3xJmF-4pacDXEWs(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$p6L8lBmsKUAaiq4jQwn1KSWoNSE(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V +HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$r3ns0uu-mjbAk0TkMAI7ay4cBrI(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;IILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;)V HSPLandroidx/media3/session/MediaSessionStub;->(Landroidx/media3/session/MediaSessionImpl;)V HSPLandroidx/media3/session/MediaSessionStub;->connect(Landroidx/media3/session/IMediaController;IILjava/lang/String;IILandroid/os/Bundle;)V HSPLandroidx/media3/session/MediaSessionStub;->connect(Landroidx/media3/session/IMediaController;ILandroid/os/Bundle;)V +HSPLandroidx/media3/session/MediaSessionStub;->dispatchSessionTaskWithSessionCommand(Landroidx/media3/session/IMediaController;ILandroidx/media3/session/SessionCommand;ILandroidx/media3/session/MediaSessionStub$SessionTask;)V +HSPLandroidx/media3/session/MediaSessionStub;->dispatchSessionTaskWithSessionCommand(Landroidx/media3/session/IMediaController;ILandroidx/media3/session/SessionCommand;Landroidx/media3/session/MediaSessionStub$SessionTask;)V HSPLandroidx/media3/session/MediaSessionStub;->generateAndCacheUniqueTrackGroupIds(Landroidx/media3/session/PlayerInfo;)Landroidx/media3/session/PlayerInfo; HSPLandroidx/media3/session/MediaSessionStub;->getConnectedControllersManager()Landroidx/media3/session/ConnectedControllersManager; +HSPLandroidx/media3/session/MediaSessionStub;->handleSessionTaskWhenReady(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;ILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/common/util/Consumer;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaSessionStub;->lambda$connect$17(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/IMediaController;)V +HSPLandroidx/media3/session/MediaSessionStub;->lambda$dispatchSessionTaskWithSessionCommand$15(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;IILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;)V +HSPLandroidx/media3/session/MediaSessionStub;->lambda$handleSessionTaskWhenReady$16(Landroidx/media3/session/MediaSessionImpl;Lcom/google/common/util/concurrent/SettableFuture;Landroidx/media3/common/util/Consumer;Lcom/google/common/util/concurrent/ListenableFuture;)V +HSPLandroidx/media3/session/MediaSessionStub;->lambda$onCustomCommand$25(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLandroidx/media3/session/MediaSessionStub;->lambda$release$19(Landroidx/media3/session/IMediaController;)V +HSPLandroidx/media3/session/MediaSessionStub;->lambda$sendSessionResultWhenReady$2(Landroidx/media3/session/MediaSession$ControllerInfo;ILcom/google/common/util/concurrent/ListenableFuture;)V +HSPLandroidx/media3/session/MediaSessionStub;->lambda$sendSessionResultWhenReady$3(Landroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaSessionStub;->onControllerResult(Landroidx/media3/session/IMediaController;ILandroid/os/Bundle;)V +HSPLandroidx/media3/session/MediaSessionStub;->onCustomCommand(Landroidx/media3/session/IMediaController;ILandroid/os/Bundle;Landroid/os/Bundle;)V +HSPLandroidx/media3/session/MediaSessionStub;->release(Landroidx/media3/session/IMediaController;I)V +HSPLandroidx/media3/session/MediaSessionStub;->sendSessionResult(Landroidx/media3/session/MediaSession$ControllerInfo;ILandroidx/media3/session/SessionResult;)V +HSPLandroidx/media3/session/MediaSessionStub;->sendSessionResultWhenReady(Landroidx/media3/session/MediaSessionStub$SessionTask;)Landroidx/media3/session/MediaSessionStub$SessionTask; HSPLandroidx/media3/session/MediaUtils;->()V HSPLandroidx/media3/session/MediaUtils;->convertToAudioAttributesCompat(Landroidx/media3/common/AudioAttributes;)Landroidx/media/AudioAttributesCompat; HSPLandroidx/media3/session/MediaUtils;->convertToPlaybackStateCompatRepeatMode(I)I @@ -4435,13 +4597,16 @@ HSPLandroidx/media3/session/SequencedFutureManager$SequencedFuture;->getSequence HSPLandroidx/media3/session/SequencedFutureManager$SequencedFuture;->set(Ljava/lang/Object;)Z HSPLandroidx/media3/session/SequencedFutureManager;->()V HSPLandroidx/media3/session/SequencedFutureManager;->createSequencedFuture(Ljava/lang/Object;)Landroidx/media3/session/SequencedFutureManager$SequencedFuture; +HSPLandroidx/media3/session/SequencedFutureManager;->lazyRelease(JLjava/lang/Runnable;)V HSPLandroidx/media3/session/SequencedFutureManager;->obtainNextSequenceNumber()I +HSPLandroidx/media3/session/SequencedFutureManager;->release()V HSPLandroidx/media3/session/SequencedFutureManager;->setFutureResult(ILjava/lang/Object;)V HSPLandroidx/media3/session/SessionCommand$$ExternalSyntheticLambda0;->()V HSPLandroidx/media3/session/SessionCommand$$ExternalSyntheticLambda0;->fromBundle(Landroid/os/Bundle;)Landroidx/media3/common/Bundleable; HSPLandroidx/media3/session/SessionCommand;->$r8$lambda$-vVtmRPGIu-NOoGvOcmGBqPpE2A(Landroid/os/Bundle;)Landroidx/media3/session/SessionCommand; HSPLandroidx/media3/session/SessionCommand;->()V HSPLandroidx/media3/session/SessionCommand;->(Ljava/lang/String;Landroid/os/Bundle;)V +HSPLandroidx/media3/session/SessionCommand;->equals(Ljava/lang/Object;)Z HSPLandroidx/media3/session/SessionCommand;->hashCode()I HSPLandroidx/media3/session/SessionCommand;->lambda$static$0(Landroid/os/Bundle;)Landroidx/media3/session/SessionCommand; HSPLandroidx/media3/session/SessionCommand;->toBundle()Landroid/os/Bundle; @@ -4454,6 +4619,7 @@ HSPLandroidx/media3/session/SessionCommands;->$r8$lambda$QT7G-P2DLDMA1OfVE7mMOAs HSPLandroidx/media3/session/SessionCommands;->()V HSPLandroidx/media3/session/SessionCommands;->(Ljava/util/Collection;)V HSPLandroidx/media3/session/SessionCommands;->(Ljava/util/Collection;Landroidx/media3/session/SessionCommands$1;)V +HSPLandroidx/media3/session/SessionCommands;->contains(Landroidx/media3/session/SessionCommand;)Z HSPLandroidx/media3/session/SessionCommands;->lambda$static$0(Landroid/os/Bundle;)Landroidx/media3/session/SessionCommands; HSPLandroidx/media3/session/SessionCommands;->toBundle()Landroid/os/Bundle; HSPLandroidx/media3/session/SessionPositionInfo$$ExternalSyntheticLambda0;->()V @@ -4504,6 +4670,18 @@ HSPLandroidx/media3/session/SimpleBitmapLoader;->()V HSPLandroidx/media3/session/SimpleBitmapLoader;->()V HSPLandroidx/media3/session/SimpleBitmapLoader;->(Ljava/util/concurrent/ExecutorService;)V HSPLandroidx/media3/session/SimpleBitmapLoader;->lambda$static$0()Lcom/google/common/util/concurrent/ListeningExecutorService; +HSPLandroidx/media3/ui/AspectRatioFrameLayout$AspectRatioUpdateDispatcher;->(Landroidx/media3/ui/AspectRatioFrameLayout;)V +HSPLandroidx/media3/ui/AspectRatioFrameLayout$AspectRatioUpdateDispatcher;->(Landroidx/media3/ui/AspectRatioFrameLayout;Landroidx/media3/ui/AspectRatioFrameLayout$1;)V +HSPLandroidx/media3/ui/AspectRatioFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/media3/ui/AspectRatioFrameLayout;->onMeasure(II)V +HSPLandroidx/media3/ui/AspectRatioFrameLayout;->setResizeMode(I)V +HSPLandroidx/media3/ui/PlayerView$ComponentListener;->(Landroidx/media3/ui/PlayerView;)V +HSPLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/media3/ui/PlayerView;->setResizeMode(I)V +HSPLandroidx/media3/ui/PlayerView;->setResizeModeRaw(Landroidx/media3/ui/AspectRatioFrameLayout;I)V +HSPLandroidx/media3/ui/PlayerView;->updateContentDescription()V +HSPLandroidx/media3/ui/R$styleable;->()V HSPLandroidx/multidex/MultiDex;->()V HSPLandroidx/multidex/MultiDex;->install(Landroid/content/Context;)V HSPLandroidx/multidex/MultiDex;->isVMMultidexCapable(Ljava/lang/String;)Z @@ -4552,8 +4730,14 @@ HSPLandroidx/navigation/NavBackStackEntry;->getSavedStateRegistry()Landroidx/sav HSPLandroidx/navigation/NavBackStackEntry;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; HSPLandroidx/navigation/NavBackStackEntry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/navigation/NavBackStackEntry;->hashCode()I +HSPLandroidx/navigation/NavBackStackEntry;->saveState(Landroid/os/Bundle;)V HSPLandroidx/navigation/NavBackStackEntry;->setMaxLifecycle(Landroidx/lifecycle/Lifecycle$State;)V HSPLandroidx/navigation/NavBackStackEntry;->updateState()V +HSPLandroidx/navigation/NavBackStackEntryState$Companion$CREATOR$1;->()V +HSPLandroidx/navigation/NavBackStackEntryState$Companion;->()V +HSPLandroidx/navigation/NavBackStackEntryState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/navigation/NavBackStackEntryState;->()V +HSPLandroidx/navigation/NavBackStackEntryState;->(Landroidx/navigation/NavBackStackEntry;)V HSPLandroidx/navigation/NavController$$ExternalSyntheticLambda0;->(Landroidx/navigation/NavController;)V HSPLandroidx/navigation/NavController$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/navigation/NavController$Companion;->()V @@ -4603,6 +4787,8 @@ HSPLandroidx/navigation/NavController;->navigate(Landroidx/navigation/NavDestina HSPLandroidx/navigation/NavController;->navigateInternal(Landroidx/navigation/Navigator;Ljava/util/List;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/navigation/NavController;->onGraphCreated(Landroid/os/Bundle;)V HSPLandroidx/navigation/NavController;->populateVisibleEntries$navigation_runtime_release()Ljava/util/List; +HSPLandroidx/navigation/NavController;->removeOnDestinationChangedListener(Landroidx/navigation/NavController$OnDestinationChangedListener;)V +HSPLandroidx/navigation/NavController;->saveState()Landroid/os/Bundle; HSPLandroidx/navigation/NavController;->setGraph(I)V HSPLandroidx/navigation/NavController;->setGraph(Landroidx/navigation/NavGraph;Landroid/os/Bundle;)V HSPLandroidx/navigation/NavController;->setLifecycleOwner(Landroidx/lifecycle/LifecycleOwner;)V @@ -4735,6 +4921,7 @@ HSPLandroidx/navigation/Navigator;->()V HSPLandroidx/navigation/Navigator;->getState()Landroidx/navigation/NavigatorState; HSPLandroidx/navigation/Navigator;->isAttached()Z HSPLandroidx/navigation/Navigator;->onAttach(Landroidx/navigation/NavigatorState;)V +HSPLandroidx/navigation/Navigator;->onSaveState()Landroid/os/Bundle; HSPLandroidx/navigation/NavigatorProvider$Companion;->()V HSPLandroidx/navigation/NavigatorProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/navigation/NavigatorProvider$Companion;->getNameForNavigator$navigation_common_release(Ljava/lang/Class;)Ljava/lang/String; @@ -4823,11 +5010,18 @@ HSPLandroidx/navigation/fragment/FragmentNavigator;->navigate(Landroidx/navigati HSPLandroidx/navigation/fragment/FragmentNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V HSPLandroidx/navigation/fragment/FragmentNavigator;->onAttach$lambda$4(Landroidx/navigation/NavigatorState;Landroidx/navigation/fragment/FragmentNavigator;Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V HSPLandroidx/navigation/fragment/FragmentNavigator;->onAttach(Landroidx/navigation/NavigatorState;)V +HSPLandroidx/navigation/fragment/FragmentNavigator;->onSaveState()Landroid/os/Bundle; HSPLandroidx/navigation/fragment/NavHostFragment$Companion;->()V HSPLandroidx/navigation/fragment/NavHostFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2$$ExternalSyntheticLambda0;->(Landroidx/navigation/NavHostController;)V +HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2$$ExternalSyntheticLambda0;->saveState()Landroid/os/Bundle; HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2$$ExternalSyntheticLambda1;->(Landroidx/navigation/fragment/NavHostFragment;)V +HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2$$ExternalSyntheticLambda1;->saveState()Landroid/os/Bundle; +HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->$r8$lambda$S8rYz5PdxQ_qmpQw5Wg04g8YyYI(Landroidx/navigation/fragment/NavHostFragment;)Landroid/os/Bundle; +HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->$r8$lambda$yvpdz-7lzmuHOSkQDGqC7TUxHHI(Landroidx/navigation/NavHostController;)Landroid/os/Bundle; HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->(Landroidx/navigation/fragment/NavHostFragment;)V +HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->invoke$lambda$5$lambda$2(Landroidx/navigation/NavHostController;)Landroid/os/Bundle; +HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->invoke$lambda$5$lambda$4(Landroidx/navigation/fragment/NavHostFragment;)Landroid/os/Bundle; HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->invoke()Landroidx/navigation/NavHostController; HSPLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->invoke()Ljava/lang/Object; HSPLandroidx/navigation/fragment/NavHostFragment;->()V @@ -4842,6 +5036,7 @@ HSPLandroidx/navigation/fragment/NavHostFragment;->onCreateNavController(Landroi HSPLandroidx/navigation/fragment/NavHostFragment;->onCreateNavHostController(Landroidx/navigation/NavHostController;)V HSPLandroidx/navigation/fragment/NavHostFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; HSPLandroidx/navigation/fragment/NavHostFragment;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V +HSPLandroidx/navigation/fragment/NavHostFragment;->onSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/navigation/fragment/NavHostFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V HSPLandroidx/navigation/fragment/R$styleable;->()V HSPLandroidx/preference/PreferenceManager;->getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences; @@ -4870,6 +5065,7 @@ HSPLandroidx/recyclerview/widget/AdapterHelper$UpdateOp;->(IIILjava/lang/O HSPLandroidx/recyclerview/widget/AdapterHelper;->(Landroidx/recyclerview/widget/AdapterHelper$Callback;)V HSPLandroidx/recyclerview/widget/AdapterHelper;->(Landroidx/recyclerview/widget/AdapterHelper$Callback;Z)V HSPLandroidx/recyclerview/widget/AdapterHelper;->applyAdd(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V +HSPLandroidx/recyclerview/widget/AdapterHelper;->applyPendingUpdatesToPosition(I)I HSPLandroidx/recyclerview/widget/AdapterHelper;->consumePostponedUpdates()V HSPLandroidx/recyclerview/widget/AdapterHelper;->consumeUpdatesInOnePass()V HSPLandroidx/recyclerview/widget/AdapterHelper;->findPositionOffset(I)I @@ -4928,8 +5124,56 @@ HSPLandroidx/recyclerview/widget/ChildHelper;->getChildCount()I HSPLandroidx/recyclerview/widget/ChildHelper;->getOffset(I)I HSPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildAt(I)Landroid/view/View; HSPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I +HSPLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z HSPLandroidx/recyclerview/widget/ChildHelper;->removeAllViewsUnfiltered()V HSPLandroidx/recyclerview/widget/ChildHelper;->removeViewIfHidden(Landroid/view/View;)Z +HSPLandroidx/recyclerview/widget/ConcatAdapter$Config$StableIdMode;->()V +HSPLandroidx/recyclerview/widget/ConcatAdapter$Config$StableIdMode;->(Ljava/lang/String;I)V +HSPLandroidx/recyclerview/widget/ConcatAdapter$Config;->()V +HSPLandroidx/recyclerview/widget/ConcatAdapter$Config;->(ZLandroidx/recyclerview/widget/ConcatAdapter$Config$StableIdMode;)V +HSPLandroidx/recyclerview/widget/ConcatAdapter;->(Landroidx/recyclerview/widget/ConcatAdapter$Config;Ljava/util/List;)V +HSPLandroidx/recyclerview/widget/ConcatAdapter;->(Landroidx/recyclerview/widget/ConcatAdapter$Config;[Landroidx/recyclerview/widget/RecyclerView$Adapter;)V +HSPLandroidx/recyclerview/widget/ConcatAdapter;->([Landroidx/recyclerview/widget/RecyclerView$Adapter;)V +HSPLandroidx/recyclerview/widget/ConcatAdapter;->addAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)Z +HSPLandroidx/recyclerview/widget/ConcatAdapter;->findRelativeAdapterPositionIn(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)I +HSPLandroidx/recyclerview/widget/ConcatAdapter;->getAdapters()Ljava/util/List; +HSPLandroidx/recyclerview/widget/ConcatAdapter;->getItemCount()I +HSPLandroidx/recyclerview/widget/ConcatAdapter;->getItemViewType(I)I +HSPLandroidx/recyclerview/widget/ConcatAdapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLandroidx/recyclerview/widget/ConcatAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +HSPLandroidx/recyclerview/widget/ConcatAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLandroidx/recyclerview/widget/ConcatAdapter;->onViewAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +HSPLandroidx/recyclerview/widget/ConcatAdapterController$WrapperAndLocalPosition;->()V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->(Landroidx/recyclerview/widget/ConcatAdapter;Landroidx/recyclerview/widget/ConcatAdapter$Config;)V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->addAdapter(ILandroidx/recyclerview/widget/RecyclerView$Adapter;)Z +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->addAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)Z +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->calculateAndUpdateStateRestorationPolicy()V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->computeStateRestorationPolicy()Landroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy; +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->countItemsBefore(Landroidx/recyclerview/widget/NestedAdapterWrapper;)I +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->findWrapperAndLocalPosition(I)Landroidx/recyclerview/widget/ConcatAdapterController$WrapperAndLocalPosition; +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->findWrapperFor(Landroidx/recyclerview/widget/RecyclerView$Adapter;)Landroidx/recyclerview/widget/NestedAdapterWrapper; +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->getCopyOfAdapters()Ljava/util/List; +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->getItemViewType(I)I +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->getLocalAdapterPosition(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)I +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->getTotalCount()I +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->getWrapper(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/NestedAdapterWrapper; +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->hasStableIds()Z +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->indexOfWrapper(Landroidx/recyclerview/widget/RecyclerView$Adapter;)I +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->isAttachedTo(Landroidx/recyclerview/widget/RecyclerView;)Z +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->onItemRangeChanged(Landroidx/recyclerview/widget/NestedAdapterWrapper;IILjava/lang/Object;)V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->onItemRangeInserted(Landroidx/recyclerview/widget/NestedAdapterWrapper;II)V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->onViewAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +HSPLandroidx/recyclerview/widget/ConcatAdapterController;->releaseWrapperAndLocalPosition(Landroidx/recyclerview/widget/ConcatAdapterController$WrapperAndLocalPosition;)V +HSPLandroidx/recyclerview/widget/ConversationLayoutManager$Companion;->()V +HSPLandroidx/recyclerview/widget/ConversationLayoutManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/recyclerview/widget/ConversationLayoutManager;->()V +HSPLandroidx/recyclerview/widget/ConversationLayoutManager;->(Landroid/content/Context;)V +HSPLandroidx/recyclerview/widget/ConversationLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLandroidx/recyclerview/widget/ConversationLayoutManager;->scrollToPositionWithOffset(IILkotlin/jvm/functions/Function0;)V +HSPLandroidx/recyclerview/widget/ConversationLayoutManager;->supportsPredictiveItemAnimations()Z HSPLandroidx/recyclerview/widget/DefaultItemAnimator$3;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Ljava/util/ArrayList;)V HSPLandroidx/recyclerview/widget/DefaultItemAnimator$3;->run()V HSPLandroidx/recyclerview/widget/DefaultItemAnimator$5;->(Landroidx/recyclerview/widget/DefaultItemAnimator;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroid/view/View;Landroid/view/ViewPropertyAnimator;)V @@ -4972,6 +5216,7 @@ HSPLandroidx/recyclerview/widget/GapWorker;->()V HSPLandroidx/recyclerview/widget/GapWorker;->add(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper$1;->(Landroidx/recyclerview/widget/ItemTouchHelper;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper$2;->(Landroidx/recyclerview/widget/ItemTouchHelper;)V +HSPLandroidx/recyclerview/widget/ItemTouchHelper$2;->onInterceptTouchEvent(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/MotionEvent;)Z HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback$1;->()V HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback$2;->()V HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback;->()V @@ -4979,13 +5224,17 @@ HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback;->()V HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Ljava/util/List;IFF)V HSPLandroidx/recyclerview/widget/ItemTouchHelper$Callback;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Ljava/util/List;IFF)V HSPLandroidx/recyclerview/widget/ItemTouchHelper$ItemTouchHelperGestureListener;->(Landroidx/recyclerview/widget/ItemTouchHelper;)V +HSPLandroidx/recyclerview/widget/ItemTouchHelper$ItemTouchHelperGestureListener;->onDown(Landroid/view/MotionEvent;)Z HSPLandroidx/recyclerview/widget/ItemTouchHelper$SimpleCallback;->(II)V HSPLandroidx/recyclerview/widget/ItemTouchHelper;->(Landroidx/recyclerview/widget/ItemTouchHelper$Callback;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper;->attachToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLandroidx/recyclerview/widget/ItemTouchHelper;->findAnimation(Landroid/view/MotionEvent;)Landroidx/recyclerview/widget/ItemTouchHelper$RecoverAnimation; HSPLandroidx/recyclerview/widget/ItemTouchHelper;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLandroidx/recyclerview/widget/ItemTouchHelper;->obtainVelocityTracker()V HSPLandroidx/recyclerview/widget/ItemTouchHelper;->onChildViewAttachedToWindow(Landroid/view/View;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLandroidx/recyclerview/widget/ItemTouchHelper;->select(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V HSPLandroidx/recyclerview/widget/ItemTouchHelper;->setupCallbacks()V HSPLandroidx/recyclerview/widget/ItemTouchHelper;->startGestureDetection()V HSPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->()V @@ -4997,6 +5246,9 @@ HSPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;->resetIn HSPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->()V HSPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->hasMore(Landroidx/recyclerview/widget/RecyclerView$State;)Z HSPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->next(Landroidx/recyclerview/widget/RecyclerView$Recycler;)Landroid/view/View; +HSPLandroidx/recyclerview/widget/LinearLayoutManager$SavedState$1;->()V +HSPLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->()V +HSPLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->()V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->(Landroid/content/Context;)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->(Landroid/content/Context;IZ)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V @@ -5022,6 +5274,7 @@ HSPLandroidx/recyclerview/widget/LinearLayoutManager;->findOneVisibleChild(IIZZ) HSPLandroidx/recyclerview/widget/LinearLayoutManager;->findReferenceChild(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;ZZ)Landroid/view/View; HSPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutEndGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutStartGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToStart()Landroid/view/View; HSPLandroidx/recyclerview/widget/LinearLayoutManager;->getExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->getReverseLayout()Z HSPLandroidx/recyclerview/widget/LinearLayoutManager;->isAutoMeasureEnabled()Z @@ -5032,8 +5285,10 @@ HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onAnchorReady(Landroidx/r HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onSaveInstanceState()Landroid/os/Parcelable; HSPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveIsInfinite()Z HSPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveShouldLayoutReverse()V +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollToPositionWithOffset(II)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->setOrientation(I)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->setReverseLayout(Z)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->setStackFromEnd(Z)V @@ -5049,16 +5304,26 @@ HSPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillSt HSPLandroidx/recyclerview/widget/ListAdapter$1;->(Landroidx/recyclerview/widget/ListAdapter;)V HSPLandroidx/recyclerview/widget/ListAdapter$1;->onCurrentListChanged(Ljava/util/List;Ljava/util/List;)V HSPLandroidx/recyclerview/widget/ListAdapter;->(Landroidx/recyclerview/widget/DiffUtil$ItemCallback;)V +HSPLandroidx/recyclerview/widget/ListAdapter;->getCurrentList()Ljava/util/List; HSPLandroidx/recyclerview/widget/ListAdapter;->getItem(I)Ljava/lang/Object; HSPLandroidx/recyclerview/widget/ListAdapter;->getItemCount()I HSPLandroidx/recyclerview/widget/ListAdapter;->onCurrentListChanged(Ljava/util/List;Ljava/util/List;)V HSPLandroidx/recyclerview/widget/ListAdapter;->submitList(Ljava/util/List;Ljava/lang/Runnable;)V +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper$1;->(Landroidx/recyclerview/widget/NestedAdapterWrapper;)V +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper$1;->onItemRangeChanged(IILjava/lang/Object;)V +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper$1;->onItemRangeInserted(II)V +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper;->(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/NestedAdapterWrapper$Callback;Landroidx/recyclerview/widget/ViewTypeStorage;Landroidx/recyclerview/widget/StableIdStorage$StableIdLookup;)V +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper;->getCachedItemCount()I +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper;->getItemViewType(I)I +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +HSPLandroidx/recyclerview/widget/NestedAdapterWrapper;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/OpReorderer;->(Landroidx/recyclerview/widget/OpReorderer$Callback;)V HSPLandroidx/recyclerview/widget/OpReorderer;->getLastMoveOutOfOrder(Ljava/util/List;)I HSPLandroidx/recyclerview/widget/OpReorderer;->reorderOps(Ljava/util/List;)V HSPLandroidx/recyclerview/widget/OrientationHelper$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurement(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurementInOther(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedStart(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndAfterPadding()I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndPadding()I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getMode()I @@ -5079,6 +5344,7 @@ HSPLandroidx/recyclerview/widget/OrientationHelper;->(Landroidx/recyclervi HSPLandroidx/recyclerview/widget/OrientationHelper;->createHorizontalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper; HSPLandroidx/recyclerview/widget/OrientationHelper;->createOrientationHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)Landroidx/recyclerview/widget/OrientationHelper; HSPLandroidx/recyclerview/widget/OrientationHelper;->createVerticalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper; +HSPLandroidx/recyclerview/widget/OrientationHelper;->getTotalSpaceChange()I HSPLandroidx/recyclerview/widget/OrientationHelper;->onLayoutComplete()V HSPLandroidx/recyclerview/widget/RecyclerView$1;->(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$2;->(Landroidx/recyclerview/widget/RecyclerView;)V @@ -5103,9 +5369,11 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy;->< HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->()V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->bindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->createViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->findRelativeAdapterPositionIn(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)I +HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->getStateRestorationPolicy()Landroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy; HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasObservers()Z HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasStableIds()Z -HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeChanged(II)V +HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyDataSetChanged()V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeChanged(IILjava/lang/Object;)V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeInserted(II)V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V @@ -5116,7 +5384,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->setHasStableIds(Z)V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->unregisterAdapterDataObserver(Landroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;)V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->()V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->hasObservers()Z -HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeChanged(II)V +HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyChanged()V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeChanged(IILjava/lang/Object;)V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeInserted(II)V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;->()V @@ -5141,6 +5409,8 @@ HSPLandroidx/recyclerview/widget/RecyclerView$ItemAnimatorRestoreListener;->onAn HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->()V HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->getItemOffsets(Landroid/graphics/Rect;ILandroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V +HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V @@ -5163,20 +5433,25 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewAt(I)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewInternal(ILandroid/view/View;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBaseline()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBottomDecorationHeight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildAt(I)Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildMeasureSpec(IIIIZ)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBoundsWithMargins(Landroid/view/View;Landroid/graphics/Rect;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredHeight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredWidth(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getFocusedChild()Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeightMode()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getItemCount()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLayoutDirection()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLeftDecorationWidth(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumHeight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumWidth()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingBottom()I @@ -5185,16 +5460,24 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingTop()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPosition(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getProperties(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroidx/recyclerview/widget/RecyclerView$LayoutManager$Properties; +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getSelectionModeForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTopDecorationHeight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidth()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getWidthMode()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isLayoutHierarchical(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isMeasurementUpToDate(III)Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->layoutDecoratedWithMargins(Landroid/view/View;IIII)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->measureChildWithMargins(Landroid/view/View;II)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAddFocusables(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/ArrayList;II)Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsAdded(Landroidx/recyclerview/widget/RecyclerView;II)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onMeasure(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;II)V @@ -5209,22 +5492,27 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimensi HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimensionFromChildren(II)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->shouldMeasureChild(Landroid/view/View;IILandroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->stopSmoothScroller()V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->(Landroid/view/ViewGroup$MarginLayoutParams;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->getViewLayoutPosition()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemChanged()Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemRemoved()Z HSPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->()V +HSPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData;->()V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->()V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->attach()V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->attachForPoolingContainer(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->clear()V +HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->detachForPoolingContainer(Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->factorInBindTime(IJ)V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->factorInCreateTime(IJ)V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->getRecycledView(I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->getScrapDataForType(I)Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData; HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->runningAverage(JJ)J +HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->setMaxRecycledViews(II)V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->attachAccessibilityDelegateOnBind(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clear()V @@ -5252,9 +5540,14 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->unscrapView(Landroidx/r HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->updateViewCacheSize()V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->validateViewHolderForOffsetPosition(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onChanged()V HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeChanged(IILjava/lang/Object;)V HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeInserted(II)V HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->triggerUpdateProcessor()V +HSPLandroidx/recyclerview/widget/RecyclerView$SavedState$1;->()V +HSPLandroidx/recyclerview/widget/RecyclerView$SavedState;->()V +HSPLandroidx/recyclerview/widget/RecyclerView$SavedState;->(Landroid/os/Parcelable;)V +HSPLandroidx/recyclerview/widget/RecyclerView$SimpleOnItemTouchListener;->()V HSPLandroidx/recyclerview/widget/RecyclerView$State;->()V HSPLandroidx/recyclerview/widget/RecyclerView$State;->assertLayoutStep(I)V HSPLandroidx/recyclerview/widget/RecyclerView$State;->getItemCount()I @@ -5271,6 +5564,9 @@ HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearOldPosition()V HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearPayload()V HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearReturnedFromScrapFlag()V HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearTmpDetachFlag()V +HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAbsoluteAdapterPosition()I +HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAdapterPosition()I +HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getBindingAdapterPosition()I HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getItemId()J HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getItemViewType()I HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getLayoutPosition()I @@ -5296,6 +5592,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context; HSPLandroidx/recyclerview/widget/RecyclerView;->access$000(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V HSPLandroidx/recyclerview/widget/RecyclerView;->access$100(Landroidx/recyclerview/widget/RecyclerView;I)V HSPLandroidx/recyclerview/widget/RecyclerView;->access$500(Landroidx/recyclerview/widget/RecyclerView;II)V +HSPLandroidx/recyclerview/widget/RecyclerView;->addFocusables(Ljava/util/ArrayList;II)V HSPLandroidx/recyclerview/widget/RecyclerView;->addItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V HSPLandroidx/recyclerview/widget/RecyclerView;->addItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;I)V HSPLandroidx/recyclerview/widget/RecyclerView;->addOnChildAttachStateChangeListener(Landroidx/recyclerview/widget/RecyclerView$OnChildAttachStateChangeListener;)V @@ -5305,6 +5602,9 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->animateAppearance(Landroidx/recy HSPLandroidx/recyclerview/widget/RecyclerView;->assertNotInLayoutOrScroll(Ljava/lang/String;)V HSPLandroidx/recyclerview/widget/RecyclerView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HSPLandroidx/recyclerview/widget/RecyclerView;->clearOldPositions()V +HSPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I +HSPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I +HSPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I HSPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollExtent()I HSPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollOffset()I HSPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollRange()I @@ -5319,22 +5619,29 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep2()V HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep3()V HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchOnScrolled(II)V HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchPendingImportantForAccessibilityChanges()V +HSPLandroidx/recyclerview/widget/RecyclerView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V HSPLandroidx/recyclerview/widget/RecyclerView;->draw(Landroid/graphics/Canvas;)V HSPLandroidx/recyclerview/widget/RecyclerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z HSPLandroidx/recyclerview/widget/RecyclerView;->fillRemainingScrollValues(Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLandroidx/recyclerview/widget/RecyclerView;->findInterceptingOnItemTouchListener(Landroid/view/MotionEvent;)Z HSPLandroidx/recyclerview/widget/RecyclerView;->findMinMaxChildLayoutPositions([I)V HSPLandroidx/recyclerview/widget/RecyclerView;->findNestedRecyclerView(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView; HSPLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; +HSPLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams; HSPLandroidx/recyclerview/widget/RecyclerView;->getAccessibilityClassName()Ljava/lang/CharSequence; HSPLandroidx/recyclerview/widget/RecyclerView;->getAdapter()Landroidx/recyclerview/widget/RecyclerView$Adapter; +HSPLandroidx/recyclerview/widget/RecyclerView;->getAdapterPositionInRecyclerView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I HSPLandroidx/recyclerview/widget/RecyclerView;->getBaseline()I HSPLandroidx/recyclerview/widget/RecyclerView;->getChangedHolderKey(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)J +HSPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolder(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolderInt(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/RecyclerView;->getDecoratedBoundsWithMarginsInt(Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroidx/recyclerview/widget/RecyclerView;->getFullClassName(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String; +HSPLandroidx/recyclerview/widget/RecyclerView;->getItemAnimator()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; HSPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorInsetsForChild(Landroid/view/View;)Landroid/graphics/Rect; HSPLandroidx/recyclerview/widget/RecyclerView;->getLayoutManager()Landroidx/recyclerview/widget/RecyclerView$LayoutManager; HSPLandroidx/recyclerview/widget/RecyclerView;->getNanoTime()J +HSPLandroidx/recyclerview/widget/RecyclerView;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; HSPLandroidx/recyclerview/widget/RecyclerView;->getScrollState()I HSPLandroidx/recyclerview/widget/RecyclerView;->getScrollingChildHelper()Landroidx/core/view/NestedScrollingChildHelper; HSPLandroidx/recyclerview/widget/RecyclerView;->hasPendingAdapterUpdates()Z @@ -5342,6 +5649,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->initAdapterManager()V HSPLandroidx/recyclerview/widget/RecyclerView;->initAutofill()V HSPLandroidx/recyclerview/widget/RecyclerView;->initChildrenHelper()V HSPLandroidx/recyclerview/widget/RecyclerView;->invalidateGlows()V +HSPLandroidx/recyclerview/widget/RecyclerView;->invalidateItemDecorations()V HSPLandroidx/recyclerview/widget/RecyclerView;->isAccessibilityEnabled()Z HSPLandroidx/recyclerview/widget/RecyclerView;->isAttachedToWindow()Z HSPLandroidx/recyclerview/widget/RecyclerView;->isComputingLayout()Z @@ -5354,8 +5662,10 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->onDraw(Landroid/graphics/Canvas; HSPLandroidx/recyclerview/widget/RecyclerView;->onEnterLayoutOrScroll()V HSPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll()V HSPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll(Z)V +HSPLandroidx/recyclerview/widget/RecyclerView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/recyclerview/widget/RecyclerView;->onLayout(ZIIII)V HSPLandroidx/recyclerview/widget/RecyclerView;->onMeasure(II)V +HSPLandroidx/recyclerview/widget/RecyclerView;->onSaveInstanceState()Landroid/os/Parcelable; HSPLandroidx/recyclerview/widget/RecyclerView;->onScrolled(II)V HSPLandroidx/recyclerview/widget/RecyclerView;->onSizeChanged(IIII)V HSPLandroidx/recyclerview/widget/RecyclerView;->postAnimationRunner()V @@ -5374,6 +5684,8 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->setAccessibilityDelegateCompat(L HSPLandroidx/recyclerview/widget/RecyclerView;->setAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V HSPLandroidx/recyclerview/widget/RecyclerView;->setAdapterInternal(Landroidx/recyclerview/widget/RecyclerView$Adapter;ZZ)V HSPLandroidx/recyclerview/widget/RecyclerView;->setClipToPadding(Z)V +HSPLandroidx/recyclerview/widget/RecyclerView;->setEdgeEffectFactory(Landroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory;)V +HSPLandroidx/recyclerview/widget/RecyclerView;->setHasFixedSize(Z)V HSPLandroidx/recyclerview/widget/RecyclerView;->setItemAnimator(Landroidx/recyclerview/widget/RecyclerView$ItemAnimator;)V HSPLandroidx/recyclerview/widget/RecyclerView;->setLayoutFrozen(Z)V HSPLandroidx/recyclerview/widget/RecyclerView;->setLayoutManager(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V @@ -5381,15 +5693,26 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->setNestedScrollingEnabled(Z)V HSPLandroidx/recyclerview/widget/RecyclerView;->setScrollState(I)V HSPLandroidx/recyclerview/widget/RecyclerView;->shouldDeferAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z HSPLandroidx/recyclerview/widget/RecyclerView;->startInterceptRequestLayout()V +HSPLandroidx/recyclerview/widget/RecyclerView;->startNestedScroll(II)Z +HSPLandroidx/recyclerview/widget/RecyclerView;->stopGlowAnimations(Landroid/view/MotionEvent;)Z HSPLandroidx/recyclerview/widget/RecyclerView;->stopInterceptRequestLayout(Z)V +HSPLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll(I)V HSPLandroidx/recyclerview/widget/RecyclerView;->stopScroll()V HSPLandroidx/recyclerview/widget/RecyclerView;->stopScrollersInternal()V HSPLandroidx/recyclerview/widget/RecyclerView;->suppressLayout(Z)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->saveOriginalDelegate(Landroid/view/View;)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->sendAccessibilityEvent(Landroid/view/View;I)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->getItemDelegate()Landroidx/core/view/AccessibilityDelegateCompat; HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->shouldIgnore()Z HSPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I HSPLandroidx/recyclerview/widget/ScrollbarHelper;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;ZZ)I @@ -5401,6 +5724,9 @@ HSPLandroidx/recyclerview/widget/SimpleItemAnimator;->dispatchAddStarting(Landro HSPLandroidx/recyclerview/widget/SimpleItemAnimator;->onAddFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HSPLandroidx/recyclerview/widget/SimpleItemAnimator;->onAddStarting(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HSPLandroidx/recyclerview/widget/SimpleItemAnimator;->setSupportsChangeAnimations(Z)V +HSPLandroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage$1;->(Landroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage;)V +HSPLandroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage;->()V +HSPLandroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage;->createStableIdLookup()Landroidx/recyclerview/widget/StableIdStorage$StableIdLookup; HSPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->()V HSPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->addFlags(I)V HSPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->boundsMatch()Z @@ -5420,8 +5746,17 @@ HSPLandroidx/recyclerview/widget/ViewInfoStore;->getFromOldChangeHolders(J)Landr HSPLandroidx/recyclerview/widget/ViewInfoStore;->onViewDetached(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HSPLandroidx/recyclerview/widget/ViewInfoStore;->process(Landroidx/recyclerview/widget/ViewInfoStore$ProcessCallback;)V HSPLandroidx/recyclerview/widget/ViewInfoStore;->removeFromDisappearedInLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage$WrapperViewTypeLookup;->(Landroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage;Landroidx/recyclerview/widget/NestedAdapterWrapper;)V +HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage$WrapperViewTypeLookup;->globalToLocal(I)I +HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage$WrapperViewTypeLookup;->localToGlobal(I)I +HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage;->()V +HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage;->createViewTypeWrapper(Landroidx/recyclerview/widget/NestedAdapterWrapper;)Landroidx/recyclerview/widget/ViewTypeStorage$ViewTypeLookup; +HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage;->getWrapperForGlobalType(I)Landroidx/recyclerview/widget/NestedAdapterWrapper; +HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage;->obtainViewType(Landroidx/recyclerview/widget/NestedAdapterWrapper;)I HSPLandroidx/savedstate/Recreator$Companion;->()V HSPLandroidx/savedstate/Recreator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLandroidx/savedstate/Recreator$SavedStateProvider;->(Landroidx/savedstate/SavedStateRegistry;)V +HSPLandroidx/savedstate/Recreator$SavedStateProvider;->add(Ljava/lang/String;)V HSPLandroidx/savedstate/Recreator;->()V HSPLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V @@ -5437,7 +5772,9 @@ HSPLandroidx/savedstate/SavedStateRegistry;->getSavedStateProvider(Ljava/lang/St HSPLandroidx/savedstate/SavedStateRegistry;->performAttach$lambda$4(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/savedstate/SavedStateRegistry;->performAttach$savedstate_release(Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/savedstate/SavedStateRegistry;->performRestore$savedstate_release(Landroid/os/Bundle;)V +HSPLandroidx/savedstate/SavedStateRegistry;->performSave(Landroid/os/Bundle;)V HSPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V +HSPLandroidx/savedstate/SavedStateRegistry;->runOnNextRecreation(Ljava/lang/Class;)V HSPLandroidx/savedstate/SavedStateRegistryController$Companion;->()V HSPLandroidx/savedstate/SavedStateRegistryController$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/savedstate/SavedStateRegistryController$Companion;->create(Landroidx/savedstate/SavedStateRegistryOwner;)Landroidx/savedstate/SavedStateRegistryController; @@ -5448,6 +5785,7 @@ HSPLandroidx/savedstate/SavedStateRegistryController;->create(Landroidx/savedsta HSPLandroidx/savedstate/SavedStateRegistryController;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; HSPLandroidx/savedstate/SavedStateRegistryController;->performAttach()V HSPLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V +HSPLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->(Ljava/lang/String;[Ljava/lang/Object;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->bind(Landroidx/sqlite/db/SupportSQLiteProgram;ILjava/lang/Object;)V @@ -5491,10 +5829,14 @@ HSPLcom/airbnb/lottie/LottieAnimationView$$ExternalSyntheticLambda1;->onResult(L HSPLcom/airbnb/lottie/LottieAnimationView$$ExternalSyntheticLambda2;->()V HSPLcom/airbnb/lottie/LottieAnimationView$1;->(Lcom/airbnb/lottie/LottieAnimationView;)V HSPLcom/airbnb/lottie/LottieAnimationView$2;->(Lcom/airbnb/lottie/LottieAnimationView;Lcom/airbnb/lottie/value/SimpleLottieValueCallback;)V +HSPLcom/airbnb/lottie/LottieAnimationView$SavedState$1;->()V +HSPLcom/airbnb/lottie/LottieAnimationView$SavedState;->()V +HSPLcom/airbnb/lottie/LottieAnimationView$SavedState;->(Landroid/os/Parcelable;)V HSPLcom/airbnb/lottie/LottieAnimationView$UserActionTaken;->()V HSPLcom/airbnb/lottie/LottieAnimationView$UserActionTaken;->(Ljava/lang/String;I)V HSPLcom/airbnb/lottie/LottieAnimationView;->()V HSPLcom/airbnb/lottie/LottieAnimationView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLcom/airbnb/lottie/LottieAnimationView;->addValueCallback(Lcom/airbnb/lottie/model/KeyPath;Ljava/lang/Object;Lcom/airbnb/lottie/value/LottieValueCallback;)V HSPLcom/airbnb/lottie/LottieAnimationView;->addValueCallback(Lcom/airbnb/lottie/model/KeyPath;Ljava/lang/Object;Lcom/airbnb/lottie/value/SimpleLottieValueCallback;)V HSPLcom/airbnb/lottie/LottieAnimationView;->cancelLoaderTask()V HSPLcom/airbnb/lottie/LottieAnimationView;->clearComposition()V @@ -5502,7 +5844,9 @@ HSPLcom/airbnb/lottie/LottieAnimationView;->enableMergePathsForKitKatAndAbove(Z) HSPLcom/airbnb/lottie/LottieAnimationView;->fromRawRes(I)Lcom/airbnb/lottie/LottieTask; HSPLcom/airbnb/lottie/LottieAnimationView;->init(Landroid/util/AttributeSet;I)V HSPLcom/airbnb/lottie/LottieAnimationView;->invalidate()V +HSPLcom/airbnb/lottie/LottieAnimationView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLcom/airbnb/lottie/LottieAnimationView;->onAttachedToWindow()V +HSPLcom/airbnb/lottie/LottieAnimationView;->onSaveInstanceState()Landroid/os/Parcelable; HSPLcom/airbnb/lottie/LottieAnimationView;->pauseAnimation()V HSPLcom/airbnb/lottie/LottieAnimationView;->setAnimation(I)V HSPLcom/airbnb/lottie/LottieAnimationView;->setComposition(Lcom/airbnb/lottie/LottieComposition;)V @@ -5571,11 +5915,16 @@ HSPLcom/airbnb/lottie/LottieDrawable;->draw(Landroid/graphics/Canvas;)V HSPLcom/airbnb/lottie/LottieDrawable;->drawDirectlyToCanvas(Landroid/graphics/Canvas;)V HSPLcom/airbnb/lottie/LottieDrawable;->enableMergePathsForKitKatAndAbove(Z)V HSPLcom/airbnb/lottie/LottieDrawable;->getComposition()Lcom/airbnb/lottie/LottieComposition; +HSPLcom/airbnb/lottie/LottieDrawable;->getImageAssetsFolder()Ljava/lang/String; HSPLcom/airbnb/lottie/LottieDrawable;->getIntrinsicHeight()I HSPLcom/airbnb/lottie/LottieDrawable;->getIntrinsicWidth()I HSPLcom/airbnb/lottie/LottieDrawable;->getOpacity()I +HSPLcom/airbnb/lottie/LottieDrawable;->getProgress()F HSPLcom/airbnb/lottie/LottieDrawable;->getRenderMode()Lcom/airbnb/lottie/RenderMode; +HSPLcom/airbnb/lottie/LottieDrawable;->getRepeatCount()I +HSPLcom/airbnb/lottie/LottieDrawable;->getRepeatMode()I HSPLcom/airbnb/lottie/LottieDrawable;->invalidateSelf()V +HSPLcom/airbnb/lottie/LottieDrawable;->isAnimatingOrWillAnimateOnVisible()Z HSPLcom/airbnb/lottie/LottieDrawable;->isApplyingOpacityToLayersEnabled()Z HSPLcom/airbnb/lottie/LottieDrawable;->lambda$addValueCallback$14(Lcom/airbnb/lottie/model/KeyPath;Ljava/lang/Object;Lcom/airbnb/lottie/value/LottieValueCallback;Lcom/airbnb/lottie/LottieComposition;)V HSPLcom/airbnb/lottie/LottieDrawable;->lambda$setProgress$13(FLcom/airbnb/lottie/LottieComposition;)V @@ -5694,6 +6043,7 @@ HSPLcom/airbnb/lottie/animation/keyframe/IntegerKeyframeAnimation;->getValue(Lco HSPLcom/airbnb/lottie/animation/keyframe/KeyframeAnimation;->(Ljava/util/List;)V HSPLcom/airbnb/lottie/animation/keyframe/PathKeyframe;->(Lcom/airbnb/lottie/LottieComposition;Lcom/airbnb/lottie/value/Keyframe;)V HSPLcom/airbnb/lottie/animation/keyframe/PathKeyframe;->createPath()V +HSPLcom/airbnb/lottie/animation/keyframe/PathKeyframeAnimation;->(Ljava/util/List;)V HSPLcom/airbnb/lottie/animation/keyframe/PointKeyframeAnimation;->(Ljava/util/List;)V HSPLcom/airbnb/lottie/animation/keyframe/PointKeyframeAnimation;->getValue(Lcom/airbnb/lottie/value/Keyframe;F)Landroid/graphics/PointF; HSPLcom/airbnb/lottie/animation/keyframe/PointKeyframeAnimation;->getValue(Lcom/airbnb/lottie/value/Keyframe;F)Ljava/lang/Object; @@ -5827,6 +6177,7 @@ HSPLcom/airbnb/lottie/model/layer/BaseLayer;->invalidateSelf()V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->lambda$setupInOutAnimations$0()V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->onValueChanged()V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->recordRenderTime(F)V +HSPLcom/airbnb/lottie/model/layer/BaseLayer;->removeAnimation(Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation;)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->resolveKeyPath(Lcom/airbnb/lottie/model/KeyPath;ILjava/util/List;Lcom/airbnb/lottie/model/KeyPath;)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->setMatteLayer(Lcom/airbnb/lottie/model/layer/BaseLayer;)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->setProgress(F)V @@ -5904,6 +6255,7 @@ HSPLcom/airbnb/lottie/parser/IntegerParser;->parse(Lcom/airbnb/lottie/parser/mos HSPLcom/airbnb/lottie/parser/IntegerParser;->parse(Lcom/airbnb/lottie/parser/moshi/JsonReader;F)Ljava/lang/Object; HSPLcom/airbnb/lottie/parser/JsonUtils$1;->()V HSPLcom/airbnb/lottie/parser/JsonUtils;->()V +HSPLcom/airbnb/lottie/parser/JsonUtils;->jsonArrayToPoint(Lcom/airbnb/lottie/parser/moshi/JsonReader;F)Landroid/graphics/PointF; HSPLcom/airbnb/lottie/parser/JsonUtils;->jsonNumbersToPoint(Lcom/airbnb/lottie/parser/moshi/JsonReader;F)Landroid/graphics/PointF; HSPLcom/airbnb/lottie/parser/JsonUtils;->jsonObjectToPoint(Lcom/airbnb/lottie/parser/moshi/JsonReader;F)Landroid/graphics/PointF; HSPLcom/airbnb/lottie/parser/JsonUtils;->jsonToPoint(Lcom/airbnb/lottie/parser/moshi/JsonReader;F)Landroid/graphics/PointF; @@ -5974,10 +6326,8 @@ HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->findName(Ljava/lang/String;L HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->hasNext()Z HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->isLiteral(I)Z HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextBoolean()Z -HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextDouble()D HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextInt()I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextName()Ljava/lang/String; -HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextNonWhitespace(Z)I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextQuotedValue(Lokio/ByteString;)Ljava/lang/String; HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextString()Ljava/lang/String; HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->peek()Lcom/airbnb/lottie/parser/moshi/JsonReader$Token; @@ -6019,6 +6369,7 @@ HSPLcom/airbnb/lottie/utils/Utils$3;->()V HSPLcom/airbnb/lottie/utils/Utils$4;->()V HSPLcom/airbnb/lottie/utils/Utils;->()V HSPLcom/airbnb/lottie/utils/Utils;->closeQuietly(Ljava/io/Closeable;)V +HSPLcom/airbnb/lottie/utils/Utils;->createPath(Landroid/graphics/PointF;Landroid/graphics/PointF;Landroid/graphics/PointF;Landroid/graphics/PointF;)Landroid/graphics/Path; HSPLcom/airbnb/lottie/utils/Utils;->dpScale()F HSPLcom/airbnb/lottie/utils/Utils;->getAnimationScale(Landroid/content/Context;)F HSPLcom/airbnb/lottie/utils/Utils;->hashFor(FFFF)I @@ -6036,6 +6387,7 @@ HSPLcom/airbnb/lottie/value/Keyframe;->getStartValueInt()I HSPLcom/airbnb/lottie/value/Keyframe;->isStatic()Z HSPLcom/airbnb/lottie/value/LottieFrameInfo;->()V HSPLcom/airbnb/lottie/value/LottieValueCallback;->()V +HSPLcom/airbnb/lottie/value/LottieValueCallback;->(Ljava/lang/Object;)V HSPLcom/airbnb/lottie/value/LottieValueCallback;->setAnimation(Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation;)V HSPLcom/airbnb/lottie/value/ScaleXY;->()V HSPLcom/airbnb/lottie/value/ScaleXY;->(FF)V @@ -6085,11 +6437,21 @@ HSPLcom/annimon/stream/Collectors;->toSet()Lcom/annimon/stream/Collector; HSPLcom/annimon/stream/IntPair;->(ILjava/lang/Object;)V HSPLcom/annimon/stream/IntPair;->getFirst()I HSPLcom/annimon/stream/IntPair;->getSecond()Ljava/lang/Object; +HSPLcom/annimon/stream/IntStream$1;->()V +HSPLcom/annimon/stream/IntStream$5;->()V +HSPLcom/annimon/stream/IntStream;->()V +HSPLcom/annimon/stream/IntStream;->(Lcom/annimon/stream/internal/Params;Lcom/annimon/stream/iterator/PrimitiveIterator$OfInt;)V +HSPLcom/annimon/stream/IntStream;->(Lcom/annimon/stream/iterator/PrimitiveIterator$OfInt;)V +HSPLcom/annimon/stream/IntStream;->boxed()Lcom/annimon/stream/Stream; +HSPLcom/annimon/stream/IntStream;->of(I)Lcom/annimon/stream/IntStream; +HSPLcom/annimon/stream/IntStream;->rangeClosed(II)Lcom/annimon/stream/IntStream; HSPLcom/annimon/stream/Objects;->requireNonNull(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/annimon/stream/Optional;->()V HSPLcom/annimon/stream/Optional;->()V HSPLcom/annimon/stream/Optional;->(Ljava/lang/Object;)V +HSPLcom/annimon/stream/Optional;->empty()Lcom/annimon/stream/Optional; HSPLcom/annimon/stream/Optional;->of(Ljava/lang/Object;)Lcom/annimon/stream/Optional; +HSPLcom/annimon/stream/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/annimon/stream/Optional;->orElseThrow(Lcom/annimon/stream/function/Supplier;)Ljava/lang/Object; HSPLcom/annimon/stream/Stream$2;->(Lcom/annimon/stream/Stream;)V HSPLcom/annimon/stream/Stream$2;->apply(ILjava/lang/Object;)Lcom/annimon/stream/IntPair; @@ -6101,23 +6463,30 @@ HSPLcom/annimon/stream/Stream;->(Ljava/util/Iterator;)V HSPLcom/annimon/stream/Stream;->allMatch(Lcom/annimon/stream/function/Predicate;)Z HSPLcom/annimon/stream/Stream;->anyMatch(Lcom/annimon/stream/function/Predicate;)Z HSPLcom/annimon/stream/Stream;->collect(Lcom/annimon/stream/Collector;)Ljava/lang/Object; +HSPLcom/annimon/stream/Stream;->empty()Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->filter(Lcom/annimon/stream/function/Predicate;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->filterNot(Lcom/annimon/stream/function/Predicate;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->findFirst()Lcom/annimon/stream/Optional; HSPLcom/annimon/stream/Stream;->forEach(Lcom/annimon/stream/function/Consumer;)V HSPLcom/annimon/stream/Stream;->indexed()Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->indexed(II)Lcom/annimon/stream/Stream; +HSPLcom/annimon/stream/Stream;->limit(J)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->map(Lcom/annimon/stream/function/Function;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->mapIndexed(IILcom/annimon/stream/function/IndexedFunction;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->match(Lcom/annimon/stream/function/Predicate;I)Z +HSPLcom/annimon/stream/Stream;->max(Ljava/util/Comparator;)Lcom/annimon/stream/Optional; HSPLcom/annimon/stream/Stream;->of(Ljava/lang/Iterable;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->of(Ljava/util/Map;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->of([Ljava/lang/Object;)Lcom/annimon/stream/Stream; +HSPLcom/annimon/stream/Stream;->rangeClosed(II)Lcom/annimon/stream/Stream; +HSPLcom/annimon/stream/Stream;->reduce(Lcom/annimon/stream/function/BiFunction;)Lcom/annimon/stream/Optional; HSPLcom/annimon/stream/Stream;->reduce(Ljava/lang/Object;Lcom/annimon/stream/function/BiFunction;)Ljava/lang/Object; HSPLcom/annimon/stream/Stream;->sorted()Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->sorted(Ljava/util/Comparator;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->toList()Ljava/util/List; HSPLcom/annimon/stream/Stream;->withoutNulls()Lcom/annimon/stream/Stream; +HSPLcom/annimon/stream/function/BinaryOperator$Util$2;->(Ljava/util/Comparator;)V +HSPLcom/annimon/stream/function/BinaryOperator$Util;->maxBy(Ljava/util/Comparator;)Lcom/annimon/stream/function/BinaryOperator; HSPLcom/annimon/stream/function/Predicate$Util$4;->(Lcom/annimon/stream/function/Predicate;)V HSPLcom/annimon/stream/function/Predicate$Util$4;->test(Ljava/lang/Object;)Z HSPLcom/annimon/stream/function/Predicate$Util$5;->()V @@ -6138,6 +6507,15 @@ HSPLcom/annimon/stream/iterator/LsaExtIterator;->hasNext()Z HSPLcom/annimon/stream/iterator/LsaExtIterator;->next()Ljava/lang/Object; HSPLcom/annimon/stream/iterator/LsaIterator;->()V HSPLcom/annimon/stream/iterator/LsaIterator;->next()Ljava/lang/Object; +HSPLcom/annimon/stream/iterator/PrimitiveIterator$OfInt;->()V +HSPLcom/annimon/stream/iterator/PrimitiveIterator$OfInt;->next()Ljava/lang/Integer; +HSPLcom/annimon/stream/iterator/PrimitiveIterator$OfInt;->next()Ljava/lang/Object; +HSPLcom/annimon/stream/operator/IntArray;->([I)V +HSPLcom/annimon/stream/operator/IntArray;->hasNext()Z +HSPLcom/annimon/stream/operator/IntArray;->nextInt()I +HSPLcom/annimon/stream/operator/IntRangeClosed;->(II)V +HSPLcom/annimon/stream/operator/IntRangeClosed;->hasNext()Z +HSPLcom/annimon/stream/operator/IntRangeClosed;->nextInt()I HSPLcom/annimon/stream/operator/ObjArray;->([Ljava/lang/Object;)V HSPLcom/annimon/stream/operator/ObjArray;->hasNext()Z HSPLcom/annimon/stream/operator/ObjArray;->nextIteration()Ljava/lang/Object; @@ -6145,6 +6523,8 @@ HSPLcom/annimon/stream/operator/ObjFilter;->(Ljava/util/Iterator;Lcom/anni HSPLcom/annimon/stream/operator/ObjFilter;->hasNext()Z HSPLcom/annimon/stream/operator/ObjFilter;->next()Ljava/lang/Object; HSPLcom/annimon/stream/operator/ObjFilter;->nextIteration()V +HSPLcom/annimon/stream/operator/ObjLimit;->(Ljava/util/Iterator;J)V +HSPLcom/annimon/stream/operator/ObjLimit;->hasNext()Z HSPLcom/annimon/stream/operator/ObjMap;->(Ljava/util/Iterator;Lcom/annimon/stream/function/Function;)V HSPLcom/annimon/stream/operator/ObjMap;->hasNext()Z HSPLcom/annimon/stream/operator/ObjMap;->nextIteration()Ljava/lang/Object; @@ -6775,6 +7155,7 @@ HSPLcom/bumptech/glide/manager/DoNothingFirstFrameWaiter;->registerSelf(Landroid HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->(Landroidx/lifecycle/Lifecycle;)V HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->addListener(Lcom/bumptech/glide/manager/LifecycleListener;)V HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->(Lcom/bumptech/glide/manager/LifecycleRequestManagerRetriever;Landroidx/lifecycle/Lifecycle;)V HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->onStart()V HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->onStop()V @@ -6884,6 +7265,8 @@ HSPLcom/bumptech/glide/request/BaseRequestOptions;->isSet(II)Z HSPLcom/bumptech/glide/request/BaseRequestOptions;->isTransformationRequired()Z HSPLcom/bumptech/glide/request/BaseRequestOptions;->isTransformationSet()Z HSPLcom/bumptech/glide/request/BaseRequestOptions;->lock()Lcom/bumptech/glide/request/BaseRequestOptions; +HSPLcom/bumptech/glide/request/BaseRequestOptions;->override(I)Lcom/bumptech/glide/request/BaseRequestOptions; +HSPLcom/bumptech/glide/request/BaseRequestOptions;->override(II)Lcom/bumptech/glide/request/BaseRequestOptions; HSPLcom/bumptech/glide/request/BaseRequestOptions;->priority(Lcom/bumptech/glide/Priority;)Lcom/bumptech/glide/request/BaseRequestOptions; HSPLcom/bumptech/glide/request/BaseRequestOptions;->self()Lcom/bumptech/glide/request/BaseRequestOptions; HSPLcom/bumptech/glide/request/BaseRequestOptions;->selfOrThrowIfLocked()Lcom/bumptech/glide/request/BaseRequestOptions; @@ -6906,6 +7289,7 @@ HSPLcom/bumptech/glide/request/SingleRequest;->getErrorDrawable()Landroid/graphi HSPLcom/bumptech/glide/request/SingleRequest;->getLock()Ljava/lang/Object; HSPLcom/bumptech/glide/request/SingleRequest;->getPlaceholderDrawable()Landroid/graphics/drawable/Drawable; HSPLcom/bumptech/glide/request/SingleRequest;->isEquivalentTo(Lcom/bumptech/glide/request/Request;)Z +HSPLcom/bumptech/glide/request/SingleRequest;->isRunning()Z HSPLcom/bumptech/glide/request/SingleRequest;->maybeApplySizeMultiplier(IF)I HSPLcom/bumptech/glide/request/SingleRequest;->notifyRequestCoordinatorLoadFailed()V HSPLcom/bumptech/glide/request/SingleRequest;->obtain(Landroid/content/Context;Lcom/bumptech/glide/GlideContext;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Class;Lcom/bumptech/glide/request/BaseRequestOptions;IILcom/bumptech/glide/Priority;Lcom/bumptech/glide/request/target/Target;Lcom/bumptech/glide/request/RequestListener;Ljava/util/List;Lcom/bumptech/glide/request/RequestCoordinator;Lcom/bumptech/glide/load/engine/Engine;Lcom/bumptech/glide/request/transition/TransitionFactory;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/request/SingleRequest; @@ -6930,21 +7314,15 @@ HSPLcom/bumptech/glide/request/target/ImageViewTarget;->(Landroid/widget/I HSPLcom/bumptech/glide/request/target/ImageViewTarget;->maybeUpdateAnimatable(Ljava/lang/Object;)V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->onLoadFailed(Landroid/graphics/drawable/Drawable;)V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->onLoadStarted(Landroid/graphics/drawable/Drawable;)V +HSPLcom/bumptech/glide/request/target/ImageViewTarget;->onStop()V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->setDrawable(Landroid/graphics/drawable/Drawable;)V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->setResourceInternal(Ljava/lang/Object;)V HSPLcom/bumptech/glide/request/target/ImageViewTargetFactory;->()V HSPLcom/bumptech/glide/request/target/ImageViewTargetFactory;->buildTarget(Landroid/widget/ImageView;Ljava/lang/Class;)Lcom/bumptech/glide/request/target/ViewTarget; HSPLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->(Landroid/view/View;)V -HSPLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->getSize(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V -HSPLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->getTargetDimen(III)I -HSPLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->getTargetHeight()I -HSPLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->getTargetWidth()I -HSPLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->isDimensionValid(I)Z -HSPLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->isViewStateAndSizeValid(II)Z HSPLcom/bumptech/glide/request/target/ViewTarget;->()V HSPLcom/bumptech/glide/request/target/ViewTarget;->(Landroid/view/View;)V HSPLcom/bumptech/glide/request/target/ViewTarget;->getRequest()Lcom/bumptech/glide/request/Request; -HSPLcom/bumptech/glide/request/target/ViewTarget;->getSize(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V HSPLcom/bumptech/glide/request/target/ViewTarget;->getTag()Ljava/lang/Object; HSPLcom/bumptech/glide/request/target/ViewTarget;->maybeAddAttachStateListener()V HSPLcom/bumptech/glide/request/target/ViewTarget;->onLoadStarted(Landroid/graphics/drawable/Drawable;)V @@ -7057,13 +7435,9 @@ HSPLcom/fasterxml/jackson/annotation/JsonFormat$Value;->hasShape()Z HSPLcom/fasterxml/jackson/annotation/JsonFormat$Value;->withOverrides(Lcom/fasterxml/jackson/annotation/JsonFormat$Value;)Lcom/fasterxml/jackson/annotation/JsonFormat$Value; HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->()V HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->(Ljava/util/Set;ZZZZ)V -HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->_asSet([Ljava/lang/String;)Ljava/util/Set; -HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->_empty(Ljava/util/Set;ZZZZ)Z -HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->construct(Ljava/util/Set;ZZZZ)Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value; HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->empty()Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value; HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->findIgnoredForDeserialization()Ljava/util/Set; HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->findIgnoredForSerialization()Ljava/util/Set; -HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->from(Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties;)Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value; HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->getIgnoreUnknown()Z HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->merge(Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;)Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value; HSPLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->withOverrides(Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;)Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value; @@ -7104,10 +7478,6 @@ HSPLcom/fasterxml/jackson/core/Base64Variant;->(Lcom/fasterxml/jackson/cor HSPLcom/fasterxml/jackson/core/Base64Variant;->(Lcom/fasterxml/jackson/core/Base64Variant;Ljava/lang/String;ZCI)V HSPLcom/fasterxml/jackson/core/Base64Variant;->(Lcom/fasterxml/jackson/core/Base64Variant;Ljava/lang/String;ZCLcom/fasterxml/jackson/core/Base64Variant$PaddingReadBehaviour;I)V HSPLcom/fasterxml/jackson/core/Base64Variant;->(Ljava/lang/String;Ljava/lang/String;ZCI)V -HSPLcom/fasterxml/jackson/core/Base64Variant;->encodeBase64Chunk(I[CI)I -HSPLcom/fasterxml/jackson/core/Base64Variant;->encodeBase64Partial(II[CI)I -HSPLcom/fasterxml/jackson/core/Base64Variant;->getMaxLineLength()I -HSPLcom/fasterxml/jackson/core/Base64Variant;->usesPadding()Z HSPLcom/fasterxml/jackson/core/Base64Variants;->()V HSPLcom/fasterxml/jackson/core/Base64Variants;->getDefaultVariant()Lcom/fasterxml/jackson/core/Base64Variant; HSPLcom/fasterxml/jackson/core/JsonEncoding;->()V @@ -7172,6 +7542,8 @@ HSPLcom/fasterxml/jackson/core/JsonStreamContext;->inRoot()Z HSPLcom/fasterxml/jackson/core/JsonToken;->()V HSPLcom/fasterxml/jackson/core/JsonToken;->(Ljava/lang/String;ILjava/lang/String;I)V HSPLcom/fasterxml/jackson/core/JsonToken;->id()I +HSPLcom/fasterxml/jackson/core/JsonToken;->isStructEnd()Z +HSPLcom/fasterxml/jackson/core/JsonToken;->isStructStart()Z HSPLcom/fasterxml/jackson/core/JsonToken;->values()[Lcom/fasterxml/jackson/core/JsonToken; HSPLcom/fasterxml/jackson/core/ObjectCodec;->()V HSPLcom/fasterxml/jackson/core/PrettyPrinter;->()V @@ -7196,11 +7568,11 @@ HSPLcom/fasterxml/jackson/core/base/GeneratorBase;->getOutputContext()Lcom/faste HSPLcom/fasterxml/jackson/core/base/GeneratorBase;->isEnabled(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Z HSPLcom/fasterxml/jackson/core/base/ParserBase;->()V HSPLcom/fasterxml/jackson/core/base/ParserBase;->(Lcom/fasterxml/jackson/core/io/IOContext;I)V -HSPLcom/fasterxml/jackson/core/base/ParserBase;->_parseIntValue()I HSPLcom/fasterxml/jackson/core/base/ParserBase;->_parseNumericValue(I)V HSPLcom/fasterxml/jackson/core/base/ParserBase;->_releaseBuffers()V HSPLcom/fasterxml/jackson/core/base/ParserBase;->close()V HSPLcom/fasterxml/jackson/core/base/ParserBase;->convertNumberToLong()V +HSPLcom/fasterxml/jackson/core/base/ParserBase;->getCurrentName()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/base/ParserBase;->getIntValue()I HSPLcom/fasterxml/jackson/core/base/ParserBase;->getLongValue()J HSPLcom/fasterxml/jackson/core/base/ParserBase;->getNumberType()Lcom/fasterxml/jackson/core/JsonParser$NumberType; @@ -7249,11 +7621,7 @@ HSPLcom/fasterxml/jackson/core/io/JsonStringEncoder;->quoteAsUTF8(Ljava/lang/Str HSPLcom/fasterxml/jackson/core/io/NumberInput;->()V HSPLcom/fasterxml/jackson/core/io/NumberInput;->parseInt([CII)I HSPLcom/fasterxml/jackson/core/io/NumberOutput;->()V -HSPLcom/fasterxml/jackson/core/io/NumberOutput;->_full3(I[CI)I HSPLcom/fasterxml/jackson/core/io/NumberOutput;->_leading3(I[CI)I -HSPLcom/fasterxml/jackson/core/io/NumberOutput;->_outputFullBillion(I[CI)I -HSPLcom/fasterxml/jackson/core/io/NumberOutput;->_outputUptoBillion(I[CI)I -HSPLcom/fasterxml/jackson/core/io/NumberOutput;->_outputUptoMillion([CIII)I HSPLcom/fasterxml/jackson/core/io/NumberOutput;->outputInt(I[BI)I HSPLcom/fasterxml/jackson/core/io/NumberOutput;->outputInt(I[CI)I HSPLcom/fasterxml/jackson/core/io/NumberOutput;->outputLong(J[BI)I @@ -7299,19 +7667,21 @@ HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->(Lcom/fasterxml/jackson/core/io/IOContext;ILjava/io/Reader;Lcom/fasterxml/jackson/core/ObjectCodec;Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;)V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->(Lcom/fasterxml/jackson/core/io/IOContext;ILjava/io/Reader;Lcom/fasterxml/jackson/core/ObjectCodec;Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;[CIIZ)V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_closeInput()V -HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_closeScope(I)V +HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_finishString()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_finishString2()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_loadMore()Z -HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_matchFalse()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_matchNull()V -HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_matchTrue()V +HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_nextAfterName()Lcom/fasterxml/jackson/core/JsonToken; +HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_parseName()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_parseName2(III)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_parseNumber2(ZI)Lcom/fasterxml/jackson/core/JsonToken; +HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_parsePosNumber(I)Lcom/fasterxml/jackson/core/JsonToken; HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_releaseBuffers()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_skipAfterComma2()I HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_skipColon()I HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_skipColon2(Z)I HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_skipComma(I)I +HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_skipString()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_skipWSOrEnd()I HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_skipWSOrEnd2()I HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_updateLocation()V @@ -7332,8 +7702,6 @@ HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->close()V HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeEndArray()V HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeEndObject()V HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeFieldName(Lcom/fasterxml/jackson/core/SerializableString;)V -HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeFieldName(Ljava/lang/String;)V -HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeNumber(I)V HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeNumber(J)V HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeStartArray(Ljava/lang/Object;I)V HSPLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeStartObject(Ljava/lang/Object;)V @@ -7364,6 +7732,7 @@ HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->findName(III)Ljava/la HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->findName(IIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->findName([IIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getReadCapabilities()Lcom/fasterxml/jackson/core/util/JacksonFeatureSet; +HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getText()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->nextFieldName()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->parseEscapedName([IIIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->parseLongName(III)Ljava/lang/String; @@ -7375,21 +7744,20 @@ HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->(Lcom/faste HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_flushBuffer()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_releaseBuffers()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_verifyValueWrite(Ljava/lang/String;)V -HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeBinary(Lcom/fasterxml/jackson/core/Base64Variant;[BII)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeFieldName(Lcom/fasterxml/jackson/core/SerializableString;Z)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeFieldName(Ljava/lang/String;Z)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeNull()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeString(Ljava/lang/String;)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeString2(I)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->close()V -HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeBinary(Lcom/fasterxml/jackson/core/Base64Variant;[BII)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeBoolean(Z)V +HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeEndArray()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeEndObject()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeFieldName(Lcom/fasterxml/jackson/core/SerializableString;)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeFieldName(Ljava/lang/String;)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeNull()V -HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeNumber(I)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeNumber(J)V +HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeStartArray(Ljava/lang/Object;I)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeStartObject(Ljava/lang/Object;)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeString(Ljava/lang/String;)V HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer$TableInfo;->(III[I[Ljava/lang/String;II)V @@ -7403,7 +7771,6 @@ HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_calcTertiaryShift(I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_checkNeedForRehash()Z HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_findOffsetForAdd(I)I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_findSecondary(III)Ljava/lang/String; -HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_findSecondary(IIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_resizeAndFindOffsetForAdd(I)I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_spilloverStart()I HSPLcom/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer;->_verifyLongName([III)Z @@ -7433,6 +7800,7 @@ HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer$TableInfo;->createIn HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->(I)V HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->(Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;IILcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer$TableInfo;)V HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->_addSymbol([CIIII)Ljava/lang/String; +HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->_findSymbol2([CIILcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer$Bucket;)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->_hashToIndex(I)I HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->_thresholdSize(I)I HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->copyArrays()V @@ -7523,7 +7891,6 @@ HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findFormat(Lcom/fast HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findImplicitPropertyName(Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember;)Ljava/lang/String; HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findInjectableValue(Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember;)Lcom/fasterxml/jackson/annotation/JacksonInject$Value; HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findInjectableValueId(Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember;)Ljava/lang/Object; -HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findKeySerializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findMergeInfo(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Boolean; HSPLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findNameForDeserialization(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Lcom/fasterxml/jackson/databind/PropertyName; @@ -7600,9 +7967,7 @@ HSPLcom/fasterxml/jackson/databind/DeserializationConfig;->without(Lcom/fasterxm HSPLcom/fasterxml/jackson/databind/DeserializationContext;->(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/InjectableValues;)V HSPLcom/fasterxml/jackson/databind/DeserializationContext;->(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/deser/DeserializerFactory;)V HSPLcom/fasterxml/jackson/databind/DeserializationContext;->(Lcom/fasterxml/jackson/databind/deser/DeserializerFactory;Lcom/fasterxml/jackson/databind/deser/DeserializerCache;)V -HSPLcom/fasterxml/jackson/databind/DeserializationContext;->constructType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/DeserializationContext;->findContextualValueDeserializer(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/DeserializationContext;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/KeyDeserializer; HSPLcom/fasterxml/jackson/databind/DeserializationContext;->findNonContextualValueDeserializer(Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/DeserializationContext;->findRootValueDeserializer(Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/DeserializationContext;->getAnnotationIntrospector()Lcom/fasterxml/jackson/databind/AnnotationIntrospector; @@ -7656,7 +8021,6 @@ HSPLcom/fasterxml/jackson/databind/JsonNode;->()V HSPLcom/fasterxml/jackson/databind/JsonNode;->iterator()Ljava/util/Iterator; HSPLcom/fasterxml/jackson/databind/JsonSerializable$Base;->()V HSPLcom/fasterxml/jackson/databind/JsonSerializer;->()V -HSPLcom/fasterxml/jackson/databind/KeyDeserializer;->()V HSPLcom/fasterxml/jackson/databind/MapperFeature;->()V HSPLcom/fasterxml/jackson/databind/MapperFeature;->(Ljava/lang/String;IZ)V HSPLcom/fasterxml/jackson/databind/MapperFeature;->enabledByDefault()Z @@ -7778,7 +8142,6 @@ HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->()V HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->(Lcom/fasterxml/jackson/databind/introspect/ClassIntrospector;Lcom/fasterxml/jackson/databind/AnnotationIntrospector;Lcom/fasterxml/jackson/databind/PropertyNamingStrategy;Lcom/fasterxml/jackson/databind/type/TypeFactory;Lcom/fasterxml/jackson/databind/jsontype/TypeResolverBuilder;Ljava/text/DateFormat;Lcom/fasterxml/jackson/databind/cfg/HandlerInstantiator;Ljava/util/Locale;Ljava/util/TimeZone;Lcom/fasterxml/jackson/core/Base64Variant;Lcom/fasterxml/jackson/databind/jsontype/PolymorphicTypeValidator;Lcom/fasterxml/jackson/databind/introspect/AccessorNamingStrategy$Provider;)V HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->getAccessorNaming()Lcom/fasterxml/jackson/databind/introspect/AccessorNamingStrategy$Provider; HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->getAnnotationIntrospector()Lcom/fasterxml/jackson/databind/AnnotationIntrospector; -HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->getBase64Variant()Lcom/fasterxml/jackson/core/Base64Variant; HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->getClassIntrospector()Lcom/fasterxml/jackson/databind/introspect/ClassIntrospector; HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->getHandlerInstantiator()Lcom/fasterxml/jackson/databind/cfg/HandlerInstantiator; HSPLcom/fasterxml/jackson/databind/cfg/BaseSettings;->getLocale()Ljava/util/Locale; @@ -7841,9 +8204,7 @@ HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->([Lcom/ HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->deserializers()Ljava/lang/Iterable; HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->hasAbstractTypeResolvers()Z HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->hasDeserializerModifiers()Z -HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->hasKeyDeserializers()Z HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->hasValueInstantiators()Z -HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->keyDeserializers()Ljava/lang/Iterable; HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->valueInstantiators()Ljava/lang/Iterable; HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->withAdditionalDeserializers(Lcom/fasterxml/jackson/databind/deser/Deserializers;)Lcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig; HSPLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->withValueInstantiators(Lcom/fasterxml/jackson/databind/deser/ValueInstantiators;)Lcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig; @@ -7856,7 +8217,6 @@ HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->collectFeatureDefaults(Lja HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->constructType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->getAccessorNaming()Lcom/fasterxml/jackson/databind/introspect/AccessorNamingStrategy$Provider; HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->getAnnotationIntrospector()Lcom/fasterxml/jackson/databind/AnnotationIntrospector; -HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->getBase64Variant()Lcom/fasterxml/jackson/core/Base64Variant; HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->getClassIntrospector()Lcom/fasterxml/jackson/databind/introspect/ClassIntrospector; HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->getDefaultInclusion(Ljava/lang/Class;Ljava/lang/Class;Lcom/fasterxml/jackson/annotation/JsonInclude$Value;)Lcom/fasterxml/jackson/annotation/JsonInclude$Value; HSPLcom/fasterxml/jackson/databind/cfg/MapperConfig;->getDefaultPropertyInclusion(Ljava/lang/Class;Lcom/fasterxml/jackson/annotation/JsonInclude$Value;)Lcom/fasterxml/jackson/annotation/JsonInclude$Value; @@ -7903,7 +8263,6 @@ HSPLcom/fasterxml/jackson/databind/cfg/SerializerFactoryConfig;->withAdditionalS HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$1;->()V HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$ContainerDefaultMappings;->()V HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$ContainerDefaultMappings;->findCollectionFallback(Lcom/fasterxml/jackson/databind/JavaType;)Ljava/lang/Class; -HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$ContainerDefaultMappings;->findMapFallback(Lcom/fasterxml/jackson/databind/JavaType;)Ljava/lang/Class; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$CreatorCollectionState;->(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/introspect/VisibilityChecker;Lcom/fasterxml/jackson/databind/deser/impl/CreatorCollector;Ljava/util/Map;)V HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$CreatorCollectionState;->addImplicitConstructorCandidate(Lcom/fasterxml/jackson/databind/deser/impl/CreatorCandidate;)V HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$CreatorCollectionState;->addImplicitFactoryCandidate(Lcom/fasterxml/jackson/databind/deser/impl/CreatorCandidate;)V @@ -7929,18 +8288,14 @@ HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_findCreator HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_findCustomArrayDeserializer(Lcom/fasterxml/jackson/databind/type/ArrayType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_findCustomBeanDeserializer(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_findCustomCollectionDeserializer(Lcom/fasterxml/jackson/databind/type/CollectionType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_findCustomMapDeserializer(Lcom/fasterxml/jackson/databind/type/MapType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_findCustomTreeNodeDeserializer(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_getSetterInfo(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;Lcom/fasterxml/jackson/databind/PropertyMetadata;)Lcom/fasterxml/jackson/databind/PropertyMetadata; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_handleSingleArgumentCreator(Lcom/fasterxml/jackson/databind/deser/impl/CreatorCollector;Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams;ZZ)Z HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_mapAbstractCollectionType(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/DeserializationConfig;)Lcom/fasterxml/jackson/databind/type/CollectionType; -HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_mapAbstractMapType(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/DeserializationConfig;)Lcom/fasterxml/jackson/databind/type/MapType; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_mapAbstractType2(Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->constructCreatorProperty(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/PropertyName;ILcom/fasterxml/jackson/databind/introspect/AnnotatedParameter;Lcom/fasterxml/jackson/annotation/JacksonInject$Value;)Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->createArrayDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/type/ArrayType;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->createCollectionDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/type/CollectionType;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->createKeyDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/KeyDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->createMapDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/type/MapType;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->createTreeDeserializer(Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->findDefaultDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->findDeserializerFromAnnotation(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/introspect/Annotated;)Lcom/fasterxml/jackson/databind/JsonDeserializer; @@ -7959,7 +8314,6 @@ HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->_deserializeWithErro HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserializeFromObject(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; -HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->vanillaDeserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/core/JsonToken;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->()V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->(Lcom/fasterxml/jackson/databind/deser/BeanDeserializerBuilder;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/deser/impl/BeanPropertyMap;Ljava/util/Map;Ljava/util/Set;ZLjava/util/Set;Z)V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->_delegateDeserializer()Lcom/fasterxml/jackson/databind/JsonDeserializer; @@ -7996,7 +8350,6 @@ HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBuilder;->setValueInsta HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->()V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->(Lcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;)V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->_findUnsupportedTypeDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->_isSetterlessType(Ljava/lang/Class;)Z HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->_validateSubType(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/BeanDescription;)V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->addBackReferenceProperties(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/deser/BeanDeserializerBuilder;)V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->addBeanProps(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/deser/BeanDeserializerBuilder;)V @@ -8032,7 +8385,6 @@ HSPLcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext;->( HSPLcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext;->(Lcom/fasterxml/jackson/databind/deser/DeserializerFactory;Lcom/fasterxml/jackson/databind/deser/DeserializerCache;)V HSPLcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext;->checkUnresolvedObjectId()V HSPLcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext;->deserializerInstance(Lcom/fasterxml/jackson/databind/introspect/Annotated;Ljava/lang/Object;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext;->keyDeserializerInstance(Lcom/fasterxml/jackson/databind/introspect/Annotated;Ljava/lang/Object;)Lcom/fasterxml/jackson/databind/KeyDeserializer; HSPLcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext;->readRootValue(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JsonDeserializer;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->()V HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->(I)V @@ -8043,7 +8395,6 @@ HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->_createDeserializer HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->_findCachedDeserializer(Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->_hasCustomHandlers(Lcom/fasterxml/jackson/databind/JavaType;)Z HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->findDeserializerFromAnnotation(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/introspect/Annotated;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/deser/DeserializerFactory;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/KeyDeserializer; HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->findValueDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/deser/DeserializerFactory;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/DeserializerCache;->modifyTypeByAnnotation(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/introspect/Annotated;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/deser/DeserializerFactory;->()V @@ -8051,7 +8402,6 @@ HSPLcom/fasterxml/jackson/databind/deser/DeserializerFactory;->()V HSPLcom/fasterxml/jackson/databind/deser/Deserializers$Base;->()V HSPLcom/fasterxml/jackson/databind/deser/Deserializers$Base;->findArrayDeserializer(Lcom/fasterxml/jackson/databind/type/ArrayType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/Deserializers$Base;->findCollectionDeserializer(Lcom/fasterxml/jackson/databind/type/CollectionType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/Deserializers$Base;->findMapDeserializer(Lcom/fasterxml/jackson/databind/type/MapType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/Deserializers$Base;->findTreeNodeDeserializer(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/SettableBeanProperty;->()V HSPLcom/fasterxml/jackson/databind/deser/SettableBeanProperty;->(Lcom/fasterxml/jackson/databind/PropertyName;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/PropertyName;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/util/Annotations;Lcom/fasterxml/jackson/databind/PropertyMetadata;)V @@ -8070,11 +8420,7 @@ HSPLcom/fasterxml/jackson/databind/deser/SettableBeanProperty;->hasViews()Z HSPLcom/fasterxml/jackson/databind/deser/SettableBeanProperty;->setViews([Ljava/lang/Class;)V HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator$Base;->(Ljava/lang/Class;)V HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->()V -HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->canCreateFromObjectWith()Z -HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->canCreateUsingArrayDelegate()Z -HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->canCreateUsingDelegate()Z HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/deser/ValueInstantiator; -HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->createFromObjectWith(Lcom/fasterxml/jackson/databind/DeserializationContext;[Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;Lcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->getArrayDelegateCreator()Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams; HSPLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->getDelegateCreator()Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams; HSPLcom/fasterxml/jackson/databind/deser/impl/BeanPropertyMap;->(ZLjava/util/Collection;Ljava/util/Map;Ljava/util/Locale;)V @@ -8118,7 +8464,6 @@ HSPLcom/fasterxml/jackson/databind/deser/impl/FailingDeserializer;->(Ljava HSPLcom/fasterxml/jackson/databind/deser/impl/FailingDeserializer;->(Ljava/lang/String;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->(Lcom/fasterxml/jackson/databind/deser/impl/FieldProperty;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->(Lcom/fasterxml/jackson/databind/introspect/BeanPropertyDefinition;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/util/Annotations;Lcom/fasterxml/jackson/databind/introspect/AnnotatedField;)V -HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->deserializeAndSet(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->fixAccess(Lcom/fasterxml/jackson/databind/DeserializationConfig;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->getMember()Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember; HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->withValueDeserializer(Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty; @@ -8126,10 +8471,6 @@ HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$ArrayListIns HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$ArrayListInstantiator;->()V HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$ArrayListInstantiator;->canCreateUsingDefault()Z HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$ArrayListInstantiator;->createUsingDefault(Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; -HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->()V -HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->()V -HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->canCreateUsingDefault()Z -HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->createUsingDefault(Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators;->findStdValueInstantiator(Lcom/fasterxml/jackson/databind/DeserializationConfig;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/deser/ValueInstantiator; HSPLcom/fasterxml/jackson/databind/deser/impl/NullsConstantProvider;->()V HSPLcom/fasterxml/jackson/databind/deser/impl/NullsConstantProvider;->(Ljava/lang/Object;)V @@ -8143,7 +8484,6 @@ HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->(Lcom/ HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->assignParameter(Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;Ljava/lang/Object;)Z HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->buffered()Lcom/fasterxml/jackson/databind/deser/impl/PropertyValue; HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->getParameter(Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;)Ljava/lang/Object; -HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->getParameters([Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;)[Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->handleIdValue(Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->hasParameter(Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;)Z HSPLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->readIdProperty(Ljava/lang/String;)Z @@ -8167,26 +8507,6 @@ HSPLcom/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer;->deserialize( HSPLcom/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer;->getDeserializer(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer;->isCachable()Z -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/deser/ValueInstantiator;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;)V -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->(Lcom/fasterxml/jackson/databind/deser/std/MapDeserializer;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/util/Set;Ljava/util/Set;)V -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->_isStdKeyDeser(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/KeyDeserializer;)Z -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->_readAndBindStringKeyMap(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/util/Map;)V -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/util/Map; -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->isCachable()Z -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->resolve(Lcom/fasterxml/jackson/databind/DeserializationContext;)V -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->setIgnorableProperties(Ljava/util/Set;)V -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->setIncludableProperties(Ljava/util/Set;)V -HSPLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->withResolved(Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/util/Set;Ljava/util/Set;)Lcom/fasterxml/jackson/databind/deser/std/MapDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->(Ljava/lang/Class;Ljava/lang/Boolean;)V -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Boolean; -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$DoubleDeserializer;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$DoubleDeserializer;->(Ljava/lang/Class;Ljava/lang/Double;)V -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$FloatDeserializer;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$FloatDeserializer;->(Ljava/lang/Class;Ljava/lang/Float;)V HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$IntegerDeserializer;->()V HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$IntegerDeserializer;->(Ljava/lang/Class;Ljava/lang/Integer;)V HSPLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$IntegerDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Integer; @@ -8207,16 +8527,6 @@ HSPLcom/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer;->deseriali HSPLcom/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)[Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer;->isCachable()Z HSPLcom/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer;->withResolved(Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/lang/Boolean;)Lcom/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$BooleanDeser;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$DoubleDeser;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$FloatDeser;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$IntDeser;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$IntDeser;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$LongDeser;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$LongDeser;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers;->(Ljava/lang/Class;)V -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; -HSPLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers;->forType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->()V HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->(Lcom/fasterxml/jackson/databind/JavaType;)V HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->(Ljava/lang/Class;)V @@ -8230,15 +8540,7 @@ HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->findFormatOverrid HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->findValueNullProvider(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;Lcom/fasterxml/jackson/databind/PropertyMetadata;)Lcom/fasterxml/jackson/databind/deser/NullValueProvider; HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->handleUnknownProperty(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;Ljava/lang/String;)V HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->isDefaultDeserializer(Lcom/fasterxml/jackson/databind/JsonDeserializer;)Z -HSPLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->isDefaultKeyDeserializer(Lcom/fasterxml/jackson/databind/KeyDeserializer;)Z -HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD;->(Ljava/lang/Class;)V -HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD;->forType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD; -HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer;->(ILjava/lang/Class;)V -HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer;->(ILjava/lang/Class;Lcom/fasterxml/jackson/databind/deser/std/FromStringDeserializer;)V -HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer;->forType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializers;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializers;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/KeyDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StdScalarDeserializer;->(Ljava/lang/Class;)V HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->(Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/JavaType;)V HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->(Lcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;)V @@ -8257,17 +8559,13 @@ HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->configureFro HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->configureFromStringCreator(Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams;)V HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->createFromObjectWith(Lcom/fasterxml/jackson/databind/DeserializationContext;[Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->createUsingDefault(Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; +HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->getArrayDelegateCreator()Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams; +HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->getDelegateCreator()Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams; HSPLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->getFromObjectArguments(Lcom/fasterxml/jackson/databind/DeserializationConfig;)[Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty; -HSPLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->()V -HSPLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->(Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/lang/Boolean;)V -HSPLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/ValueInstantiator;)V HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/deser/ValueInstantiator;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/lang/Boolean;)V HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; -HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/util/Collection; -HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/util/Collection;)Ljava/util/Collection; HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->isCachable()Z HSPLcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer;->withResolved(Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/lang/Boolean;)Lcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer; HSPLcom/fasterxml/jackson/databind/deser/std/StringDeserializer;->()V @@ -8425,7 +8723,6 @@ HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$EmptyCollector HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NCollector;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/annotation/Annotation;Ljava/lang/Class;Ljava/lang/annotation/Annotation;)V HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NCollector;->addOrOverride(Ljava/lang/annotation/Annotation;)Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NCollector;->asAnnotationMap()Lcom/fasterxml/jackson/databind/introspect/AnnotationMap; -HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NCollector;->asAnnotations()Lcom/fasterxml/jackson/databind/util/Annotations; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NoAnnotations;->()V HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NoAnnotations;->get(Ljava/lang/Class;)Ljava/lang/annotation/Annotation; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneAnnotation;->(Ljava/lang/Class;Ljava/lang/annotation/Annotation;)V @@ -8434,9 +8731,6 @@ HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneCollector;- HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneCollector;->addOrOverride(Ljava/lang/annotation/Annotation;)Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneCollector;->asAnnotationMap()Lcom/fasterxml/jackson/databind/introspect/AnnotationMap; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneCollector;->asAnnotations()Lcom/fasterxml/jackson/databind/util/Annotations; -HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneCollector;->isPresent(Ljava/lang/annotation/Annotation;)Z -HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$TwoAnnotations;->(Ljava/lang/Class;Ljava/lang/annotation/Annotation;Ljava/lang/Class;Ljava/lang/annotation/Annotation;)V -HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$TwoAnnotations;->get(Ljava/lang/Class;)Ljava/lang/annotation/Annotation; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector;->()V HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector;->(Ljava/lang/Object;)V HSPLcom/fasterxml/jackson/databind/introspect/AnnotationCollector;->emptyAnnotations()Lcom/fasterxml/jackson/databind/util/Annotations; @@ -8457,7 +8751,6 @@ HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findF HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findFormat(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Lcom/fasterxml/jackson/annotation/JsonFormat$Value; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findImplicitPropertyName(Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember;)Ljava/lang/String; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findInjectableValue(Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember;)Lcom/fasterxml/jackson/annotation/JacksonInject$Value; -HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findKeySerializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findMergeInfo(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Boolean; HSPLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findNameForDeserialization(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Lcom/fasterxml/jackson/databind/PropertyName; @@ -8562,6 +8855,7 @@ HSPLcom/fasterxml/jackson/databind/introspect/BeanPropertyDefinition;->getNonCon HSPLcom/fasterxml/jackson/databind/introspect/ClassIntrospector;->()V HSPLcom/fasterxml/jackson/databind/introspect/CollectorBase;->()V HSPLcom/fasterxml/jackson/databind/introspect/CollectorBase;->(Lcom/fasterxml/jackson/databind/AnnotationIntrospector;)V +HSPLcom/fasterxml/jackson/databind/introspect/CollectorBase;->_emptyAnnotationMap()Lcom/fasterxml/jackson/databind/introspect/AnnotationMap; HSPLcom/fasterxml/jackson/databind/introspect/CollectorBase;->collectAnnotations(Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector;[Ljava/lang/annotation/Annotation;)Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector; HSPLcom/fasterxml/jackson/databind/introspect/CollectorBase;->collectAnnotations([Ljava/lang/annotation/Annotation;)Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector; HSPLcom/fasterxml/jackson/databind/introspect/CollectorBase;->collectDefaultAnnotations(Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector;[Ljava/lang/annotation/Annotation;)Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector; @@ -8601,7 +8895,6 @@ HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->fi HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findFormat(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Lcom/fasterxml/jackson/annotation/JsonFormat$Value; HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findImplicitPropertyName(Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember;)Ljava/lang/String; HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findInjectableValue(Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember;)Lcom/fasterxml/jackson/annotation/JacksonInject$Value; -HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findKeySerializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findMergeInfo(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Boolean; HSPLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findNameForDeserialization(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Lcom/fasterxml/jackson/databind/PropertyName; @@ -8951,15 +9244,12 @@ HSPLcom/fasterxml/jackson/databind/ser/impl/IndexedListSerializer;->serializeCon HSPLcom/fasterxml/jackson/databind/ser/impl/IndexedListSerializer;->serializeContentsUsing(Ljava/util/List;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;Lcom/fasterxml/jackson/databind/JsonSerializer;)V HSPLcom/fasterxml/jackson/databind/ser/impl/IndexedListSerializer;->withResolved(Lcom/fasterxml/jackson/databind/BeanProperty;Lcom/fasterxml/jackson/databind/jsontype/TypeSerializer;Lcom/fasterxml/jackson/databind/JsonSerializer;Ljava/lang/Boolean;)Lcom/fasterxml/jackson/databind/ser/impl/IndexedListSerializer; HSPLcom/fasterxml/jackson/databind/ser/impl/IndexedListSerializer;->withResolved(Lcom/fasterxml/jackson/databind/BeanProperty;Lcom/fasterxml/jackson/databind/jsontype/TypeSerializer;Lcom/fasterxml/jackson/databind/JsonSerializer;Ljava/lang/Boolean;)Lcom/fasterxml/jackson/databind/ser/std/AsArraySerializerBase; -HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Double;->(Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap;Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;)V -HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Double;->serializerFor(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JsonSerializer; HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Empty;->()V HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Empty;->(Z)V HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Empty;->newWith(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;)Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap; HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Empty;->serializerFor(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JsonSerializer; HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$SerializerAndMapResult;->(Lcom/fasterxml/jackson/databind/JsonSerializer;Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap;)V HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Single;->(Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap;Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;)V -HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Single;->newWith(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;)Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap; HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Single;->serializerFor(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JsonSerializer; HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap;->(Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap;)V HSPLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap;->(Z)V @@ -8978,6 +9268,9 @@ HSPLcom/fasterxml/jackson/databind/ser/impl/ReadOnlyClassToSerializerMap;->untyp HSPLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->()V HSPLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->()V HSPLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->createContextual(Lcom/fasterxml/jackson/databind/SerializerProvider;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonSerializer; +HSPLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V +HSPLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->serialize([Ljava/lang/String;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V +HSPLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->serializeContents([Ljava/lang/String;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V HSPLcom/fasterxml/jackson/databind/ser/impl/UnknownSerializer;->()V HSPLcom/fasterxml/jackson/databind/ser/std/ArraySerializerBase;->(Ljava/lang/Class;)V HSPLcom/fasterxml/jackson/databind/ser/std/ArraySerializerBase;->createContextual(Lcom/fasterxml/jackson/databind/SerializerProvider;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonSerializer; @@ -8995,8 +9288,6 @@ HSPLcom/fasterxml/jackson/databind/ser/std/BooleanSerializer;->(Z)V HSPLcom/fasterxml/jackson/databind/ser/std/BooleanSerializer;->createContextual(Lcom/fasterxml/jackson/databind/SerializerProvider;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonSerializer; HSPLcom/fasterxml/jackson/databind/ser/std/BooleanSerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V HSPLcom/fasterxml/jackson/databind/ser/std/ByteArraySerializer;->()V -HSPLcom/fasterxml/jackson/databind/ser/std/ByteArraySerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V -HSPLcom/fasterxml/jackson/databind/ser/std/ByteArraySerializer;->serialize([BLcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V HSPLcom/fasterxml/jackson/databind/ser/std/CalendarSerializer;->()V HSPLcom/fasterxml/jackson/databind/ser/std/CalendarSerializer;->()V HSPLcom/fasterxml/jackson/databind/ser/std/CalendarSerializer;->(Ljava/lang/Boolean;Ljava/text/DateFormat;)V @@ -9030,7 +9321,6 @@ HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$FloatSerializer;->< HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$IntLikeSerializer;->()V HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$IntLikeSerializer;->()V HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$IntegerSerializer;->(Ljava/lang/Class;)V -HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$IntegerSerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$LongSerializer;->(Ljava/lang/Class;)V HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$LongSerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V HSPLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$ShortSerializer;->()V @@ -9118,11 +9408,11 @@ HSPLcom/fasterxml/jackson/databind/type/CollectionLikeType;->withHandlersFrom(Lc HSPLcom/fasterxml/jackson/databind/type/CollectionType;->(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;Ljava/lang/Object;Ljava/lang/Object;Z)V HSPLcom/fasterxml/jackson/databind/type/CollectionType;->construct(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/CollectionType; HSPLcom/fasterxml/jackson/databind/type/CollectionType;->refine(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; +HSPLcom/fasterxml/jackson/databind/type/CollectionType;->toString()Ljava/lang/String; HSPLcom/fasterxml/jackson/databind/type/LogicalType;->()V HSPLcom/fasterxml/jackson/databind/type/LogicalType;->(Ljava/lang/String;I)V HSPLcom/fasterxml/jackson/databind/type/LogicalType;->values()[Lcom/fasterxml/jackson/databind/type/LogicalType; HSPLcom/fasterxml/jackson/databind/type/MapLikeType;->(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;Ljava/lang/Object;Ljava/lang/Object;Z)V -HSPLcom/fasterxml/jackson/databind/type/MapLikeType;->equals(Ljava/lang/Object;)Z HSPLcom/fasterxml/jackson/databind/type/MapLikeType;->getContentType()Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/MapLikeType;->getKeyType()Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/MapLikeType;->hasHandlers()Z @@ -9132,9 +9422,6 @@ HSPLcom/fasterxml/jackson/databind/type/MapLikeType;->withHandlersFrom(Lcom/fast HSPLcom/fasterxml/jackson/databind/type/MapType;->(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;Ljava/lang/Object;Ljava/lang/Object;Z)V HSPLcom/fasterxml/jackson/databind/type/MapType;->construct(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/MapType; HSPLcom/fasterxml/jackson/databind/type/MapType;->refine(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; -HSPLcom/fasterxml/jackson/databind/type/PlaceholderForType;->(I)V -HSPLcom/fasterxml/jackson/databind/type/PlaceholderForType;->actualType()Lcom/fasterxml/jackson/databind/JavaType; -HSPLcom/fasterxml/jackson/databind/type/PlaceholderForType;->actualType(Lcom/fasterxml/jackson/databind/JavaType;)V HSPLcom/fasterxml/jackson/databind/type/SimpleType;->(Ljava/lang/Class;)V HSPLcom/fasterxml/jackson/databind/type/SimpleType;->(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;)V HSPLcom/fasterxml/jackson/databind/type/SimpleType;->(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;Ljava/lang/Object;Ljava/lang/Object;Z)V @@ -9147,7 +9434,6 @@ HSPLcom/fasterxml/jackson/databind/type/SimpleType;->refine(Ljava/lang/Class;Lco HSPLcom/fasterxml/jackson/databind/type/SimpleType;->toString()Ljava/lang/String; HSPLcom/fasterxml/jackson/databind/type/TypeBase;->()V HSPLcom/fasterxml/jackson/databind/type/TypeBase;->(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;ILjava/lang/Object;Ljava/lang/Object;Z)V -HSPLcom/fasterxml/jackson/databind/type/TypeBase;->findSuperType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeBase;->getBindings()Lcom/fasterxml/jackson/databind/type/TypeBindings; HSPLcom/fasterxml/jackson/databind/type/TypeBase;->getInterfaces()Ljava/util/List; HSPLcom/fasterxml/jackson/databind/type/TypeBase;->getSuperClass()Lcom/fasterxml/jackson/databind/JavaType; @@ -9163,6 +9449,7 @@ HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->asKey(Ljava/lang/Class;)L HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->create(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/TypeBindings; HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->create(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/TypeBindings; HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->create(Ljava/lang/Class;[Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/TypeBindings; +HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->createIfNeeded(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/TypeBindings; HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->emptyBindings()Lcom/fasterxml/jackson/databind/type/TypeBindings; HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->findBoundType(Ljava/lang/String;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeBindings;->getTypeParameters()Ljava/util/List; @@ -9174,7 +9461,6 @@ HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->()V HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->()V HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->(Lcom/fasterxml/jackson/databind/util/LookupCache;)V HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_applyModifiers(Ljava/lang/reflect/Type;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; -HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_bindingsForSubtype(Lcom/fasterxml/jackson/databind/JavaType;ILjava/lang/Class;Z)Lcom/fasterxml/jackson/databind/type/TypeBindings; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_collectionType(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_constructSimple(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_findWellKnownSimple(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType; @@ -9189,9 +9475,9 @@ HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_mapType(Ljava/lang/Class; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_newSimpleType(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;Lcom/fasterxml/jackson/databind/JavaType;[Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_resolveSuperClass(Lcom/fasterxml/jackson/databind/type/ClassStack;Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_resolveSuperInterfaces(Lcom/fasterxml/jackson/databind/type/ClassStack;Ljava/lang/Class;Lcom/fasterxml/jackson/databind/type/TypeBindings;)[Lcom/fasterxml/jackson/databind/JavaType; -HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_resolveTypePlaceholders(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;)Ljava/lang/String; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_unknownType()Lcom/fasterxml/jackson/databind/JavaType; -HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->_verifyAndResolvePlaceholders(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;)Z +HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->constructCollectionType(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/CollectionType; +HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->constructCollectionType(Ljava/lang/Class;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/type/CollectionType; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->constructSpecializedType(Lcom/fasterxml/jackson/databind/JavaType;Ljava/lang/Class;Z)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->constructType(Ljava/lang/reflect/Type;)Lcom/fasterxml/jackson/databind/JavaType; HSPLcom/fasterxml/jackson/databind/type/TypeFactory;->defaultInstance()Lcom/fasterxml/jackson/databind/type/TypeFactory; @@ -9653,6 +9939,7 @@ HSPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityCr HSPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityDestroyed(Landroid/app/Activity;)V HSPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityPaused(Landroid/app/Activity;)V HSPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityResumed(Landroid/app/Activity;)V +HSPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityStarted(Landroid/app/Activity;)V HSPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityStopped(Landroid/app/Activity;)V HSPLcom/google/android/gms/common/internal/Preconditions;->checkNotEmpty(Ljava/lang/String;)Ljava/lang/String; @@ -9697,6 +9984,7 @@ HSPLcom/google/android/material/animation/AnimationUtils;->()V HSPLcom/google/android/material/animation/AnimationUtils;->lerp(FFF)F HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->()V HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->()V +HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer; HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->getInstance()Lcom/google/android/material/animation/ArgbEvaluatorCompat; HSPLcom/google/android/material/animation/MotionSpec;->()V HSPLcom/google/android/material/animation/MotionSpec;->addInfoFromAnimator(Lcom/google/android/material/animation/MotionSpec;Landroid/animation/Animator;)V @@ -9712,29 +10000,44 @@ HSPLcom/google/android/material/appbar/AppBarLayout$$ExternalSyntheticLambda1;-> HSPLcom/google/android/material/appbar/AppBarLayout$1;->(Lcom/google/android/material/appbar/AppBarLayout;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$$ExternalSyntheticLambda0;->(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;Landroid/view/View;Lcom/google/android/material/appbar/AppBarLayout;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$2;->(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)V +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$2;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$4;->(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;Lcom/google/android/material/appbar/AppBarLayout;Z)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->access$000(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->access$100(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)I HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->addAccessibilityScrollActions(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->addActionToExpand(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;Z)V +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->animateOffsetTo(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IF)V +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->animateOffsetWithDuration(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;II)V +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->canDragView(Landroid/view/View;)Z +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->canDragView(Lcom/google/android/material/appbar/AppBarLayout;)Z +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->canScrollChildren(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;)Z +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->checkFlag(II)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->childrenHaveScrollFlags(Lcom/google/android/material/appbar/AppBarLayout;)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->findFirstScrollingChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)Landroid/view/View; HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->getAppBarChildOnOffset(Lcom/google/android/material/appbar/AppBarLayout;I)Landroid/view/View; +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->getChildIndexOnOffset(Lcom/google/android/material/appbar/AppBarLayout;I)I HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->getChildWithScrollingBehavior(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)Landroid/view/View; HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->getTopBottomOffsetForScrollingSibling()I HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;I)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IIII)Z +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;Landroid/view/View;II)Z +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;I)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->setHeaderTopBottomOffset(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;III)I HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->setHeaderTopBottomOffset(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;III)I HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->shouldJumpElevationState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;)Z +HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->snapToChildIfNeeded(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->updateAccessibilityActions(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;)V HSPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->updateAppBarLayoutDrawableState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IIZ)V HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->getTopAndBottomOffset()I +HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;I)Z HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IIII)Z +HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;Landroid/view/View;II)Z +HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;I)V HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z HSPLcom/google/android/material/appbar/AppBarLayout$Behavior;->setTopAndBottomOffset(I)Z HSPLcom/google/android/material/appbar/AppBarLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V @@ -9770,6 +10073,7 @@ HSPLcom/google/android/material/appbar/AppBarLayout;->getTotalScrollRange()I HSPLcom/google/android/material/appbar/AppBarLayout;->getUpNestedPreScrollRange()I HSPLcom/google/android/material/appbar/AppBarLayout;->hasChildWithInterpolator()Z HSPLcom/google/android/material/appbar/AppBarLayout;->hasCollapsibleChild()Z +HSPLcom/google/android/material/appbar/AppBarLayout;->hasScrollableChildren()Z HSPLcom/google/android/material/appbar/AppBarLayout;->initializeLiftOnScrollWithElevation(Landroid/content/Context;Lcom/google/android/material/shape/MaterialShapeDrawable;)V HSPLcom/google/android/material/appbar/AppBarLayout;->invalidateScrollRanges()V HSPLcom/google/android/material/appbar/AppBarLayout;->isLiftOnScroll()Z @@ -9780,6 +10084,7 @@ HSPLcom/google/android/material/appbar/AppBarLayout;->onMeasure(II)V HSPLcom/google/android/material/appbar/AppBarLayout;->onOffsetChanged(I)V HSPLcom/google/android/material/appbar/AppBarLayout;->resetPendingAction()V HSPLcom/google/android/material/appbar/AppBarLayout;->setElevation(F)V +HSPLcom/google/android/material/appbar/AppBarLayout;->setExpanded(ZZ)V HSPLcom/google/android/material/appbar/AppBarLayout;->setExpanded(ZZZ)V HSPLcom/google/android/material/appbar/AppBarLayout;->setLiftableState(Z)Z HSPLcom/google/android/material/appbar/AppBarLayout;->setLiftedState(Z)Z @@ -9787,6 +10092,7 @@ HSPLcom/google/android/material/appbar/AppBarLayout;->setLiftedState(ZZ)Z HSPLcom/google/android/material/appbar/AppBarLayout;->setOrientation(I)V HSPLcom/google/android/material/appbar/AppBarLayout;->setStatusBarForeground(Landroid/graphics/drawable/Drawable;)V HSPLcom/google/android/material/appbar/AppBarLayout;->shouldDrawStatusBarForeground()Z +HSPLcom/google/android/material/appbar/AppBarLayout;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z HSPLcom/google/android/material/appbar/CollapsingToolbarLayout$1;->(Lcom/google/android/material/appbar/CollapsingToolbarLayout;)V HSPLcom/google/android/material/appbar/CollapsingToolbarLayout$2;->(Lcom/google/android/material/appbar/CollapsingToolbarLayout;)V HSPLcom/google/android/material/appbar/CollapsingToolbarLayout$2;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V @@ -9829,6 +10135,7 @@ HSPLcom/google/android/material/appbar/CollapsingToolbarLayout;->updateTextBound HSPLcom/google/android/material/appbar/CollapsingToolbarLayout;->updateTitleFromToolbarIfNeeded()V HSPLcom/google/android/material/appbar/CollapsingToolbarLayout;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z HSPLcom/google/android/material/appbar/HeaderBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLcom/google/android/material/appbar/HeaderBehavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z HSPLcom/google/android/material/appbar/HeaderBehavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z HSPLcom/google/android/material/appbar/HeaderBehavior;->setHeaderTopBottomOffset(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)I HSPLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V @@ -9863,9 +10170,13 @@ HSPLcom/google/android/material/button/MaterialButton;->isIconEnd()Z HSPLcom/google/android/material/button/MaterialButton;->isIconStart()Z HSPLcom/google/android/material/button/MaterialButton;->isIconTop()Z HSPLcom/google/android/material/button/MaterialButton;->isUsingOriginalBackground()Z +HSPLcom/google/android/material/button/MaterialButton;->onAttachedToWindow()V HSPLcom/google/android/material/button/MaterialButton;->onCreateDrawableState(I)[I HSPLcom/google/android/material/button/MaterialButton;->onTextChanged(Ljava/lang/CharSequence;III)V +HSPLcom/google/android/material/button/MaterialButton;->refreshDrawableState()V +HSPLcom/google/android/material/button/MaterialButton;->resetIconDrawable()V HSPLcom/google/android/material/button/MaterialButton;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V +HSPLcom/google/android/material/button/MaterialButton;->setElevation(F)V HSPLcom/google/android/material/button/MaterialButton;->setInternalBackground(Landroid/graphics/drawable/Drawable;)V HSPLcom/google/android/material/button/MaterialButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V HSPLcom/google/android/material/button/MaterialButton;->updateIcon(Z)V @@ -9877,6 +10188,8 @@ HSPLcom/google/android/material/button/MaterialButtonHelper;->getMaskDrawable()L HSPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; HSPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable(Z)Lcom/google/android/material/shape/MaterialShapeDrawable; HSPLcom/google/android/material/button/MaterialButtonHelper;->getSurfaceColorStrokeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; +HSPLcom/google/android/material/button/MaterialButtonHelper;->isBackgroundOverwritten()Z +HSPLcom/google/android/material/button/MaterialButtonHelper;->isCheckable()Z HSPLcom/google/android/material/button/MaterialButtonHelper;->loadFromAttributes(Landroid/content/res/TypedArray;)V HSPLcom/google/android/material/button/MaterialButtonHelper;->setShapeAppearanceModel(Lcom/google/android/material/shape/ShapeAppearanceModel;)V HSPLcom/google/android/material/button/MaterialButtonHelper;->updateBackground()V @@ -10055,6 +10368,7 @@ HSPLcom/google/android/material/elevation/ElevationOverlayProvider;->(ZIII HSPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlayIfNeeded(IF)I HSPLcom/google/android/material/elevation/ElevationOverlayProvider;->isThemeElevationOverlayEnabled()Z HSPLcom/google/android/material/expandable/ExpandableWidgetHelper;->(Lcom/google/android/material/expandable/ExpandableWidget;)V +HSPLcom/google/android/material/expandable/ExpandableWidgetHelper;->onSaveInstanceState()Landroid/os/Bundle; HSPLcom/google/android/material/floatingactionbutton/BorderDrawable$BorderState;->(Lcom/google/android/material/floatingactionbutton/BorderDrawable;)V HSPLcom/google/android/material/floatingactionbutton/BorderDrawable$BorderState;->(Lcom/google/android/material/floatingactionbutton/BorderDrawable;Lcom/google/android/material/floatingactionbutton/BorderDrawable$1;)V HSPLcom/google/android/material/floatingactionbutton/BorderDrawable;->(Lcom/google/android/material/shape/ShapeAppearanceModel;)V @@ -10085,6 +10399,7 @@ HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->getS HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->jumpDrawablesToCurrentState()V HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onAttachedToWindow()V HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onMeasure(II)V +HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onSaveInstanceState()Landroid/os/Parcelable; HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setElevation(F)V HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V HSPLcom/google/android/material/floatingactionbutton/FloatingActionButton;->setMaxImageSize(I)V @@ -10138,9 +10453,29 @@ HSPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImplLol HSPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImplLollipop;->requirePreDrawListener()Z HSPLcom/google/android/material/floatingactionbutton/FloatingActionButtonImplLollipop;->shouldAddPadding()Z HSPLcom/google/android/material/imageview/ShapeableImageView$OutlineProvider;->(Lcom/google/android/material/imageview/ShapeableImageView;)V +HSPLcom/google/android/material/imageview/ShapeableImageView$OutlineProvider;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V HSPLcom/google/android/material/imageview/ShapeableImageView;->()V HSPLcom/google/android/material/imageview/ShapeableImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLcom/google/android/material/imageview/ShapeableImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLcom/google/android/material/imageview/ShapeableImageView;->access$000(Lcom/google/android/material/imageview/ShapeableImageView;)Lcom/google/android/material/shape/ShapeAppearanceModel; +HSPLcom/google/android/material/imageview/ShapeableImageView;->access$100(Lcom/google/android/material/imageview/ShapeableImageView;)Lcom/google/android/material/shape/MaterialShapeDrawable; +HSPLcom/google/android/material/imageview/ShapeableImageView;->access$102(Lcom/google/android/material/imageview/ShapeableImageView;Lcom/google/android/material/shape/MaterialShapeDrawable;)Lcom/google/android/material/shape/MaterialShapeDrawable; +HSPLcom/google/android/material/imageview/ShapeableImageView;->access$200(Lcom/google/android/material/imageview/ShapeableImageView;)Landroid/graphics/RectF; +HSPLcom/google/android/material/imageview/ShapeableImageView;->drawStroke(Landroid/graphics/Canvas;)V +HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingBottom()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingLeft()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingRight()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingTop()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingBottom()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingLeft()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingRight()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingTop()I +HSPLcom/google/android/material/imageview/ShapeableImageView;->isContentPaddingRelative()Z +HSPLcom/google/android/material/imageview/ShapeableImageView;->onDraw(Landroid/graphics/Canvas;)V +HSPLcom/google/android/material/imageview/ShapeableImageView;->onMeasure(II)V +HSPLcom/google/android/material/imageview/ShapeableImageView;->onSizeChanged(IIII)V +HSPLcom/google/android/material/imageview/ShapeableImageView;->setPadding(IIII)V +HSPLcom/google/android/material/imageview/ShapeableImageView;->updateShapeMask(II)V HSPLcom/google/android/material/internal/CollapsingTextHelper$1;->(Lcom/google/android/material/internal/CollapsingTextHelper;)V HSPLcom/google/android/material/internal/CollapsingTextHelper$1;->apply(Landroid/graphics/Typeface;)V HSPLcom/google/android/material/internal/CollapsingTextHelper$2;->(Lcom/google/android/material/internal/CollapsingTextHelper;)V @@ -10340,6 +10675,8 @@ HSPLcom/google/android/material/shape/MaterialShapeUtils;->setElevation(Landroid HSPLcom/google/android/material/shape/MaterialShapeUtils;->setParentAbsoluteElevation(Landroid/view/View;)V HSPLcom/google/android/material/shape/MaterialShapeUtils;->setParentAbsoluteElevation(Landroid/view/View;Lcom/google/android/material/shape/MaterialShapeDrawable;)V HSPLcom/google/android/material/shape/RelativeCornerSize;->(F)V +HSPLcom/google/android/material/shape/RelativeCornerSize;->getCornerSize(Landroid/graphics/RectF;)F +HSPLcom/google/android/material/shape/RelativeCornerSize;->getMaxCornerSize(Landroid/graphics/RectF;)F HSPLcom/google/android/material/shape/RoundedCornerTreatment;->()V HSPLcom/google/android/material/shape/RoundedCornerTreatment;->getCornerPath(Lcom/google/android/material/shape/ShapePath;FFF)V HSPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->()V @@ -10469,6 +10806,9 @@ HSPLcom/google/android/material/shape/ShapePath;->setEndX(F)V HSPLcom/google/android/material/shape/ShapePath;->setEndY(F)V HSPLcom/google/android/material/shape/ShapePath;->setStartX(F)V HSPLcom/google/android/material/shape/ShapePath;->setStartY(F)V +HSPLcom/google/android/material/stateful/ExtendableSavedState$1;->()V +HSPLcom/google/android/material/stateful/ExtendableSavedState;->()V +HSPLcom/google/android/material/stateful/ExtendableSavedState;->(Landroid/os/Parcelable;)V HSPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->()V HSPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->obtainAndroidThemeOverlayId(Landroid/content/Context;Landroid/util/AttributeSet;)I HSPLcom/google/android/material/theme/overlay/MaterialThemeOverlay;->obtainMaterialThemeOverlayId(Landroid/content/Context;Landroid/util/AttributeSet;II)I @@ -10601,6 +10941,11 @@ HSPLcom/google/common/collect/RegularImmutableSet;->copyIntoArray([Ljava/lang/Ob HSPLcom/google/common/collect/RegularImmutableSet;->createAsList()Lcom/google/common/collect/ImmutableList; HSPLcom/google/common/collect/RegularImmutableSet;->iterator()Lcom/google/common/collect/UnmodifiableIterator; HSPLcom/google/common/collect/RegularImmutableSet;->size()I +HSPLcom/google/common/collect/Sets$2;->(Ljava/util/Set;Ljava/util/Set;)V +HSPLcom/google/common/collect/Sets$2;->isEmpty()Z +HSPLcom/google/common/collect/Sets$SetView;->()V +HSPLcom/google/common/collect/Sets$SetView;->(Lcom/google/common/collect/Sets$1;)V +HSPLcom/google/common/collect/Sets;->intersection(Ljava/util/Set;Ljava/util/Set;)Lcom/google/common/collect/Sets$SetView; HSPLcom/google/common/collect/Sets;->newIdentityHashSet()Ljava/util/Set; HSPLcom/google/common/collect/UnmodifiableIterator;->()V HSPLcom/google/common/collect/UnmodifiableListIterator;->()V @@ -10610,6 +10955,7 @@ HSPLcom/google/common/util/concurrent/AbstractFuture$AtomicHelper;->(Lcom/ HSPLcom/google/common/util/concurrent/AbstractFuture$Listener;->()V HSPLcom/google/common/util/concurrent/AbstractFuture$Listener;->()V HSPLcom/google/common/util/concurrent/AbstractFuture$Listener;->(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V +HSPLcom/google/common/util/concurrent/AbstractFuture$TrustedFuture;->()V HSPLcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0;->m(Lsun/misc/Unsafe;Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z HSPLcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper$1;->()V HSPLcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper$1;->run()Ljava/lang/Object; @@ -10664,6 +11010,9 @@ HSPLcom/google/common/util/concurrent/ImmediateFuture;->get()Ljava/lang/Object; HSPLcom/google/common/util/concurrent/MoreExecutors$ListeningDecorator;->(Ljava/util/concurrent/ExecutorService;)V HSPLcom/google/common/util/concurrent/MoreExecutors;->directExecutor()Ljava/util/concurrent/Executor; HSPLcom/google/common/util/concurrent/MoreExecutors;->listeningDecorator(Ljava/util/concurrent/ExecutorService;)Lcom/google/common/util/concurrent/ListeningExecutorService; +HSPLcom/google/common/util/concurrent/SettableFuture;->()V +HSPLcom/google/common/util/concurrent/SettableFuture;->create()Lcom/google/common/util/concurrent/SettableFuture; +HSPLcom/google/common/util/concurrent/SettableFuture;->set(Ljava/lang/Object;)Z HSPLcom/google/common/util/concurrent/Uninterruptibles;->getUninterruptibly(Ljava/util/concurrent/Future;)Ljava/lang/Object; HSPLcom/google/common/util/concurrent/internal/InternalFutureFailureAccess;->()V HSPLcom/google/common/util/concurrent/internal/InternalFutures;->tryInternalFastPathGetFailure(Lcom/google/common/util/concurrent/internal/InternalFutureFailureAccess;)Ljava/lang/Throwable; @@ -10985,6 +11334,7 @@ HSPLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivityCreated(Land HSPLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V HSPLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V HSPLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +HSPLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V HSPLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V HSPLcom/google/firebase/messaging/FirebaseMessaging$$ExternalSyntheticLambda1;->(Lcom/google/firebase/messaging/FirebaseMessaging;)V @@ -11077,18 +11427,22 @@ HSPLcom/google/firebase/tracing/FirebaseTrace;->popTrace()V HSPLcom/google/firebase/tracing/FirebaseTrace;->pushTrace(Ljava/lang/String;)V HSPLcom/google/i18n/phonenumbers/CountryCodeToRegionCodeMap;->getCountryCodeToRegionCodeMap()Ljava/util/Map; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$2;->()V +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;->$values()[Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;->()V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;->(Ljava/lang/String;I)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;->values()[Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;->$values()[Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;->()V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;->(Ljava/lang/String;I)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;->values()[Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;->$values()[Lcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;->()V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;->(Ljava/lang/String;I)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->()V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->(Lcom/google/i18n/phonenumbers/metadata/source/MetadataSource;Ljava/util/Map;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->buildNationalNumberForParsing(Ljava/lang/String;Ljava/lang/StringBuilder;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->checkRegionForParsing(Ljava/lang/CharSequence;Ljava/lang/String;)Z +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->chooseFormattingPatternForNumber(Ljava/util/List;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->createExtnPattern(Z)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->createInstance(Lcom/google/i18n/phonenumbers/MetadataLoader;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->createInstance(Lcom/google/i18n/phonenumbers/metadata/source/MetadataSource;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil; @@ -11097,14 +11451,26 @@ HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extnDigits(I)Ljava/lang/Strin HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extractCountryCode(Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;)I HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extractPhoneContext(Ljava/lang/String;I)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extractPossibleNumber(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsnUsingPattern(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getInstance()Lcom/google/i18n/phonenumbers/PhoneNumberUtil; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegion(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegionOrCallingCode(ILjava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNationalSignificantNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNumberDescByType(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForCountryCode(I)Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->hasValidCountryCallingCode(I)Z +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isPhoneContextValid(Ljava/lang/String;)Z HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isValidRegionCode(Ljava/lang/String;)Z HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isViablePhoneNumber(Ljava/lang/CharSequence;)Z +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeAppendFormattedExtension(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeExtractCountryCode(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Ljava/lang/StringBuilder;ZLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)I HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeStripExtension(Ljava/lang/StringBuilder;)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeStripInternationalPrefixAndNormalize(Ljava/lang/StringBuilder;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource; @@ -11115,30 +11481,52 @@ HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->normalizeDigitsOnly(Ljava/lan HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->parseHelper(Ljava/lang/CharSequence;Ljava/lang/String;ZZLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)V +HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->prefixNumberWithCountryCallingCode(ILcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->setInstance(Lcom/google/i18n/phonenumbers/PhoneNumberUtil;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->setItalianLeadingZerosForPhoneNumber(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->()V +HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getFormat()Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPattern(I)Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPatternCount()I +HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getNationalPrefixFormattingRule()Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getPattern()Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->readExternal(Ljava/io/ObjectInput;)V HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->setFormat(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->setNationalPrefixOptionalWhenFormatting(Z)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->setPattern(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->()V +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getFixedLine()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getGeneralDesc()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getId()Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getIntlNumberFormatList()Ljava/util/List; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getLeadingDigits()Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNationalPrefixForParsing()Ljava/lang/String; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNumberFormatList()Ljava/util/List; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPager()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPersonalNumber()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPremiumRate()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSameMobileAndFixedLinePattern()Z +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSharedCost()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getTollFree()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getUan()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoicemail()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoip()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->hasLeadingDigits()Z HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->readExternal(Ljava/io/ObjectInput;)V HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setCountryCode(I)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setFixedLine(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setGeneralDesc(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setId(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setInternationalPrefix(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setLeadingDigits(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMainCountryForCode(Z)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobile(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobileNumberPortableRegion(Z)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefix(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixForParsing(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixTransformRule(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNoInternationalDialling(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPager(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPersonalNumber(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; @@ -11153,21 +11541,28 @@ HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->( HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->getMetadataList()Ljava/util/List; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->readExternal(Ljava/io/ObjectInput;)V HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->()V +HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getNationalNumberPattern()Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getPossibleLengthList()Ljava/util/List; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getPossibleLengthLocalOnlyList()Ljava/util/List; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->readExternal(Ljava/io/ObjectInput;)V HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->setExampleNumber(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->setNationalNumberPattern(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;->$values()[Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource; HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;->()V HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;->(Ljava/lang/String;I)V HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;->values()[Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource; HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->()V HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->getCountryCode()I +HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->getNationalNumber()J +HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasExtension()Z +HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->isItalianLeadingZero()Z HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCode(I)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->setNationalNumber(J)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/google/i18n/phonenumbers/internal/GeoEntityUtility;->isGeoEntity(Ljava/lang/String;)Z HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->()V HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->create()Lcom/google/i18n/phonenumbers/internal/MatcherApi; +HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z +HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->matchNationalNumber(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Z)Z HSPLcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache$1;->(Lcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache;IFZ)V HSPLcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache$1;->removeEldestEntry(Ljava/util/Map$Entry;)Z HSPLcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache;->(I)V @@ -11217,157 +11612,6 @@ HSPLcom/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider;- HSPLcom/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider;->getFor(Ljava/lang/Object;)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl;->(Lcom/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider;Lcom/google/i18n/phonenumbers/MetadataLoader;Lcom/google/i18n/phonenumbers/metadata/init/MetadataParser;)V HSPLcom/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl;->(Lcom/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider;Lcom/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard;)V -HSPLcom/google/protobuf/AbstractMessageLite$Builder;->()V -HSPLcom/google/protobuf/AbstractMessageLite;->()V -HSPLcom/google/protobuf/AbstractProtobufList;->()V -HSPLcom/google/protobuf/AbstractProtobufList;->ensureIsMutable()V -HSPLcom/google/protobuf/AbstractProtobufList;->isModifiable()Z -HSPLcom/google/protobuf/AbstractProtobufList;->makeImmutable()V -HSPLcom/google/protobuf/Android;->()V -HSPLcom/google/protobuf/Android;->getClassForName(Ljava/lang/String;)Ljava/lang/Class; -HSPLcom/google/protobuf/Android;->getMemoryClass()Ljava/lang/Class; -HSPLcom/google/protobuf/Android;->isOnAndroidDevice()Z -HSPLcom/google/protobuf/ByteString$2;->()V -HSPLcom/google/protobuf/ByteString$LeafByteString;->()V -HSPLcom/google/protobuf/ByteString$LiteralByteString;->([B)V -HSPLcom/google/protobuf/ByteString$SystemByteArrayCopier;->()V -HSPLcom/google/protobuf/ByteString$SystemByteArrayCopier;->(Lcom/google/protobuf/ByteString$1;)V -HSPLcom/google/protobuf/ByteString$SystemByteArrayCopier;->copyFrom([BII)[B -HSPLcom/google/protobuf/ByteString;->()V -HSPLcom/google/protobuf/ByteString;->()V -HSPLcom/google/protobuf/ByteString;->checkRange(III)I -HSPLcom/google/protobuf/ByteString;->copyFrom([B)Lcom/google/protobuf/ByteString; -HSPLcom/google/protobuf/ByteString;->copyFrom([BII)Lcom/google/protobuf/ByteString; -HSPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->([BIIZ)V -HSPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->([BIIZLcom/google/protobuf/CodedInputStream$1;)V -HSPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->getTotalBytesRead()I -HSPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->pushLimit(I)I -HSPLcom/google/protobuf/CodedInputStream$ArrayDecoder;->recomputeBufferSizeAfterLimit()V -HSPLcom/google/protobuf/CodedInputStream;->()V -HSPLcom/google/protobuf/CodedInputStream;->(Lcom/google/protobuf/CodedInputStream$1;)V -HSPLcom/google/protobuf/CodedInputStream;->newInstance([B)Lcom/google/protobuf/CodedInputStream; -HSPLcom/google/protobuf/CodedInputStream;->newInstance([BII)Lcom/google/protobuf/CodedInputStream; -HSPLcom/google/protobuf/CodedInputStream;->newInstance([BIIZ)Lcom/google/protobuf/CodedInputStream; -HSPLcom/google/protobuf/ExtensionSchema;->()V -HSPLcom/google/protobuf/ExtensionSchemaLite;->()V -HSPLcom/google/protobuf/ExtensionSchemaLite;->hasExtensions(Lcom/google/protobuf/MessageLite;)Z -HSPLcom/google/protobuf/ExtensionSchemas;->()V -HSPLcom/google/protobuf/ExtensionSchemas;->lite()Lcom/google/protobuf/ExtensionSchema; -HSPLcom/google/protobuf/ExtensionSchemas;->loadSchemaForFullRuntime()Lcom/google/protobuf/ExtensionSchema; -HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->()V -HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->()V -HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->getInstance()Lcom/google/protobuf/GeneratedMessageInfoFactory; -HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->isSupported(Ljava/lang/Class;)Z -HSPLcom/google/protobuf/GeneratedMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Lcom/google/protobuf/MessageInfo; -HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->buildPartial()Lcom/google/protobuf/GeneratedMessageLite; -HSPLcom/google/protobuf/GeneratedMessageLite$Builder;->copyOnWrite()V -HSPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->()V -HSPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->(Ljava/lang/String;I)V -HSPLcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;->values()[Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke; -HSPLcom/google/protobuf/GeneratedMessageLite;->()V -HSPLcom/google/protobuf/GeneratedMessageLite;->()V -HSPLcom/google/protobuf/GeneratedMessageLite;->buildMessageInfo()Ljava/lang/Object; -HSPLcom/google/protobuf/GeneratedMessageLite;->emptyLongList()Lcom/google/protobuf/Internal$LongList; -HSPLcom/google/protobuf/GeneratedMessageLite;->emptyProtobufList()Lcom/google/protobuf/Internal$ProtobufList; -HSPLcom/google/protobuf/GeneratedMessageLite;->getDefaultInstance(Ljava/lang/Class;)Lcom/google/protobuf/GeneratedMessageLite; -HSPLcom/google/protobuf/GeneratedMessageLite;->isInitialized()Z -HSPLcom/google/protobuf/GeneratedMessageLite;->makeImmutable()V -HSPLcom/google/protobuf/GeneratedMessageLite;->newMessageInfo(Lcom/google/protobuf/MessageLite;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/google/protobuf/GeneratedMessageLite;->registerDefaultInstance(Ljava/lang/Class;Lcom/google/protobuf/GeneratedMessageLite;)V -HSPLcom/google/protobuf/Internal;->()V -HSPLcom/google/protobuf/Internal;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; -HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaFull;->()V -HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaFull;->()V -HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaFull;->(Lcom/google/protobuf/ListFieldSchema$1;)V -HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaLite;->()V -HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaLite;->(Lcom/google/protobuf/ListFieldSchema$1;)V -HSPLcom/google/protobuf/ListFieldSchema$ListFieldSchemaLite;->getProtobufList(Ljava/lang/Object;J)Lcom/google/protobuf/Internal$ProtobufList; -HSPLcom/google/protobuf/ListFieldSchema;->()V -HSPLcom/google/protobuf/ListFieldSchema;->()V -HSPLcom/google/protobuf/ListFieldSchema;->(Lcom/google/protobuf/ListFieldSchema$1;)V -HSPLcom/google/protobuf/ListFieldSchema;->lite()Lcom/google/protobuf/ListFieldSchema; -HSPLcom/google/protobuf/LongArrayList;->()V -HSPLcom/google/protobuf/LongArrayList;->([JI)V -HSPLcom/google/protobuf/LongArrayList;->emptyList()Lcom/google/protobuf/LongArrayList; -HSPLcom/google/protobuf/ManifestSchemaFactory$1;->()V -HSPLcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->([Lcom/google/protobuf/MessageInfoFactory;)V -HSPLcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Lcom/google/protobuf/MessageInfo; -HSPLcom/google/protobuf/ManifestSchemaFactory;->()V -HSPLcom/google/protobuf/ManifestSchemaFactory;->()V -HSPLcom/google/protobuf/ManifestSchemaFactory;->(Lcom/google/protobuf/MessageInfoFactory;)V -HSPLcom/google/protobuf/ManifestSchemaFactory;->createSchema(Ljava/lang/Class;)Lcom/google/protobuf/Schema; -HSPLcom/google/protobuf/ManifestSchemaFactory;->getDefaultMessageInfoFactory()Lcom/google/protobuf/MessageInfoFactory; -HSPLcom/google/protobuf/ManifestSchemaFactory;->getDescriptorMessageInfoFactory()Lcom/google/protobuf/MessageInfoFactory; -HSPLcom/google/protobuf/ManifestSchemaFactory;->isProto2(Lcom/google/protobuf/MessageInfo;)Z -HSPLcom/google/protobuf/ManifestSchemaFactory;->newSchema(Ljava/lang/Class;Lcom/google/protobuf/MessageInfo;)Lcom/google/protobuf/Schema; -HSPLcom/google/protobuf/MapFieldSchemaLite;->()V -HSPLcom/google/protobuf/MapFieldSchemas;->()V -HSPLcom/google/protobuf/MapFieldSchemas;->lite()Lcom/google/protobuf/MapFieldSchema; -HSPLcom/google/protobuf/MapFieldSchemas;->loadSchemaForFullRuntime()Lcom/google/protobuf/MapFieldSchema; -HSPLcom/google/protobuf/MessageSchema;->()V -HSPLcom/google/protobuf/MessageSchema;->([I[Ljava/lang/Object;IILcom/google/protobuf/MessageLite;ZZ[IIILcom/google/protobuf/NewInstanceSchema;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSchema;Lcom/google/protobuf/ExtensionSchema;Lcom/google/protobuf/MapFieldSchema;)V -HSPLcom/google/protobuf/MessageSchema;->makeImmutable(Ljava/lang/Object;)V -HSPLcom/google/protobuf/MessageSchema;->newSchema(Ljava/lang/Class;Lcom/google/protobuf/MessageInfo;Lcom/google/protobuf/NewInstanceSchema;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSchema;Lcom/google/protobuf/ExtensionSchema;Lcom/google/protobuf/MapFieldSchema;)Lcom/google/protobuf/MessageSchema; -HSPLcom/google/protobuf/MessageSchema;->newSchemaForRawMessageInfo(Lcom/google/protobuf/RawMessageInfo;Lcom/google/protobuf/NewInstanceSchema;Lcom/google/protobuf/ListFieldSchema;Lcom/google/protobuf/UnknownFieldSchema;Lcom/google/protobuf/ExtensionSchema;Lcom/google/protobuf/MapFieldSchema;)Lcom/google/protobuf/MessageSchema; -HSPLcom/google/protobuf/MessageSchema;->reflectField(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field; -HSPLcom/google/protobuf/NewInstanceSchemaLite;->()V -HSPLcom/google/protobuf/NewInstanceSchemas;->()V -HSPLcom/google/protobuf/NewInstanceSchemas;->lite()Lcom/google/protobuf/NewInstanceSchema; -HSPLcom/google/protobuf/NewInstanceSchemas;->loadSchemaForFullRuntime()Lcom/google/protobuf/NewInstanceSchema; -HSPLcom/google/protobuf/ProtoSyntax;->()V -HSPLcom/google/protobuf/ProtoSyntax;->(Ljava/lang/String;I)V -HSPLcom/google/protobuf/Protobuf;->()V -HSPLcom/google/protobuf/Protobuf;->()V -HSPLcom/google/protobuf/Protobuf;->getInstance()Lcom/google/protobuf/Protobuf; -HSPLcom/google/protobuf/Protobuf;->registerSchema(Ljava/lang/Class;Lcom/google/protobuf/Schema;)Lcom/google/protobuf/Schema; -HSPLcom/google/protobuf/Protobuf;->schemaFor(Ljava/lang/Object;)Lcom/google/protobuf/Schema; -HSPLcom/google/protobuf/ProtobufArrayList;->()V -HSPLcom/google/protobuf/ProtobufArrayList;->([Ljava/lang/Object;I)V -HSPLcom/google/protobuf/ProtobufArrayList;->add(Ljava/lang/Object;)Z -HSPLcom/google/protobuf/ProtobufArrayList;->emptyList()Lcom/google/protobuf/ProtobufArrayList; -HSPLcom/google/protobuf/ProtobufArrayList;->mutableCopyWithCapacity(I)Lcom/google/protobuf/Internal$ProtobufList; -HSPLcom/google/protobuf/ProtobufArrayList;->mutableCopyWithCapacity(I)Lcom/google/protobuf/ProtobufArrayList; -HSPLcom/google/protobuf/ProtobufArrayList;->size()I -HSPLcom/google/protobuf/RawMessageInfo;->(Lcom/google/protobuf/MessageLite;Ljava/lang/String;[Ljava/lang/Object;)V -HSPLcom/google/protobuf/RawMessageInfo;->getDefaultInstance()Lcom/google/protobuf/MessageLite; -HSPLcom/google/protobuf/RawMessageInfo;->getObjects()[Ljava/lang/Object; -HSPLcom/google/protobuf/RawMessageInfo;->getStringInfo()Ljava/lang/String; -HSPLcom/google/protobuf/RawMessageInfo;->getSyntax()Lcom/google/protobuf/ProtoSyntax; -HSPLcom/google/protobuf/RawMessageInfo;->isMessageSetWireFormat()Z -HSPLcom/google/protobuf/SchemaUtil;->()V -HSPLcom/google/protobuf/SchemaUtil;->getGeneratedMessageClass()Ljava/lang/Class; -HSPLcom/google/protobuf/SchemaUtil;->getUnknownFieldSetSchema(Z)Lcom/google/protobuf/UnknownFieldSchema; -HSPLcom/google/protobuf/SchemaUtil;->getUnknownFieldSetSchemaClass()Ljava/lang/Class; -HSPLcom/google/protobuf/SchemaUtil;->requireGeneratedMessage(Ljava/lang/Class;)V -HSPLcom/google/protobuf/SchemaUtil;->unknownFieldSetLiteSchema()Lcom/google/protobuf/UnknownFieldSchema; -HSPLcom/google/protobuf/UnknownFieldSchema;->()V -HSPLcom/google/protobuf/UnknownFieldSetLite;->()V -HSPLcom/google/protobuf/UnknownFieldSetLite;->(I[I[Ljava/lang/Object;Z)V -HSPLcom/google/protobuf/UnknownFieldSetLite;->getDefaultInstance()Lcom/google/protobuf/UnknownFieldSetLite; -HSPLcom/google/protobuf/UnknownFieldSetLite;->makeImmutable()V -HSPLcom/google/protobuf/UnknownFieldSetLiteSchema;->()V -HSPLcom/google/protobuf/UnknownFieldSetLiteSchema;->getFromMessage(Ljava/lang/Object;)Lcom/google/protobuf/UnknownFieldSetLite; -HSPLcom/google/protobuf/UnknownFieldSetLiteSchema;->makeImmutable(Ljava/lang/Object;)V -HSPLcom/google/protobuf/UnsafeUtil$1;->()V -HSPLcom/google/protobuf/UnsafeUtil$1;->run()Ljava/lang/Object; -HSPLcom/google/protobuf/UnsafeUtil$1;->run()Lsun/misc/Unsafe; -HSPLcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor;->(Lsun/misc/Unsafe;)V -HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->(Lsun/misc/Unsafe;)V -HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayBaseOffset(Ljava/lang/Class;)I -HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->arrayIndexScale(Ljava/lang/Class;)I -HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; -HSPLcom/google/protobuf/UnsafeUtil$MemoryAccessor;->objectFieldOffset(Ljava/lang/reflect/Field;)J -HSPLcom/google/protobuf/UnsafeUtil;->()V -HSPLcom/google/protobuf/UnsafeUtil;->arrayBaseOffset(Ljava/lang/Class;)I -HSPLcom/google/protobuf/UnsafeUtil;->arrayIndexScale(Ljava/lang/Class;)I -HSPLcom/google/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field; -HSPLcom/google/protobuf/UnsafeUtil;->determineAndroidSupportByAddressSize(Ljava/lang/Class;)Z -HSPLcom/google/protobuf/UnsafeUtil;->field(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field; -HSPLcom/google/protobuf/UnsafeUtil;->fieldOffset(Ljava/lang/reflect/Field;)J -HSPLcom/google/protobuf/UnsafeUtil;->getMemoryAccessor()Lcom/google/protobuf/UnsafeUtil$MemoryAccessor; -HSPLcom/google/protobuf/UnsafeUtil;->getUnsafe()Lsun/misc/Unsafe; -HSPLcom/google/protobuf/UnsafeUtil;->supportsUnsafeArrayOperations()Z -HSPLcom/google/protobuf/UnsafeUtil;->supportsUnsafeByteBufferOperations()Z HSPLcom/klinker/android/send_message/MmsFileProvider;->()V HSPLcom/klinker/android/send_message/MmsFileProvider;->onCreate()Z HSPLcom/makeramen/roundedimageview/RoundedDrawable$1;->()V @@ -11380,6 +11624,15 @@ HSPLcom/makeramen/roundedimageview/RoundedDrawable;->setScaleType(Landroid/widge HSPLcom/makeramen/roundedimageview/RoundedDrawable;->updateShaderMatrix()V HSPLcom/mobilecoin/lib/util/Hex;->()V HSPLcom/mobilecoin/lib/util/Hex;->toByteArray(Ljava/lang/String;)[B +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->()V +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->onVisibilityChanged(Landroid/view/View;I)V +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->parseAttributes(Landroid/content/res/TypedArray;)V +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->setBarColor(I)V +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->setupPaints()V +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->spin()V +HSPLcom/pnikosis/materialishprogress/R$styleable;->()V +HSPLcom/squareup/wire/EnumAdapter;->(Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;Lcom/squareup/wire/WireEnum;)V HSPLcom/squareup/wire/FieldEncoding$Companion;->()V HSPLcom/squareup/wire/FieldEncoding$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLcom/squareup/wire/FieldEncoding;->$values()[Lcom/squareup/wire/FieldEncoding; @@ -11456,9 +11709,13 @@ HSPLcom/squareup/wire/internal/ImmutableList;->(Ljava/util/List;)V HSPLcom/squareup/wire/internal/ImmutableList;->get(I)Ljava/lang/Object; HSPLcom/squareup/wire/internal/ImmutableList;->getSize()I HSPLcom/squareup/wire/internal/Internal;->checkElementsNotNull(Ljava/util/List;)V +HSPLcom/squareup/wire/internal/Internal;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;)I +HSPLcom/squareup/wire/internal/Internal;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)I HSPLcom/squareup/wire/internal/Internal;->immutableCopyOf(Ljava/lang/String;Ljava/util/List;)Ljava/util/List; HSPLcom/squareup/wire/internal/Internal__InternalKt;->checkElementsNotNull(Ljava/util/List;)V -HSPLcom/squareup/wire/internal/Internal__InternalKt;->immutableCopyOf(Ljava/lang/String;Ljava/util/List;)Ljava/util/List; +HSPLcom/squareup/wire/internal/Internal__InternalKt;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;)I +HSPLcom/squareup/wire/internal/Internal__InternalKt;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)I +HSPLcom/squareup/wire/internal/Internal__InternalKt;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)I HSPLio/reactivex/rxjava3/android/plugins/RxAndroidPlugins;->callRequireNonNull(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/android/plugins/RxAndroidPlugins;->initMainThreadScheduler(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/android/plugins/RxAndroidPlugins;->onMainThreadScheduler(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Scheduler; @@ -11477,6 +11734,7 @@ HSPLio/reactivex/rxjava3/android/schedulers/HandlerScheduler$ScheduledRunnable;- HSPLio/reactivex/rxjava3/android/schedulers/HandlerScheduler$ScheduledRunnable;->run()V HSPLio/reactivex/rxjava3/android/schedulers/HandlerScheduler;->(Landroid/os/Handler;Z)V HSPLio/reactivex/rxjava3/android/schedulers/HandlerScheduler;->createWorker()Lio/reactivex/rxjava3/core/Scheduler$Worker; +HSPLio/reactivex/rxjava3/android/schedulers/HandlerScheduler;->scheduleDirect(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/BackpressureStrategy;->()V HSPLio/reactivex/rxjava3/core/BackpressureStrategy;->(Ljava/lang/String;I)V HSPLio/reactivex/rxjava3/core/BackpressureStrategy;->values()[Lio/reactivex/rxjava3/core/BackpressureStrategy; @@ -11487,10 +11745,11 @@ HSPLio/reactivex/rxjava3/core/Flowable;->combineLatest(Lorg/reactivestreams/Publ HSPLio/reactivex/rxjava3/core/Flowable;->combineLatestArray([Lorg/reactivestreams/Publisher;Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->create(Lio/reactivex/rxjava3/core/FlowableOnSubscribe;Lio/reactivex/rxjava3/core/BackpressureStrategy;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged()Lio/reactivex/rxjava3/core/Flowable; +HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->doOnEach(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->doOnNext(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Flowable; -HSPLio/reactivex/rxjava3/core/Flowable;->fromFuture(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Flowable; +HSPLio/reactivex/rxjava3/core/Flowable;->filter(Lio/reactivex/rxjava3/functions/Predicate;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->interval(JJLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->interval(JJLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->map(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; @@ -11507,26 +11766,69 @@ HSPLio/reactivex/rxjava3/core/Flowable;->subscribeOn(Lio/reactivex/rxjava3/core/ HSPLio/reactivex/rxjava3/core/Flowable;->switchMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->switchMap(Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->switchMap0(Lio/reactivex/rxjava3/functions/Function;IZ)Lio/reactivex/rxjava3/core/Flowable; +HSPLio/reactivex/rxjava3/core/Flowable;->switchMapSingle(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->throttleLatest(JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->throttleLatest(JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;Z)Lio/reactivex/rxjava3/core/Flowable; +HSPLio/reactivex/rxjava3/core/Flowable;->toObservable()Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Maybe;->()V +HSPLio/reactivex/rxjava3/core/Maybe;->create(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Maybe;->doOnSuccess(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Maybe;->empty()Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Maybe;->filter(Lio/reactivex/rxjava3/functions/Predicate;)Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Maybe;->flatMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Maybe;->fromCallable(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Maybe;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/core/Maybe;->subscribeWith(Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; HSPLio/reactivex/rxjava3/core/Observable$1;->()V HSPLio/reactivex/rxjava3/core/Observable;->()V +HSPLio/reactivex/rxjava3/core/Observable;->buffer(Lio/reactivex/rxjava3/core/ObservableSource;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->buffer(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->bufferSize()I +HSPLio/reactivex/rxjava3/core/Observable;->combineLatest(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function3;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->combineLatest(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/BiFunction;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->combineLatestArray([Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->concatArray([Lio/reactivex/rxjava3/core/ObservableSource;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->create(Lio/reactivex/rxjava3/core/ObservableOnSubscribe;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged()Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->doOnEach(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->doOnNext(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->elementAtOrError(J)Lio/reactivex/rxjava3/core/Single; HSPLio/reactivex/rxjava3/core/Observable;->filter(Lio/reactivex/rxjava3/functions/Predicate;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->firstOrError()Lio/reactivex/rxjava3/core/Single; +HSPLio/reactivex/rxjava3/core/Observable;->flatMapMaybe(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->flatMapMaybe(Lio/reactivex/rxjava3/functions/Function;Z)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->flatMapSingle(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->flatMapSingle(Lio/reactivex/rxjava3/functions/Function;Z)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->fromArray([Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->fromFuture(Ljava/util/concurrent/Future;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->just(Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->map(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;ZI)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->replay(I)Lio/reactivex/rxjava3/observables/ConnectableObservable; +HSPLio/reactivex/rxjava3/core/Observable;->sample(JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->sample(JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->scan(Ljava/lang/Object;Lio/reactivex/rxjava3/functions/BiFunction;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->scanWith(Lio/reactivex/rxjava3/functions/Supplier;Lio/reactivex/rxjava3/functions/BiFunction;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->skip(J)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->startWithItem(Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->subscribe()Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/Observable;->subscribe(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/core/Observable;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/Observable;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/Observable;->subscribeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->switchMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->switchMap(Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->switchMapSingle(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->take(J)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->throttleFirst(JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->throttleFirst(JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/core/Observable;->throttleLast(JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->toFlowable(Lio/reactivex/rxjava3/core/BackpressureStrategy;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Scheduler$PeriodicDirectTask;->(Ljava/lang/Runnable;Lio/reactivex/rxjava3/core/Scheduler$Worker;)V HSPLio/reactivex/rxjava3/core/Scheduler$PeriodicDirectTask;->run()V @@ -11540,25 +11842,28 @@ HSPLio/reactivex/rxjava3/core/Scheduler;->()V HSPLio/reactivex/rxjava3/core/Scheduler;->()V HSPLio/reactivex/rxjava3/core/Scheduler;->computeClockDrift(JLjava/lang/String;)J HSPLio/reactivex/rxjava3/core/Scheduler;->computeNow(Ljava/util/concurrent/TimeUnit;)J +HSPLio/reactivex/rxjava3/core/Scheduler;->scheduleDirect(Ljava/lang/Runnable;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/Scheduler;->schedulePeriodicallyDirect(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/Single;->()V HSPLio/reactivex/rxjava3/core/Single;->blockingGet()Ljava/lang/Object; -HSPLio/reactivex/rxjava3/core/Single;->error(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Single; -HSPLio/reactivex/rxjava3/core/Single;->error(Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/Single; -HSPLio/reactivex/rxjava3/core/Single;->flatMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Single; +HSPLio/reactivex/rxjava3/core/Single;->doOnSuccess(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Single; +HSPLio/reactivex/rxjava3/core/Single;->flatMapObservable(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Single;->fromCallable(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Single; -HSPLio/reactivex/rxjava3/core/Single;->fromFuture(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Single; +HSPLio/reactivex/rxjava3/core/Single;->just(Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Single; HSPLio/reactivex/rxjava3/core/Single;->map(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Single; -HSPLio/reactivex/rxjava3/core/Single;->onErrorResumeNext(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Single; -HSPLio/reactivex/rxjava3/core/Single;->onErrorReturn(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Single; +HSPLio/reactivex/rxjava3/core/Single;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Single; +HSPLio/reactivex/rxjava3/core/Single;->onErrorComplete()Lio/reactivex/rxjava3/core/Maybe; +HSPLio/reactivex/rxjava3/core/Single;->onErrorComplete(Lio/reactivex/rxjava3/functions/Predicate;)Lio/reactivex/rxjava3/core/Maybe; HSPLio/reactivex/rxjava3/core/Single;->subscribe(Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLio/reactivex/rxjava3/core/Single;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/core/Single;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/Single;->subscribeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Single; -HSPLio/reactivex/rxjava3/core/Single;->toSingle(Lio/reactivex/rxjava3/core/Flowable;)Lio/reactivex/rxjava3/core/Single; HSPLio/reactivex/rxjava3/disposables/CompositeDisposable;->()V HSPLio/reactivex/rxjava3/disposables/CompositeDisposable;->add(Lio/reactivex/rxjava3/disposables/Disposable;)Z HSPLio/reactivex/rxjava3/disposables/CompositeDisposable;->delete(Lio/reactivex/rxjava3/disposables/Disposable;)Z HSPLio/reactivex/rxjava3/disposables/CompositeDisposable;->dispose()V HSPLio/reactivex/rxjava3/disposables/CompositeDisposable;->dispose(Lio/reactivex/rxjava3/internal/util/OpenHashSet;)V +HSPLio/reactivex/rxjava3/disposables/Disposable$-CC;->disposed()Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/disposables/Disposable$-CC;->empty()Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/disposables/Disposable$-CC;->fromRunnable(Ljava/lang/Runnable;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/disposables/ReferenceDisposable;->(Ljava/lang/Object;)V @@ -11567,7 +11872,6 @@ HSPLio/reactivex/rxjava3/disposables/ReferenceDisposable;->isDisposed()Z HSPLio/reactivex/rxjava3/disposables/RunnableDisposable;->(Ljava/lang/Runnable;)V HSPLio/reactivex/rxjava3/disposables/RunnableDisposable;->onDisposed(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/disposables/RunnableDisposable;->onDisposed(Ljava/lang/Runnable;)V -HSPLio/reactivex/rxjava3/exceptions/Exceptions;->throwIfFatal(Ljava/lang/Throwable;)V HSPLio/reactivex/rxjava3/flowables/ConnectableFlowable;->()V HSPLio/reactivex/rxjava3/flowables/ConnectableFlowable;->refCount()Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/internal/disposables/CancellableDisposable;->(Lio/reactivex/rxjava3/functions/Cancellable;)V @@ -11581,7 +11885,7 @@ HSPLio/reactivex/rxjava3/internal/disposables/DisposableHelper;->setOnce(Ljava/u HSPLio/reactivex/rxjava3/internal/disposables/DisposableHelper;->validate(Lio/reactivex/rxjava3/disposables/Disposable;Lio/reactivex/rxjava3/disposables/Disposable;)Z HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->()V HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->(Ljava/lang/String;I)V -HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->error(Ljava/lang/Throwable;Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->complete(Lio/reactivex/rxjava3/core/MaybeObserver;)V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->()V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->isDisposed()Z @@ -11590,6 +11894,9 @@ HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->update(Lio/ HSPLio/reactivex/rxjava3/internal/functions/Functions$Array2Func;->(Lio/reactivex/rxjava3/functions/BiFunction;)V HSPLio/reactivex/rxjava3/internal/functions/Functions$Array2Func;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/functions/Functions$Array2Func;->apply([Ljava/lang/Object;)Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->(Lio/reactivex/rxjava3/functions/Function3;)V +HSPLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->apply([Ljava/lang/Object;)Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/functions/Functions$EmptyAction;->()V HSPLio/reactivex/rxjava3/internal/functions/Functions$EmptyAction;->run()V HSPLio/reactivex/rxjava3/internal/functions/Functions$EmptyConsumer;->()V @@ -11608,10 +11915,12 @@ HSPLio/reactivex/rxjava3/internal/functions/Functions$NullProvider;->()V HSPLio/reactivex/rxjava3/internal/functions/Functions$OnErrorMissingConsumer;->()V HSPLio/reactivex/rxjava3/internal/functions/Functions$TruePredicate;->()V HSPLio/reactivex/rxjava3/internal/functions/Functions;->()V +HSPLio/reactivex/rxjava3/internal/functions/Functions;->alwaysTrue()Lio/reactivex/rxjava3/functions/Predicate; HSPLio/reactivex/rxjava3/internal/functions/Functions;->emptyConsumer()Lio/reactivex/rxjava3/functions/Consumer; HSPLio/reactivex/rxjava3/internal/functions/Functions;->identity()Lio/reactivex/rxjava3/functions/Function; HSPLio/reactivex/rxjava3/internal/functions/Functions;->justSupplier(Ljava/lang/Object;)Lio/reactivex/rxjava3/functions/Supplier; HSPLio/reactivex/rxjava3/internal/functions/Functions;->toFunction(Lio/reactivex/rxjava3/functions/BiFunction;)Lio/reactivex/rxjava3/functions/Function; +HSPLio/reactivex/rxjava3/internal/functions/Functions;->toFunction(Lio/reactivex/rxjava3/functions/Function3;)Lio/reactivex/rxjava3/functions/Function; HSPLio/reactivex/rxjava3/internal/functions/ObjectHelper$BiObjectPredicate;->()V HSPLio/reactivex/rxjava3/internal/functions/ObjectHelper$BiObjectPredicate;->test(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLio/reactivex/rxjava3/internal/functions/ObjectHelper;->()V @@ -11620,13 +11929,19 @@ HSPLio/reactivex/rxjava3/internal/functions/ObjectHelper;->verifyPositive(ILjava HSPLio/reactivex/rxjava3/internal/observers/BasicFuseableObserver;->(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/observers/BasicFuseableObserver;->afterDownstream()V HSPLio/reactivex/rxjava3/internal/observers/BasicFuseableObserver;->beforeDownstream()Z +HSPLio/reactivex/rxjava3/internal/observers/BasicFuseableObserver;->dispose()V HSPLio/reactivex/rxjava3/internal/observers/BasicFuseableObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/observers/BasicFuseableObserver;->transitiveBoundaryFusion(I)I HSPLio/reactivex/rxjava3/internal/observers/BasicIntQueueDisposable;->()V +HSPLio/reactivex/rxjava3/internal/observers/BasicQueueDisposable;->()V HSPLio/reactivex/rxjava3/internal/observers/BlockingMultiObserver;->()V HSPLio/reactivex/rxjava3/internal/observers/BlockingMultiObserver;->blockingGet()Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/observers/BlockingMultiObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/observers/BlockingMultiObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;)V +HSPLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->hasCustomOnError()Z +HSPLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->onSuccess(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/observers/DeferredScalarDisposable;->(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/observers/DeferredScalarDisposable;->complete(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/observers/DeferredScalarDisposable;->isDisposed()Z @@ -11637,9 +11952,10 @@ HSPLio/reactivex/rxjava3/internal/observers/LambdaObserver;->isDisposed()Z HSPLio/reactivex/rxjava3/internal/observers/LambdaObserver;->onComplete()V HSPLio/reactivex/rxjava3/internal/observers/LambdaObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/observers/LambdaObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->(Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/core/SingleObserver;)V -HSPLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->onError(Ljava/lang/Throwable;)V -HSPLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/observers/QueueDrainObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/internal/fuseable/SimplePlainQueue;)V +HSPLio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberPad0;->()V +HSPLio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberPad2;->()V +HSPLio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberWip;->()V HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->checkTerminated(ZZLorg/reactivestreams/Subscriber;Ljava/util/concurrent/atomic/AtomicReference;)Z HSPLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->drain()V @@ -11681,8 +11997,11 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach$DoOnEachSu HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach$DoOnEachSubscriber;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach;->subscribeActual(Lorg/reactivestreams/Subscriber;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture;->(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture;->subscribeActual(Lorg/reactivestreams/Subscriber;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->(Lio/reactivex/rxjava3/internal/fuseable/ConditionalSubscriber;Lio/reactivex/rxjava3/functions/Predicate;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->tryOnNext(Ljava/lang/Object;)Z +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Predicate;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V @@ -11711,6 +12030,7 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObser HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->checkTerminated(ZZLorg/reactivestreams/Subscriber;)Z HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->request(J)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->requestFusion(I)I HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->run()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->trySchedule()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnConditionalSubscriber;->(Lio/reactivex/rxjava3/internal/fuseable/ConditionalSubscriber;Lio/reactivex/rxjava3/core/Scheduler$Worker;ZI)V @@ -11718,7 +12038,9 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOn HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnConditionalSubscriber;->runAsync()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSubscriber;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/core/Scheduler$Worker;ZI)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSubscriber;->poll()Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSubscriber;->runAsync()V +HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSubscriber;->runBackfused()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/core/Scheduler;ZI)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableOnBackpressureLatest$BackpressureLatestSubscriber;->(Lorg/reactivestreams/Subscriber;)V @@ -11741,9 +12063,7 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedRepla HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->getHead()Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$Node; HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->leaveTransform(Ljava/lang/Object;)Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->next(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->removeFirst()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->replay(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->setFirst(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$Node;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$DefaultUnboundedFactory;->()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$ReplaySubscriber;Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->index()Ljava/lang/Object; @@ -11772,11 +12092,6 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay;->create(Lio HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay;->create(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/flowables/ConnectableFlowable; HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableScalarXMap;->tryScalarXMapSubscribe(Lorg/reactivestreams/Publisher;Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/functions/Function;)Z -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle$SingleElementSubscriber;->(Lio/reactivex/rxjava3/core/SingleObserver;Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle$SingleElementSubscriber;->onError(Ljava/lang/Throwable;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle$SingleElementSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle;->(Lio/reactivex/rxjava3/core/Flowable;Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn$SubscribeOnSubscriber$Request;->(Lorg/reactivestreams/Subscription;J)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn$SubscribeOnSubscriber$Request;->run()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn$SubscribeOnSubscriber;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/core/Scheduler$Worker;Lorg/reactivestreams/Publisher;Z)V @@ -11808,6 +12123,62 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest$Thro HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest$ThrottleLatestSubscriber;->run()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest;->(Lio/reactivex/rxjava3/core/Flowable;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;Z)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest;->subscribeActual(Lorg/reactivestreams/Subscriber;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/AbstractMaybeWithUpstream;->(Lio/reactivex/rxjava3/core/MaybeSource;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->hasCustomOnError()Z +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->onComplete()V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->isDisposed()Z +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Predicate;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Predicate;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onComplete()V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Function;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->isDisposed()Z +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Function;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->(Ljava/util/concurrent/Callable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onComplete()V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->run()V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Predicate;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onAfterTerminate()V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V +HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->(Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->()V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/functions/Function;Z)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->drain()V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->request(J)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Function;Z)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver;->(Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver;)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver;->onSuccess(Ljava/lang/Object;)V @@ -11819,33 +12190,174 @@ HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$Swit HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle;->(Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/functions/Function;Z)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ScalarXMapZHelper;->tryAsSingle(Ljava/lang/Object;Lio/reactivex/rxjava3/functions/Function;Lio/reactivex/rxjava3/core/Observer;)Z +HSPLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->isDisposed()Z +HSPLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;)V +HSPLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/AbstractObservableWithUpstream;->(Lio/reactivex/rxjava3/core/ObservableSource;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferBoundaryObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Supplier;Lio/reactivex/rxjava3/core/ObservableSource;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Supplier;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;I)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;IIZ)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->drain()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->innerNext(ILjava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->subscribe([Lio/reactivex/rxjava3/core/ObservableSource;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest;->([Lio/reactivex/rxjava3/core/ObservableSource;Ljava/lang/Iterable;Lio/reactivex/rxjava3/functions/Function;IZ)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;IZ)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->drain()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;ILio/reactivex/rxjava3/internal/util/ErrorMode;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->isDisposed()Z +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->setCancellable(Lio/reactivex/rxjava3/functions/Cancellable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->setDisposable(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate;->(Lio/reactivex/rxjava3/core/ObservableOnSubscribe;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDistinctUntilChanged$DistinctUntilChangedObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Lio/reactivex/rxjava3/functions/BiPredicate;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDistinctUntilChanged$DistinctUntilChangedObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDistinctUntilChanged$DistinctUntilChangedObserver;->requestFusion(I)I HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDistinctUntilChanged;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;Lio/reactivex/rxjava3/functions/BiPredicate;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDistinctUntilChanged;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;JLjava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle;->(Lio/reactivex/rxjava3/core/ObservableSource;JLjava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Predicate;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Predicate;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Z)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;Z)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Z)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;Z)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->(Lio/reactivex/rxjava3/core/Observer;[Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->poll()Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->requestFusion(I)I +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray;->([Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture;->(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher;->(Lorg/reactivestreams/Publisher;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableJust;->(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableJust;->get()Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->requestFusion(I)I +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/core/Scheduler$Worker;ZI)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->checkTerminated(ZZLio/reactivex/rxjava3/core/Observer;)Z HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->dispose()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->drainFused()V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->drainNormal()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->isEmpty()Z HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->onComplete()V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->poll()Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->requestFusion(I)I HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->run()V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->schedule()V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/Scheduler;ZI)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;->accept(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;->accept(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->dispose()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->(Lio/reactivex/rxjava3/observables/ConnectableObservable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->(Lio/reactivex/rxjava3/observables/ConnectableObservable;IJLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->cancel(Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->(Z)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->addLast(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->enterTransform(Ljava/lang/Object;)Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->getHead()Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->leaveTransform(Ljava/lang/Object;)Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->next(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->replay(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->dispose()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->index()Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->isDisposed()Z +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node;->(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBufferSupplier;->(IZ)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBufferSupplier;->call()Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBuffer; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBuffer;Ljava/util/concurrent/atomic/AtomicReference;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->add(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)Z +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->isDisposed()Z +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->remove(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->replay()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplaySource;->(Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BufferSupplier;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplaySource;->subscribe(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$SizeBoundReplayBuffer;->(IZ)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$SizeBoundReplayBuffer;->truncate()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$UnBoundedFactory;->()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BufferSupplier;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->connect(Lio/reactivex/rxjava3/functions/Consumer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->create(Lio/reactivex/rxjava3/core/ObservableSource;IZ)Lio/reactivex/rxjava3/observables/ConnectableObservable; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->create(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BufferSupplier;)Lio/reactivex/rxjava3/observables/ConnectableObservable; +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedNoLast;->(Lio/reactivex/rxjava3/core/Observer;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedObserver;->(Lio/reactivex/rxjava3/core/Observer;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed;->(Lio/reactivex/rxjava3/core/ObservableSource;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;Z)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableScalarXMap;->tryScalarXMapSubscribe(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;)Z HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed$ScanSeedObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/BiFunction;Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed$ScanSeedObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed$ScanSeedObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Supplier;Lio/reactivex/rxjava3/functions/BiFunction;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver;->(Lio/reactivex/rxjava3/core/Observer;J)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip;->(Lio/reactivex/rxjava3/core/ObservableSource;J)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn$SubscribeOnObserver;->(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn$SubscribeOnObserver;->dispose()V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn$SubscribeOnObserver;->onComplete()V @@ -11856,41 +12368,50 @@ HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn$Sub HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn$SubscribeTask;->run()V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/Scheduler;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;JI)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->cancel()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;IZ)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->drain()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;IZ)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->(Lio/reactivex/rxjava3/core/Observer;J)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->onComplete()V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableTake;->(Lio/reactivex/rxjava3/core/ObservableSource;J)V +HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableTake;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed$DebounceTimedObserver;->(Lio/reactivex/rxjava3/core/Observer;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler$Worker;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed$DebounceTimedObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed$DebounceTimedObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed;->(Lio/reactivex/rxjava3/core/ObservableSource;JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleError;->(Lio/reactivex/rxjava3/functions/Supplier;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleError;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver;->(Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/core/SingleObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/functions/Function;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->isDisposed()Z -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess$DoOnSuccess;->(Lio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess;Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess$DoOnSuccess;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess$DoOnSuccess;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Consumer;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleFromCallable;->(Ljava/util/concurrent/Callable;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleFromCallable;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleJust;->(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleJust;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleMap$MapSingleObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/functions/Function;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleMap$MapSingleObserver;->onError(Ljava/lang/Throwable;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleMap$MapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleMap$MapSingleObserver;->onSuccess(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleMap;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleMap;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->(Lio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn;Lio/reactivex/rxjava3/core/SingleObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->onError(Ljava/lang/Throwable;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext$ResumeMainSingleObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/functions/Function;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext$ResumeMainSingleObserver;->onError(Ljava/lang/Throwable;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext$ResumeMainSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;)V -HSPLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->onSuccess(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->run()V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/core/Scheduler;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorComplete;->(Lio/reactivex/rxjava3/core/Single;Lio/reactivex/rxjava3/functions/Predicate;)V +HSPLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorComplete;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn$SubscribeOnObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/core/SingleSource;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn$SubscribeOnObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn$SubscribeOnObserver;->onSuccess(Ljava/lang/Object;)V @@ -11948,6 +12469,7 @@ HSPLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->setFuture(Ljav HSPLio/reactivex/rxjava3/internal/schedulers/DisposeOnCancel;->(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker$InterruptibleRunnable;->(Ljava/lang/Runnable;Lio/reactivex/rxjava3/disposables/DisposableContainer;)V HSPLio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker$InterruptibleRunnable;->cleanup()V +HSPLio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker$InterruptibleRunnable;->dispose()V HSPLio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker$InterruptibleRunnable;->run()V HSPLio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker$SequentialDispose;->(Lio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker;Lio/reactivex/rxjava3/internal/disposables/SequentialDisposable;Ljava/lang/Runnable;)V HSPLio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker$SequentialDispose;->run()V @@ -12015,9 +12537,6 @@ HSPLio/reactivex/rxjava3/internal/subscribers/LambdaSubscriber;->onNext(Ljava/la HSPLio/reactivex/rxjava3/internal/subscribers/LambdaSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V HSPLio/reactivex/rxjava3/internal/subscribers/LambdaSubscriber;->request(J)V HSPLio/reactivex/rxjava3/internal/subscriptions/BasicIntQueueSubscription;->()V -HSPLio/reactivex/rxjava3/internal/subscriptions/DeferredScalarSubscription;->(Lorg/reactivestreams/Subscriber;)V -HSPLio/reactivex/rxjava3/internal/subscriptions/DeferredScalarSubscription;->isCancelled()Z -HSPLio/reactivex/rxjava3/internal/subscriptions/DeferredScalarSubscription;->request(J)V HSPLio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper;->()V HSPLio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper;->(Ljava/lang/String;I)V HSPLio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper;->cancel(Ljava/util/concurrent/atomic/AtomicReference;)Z @@ -12025,9 +12544,11 @@ HSPLio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper;->setOnce(Lja HSPLio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper;->setOnce(Ljava/util/concurrent/atomic/AtomicReference;Lorg/reactivestreams/Subscription;J)Z HSPLio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper;->validate(J)Z HSPLio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper;->validate(Lorg/reactivestreams/Subscription;Lorg/reactivestreams/Subscription;)Z -HSPLio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList;->(I)V -HSPLio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList;->add(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList;->forEachWhile(Lio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList$NonThrowingPredicate;)V +HSPLio/reactivex/rxjava3/internal/util/ArrayListSupplier;->()V +HSPLio/reactivex/rxjava3/internal/util/ArrayListSupplier;->(Ljava/lang/String;I)V +HSPLio/reactivex/rxjava3/internal/util/ArrayListSupplier;->asSupplier()Lio/reactivex/rxjava3/functions/Supplier; +HSPLio/reactivex/rxjava3/internal/util/ArrayListSupplier;->get()Ljava/lang/Object; +HSPLio/reactivex/rxjava3/internal/util/ArrayListSupplier;->get()Ljava/util/List; HSPLio/reactivex/rxjava3/internal/util/AtomicThrowable;->()V HSPLio/reactivex/rxjava3/internal/util/BackpressureHelper;->add(Ljava/util/concurrent/atomic/AtomicLong;J)J HSPLio/reactivex/rxjava3/internal/util/BackpressureHelper;->addCancel(Ljava/util/concurrent/atomic/AtomicLong;J)J @@ -12035,6 +12556,9 @@ HSPLio/reactivex/rxjava3/internal/util/BackpressureHelper;->addCap(JJ)J HSPLio/reactivex/rxjava3/internal/util/BackpressureHelper;->produced(Ljava/util/concurrent/atomic/AtomicLong;J)J HSPLio/reactivex/rxjava3/internal/util/BackpressureHelper;->producedCancel(Ljava/util/concurrent/atomic/AtomicLong;J)J HSPLio/reactivex/rxjava3/internal/util/BlockingHelper;->verifyNonBlocking()V +HSPLio/reactivex/rxjava3/internal/util/EndConsumerHelper;->setOnce(Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/disposables/Disposable;Ljava/lang/Class;)Z +HSPLio/reactivex/rxjava3/internal/util/ErrorMode;->()V +HSPLio/reactivex/rxjava3/internal/util/ErrorMode;->(Ljava/lang/String;I)V HSPLio/reactivex/rxjava3/internal/util/ExceptionHelper$Termination;->()V HSPLio/reactivex/rxjava3/internal/util/ExceptionHelper$Termination;->fillInStackTrace()Ljava/lang/Throwable; HSPLio/reactivex/rxjava3/internal/util/ExceptionHelper;->()V @@ -12052,6 +12576,7 @@ HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->(IF)V HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->add(Ljava/lang/Object;)Z HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->keys()[Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->mix(I)I +HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->rehash()V HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->remove(Ljava/lang/Object;)Z HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->removeEntry(I[Ljava/lang/Object;I)Z HSPLio/reactivex/rxjava3/internal/util/Pow2;->roundToPowerOfTwo(I)I @@ -12063,6 +12588,7 @@ HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$onErrorStub$1;->()V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$onErrorStub$1;->()V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$onNextStub$1;->()V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$onNextStub$1;->()V +HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$sam$io_reactivex_rxjava3_functions_Action$0;->(Lkotlin/jvm/functions/Function0;)V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$sam$io_reactivex_rxjava3_functions_Consumer$0;->(Lkotlin/jvm/functions/Function1;)V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt$sam$io_reactivex_rxjava3_functions_Consumer$0;->accept(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->()V @@ -12070,7 +12596,18 @@ HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->asConsumer(Lkotlin/jvm/functions HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->asOnCompleteAction(Lkotlin/jvm/functions/Function0;)Lio/reactivex/rxjava3/functions/Action; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->asOnErrorConsumer(Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/functions/Consumer; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Flowable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Observable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Single;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Flowable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Observable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Single;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLio/reactivex/rxjava3/observables/ConnectableObservable;->()V +HSPLio/reactivex/rxjava3/observables/ConnectableObservable;->refCount()Lio/reactivex/rxjava3/core/Observable; +HSPLio/reactivex/rxjava3/observers/DisposableObserver;->()V +HSPLio/reactivex/rxjava3/observers/DisposableObserver;->onStart()V +HSPLio/reactivex/rxjava3/observers/DisposableObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/observers/SerializedObserver;->(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/observers/SerializedObserver;->(Lio/reactivex/rxjava3/core/Observer;Z)V HSPLio/reactivex/rxjava3/observers/SerializedObserver;->emitLoop()V @@ -12086,14 +12623,17 @@ HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->initNewThreadScheduler(Lio/reac HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->initSingleScheduler(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->isFailOnNonBlockingScheduler()Z HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/core/Flowable;)Lio/reactivex/rxjava3/core/Flowable; +HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/core/Maybe;)Lio/reactivex/rxjava3/core/Maybe; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/core/Observable;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/core/Single;)Lio/reactivex/rxjava3/core/Single; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/flowables/ConnectableFlowable;)Lio/reactivex/rxjava3/flowables/ConnectableFlowable; +HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/observables/ConnectableObservable;)Lio/reactivex/rxjava3/observables/ConnectableObservable; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onComputationScheduler(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onIoScheduler(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onSchedule(Ljava/lang/Runnable;)Ljava/lang/Runnable; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onSingleScheduler(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onSubscribe(Lio/reactivex/rxjava3/core/Flowable;Lorg/reactivestreams/Subscriber;)Lorg/reactivestreams/Subscriber; +HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onSubscribe(Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onSubscribe(Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/core/Observer;)Lio/reactivex/rxjava3/core/Observer; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onSubscribe(Lio/reactivex/rxjava3/core/Single;Lio/reactivex/rxjava3/core/SingleObserver;)Lio/reactivex/rxjava3/core/SingleObserver; HSPLio/reactivex/rxjava3/plugins/RxJavaPlugins;->setErrorHandler(Lio/reactivex/rxjava3/functions/Consumer;)V @@ -12120,6 +12660,16 @@ HSPLio/reactivex/rxjava3/processors/BehaviorProcessor;->onNext(Ljava/lang/Object HSPLio/reactivex/rxjava3/processors/BehaviorProcessor;->setCurrent(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/processors/BehaviorProcessor;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/processors/FlowableProcessor;->()V +HSPLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/processors/PublishProcessor;)V +HSPLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->isCancelled()Z +HSPLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->request(J)V +HSPLio/reactivex/rxjava3/processors/PublishProcessor;->()V +HSPLio/reactivex/rxjava3/processors/PublishProcessor;->()V +HSPLio/reactivex/rxjava3/processors/PublishProcessor;->add(Lio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;)Z +HSPLio/reactivex/rxjava3/processors/PublishProcessor;->create()Lio/reactivex/rxjava3/processors/PublishProcessor; +HSPLio/reactivex/rxjava3/processors/PublishProcessor;->onNext(Ljava/lang/Object;)V +HSPLio/reactivex/rxjava3/processors/PublishProcessor;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/schedulers/Schedulers$ComputationTask;->()V HSPLio/reactivex/rxjava3/schedulers/Schedulers$IOTask;->()V HSPLio/reactivex/rxjava3/schedulers/Schedulers$NewThreadHolder;->()V @@ -12180,6 +12730,7 @@ HSPLj$/time/Duration;->toDays()J HSPLj$/time/Instant;->()V HSPLj$/time/Instant;->(JI)V HSPLj$/time/Instant;->atOffset(Lj$/time/ZoneOffset;)Lj$/time/OffsetDateTime; +HSPLj$/time/Instant;->atZone(Lj$/time/ZoneId;)Lj$/time/ZonedDateTime; HSPLj$/time/Instant;->getEpochSecond()J HSPLj$/time/Instant;->getNano()I HSPLj$/time/Instant;->n(JI)Lj$/time/Instant; @@ -12191,6 +12742,7 @@ HSPLj$/time/LocalDate;->(III)V HSPLj$/time/LocalDate;->getLong(Lj$/time/temporal/TemporalField;)J HSPLj$/time/LocalDate;->o(III)Lj$/time/LocalDate; HSPLj$/time/LocalDate;->q(Lj$/time/temporal/TemporalField;)I +HSPLj$/time/LocalDate;->toEpochDay()J HSPLj$/time/LocalDate;->x(III)Lj$/time/LocalDate; HSPLj$/time/LocalDate;->z(J)Lj$/time/LocalDate; HSPLj$/time/LocalDateTime;->()V @@ -12202,6 +12754,7 @@ HSPLj$/time/LocalDateTime;->j(Lj$/time/temporal/m;)Ljava/lang/Object; HSPLj$/time/LocalDateTime;->ofInstant(Lj$/time/Instant;Lj$/time/ZoneId;)Lj$/time/LocalDateTime; HSPLj$/time/LocalDateTime;->r(Lj$/time/LocalDate;Lj$/time/LocalTime;)Lj$/time/LocalDateTime; HSPLj$/time/LocalDateTime;->s(JILj$/time/ZoneOffset;)Lj$/time/LocalDateTime; +HSPLj$/time/LocalDateTime;->v()Lj$/time/LocalDate; HSPLj$/time/LocalTime;->()V HSPLj$/time/LocalTime;->(IIII)V HSPLj$/time/LocalTime;->n(IIII)Lj$/time/LocalTime; @@ -12220,6 +12773,10 @@ HSPLj$/time/ZoneOffset;->(I)V HSPLj$/time/ZoneOffset;->n()Lj$/time/zone/c; HSPLj$/time/ZoneOffset;->o()I HSPLj$/time/ZoneOffset;->r(I)Lj$/time/ZoneOffset; +HSPLj$/time/ZonedDateTime;->(Lj$/time/LocalDateTime;Lj$/time/ZoneId;Lj$/time/ZoneOffset;)V +HSPLj$/time/ZonedDateTime;->m(JILj$/time/ZoneId;)Lj$/time/ZonedDateTime; +HSPLj$/time/ZonedDateTime;->n(Lj$/time/Instant;Lj$/time/ZoneId;)Lj$/time/ZonedDateTime; +HSPLj$/time/ZonedDateTime;->toLocalDate()Lj$/time/LocalDate; HSPLj$/time/a;->c(JJ)J HSPLj$/time/a;->d(Lsun/misc/Unsafe;Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z HSPLj$/time/a;->e(JJ)J @@ -12368,6 +12925,7 @@ HSPLj$/util/Comparator$-CC;->a()Ljava/util/Comparator; HSPLj$/util/DateRetargetClass;->toInstant(Ljava/util/Date;)Lj$/time/Instant; HSPLj$/util/DesugarArrays;->stream([Ljava/lang/Object;)Lj$/util/stream/Stream; HSPLj$/util/DesugarCollections;->()V +HSPLj$/util/DesugarCollections;->a()Ljava/lang/reflect/Constructor; HSPLj$/util/DesugarCollections;->b()Ljava/lang/reflect/Constructor; HSPLj$/util/DesugarCollections;->synchronizedMap(Ljava/util/Map;)Ljava/util/Map; HSPLj$/util/DesugarTimeZone;->getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone; @@ -12375,13 +12933,14 @@ HSPLj$/util/List$-CC;->$default$spliterator(Ljava/util/List;)Lj$/util/Spliterato HSPLj$/util/List$-EL;->sort(Ljava/util/List;Ljava/util/Comparator;)V HSPLj$/util/Map$-CC;->$default$getOrDefault(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/Map$-CC;->$default$putIfAbsent(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLj$/util/Map$-EL;->a(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLj$/util/Map$-EL;->b(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/Map$-EL;->getOrDefault(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/Optional;->()V HSPLj$/util/Optional;->()V HSPLj$/util/Optional;->(Ljava/lang/Object;)V HSPLj$/util/Optional;->empty()Lj$/util/Optional; HSPLj$/util/Optional;->get()Ljava/lang/Object; +HSPLj$/util/Optional;->ifPresent(Lj$/util/function/Consumer;)V HSPLj$/util/Optional;->isPresent()Z HSPLj$/util/Optional;->map(Lj$/util/function/Function;)Lj$/util/Optional; HSPLj$/util/Optional;->of(Ljava/lang/Object;)Lj$/util/Optional; @@ -12392,6 +12951,7 @@ HSPLj$/util/S;->a(Lj$/util/function/Consumer;)V HSPLj$/util/S;->characteristics()I HSPLj$/util/S;->estimateSize()J HSPLj$/util/S;->getExactSizeIfKnown()J +HSPLj$/util/S;->s(Lj$/util/function/Consumer;)Z HSPLj$/util/U;->()V HSPLj$/util/V;->()V HSPLj$/util/W;->()V @@ -12415,14 +12975,14 @@ HSPLj$/util/concurrent/ConcurrentHashMap;->casTabAt([Lj$/util/concurrent/l;ILj$/ HSPLj$/util/concurrent/ConcurrentHashMap;->clear()V HSPLj$/util/concurrent/ConcurrentHashMap;->comparableClassFor(Ljava/lang/Object;)Ljava/lang/Class; HSPLj$/util/concurrent/ConcurrentHashMap;->entrySet()Ljava/util/Set; -HSPLj$/util/concurrent/ConcurrentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->initTable()[Lj$/util/concurrent/l; HSPLj$/util/concurrent/ConcurrentHashMap;->isEmpty()Z HSPLj$/util/concurrent/ConcurrentHashMap;->keySet()Ljava/util/Set; HSPLj$/util/concurrent/ConcurrentHashMap;->mappingCount()J HSPLj$/util/concurrent/ConcurrentHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLj$/util/concurrent/ConcurrentHashMap;->putVal(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object; +HSPLj$/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; +HSPLj$/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->resizeStamp(I)I HSPLj$/util/concurrent/ConcurrentHashMap;->setTabAt([Lj$/util/concurrent/l;ILj$/util/concurrent/l;)V HSPLj$/util/concurrent/ConcurrentHashMap;->size()I @@ -12450,131 +13010,161 @@ HSPLj$/util/concurrent/p;->([Lj$/util/concurrent/l;III)V HSPLj$/util/concurrent/p;->b()Lj$/util/concurrent/l; HSPLj$/util/concurrent/q;->()V HSPLj$/util/concurrent/q;->(Lj$/util/concurrent/r;)V +HSPLj$/util/concurrent/q;->a(Ljava/lang/Object;I)Lj$/util/concurrent/l; HSPLj$/util/concurrent/q;->c(Lj$/util/concurrent/r;Lj$/util/concurrent/r;)Lj$/util/concurrent/r; +HSPLj$/util/concurrent/q;->e()V +HSPLj$/util/concurrent/q;->f(ILjava/lang/Object;Ljava/lang/Object;)Lj$/util/concurrent/r; HSPLj$/util/concurrent/q;->h(Lj$/util/concurrent/r;Lj$/util/concurrent/r;)Lj$/util/concurrent/r; HSPLj$/util/concurrent/q;->i(Lj$/util/concurrent/r;Lj$/util/concurrent/r;)Lj$/util/concurrent/r; HSPLj$/util/concurrent/q;->j(Ljava/lang/Object;Ljava/lang/Object;)I HSPLj$/util/concurrent/r;->(ILjava/lang/Object;Ljava/lang/Object;Lj$/util/concurrent/r;Lj$/util/concurrent/r;)V +HSPLj$/util/concurrent/r;->b(ILjava/lang/Object;Ljava/lang/Class;)Lj$/util/concurrent/r; HSPLj$/util/concurrent/v;->()V +HSPLj$/util/concurrent/v;->a(Lsun/misc/Unsafe;Ljava/lang/Object;J)I HSPLj$/util/concurrent/v;->b()Ljava/lang/reflect/Field; HSPLj$/util/concurrent/v;->c()Lsun/misc/Unsafe; HSPLj$/util/d;->(Ljava/util/Map;)V +HSPLj$/util/d;->a(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; HSPLj$/util/d;->get(Ljava/lang/Object;)Ljava/lang/Object; +HSPLj$/util/d;->keySet()Ljava/util/Set; HSPLj$/util/d;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLj$/util/d;->remove(Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/d;->values()Ljava/util/Collection; +HSPLj$/util/function/b;->(Ljava/util/Comparator;I)V HSPLj$/util/m;->()V HSPLj$/util/m;->j(Lj$/util/Spliterator;)J HSPLj$/util/m;->y(Ljava/lang/Object;Ljava/lang/Object;)Z -HSPLj$/util/stream/A2;->(Lj$/util/stream/c;)V -HSPLj$/util/stream/A2;->B1(ILj$/util/stream/f2;)Lj$/util/stream/f2; -HSPLj$/util/stream/B2;->(Lj$/util/stream/f2;Ljava/util/Comparator;)V -HSPLj$/util/stream/B2;->m()V -HSPLj$/util/stream/B2;->n(J)V +HSPLj$/util/stream/A1;->(Lj$/util/stream/V2;Ljava/lang/Object;I)V +HSPLj$/util/stream/A1;->l1()Lj$/util/stream/P1; +HSPLj$/util/stream/B2;->(Lj$/util/stream/c;)V +HSPLj$/util/stream/B2;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; +HSPLj$/util/stream/C2;->(Lj$/util/stream/g2;Ljava/util/Comparator;)V +HSPLj$/util/stream/C2;->m()V +HSPLj$/util/stream/C2;->n(J)V HSPLj$/util/stream/Collector$Characteristics;->()V HSPLj$/util/stream/Collector$Characteristics;->(Ljava/lang/String;I)V HSPLj$/util/stream/Collector$Characteristics;->values()[Lj$/util/stream/Collector$Characteristics; HSPLj$/util/stream/Collectors;->()V HSPLj$/util/stream/Collectors;->toList()Lj$/util/stream/Collector; HSPLj$/util/stream/Collectors;->toSet()Lj$/util/stream/Collector; -HSPLj$/util/stream/E1;->(Lj$/util/stream/U2;Lj$/util/function/BinaryOperator;Lj$/util/function/BiConsumer;Lj$/util/function/Supplier;Lj$/util/stream/Collector;)V -HSPLj$/util/stream/E1;->l1()Lj$/util/stream/O1; -HSPLj$/util/stream/E1;->p()I -HSPLj$/util/stream/F1;->(Lj$/util/function/Supplier;Lj$/util/function/BiConsumer;Lj$/util/function/BinaryOperator;)V -HSPLj$/util/stream/F1;->accept(Ljava/lang/Object;)V -HSPLj$/util/stream/F1;->m()V -HSPLj$/util/stream/F1;->n(J)V -HSPLj$/util/stream/G;->(ZLj$/util/stream/U2;Ljava/lang/Object;Lj$/util/stream/K0;Lj$/util/stream/b;)V -HSPLj$/util/stream/G;->f0(Lj$/util/stream/v0;Lj$/util/Spliterator;)Ljava/lang/Object; -HSPLj$/util/stream/G;->p()I -HSPLj$/util/stream/K0;->(I)V -HSPLj$/util/stream/K0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V -HSPLj$/util/stream/K0;->get()Ljava/lang/Object; -HSPLj$/util/stream/K;->()V -HSPLj$/util/stream/K;->get()Ljava/lang/Object; -HSPLj$/util/stream/L;->()V -HSPLj$/util/stream/L;->m()V -HSPLj$/util/stream/L;->n(J)V -HSPLj$/util/stream/P1;->()V -HSPLj$/util/stream/P1;->get()Ljava/lang/Object; -HSPLj$/util/stream/Q;->(Lj$/util/function/Consumer;Z)V -HSPLj$/util/stream/Q;->accept(Ljava/lang/Object;)V -HSPLj$/util/stream/R1;->(Lj$/util/stream/c;Lj$/util/stream/f2;I)V -HSPLj$/util/stream/R1;->accept(Ljava/lang/Object;)V -HSPLj$/util/stream/R1;->n(J)V -HSPLj$/util/stream/R2;->(Ljava/util/Map;)V -HSPLj$/util/stream/R2;->a(Lj$/util/stream/S2;)V -HSPLj$/util/stream/S2;->()V -HSPLj$/util/stream/S2;->(Ljava/lang/String;I)V -HSPLj$/util/stream/S2;->values()[Lj$/util/stream/S2; -HSPLj$/util/stream/S;->(Z)V -HSPLj$/util/stream/S;->f0(Lj$/util/stream/v0;Lj$/util/Spliterator;)Ljava/lang/Object; -HSPLj$/util/stream/S;->m()V -HSPLj$/util/stream/S;->n(J)V -HSPLj$/util/stream/S;->p()I -HSPLj$/util/stream/T1;->(Lj$/util/stream/c;ILj$/util/function/Function;I)V -HSPLj$/util/stream/T1;->B1(ILj$/util/stream/f2;)Lj$/util/stream/f2; +HSPLj$/util/stream/E1;->(Lj$/util/function/BinaryOperator;)V +HSPLj$/util/stream/E1;->accept(Ljava/lang/Object;)V +HSPLj$/util/stream/E1;->get()Ljava/lang/Object; +HSPLj$/util/stream/E1;->m()V +HSPLj$/util/stream/E1;->n(J)V +HSPLj$/util/stream/E1;->q()Z +HSPLj$/util/stream/F1;->(Lj$/util/stream/V2;Lj$/util/function/BinaryOperator;Lj$/util/function/BiConsumer;Lj$/util/function/Supplier;Lj$/util/stream/Collector;)V +HSPLj$/util/stream/F1;->l1()Lj$/util/stream/P1; +HSPLj$/util/stream/F1;->p()I +HSPLj$/util/stream/G1;->(Lj$/util/function/Supplier;Lj$/util/function/BiConsumer;Lj$/util/function/BinaryOperator;)V +HSPLj$/util/stream/G1;->accept(Ljava/lang/Object;)V +HSPLj$/util/stream/G1;->m()V +HSPLj$/util/stream/G1;->n(J)V +HSPLj$/util/stream/H;->(I)V +HSPLj$/util/stream/I;->(ZLj$/util/stream/V2;Ljava/lang/Object;Lj$/util/function/Predicate;Lj$/util/stream/b;)V +HSPLj$/util/stream/I;->f0(Lj$/util/stream/w0;Lj$/util/Spliterator;)Ljava/lang/Object; +HSPLj$/util/stream/I;->p()I +HSPLj$/util/stream/L0;->(I)V +HSPLj$/util/stream/L0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V +HSPLj$/util/stream/L0;->get()Ljava/lang/Object; +HSPLj$/util/stream/M;->()V +HSPLj$/util/stream/M;->get()Ljava/lang/Object; +HSPLj$/util/stream/N;->()V +HSPLj$/util/stream/N;->m()V +HSPLj$/util/stream/N;->n(J)V +HSPLj$/util/stream/Q1;->()V +HSPLj$/util/stream/Q1;->get()Ljava/lang/Object; +HSPLj$/util/stream/S1;->(Lj$/util/stream/c;Lj$/util/stream/g2;I)V +HSPLj$/util/stream/S1;->accept(Ljava/lang/Object;)V +HSPLj$/util/stream/S1;->n(J)V +HSPLj$/util/stream/S2;->(Ljava/util/Map;)V +HSPLj$/util/stream/S2;->a(Lj$/util/stream/T2;)V HSPLj$/util/stream/T2;->()V -HSPLj$/util/stream/T2;->(Ljava/lang/String;IILj$/util/stream/R2;)V -HSPLj$/util/stream/T2;->b(II)I -HSPLj$/util/stream/T2;->d(Lj$/util/stream/S2;)I -HSPLj$/util/stream/T2;->f(Lj$/util/Spliterator;)I -HSPLj$/util/stream/T2;->g(I)Z -HSPLj$/util/stream/T2;->j(Lj$/util/stream/S2;)Lj$/util/stream/R2; +HSPLj$/util/stream/T2;->(Ljava/lang/String;I)V HSPLj$/util/stream/T2;->values()[Lj$/util/stream/T2; -HSPLj$/util/stream/U0;->()V -HSPLj$/util/stream/U1;->(Lj$/util/Spliterator;IZ)V +HSPLj$/util/stream/T;->(Lj$/util/function/Consumer;Z)V +HSPLj$/util/stream/T;->accept(Ljava/lang/Object;)V +HSPLj$/util/stream/U1;->(Lj$/util/stream/c;ILj$/util/function/Function;I)V +HSPLj$/util/stream/U1;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; HSPLj$/util/stream/U2;->()V -HSPLj$/util/stream/U2;->(Ljava/lang/String;I)V +HSPLj$/util/stream/U2;->(Ljava/lang/String;IILj$/util/stream/S2;)V +HSPLj$/util/stream/U2;->b(II)I +HSPLj$/util/stream/U2;->d(Lj$/util/stream/T2;)I +HSPLj$/util/stream/U2;->f(Lj$/util/Spliterator;)I +HSPLj$/util/stream/U2;->g(I)Z +HSPLj$/util/stream/U2;->j(Lj$/util/stream/T2;)Lj$/util/stream/S2; +HSPLj$/util/stream/U2;->values()[Lj$/util/stream/U2; +HSPLj$/util/stream/U;->(Z)V +HSPLj$/util/stream/U;->f0(Lj$/util/stream/w0;Lj$/util/Spliterator;)Ljava/lang/Object; +HSPLj$/util/stream/U;->m()V +HSPLj$/util/stream/U;->n(J)V +HSPLj$/util/stream/U;->p()I HSPLj$/util/stream/V0;->()V -HSPLj$/util/stream/V1;->()V -HSPLj$/util/stream/V1;->(Lj$/util/stream/c;I)V -HSPLj$/util/stream/V1;->A1()Z +HSPLj$/util/stream/V1;->(Lj$/util/Spliterator;IZ)V +HSPLj$/util/stream/V2;->()V +HSPLj$/util/stream/V2;->(Ljava/lang/String;I)V HSPLj$/util/stream/W0;->()V HSPLj$/util/stream/W1;->()V HSPLj$/util/stream/W1;->(Lj$/util/stream/c;I)V HSPLj$/util/stream/W1;->A1()Z HSPLj$/util/stream/X0;->()V -HSPLj$/util/stream/X1;->(Lj$/util/Spliterator;IZ)V +HSPLj$/util/stream/X1;->()V HSPLj$/util/stream/X1;->(Lj$/util/stream/c;I)V -HSPLj$/util/stream/X1;->collect(Lj$/util/stream/Collector;)Ljava/lang/Object; -HSPLj$/util/stream/X1;->filter(Lj$/util/function/Predicate;)Lj$/util/stream/Stream; -HSPLj$/util/stream/X1;->findFirst()Lj$/util/Optional; -HSPLj$/util/stream/X1;->forEach(Lj$/util/function/Consumer;)V -HSPLj$/util/stream/X1;->map(Lj$/util/function/Function;)Lj$/util/stream/Stream; -HSPLj$/util/stream/X1;->sorted()Lj$/util/stream/Stream; -HSPLj$/util/stream/X1;->t1(Lj$/util/Spliterator;Lj$/util/stream/f2;)V +HSPLj$/util/stream/X1;->A1()Z HSPLj$/util/stream/Y0;->()V -HSPLj$/util/stream/b2;->(Lj$/util/stream/f2;)V -HSPLj$/util/stream/b2;->m()V -HSPLj$/util/stream/b2;->q()Z +HSPLj$/util/stream/Y1;->(Lj$/util/Spliterator;IZ)V +HSPLj$/util/stream/Y1;->(Lj$/util/stream/c;I)V +HSPLj$/util/stream/Y1;->collect(Lj$/util/stream/Collector;)Ljava/lang/Object; +HSPLj$/util/stream/Y1;->filter(Lj$/util/function/Predicate;)Lj$/util/stream/Stream; +HSPLj$/util/stream/Y1;->findFirst()Lj$/util/Optional; +HSPLj$/util/stream/Y1;->forEach(Lj$/util/function/Consumer;)V +HSPLj$/util/stream/Y1;->limit(J)Lj$/util/stream/Stream; +HSPLj$/util/stream/Y1;->map(Lj$/util/function/Function;)Lj$/util/stream/Stream; +HSPLj$/util/stream/Y1;->max(Ljava/util/Comparator;)Lj$/util/Optional; +HSPLj$/util/stream/Y1;->n(Lj$/util/function/BinaryOperator;)Lj$/util/Optional; +HSPLj$/util/stream/Y1;->sorted()Lj$/util/stream/Stream; +HSPLj$/util/stream/Y1;->t1(Lj$/util/Spliterator;Lj$/util/stream/g2;)V +HSPLj$/util/stream/Z0;->()V HSPLj$/util/stream/b;->(I)V HSPLj$/util/stream/b;->get()Ljava/lang/Object; +HSPLj$/util/stream/c2;->(Lj$/util/stream/g2;)V +HSPLj$/util/stream/c2;->m()V +HSPLj$/util/stream/c2;->q()Z HSPLj$/util/stream/c;->()V HSPLj$/util/stream/c;->(Lj$/util/Spliterator;IZ)V HSPLj$/util/stream/c;->(Lj$/util/stream/c;I)V HSPLj$/util/stream/c;->C1(I)Lj$/util/Spliterator; -HSPLj$/util/stream/c;->M0(Lj$/util/Spliterator;Lj$/util/stream/f2;)V -HSPLj$/util/stream/c;->N0(Lj$/util/Spliterator;Lj$/util/stream/f2;)V +HSPLj$/util/stream/c;->M0(Lj$/util/Spliterator;Lj$/util/stream/g2;)V +HSPLj$/util/stream/c;->N0(Lj$/util/Spliterator;Lj$/util/stream/g2;)V HSPLj$/util/stream/c;->isParallel()Z -HSPLj$/util/stream/c;->n1(Lj$/util/Spliterator;Lj$/util/stream/f2;)Lj$/util/stream/f2; -HSPLj$/util/stream/c;->o1(Lj$/util/stream/f2;)Lj$/util/stream/f2; -HSPLj$/util/stream/c;->q1(Lj$/util/stream/E3;)Ljava/lang/Object; +HSPLj$/util/stream/c;->n1(Lj$/util/Spliterator;Lj$/util/stream/g2;)Lj$/util/stream/g2; +HSPLj$/util/stream/c;->o1(Lj$/util/stream/g2;)Lj$/util/stream/g2; +HSPLj$/util/stream/c;->q1(Lj$/util/stream/F3;)Ljava/lang/Object; +HSPLj$/util/stream/h2;->(Lj$/util/stream/i2;Lj$/util/stream/g2;)V +HSPLj$/util/stream/h2;->accept(Ljava/lang/Object;)V +HSPLj$/util/stream/h2;->n(J)V +HSPLj$/util/stream/h2;->q()Z +HSPLj$/util/stream/i2;->(Lj$/util/stream/c;IJJ)V +HSPLj$/util/stream/i2;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; HSPLj$/util/stream/l;->(I)V -HSPLj$/util/stream/m;->(Lj$/util/function/Supplier;Lj$/util/stream/K0;Lj$/util/stream/l;Ljava/util/Set;)V -HSPLj$/util/stream/m;->accumulator()Lj$/util/function/BiConsumer; -HSPLj$/util/stream/m;->characteristics()Ljava/util/Set; -HSPLj$/util/stream/m;->combiner()Lj$/util/function/BinaryOperator; -HSPLj$/util/stream/m;->supplier()Lj$/util/function/Supplier; -HSPLj$/util/stream/t2;->(Lj$/util/stream/f2;Ljava/util/Comparator;)V -HSPLj$/util/stream/t2;->q()Z -HSPLj$/util/stream/v0;->()V -HSPLj$/util/stream/v0;->()V -HSPLj$/util/stream/v0;->(Lj$/util/stream/U2;)V -HSPLj$/util/stream/v0;->f0(Lj$/util/stream/v0;Lj$/util/Spliterator;)Ljava/lang/Object; -HSPLj$/util/stream/v0;->m1(Lj$/util/Spliterator;Z)Lj$/util/stream/Stream; -HSPLj$/util/stream/v;->(Lj$/util/stream/c;ILjava/lang/Object;I)V -HSPLj$/util/stream/v;->B1(ILj$/util/stream/f2;)Lj$/util/stream/f2; +HSPLj$/util/stream/n;->(Lj$/util/function/Supplier;Lj$/util/function/BiConsumer;Lj$/util/function/BinaryOperator;Lj$/util/function/Function;Ljava/util/Set;)V +HSPLj$/util/stream/n;->(Lj$/util/function/Supplier;Lj$/util/function/BiConsumer;Lj$/util/function/BinaryOperator;Ljava/util/Set;)V +HSPLj$/util/stream/n;->accumulator()Lj$/util/function/BiConsumer; +HSPLj$/util/stream/n;->characteristics()Ljava/util/Set; +HSPLj$/util/stream/n;->combiner()Lj$/util/function/BinaryOperator; +HSPLj$/util/stream/n;->supplier()Lj$/util/function/Supplier; +HSPLj$/util/stream/u2;->(Lj$/util/stream/g2;Ljava/util/Comparator;)V +HSPLj$/util/stream/u2;->q()Z +HSPLj$/util/stream/w0;->()V +HSPLj$/util/stream/w0;->()V +HSPLj$/util/stream/w0;->(Lj$/util/stream/V2;)V +HSPLj$/util/stream/w0;->C0(JJJ)J +HSPLj$/util/stream/w0;->S0(J)I +HSPLj$/util/stream/w0;->f0(Lj$/util/stream/w0;Lj$/util/Spliterator;)Ljava/lang/Object; +HSPLj$/util/stream/w0;->k1(Lj$/util/stream/c;JJ)Lj$/util/stream/Stream; +HSPLj$/util/stream/w0;->m1(Lj$/util/Spliterator;Z)Lj$/util/stream/Stream; +HSPLj$/util/stream/w0;->p()I +HSPLj$/util/stream/w;->(Lj$/util/stream/c;ILjava/lang/Object;I)V +HSPLj$/util/stream/w;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; HSPLkotlin/InitializedLazyImpl;->(Ljava/lang/Object;)V HSPLkotlin/KotlinVersion$Companion;->()V HSPLkotlin/KotlinVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -12608,13 +13198,10 @@ HSPLkotlin/Result$Companion;->()V HSPLkotlin/Result$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/Result$Failure;->(Ljava/lang/Throwable;)V HSPLkotlin/Result;->()V -HSPLkotlin/Result;->(Ljava/lang/Object;)V -HSPLkotlin/Result;->box-impl(Ljava/lang/Object;)Lkotlin/Result; HSPLkotlin/Result;->constructor-impl(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable; HSPLkotlin/Result;->isFailure-impl(Ljava/lang/Object;)Z HSPLkotlin/Result;->isSuccess-impl(Ljava/lang/Object;)Z -HSPLkotlin/Result;->unbox-impl()Ljava/lang/Object; HSPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Ljava/lang/Object; HSPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V HSPLkotlin/SafePublicationLazyImpl$Companion;->()V @@ -12651,7 +13238,6 @@ HSPLkotlin/collections/AbstractList$Companion;->(Lkotlin/jvm/internal/Defa HSPLkotlin/collections/AbstractList$Companion;->checkElementIndex$kotlin_stdlib(II)V HSPLkotlin/collections/AbstractList$IteratorImpl;->(Lkotlin/collections/AbstractList;)V HSPLkotlin/collections/AbstractList$IteratorImpl;->hasNext()Z -HSPLkotlin/collections/AbstractList$IteratorImpl;->next()Ljava/lang/Object; HSPLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->iterator()Ljava/util/Iterator; @@ -12708,11 +13294,13 @@ HSPLkotlin/collections/ArraysKt;->filterNotNull([Ljava/lang/Object;)Ljava/util/L HSPLkotlin/collections/ArraysKt;->getLastIndex([I)I HSPLkotlin/collections/ArraysKt;->getLastIndex([Ljava/lang/Object;)I HSPLkotlin/collections/ArraysKt;->getOrNull([II)Ljava/lang/Integer; +HSPLkotlin/collections/ArraysKt;->joinToString$default([Ljava/lang/Object;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; HSPLkotlin/collections/ArraysKt;->map([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/util/List; HSPLkotlin/collections/ArraysKt;->plus([Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object; HSPLkotlin/collections/ArraysKt;->plus([Ljava/lang/Object;[Ljava/lang/Object;)[Ljava/lang/Object; HSPLkotlin/collections/ArraysKt;->toList([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt;->toMutableList([Ljava/lang/Object;)Ljava/util/List; +HSPLkotlin/collections/ArraysKt;->toMutableSet([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/ArraysKt;->zip([Ljava/lang/Object;[Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt__ArraysJVMKt;->copyOfRangeToIndexCheck(II)V @@ -12731,10 +13319,14 @@ HSPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNullTo([Ljava/lang/Object; HSPLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([I)I HSPLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([Ljava/lang/Object;)I HSPLkotlin/collections/ArraysKt___ArraysKt;->getOrNull([II)Ljava/lang/Integer; +HSPLkotlin/collections/ArraysKt___ArraysKt;->joinTo([Ljava/lang/Object;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable; +HSPLkotlin/collections/ArraysKt___ArraysKt;->joinToString$default([Ljava/lang/Object;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; +HSPLkotlin/collections/ArraysKt___ArraysKt;->joinToString([Ljava/lang/Object;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; HSPLkotlin/collections/ArraysKt___ArraysKt;->map([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysKt;->toCollection([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; HSPLkotlin/collections/ArraysKt___ArraysKt;->toList([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysKt;->toMutableList([Ljava/lang/Object;)Ljava/util/List; +HSPLkotlin/collections/ArraysKt___ArraysKt;->toMutableSet([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/ArraysKt___ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/ArraysKt___ArraysKt;->zip([Ljava/lang/Object;[Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysUtilJVM;->asList([Ljava/lang/Object;)Ljava/util/List; @@ -12742,6 +13334,7 @@ HSPLkotlin/collections/CollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/I HSPLkotlin/collections/CollectionsKt;->addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z HSPLkotlin/collections/CollectionsKt;->asSequence(Ljava/lang/Iterable;)Lkotlin/sequences/Sequence; HSPLkotlin/collections/CollectionsKt;->binarySearch$default(Ljava/util/List;Ljava/lang/Comparable;IIILjava/lang/Object;)I +HSPLkotlin/collections/CollectionsKt;->chunked(Ljava/lang/Iterable;I)Ljava/util/List; HSPLkotlin/collections/CollectionsKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I HSPLkotlin/collections/CollectionsKt;->contains(Ljava/lang/Iterable;Ljava/lang/Object;)Z HSPLkotlin/collections/CollectionsKt;->emptyList()Ljava/util/List; @@ -12799,7 +13392,6 @@ HSPLkotlin/collections/CollectionsKt__CollectionsKt;->listOfNotNull([Ljava/lang/ HSPLkotlin/collections/CollectionsKt__CollectionsKt;->mutableListOf([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->optimizeReadOnlyList(Ljava/util/List;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->rangeCheck$CollectionsKt__CollectionsKt(III)V -HSPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I HSPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrNull(Ljava/lang/Iterable;)Ljava/lang/Integer; HSPLkotlin/collections/CollectionsKt__IterablesKt;->flatten(Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sort(Ljava/util/List;)V @@ -12817,6 +13409,7 @@ HSPLkotlin/collections/CollectionsKt___CollectionsKt$withIndex$1;->(Ljava/ HSPLkotlin/collections/CollectionsKt___CollectionsKt$withIndex$1;->invoke()Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt$withIndex$1;->invoke()Ljava/util/Iterator; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->asSequence(Ljava/lang/Iterable;)Lkotlin/sequences/Sequence; +HSPLkotlin/collections/CollectionsKt___CollectionsKt;->chunked(Ljava/lang/Iterable;I)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->contains(Ljava/lang/Iterable;Ljava/lang/Object;)Z HSPLkotlin/collections/CollectionsKt___CollectionsKt;->filter(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->filterNotNull(Ljava/lang/Iterable;)Ljava/util/List; @@ -12836,6 +13429,7 @@ HSPLkotlin/collections/CollectionsKt___CollectionsKt;->lastOrNull(Ljava/util/Lis HSPLkotlin/collections/CollectionsKt___CollectionsKt;->maxOrNull(Ljava/lang/Iterable;)Ljava/lang/Comparable; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->minOrNull(Ljava/lang/Iterable;)Ljava/lang/Comparable; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->minus(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/List; +HSPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;[Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->reversed(Ljava/lang/Iterable;)Ljava/util/List; @@ -12905,21 +13499,20 @@ HSPLkotlin/collections/MapsKt;->createMapBuilder()Ljava/util/Map; HSPLkotlin/collections/MapsKt;->emptyMap()Ljava/util/Map; HSPLkotlin/collections/MapsKt;->linkedMapOf([Lkotlin/Pair;)Ljava/util/LinkedHashMap; HSPLkotlin/collections/MapsKt;->mapCapacity(I)I -HSPLkotlin/collections/MapsKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; HSPLkotlin/collections/MapsKt;->mapOf([Lkotlin/Pair;)Ljava/util/Map; -HSPLkotlin/collections/MapsKt;->plus(Ljava/util/Map;Lkotlin/Pair;)Ljava/util/Map; +HSPLkotlin/collections/MapsKt;->plus(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map; +HSPLkotlin/collections/MapsKt;->putAll(Ljava/util/Map;[Lkotlin/Pair;)V HSPLkotlin/collections/MapsKt;->toMap(Ljava/lang/Iterable;)Ljava/util/Map; HSPLkotlin/collections/MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt;->toMutableMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsJVMKt;->build(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsJVMKt;->createMapBuilder()Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsJVMKt;->mapCapacity(I)I -HSPLkotlin/collections/MapsKt__MapsJVMKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsJVMKt;->toSingletonMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->emptyMap()Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->linkedMapOf([Lkotlin/Pair;)Ljava/util/LinkedHashMap; HSPLkotlin/collections/MapsKt__MapsKt;->mapOf([Lkotlin/Pair;)Ljava/util/Map; -HSPLkotlin/collections/MapsKt__MapsKt;->plus(Ljava/util/Map;Lkotlin/Pair;)Ljava/util/Map; +HSPLkotlin/collections/MapsKt__MapsKt;->plus(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;Ljava/lang/Iterable;)V HSPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;[Lkotlin/Pair;)V HSPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;)Ljava/util/Map; @@ -13040,6 +13633,9 @@ HSPLkotlin/jvm/internal/MutablePropertyReference1;->(Ljava/lang/Object;Lja HSPLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Lkotlin/reflect/KDeclarationContainer;Ljava/lang/String;Ljava/lang/String;)V HSPLkotlin/jvm/internal/MutablePropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +HSPLkotlin/jvm/internal/PropertyReference0;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +HSPLkotlin/jvm/internal/PropertyReference0;->invoke()Ljava/lang/Object; +HSPLkotlin/jvm/internal/PropertyReference0Impl;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/PropertyReference1;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/PropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/PropertyReference1Impl;->(Lkotlin/reflect/KDeclarationContainer;Ljava/lang/String;Ljava/lang/String;)V @@ -13411,7 +14007,6 @@ HSPLkotlin/reflect/jvm/internal/UtilKt;->()V HSPLkotlin/reflect/jvm/internal/UtilKt;->asKCallableImpl(Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/KCallableImpl; HSPLkotlin/reflect/jvm/internal/UtilKt;->asKFunctionImpl(Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/KFunctionImpl; HSPLkotlin/reflect/jvm/internal/UtilKt;->computeAnnotations(Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotated;)Ljava/util/List; -HSPLkotlin/reflect/jvm/internal/UtilKt;->createArrayType(Ljava/lang/Class;)Ljava/lang/Class; HSPLkotlin/reflect/jvm/internal/UtilKt;->getInstanceReceiverParameter(Lkotlin/reflect/jvm/internal/impl/descriptors/CallableDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor; HSPLkotlin/reflect/jvm/internal/UtilKt;->toJavaClass(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;)Ljava/lang/Class; HSPLkotlin/reflect/jvm/internal/UtilKt;->unwrapRepeatableAnnotations(Ljava/util/List;)Ljava/util/List; @@ -14019,7 +14614,6 @@ HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourc HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/SignatureSerializer;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/SignatureSerializer;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/SignatureSerializer;->constructorDesc(Ljava/lang/reflect/Constructor;)Ljava/lang/String; -HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/SignatureSerializer;->fieldDesc(Ljava/lang/reflect/Field;)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/SignatureSerializer;->methodDesc(Ljava/lang/reflect/Method;)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache;->(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache;->isSealed()Ljava/lang/reflect/Method; @@ -14324,13 +14918,10 @@ HSPLkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancem HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$AnnotationsContainerWithConstants;->(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$AnnotationsContainerWithConstants;->getMemberAnnotations()Ljava/util/Map; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$AnnotationVisitorForMethod;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1;Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$AnnotationVisitorForMethod;->visitParameterAnnotation(ILkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationArgumentVisitor; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$MemberAnnotationVisitor;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1;Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$MemberAnnotationVisitor;->getSignature()Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$MemberAnnotationVisitor;->visitAnnotation(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationArgumentVisitor; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$MemberAnnotationVisitor;->visitEnd()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader;Ljava/util/HashMap;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass;Ljava/util/HashMap;Ljava/util/HashMap;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1;->visitField(Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/String;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationVisitor; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1;->visitMethod(Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$MethodAnnotationVisitor; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$storage$1;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$storage$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -14356,14 +14947,9 @@ HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationLo HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationLoader;->loadTypeAnnotations(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationLoader;->toBinaryClass(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ProtoContainer$Class;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$AbstractAnnotationArgumentVisitor;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$AbstractAnnotationArgumentVisitor;->visit(Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/Object;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$AbstractAnnotationArgumentVisitor;->visitEnum(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/Name;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$loadAnnotation$1;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/name/ClassId;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$loadAnnotation$1;->visitConstantValue(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$loadAnnotation$1;->visitEnd()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->access$createConstant(Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue; -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->createConstant(Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->loadAnnotation(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;Ljava/util/List;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationArgumentVisitor; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->resolveClass(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;)V @@ -14409,15 +14995,12 @@ HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinarySourceElement;-> HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinarySourceElement;->getBinaryClass()Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->fromFieldNameAndDesc(Ljava/lang/String;Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->fromJvmMemberSignature(Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMemberSignature;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->fromMethodNameAndDesc(Ljava/lang/String;Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->fromMethodSignatureAndParameterIndex(Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;I)Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;->(Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;->(Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;->equals(Ljava/lang/Object;)Z -HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;->getSignature()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;->hashCode()I HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty;->()V @@ -14565,12 +15148,10 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->buil HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->buildPartial()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->create()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->maybeForceBuilderInitialization()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->mergeFrom(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->mergeFrom(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->mergeFrom(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite$Builder; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->setId(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$Builder;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$Builder;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V @@ -14601,7 +15182,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind;->(Ljava HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind;->getNumber()I HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind;->values()[Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->(Z)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->getConstructor(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor; @@ -14764,7 +15344,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property$1;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property$1;->parsePartialFrom(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property$1;->parsePartialFrom(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->(Z)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->getContextReceiverTypeCount()I @@ -15176,7 +15755,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolve HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->([Ljava/lang/String;Ljava/util/Set;Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->getQualifiedClassName(I)Ljava/lang/String; -HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->getString(I)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->isLocalClassName(I)Z HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverKt;->toExpandedRecordsList(Ljava/util/List;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->()V @@ -15345,6 +15923,7 @@ HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readBytes()Lkot HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readDouble()D HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readEnum()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readFloat()F +HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readInt32()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawByte()B HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawLittleEndian32()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawLittleEndian64()J @@ -15396,7 +15975,6 @@ HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet$1;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->(Z)V -HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->addRepeatedField(Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet$FieldDescriptorLite;Ljava/lang/Object;)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->computeElementSize(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;ILjava/lang/Object;)I HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->computeElementSizeNoTag(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;Ljava/lang/Object;)I HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->computeFieldSize(Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet$FieldDescriptorLite;Ljava/lang/Object;)I @@ -15465,7 +16043,6 @@ HSPLkotlin/reflect/jvm/internal/impl/protobuf/LiteralByteString;->toString(Ljava HSPLkotlin/reflect/jvm/internal/impl/protobuf/RopeByteString;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/RopeByteString;->concatenate(Lkotlin/reflect/jvm/internal/impl/protobuf/ByteString;Lkotlin/reflect/jvm/internal/impl/protobuf/ByteString;)Lkotlin/reflect/jvm/internal/impl/protobuf/ByteString; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$1;->(I)V -HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$1;->makeImmutable()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1;->hasNext()Z HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$2;->()V @@ -15496,7 +16073,6 @@ HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->binarySearchInArr HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->checkMutable()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->ensureEntryArrayMutable()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->entrySet()Ljava/util/Set; -HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->getArrayEntryAt(I)Ljava/util/Map$Entry; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->getNumArrayEntries()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->getOverflowEntries()Ljava/lang/Iterable; @@ -15745,15 +16321,6 @@ HSPLkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt;->getRes HSPLkotlin/reflect/jvm/internal/impl/resolve/calls/inference/CapturedTypeConstructorKt;->createCapturedIfNeeded(Lkotlin/reflect/jvm/internal/impl/types/TypeProjection;Lkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterDescriptor;)Lkotlin/reflect/jvm/internal/impl/types/TypeProjection; HSPLkotlin/reflect/jvm/internal/impl/resolve/calls/inference/CapturedTypeConstructorKt;->wrapWithCapturingSubstitution$default(Lkotlin/reflect/jvm/internal/impl/types/TypeSubstitution;ZILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/types/TypeSubstitution; HSPLkotlin/reflect/jvm/internal/impl/resolve/calls/inference/CapturedTypeConstructorKt;->wrapWithCapturingSubstitution(Lkotlin/reflect/jvm/internal/impl/types/TypeSubstitution;Z)Lkotlin/reflect/jvm/internal/impl/types/TypeSubstitution; -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/BooleanValue;->(Z)V -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue;->(Ljava/lang/Object;)V -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory;->()V -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory;->()V -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory;->createConstantValue(Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue; -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/EnumValue;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/Name;)V -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/IntValue;->(I)V -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/IntegerValueConstant;->(Ljava/lang/Object;)V -HSPLkotlin/reflect/jvm/internal/impl/resolve/constants/StringValue;->(Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt$$Lambda$0;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt$$Lambda$0;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt$$Lambda$0;->getNeighbors(Ljava/lang/Object;)Ljava/lang/Iterable; @@ -15932,7 +16499,6 @@ HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/Deserializati HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getSkipMetadataVersionCheck()Z HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getSkipPrereleaseCheck()Z HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getTypeAliasesAllowed()Z -HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/TypeTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedContainerSource;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->childContext$default(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/TypeTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->childContext(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/TypeTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;)Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->getComponents()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents; @@ -15987,7 +16553,6 @@ HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeseria HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->initializeWithCoroutinesExperimentalityStatus(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedSimpleFunctionDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;Ljava/util/Map;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadConstructor(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;Z)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassConstructorDescriptor; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadOldFlags(I)I -HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadProperty(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;)Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->valueParameters(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotatedCallableKind;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/NameResolverUtilKt;->getClassId(Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;I)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/NameResolverUtilKt;->getName(Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;I)Lkotlin/reflect/jvm/internal/impl/name/Name; @@ -16250,6 +16815,7 @@ HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComp HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->equals(Ljava/lang/Object;)Z HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->hashCode()I HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V +HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->postCompute(Ljava/lang/Object;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValueWithPostCompute;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValueWithPostCompute;->invoke()Ljava/lang/Object; @@ -16261,6 +16827,7 @@ HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNo HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValueWithPostCompute;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValueWithPostCompute;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentMap;Lkotlin/jvm/functions/Function1;)V +HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull;->()V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentMap;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -16601,6 +17168,7 @@ HSPLkotlin/sequences/SequenceBuilderIterator;->yield(Ljava/lang/Object;Lkotlin/c HSPLkotlin/sequences/SequenceScope;->()V HSPLkotlin/sequences/SequencesKt;->asSequence(Ljava/util/Iterator;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt;->filter(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; +HSPLkotlin/sequences/SequencesKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt;->filterNot(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt;->filterNotNull(Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt;->firstOrNull(Lkotlin/sequences/Sequence;)Ljava/lang/Object; @@ -16624,6 +17192,10 @@ HSPLkotlin/sequences/SequencesKt__SequencesKt;->asSequence(Ljava/util/Iterator;) HSPLkotlin/sequences/SequencesKt__SequencesKt;->constrainOnce(Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Lkotlin/jvm/functions/Function0;)Lkotlin/sequences/Sequence; +HSPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->(Ljava/lang/Class;)V +HSPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; +HSPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlin/sequences/SequencesKt___SequencesJvmKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; @@ -16695,7 +17267,6 @@ HSPLkotlin/text/StringsKt;->contains$default(Ljava/lang/CharSequence;CZILjava/la HSPLkotlin/text/StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z HSPLkotlin/text/StringsKt;->drop(Ljava/lang/String;I)Ljava/lang/String; -HSPLkotlin/text/StringsKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt;->getIndices(Ljava/lang/CharSequence;)Lkotlin/ranges/IntRange; HSPLkotlin/text/StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I HSPLkotlin/text/StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I @@ -16710,6 +17281,7 @@ HSPLkotlin/text/StringsKt;->startsWith$default(Ljava/lang/CharSequence;Ljava/lan HSPLkotlin/text/StringsKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt;->substringAfter(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt;->substringBeforeLast(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +HSPLkotlin/text/StringsKt;->take(Ljava/lang/String;I)Ljava/lang/String; HSPLkotlin/text/StringsKt;->toLongOrNull(Ljava/lang/String;)Ljava/lang/Long; HSPLkotlin/text/StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLkotlin/text/StringsKt;->trimIndent(Ljava/lang/String;)Ljava/lang/String; @@ -16724,8 +17296,6 @@ HSPLkotlin/text/StringsKt__IndentKt;->replaceIndent(Ljava/lang/String;Ljava/lang HSPLkotlin/text/StringsKt__IndentKt;->trimIndent(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toLongOrNull(Ljava/lang/String;)Ljava/lang/Long; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toLongOrNull(Ljava/lang/String;I)Ljava/lang/Long; -HSPLkotlin/text/StringsKt__StringsJVMKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z -HSPLkotlin/text/StringsKt__StringsJVMKt;->endsWith(Ljava/lang/String;Ljava/lang/String;Z)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->isBlank(Ljava/lang/CharSequence;)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->regionMatches(Ljava/lang/String;ILjava/lang/String;IIZ)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;CCZILjava/lang/Object;)Ljava/lang/String; @@ -16772,6 +17342,7 @@ HSPLkotlin/text/StringsKt__StringsKt;->substringAfter(Ljava/lang/String;Ljava/la HSPLkotlin/text/StringsKt__StringsKt;->substringBeforeLast(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLkotlin/text/StringsKt___StringsKt;->drop(Ljava/lang/String;I)Ljava/lang/String; +HSPLkotlin/text/StringsKt___StringsKt;->take(Ljava/lang/String;I)Ljava/lang/String; HSPLkotlin/time/Duration$Companion;->()V HSPLkotlin/time/Duration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/time/Duration;->()V @@ -16786,6 +17357,7 @@ HSPLkotlin/time/Duration;->isInNanos-impl(J)Z HSPLkotlin/time/Duration;->isInfinite-impl(J)Z HSPLkotlin/time/Duration;->minus-LRDsOJo(JJ)J HSPLkotlin/time/Duration;->plus-LRDsOJo(JJ)J +HSPLkotlin/time/Duration;->toDouble-impl(JLkotlin/time/DurationUnit;)D HSPLkotlin/time/Duration;->toLong-impl(JLkotlin/time/DurationUnit;)J HSPLkotlin/time/Duration;->unaryMinus-UwyO8pc(J)J HSPLkotlin/time/Duration;->unbox-impl()J @@ -16804,6 +17376,7 @@ HSPLkotlin/time/DurationUnit;->$values()[Lkotlin/time/DurationUnit; HSPLkotlin/time/DurationUnit;->()V HSPLkotlin/time/DurationUnit;->(Ljava/lang/String;ILjava/util/concurrent/TimeUnit;)V HSPLkotlin/time/DurationUnit;->getTimeUnit$kotlin_stdlib()Ljava/util/concurrent/TimeUnit; +HSPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnit(DLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)D HSPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnit(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J HSPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnitOverflow(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J HSPLkotlinx/collections/immutable/ExtensionsKt;->persistentSetOf()Lkotlinx/collections/immutable/PersistentSet; @@ -16927,7 +17500,8 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->bindArguments(Lnet/zetetic HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->canonicalizeSyncMode(Ljava/lang/String;)Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->detachCancellationSignal(Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZLandroid/os/CancellationSignal;)I +HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)I +HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->finalizePreparedStatement(Lnet/zetetic/database/sqlcipher/SQLiteConnection$PreparedStatement;)V @@ -16953,34 +17527,31 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->setWalModeFromConfiguratio HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->throwIfStatementForbidden(Lnet/zetetic/database/sqlcipher/SQLiteConnection$PreparedStatement;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool$AcquiredConnectionStatus;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool$AcquiredConnectionStatus;->(Ljava/lang/String;I)V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool$ConnectionWaiter;->()V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool$ConnectionWaiter;->(Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$1;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->closeExcessConnectionsAndLogExceptionsLocked()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->finishAcquireConnectionLocked(Lnet/zetetic/database/sqlcipher/SQLiteConnection;I)V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->getPriority(I)I HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->markAcquiredConnectionsLocked(Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$AcquiredConnectionStatus;)V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->obtainConnectionWaiterLocked(Ljava/lang/Thread;JIZLjava/lang/String;I)Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$ConnectionWaiter; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->open()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->open(Lnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;)Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->openConnectionLocked(Lnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;Z)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->reconfigure(Lnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->reconfigureAllConnectionsLocked()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->recycleConnectionLocked(Lnet/zetetic/database/sqlcipher/SQLiteConnection;Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$AcquiredConnectionStatus;)Z -HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->recycleConnectionWaiterLocked(Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool$ConnectionWaiter;)V -HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->releaseConnection(Lnet/zetetic/database/sqlcipher/SQLiteConnection;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->setMaxConnectionPoolSizeLocked()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->throwIfClosedLocked()V +HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->tryAcquirePrimaryConnectionLocked(I)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->waitForConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Lnet/zetetic/database/sqlcipher/SQLiteConnection; HSPLnet/zetetic/database/sqlcipher/SQLiteConnectionPool;->wakeConnectionWaitersLocked()V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;J)Landroid/database/CursorWindow; HSPLnet/zetetic/database/sqlcipher/SQLiteCursor$$ExternalSyntheticApiModelOutline1;->m()V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->()V +HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->(Lnet/zetetic/database/sqlcipher/SQLiteCursorDriver;Ljava/lang/String;Lnet/zetetic/database/sqlcipher/SQLiteQuery;)V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->awc_clearOrCreateWindow(Ljava/lang/String;)V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->close()V +HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->fillWindow(I)V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->finalize()V HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->getColumnIndex(Ljava/lang/String;)I HSPLnet/zetetic/database/sqlcipher/SQLiteCursor;->getColumnNames()[Ljava/lang/String; @@ -16998,6 +17569,7 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->beginTransaction(Lnet/zeteti HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->beginTransactionWithListener(Lnet/zetetic/database/sqlcipher/SQLiteTransactionListener;)V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->compileStatement(Ljava/lang/String;)Lnet/zetetic/database/sqlcipher/SQLiteStatement; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->createSession()Lnet/zetetic/database/sqlcipher/SQLiteSession; +HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->endTransaction()V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->execSQL(Ljava/lang/String;)V @@ -17010,7 +17582,9 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getThreadSession()Lnet/zetet HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getVersion()I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->hasCodec()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->inTransaction()Z +HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insert(Ljava/lang/String;ILandroid/content/ContentValues;)J HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J +HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isMainThread()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isOpen()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isReadOnly()Z @@ -17033,8 +17607,8 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->setForeignKeyConstraintsEnab HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->setTransactionSuccessful()V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->setVersion(I)V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->throwIfNotOpenLocked()V +HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->update(Ljava/lang/String;ILandroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/Object;)I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->update(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I -HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;->(Ljava/lang/String;I[BLnet/zetetic/database/sqlcipher/SQLiteDatabaseHook;)V HSPLnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabaseConfiguration;)V @@ -17065,11 +17639,10 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bind(ILjava/lang/Object;)V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bindAllArgs([Ljava/lang/Object;)V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bindString(ILjava/lang/String;)V -HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->clearBindings()V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getBindArgs()[Ljava/lang/Object; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getColumnNames()[Ljava/lang/String; +HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getConnectionFlags()I HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; -HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getSession()Lnet/zetetic/database/sqlcipher/SQLiteSession; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getSql()Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->onAllReferencesReleased()V HSPLnet/zetetic/database/sqlcipher/SQLiteQuery;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/lang/String;Landroid/os/CancellationSignal;)V @@ -17094,12 +17667,14 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->executeForLong(Ljava/lang/Str HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Z HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->hasTransaction()Z HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->obtainTransaction(ILnet/zetetic/database/sqlcipher/SQLiteTransactionListener;)Lnet/zetetic/database/sqlcipher/SQLiteSession$Transaction; +HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->prepare(Ljava/lang/String;ILandroid/os/CancellationSignal;Lnet/zetetic/database/sqlcipher/SQLiteStatementInfo;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->recycleTransaction(Lnet/zetetic/database/sqlcipher/SQLiteSession$Transaction;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->releaseConnection()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->setTransactionSuccessful()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->throwIfNoTransaction()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->throwIfTransactionMarkedSuccessful()V HSPLnet/zetetic/database/sqlcipher/SQLiteStatement;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V +HSPLnet/zetetic/database/sqlcipher/SQLiteStatement;->executeInsert()J HSPLnet/zetetic/database/sqlcipher/SQLiteStatement;->executeUpdateDelete()I HSPLnet/zetetic/database/sqlcipher/SQLiteStatement;->simpleQueryForLong()J HSPLnet/zetetic/database/sqlcipher/SQLiteStatementInfo;->()V @@ -17278,11 +17853,9 @@ HSPLokhttp3/HttpUrl;->toString()Ljava/lang/String; HSPLokhttp3/HttpUrl;->uri()Ljava/net/URI; HSPLokhttp3/MediaType;->()V HSPLokhttp3/MediaType;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -HSPLokhttp3/MediaType;->charset()Ljava/nio/charset/Charset; HSPLokhttp3/MediaType;->charset(Ljava/nio/charset/Charset;)Ljava/nio/charset/Charset; HSPLokhttp3/MediaType;->get(Ljava/lang/String;)Lokhttp3/MediaType; HSPLokhttp3/MediaType;->parse(Ljava/lang/String;)Lokhttp3/MediaType; -HSPLokhttp3/MediaType;->toString()Ljava/lang/String; HSPLokhttp3/OkHttpClient$1;->()V HSPLokhttp3/OkHttpClient$1;->addLenient(Lokhttp3/Headers$Builder;Ljava/lang/String;)V HSPLokhttp3/OkHttpClient$1;->apply(Lokhttp3/ConnectionSpec;Ljavax/net/ssl/SSLSocket;Z)V @@ -17307,7 +17880,6 @@ HSPLokhttp3/OkHttpClient$Builder;->eventListener(Lokhttp3/EventListener;)Lokhttp HSPLokhttp3/OkHttpClient$Builder;->protocols(Ljava/util/List;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->proxySelector(Ljava/net/ProxySelector;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->readTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; -HSPLokhttp3/OkHttpClient$Builder;->retryOnConnectionFailure(Z)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient;->()V HSPLokhttp3/OkHttpClient;->(Lokhttp3/OkHttpClient$Builder;)V @@ -17346,8 +17918,6 @@ HSPLokhttp3/RealCall$AsyncCall;->()V HSPLokhttp3/RealCall$AsyncCall;->(Lokhttp3/RealCall;Lokhttp3/Callback;)V HSPLokhttp3/RealCall$AsyncCall;->execute()V HSPLokhttp3/RealCall$AsyncCall;->executeOn(Ljava/util/concurrent/ExecutorService;)V -HSPLokhttp3/RealCall$AsyncCall;->get()Lokhttp3/RealCall; -HSPLokhttp3/RealCall$AsyncCall;->host()Ljava/lang/String; HSPLokhttp3/RealCall;->(Lokhttp3/OkHttpClient;Lokhttp3/Request;Z)V HSPLokhttp3/RealCall;->captureCallStackTrace()V HSPLokhttp3/RealCall;->enqueue(Lokhttp3/Callback;)V @@ -17378,7 +17948,6 @@ HSPLokhttp3/Request;->newBuilder()Lokhttp3/Request$Builder; HSPLokhttp3/Request;->url()Lokhttp3/HttpUrl; HSPLokhttp3/RequestBody$2;->(Lokhttp3/MediaType;I[BI)V HSPLokhttp3/RequestBody;->()V -HSPLokhttp3/RequestBody;->create(Lokhttp3/MediaType;Ljava/lang/String;)Lokhttp3/RequestBody; HSPLokhttp3/RequestBody;->create(Lokhttp3/MediaType;[B)Lokhttp3/RequestBody; HSPLokhttp3/RequestBody;->create(Lokhttp3/MediaType;[BII)Lokhttp3/RequestBody; HSPLokhttp3/Response$Builder;->()V @@ -17407,7 +17976,6 @@ HSPLokhttp3/Response;->isSuccessful()Z HSPLokhttp3/Response;->message()Ljava/lang/String; HSPLokhttp3/Response;->newBuilder()Lokhttp3/Response$Builder; HSPLokhttp3/Response;->request()Lokhttp3/Request; -HSPLokhttp3/Response;->toString()Ljava/lang/String; HSPLokhttp3/ResponseBody$1;->(Lokhttp3/MediaType;JLokio/BufferedSource;)V HSPLokhttp3/ResponseBody$1;->source()Lokio/BufferedSource; HSPLokhttp3/ResponseBody;->()V @@ -17621,6 +18189,7 @@ HSPLokhttp3/internal/tls/OkHostnameVerifier;->verifyHostname(Ljava/lang/String;L HSPLokhttp3/internal/ws/RealWebSocket$1;->(Lokhttp3/internal/ws/RealWebSocket;)V HSPLokhttp3/internal/ws/RealWebSocket$2;->(Lokhttp3/internal/ws/RealWebSocket;Lokhttp3/Request;)V HSPLokhttp3/internal/ws/RealWebSocket$2;->onResponse(Lokhttp3/Call;Lokhttp3/Response;)V +HSPLokhttp3/internal/ws/RealWebSocket$Close;->(ILokio/ByteString;J)V HSPLokhttp3/internal/ws/RealWebSocket;->()V HSPLokhttp3/internal/ws/RealWebSocket;->(Lokhttp3/Request;Lokhttp3/WebSocketListener;Ljava/util/Random;J)V HSPLokhttp3/internal/ws/RealWebSocket;->checkResponse(Lokhttp3/Response;)V @@ -17628,6 +18197,7 @@ HSPLokhttp3/internal/ws/RealWebSocket;->close(ILjava/lang/String;)Z HSPLokhttp3/internal/ws/RealWebSocket;->close(ILjava/lang/String;J)Z HSPLokhttp3/internal/ws/RealWebSocket;->connect(Lokhttp3/OkHttpClient;)V HSPLokhttp3/internal/ws/RealWebSocket;->failWebSocket(Ljava/lang/Exception;Lokhttp3/Response;)V +HSPLokhttp3/internal/ws/RealWebSocket;->runWriter()V HSPLokhttp3/internal/ws/WebSocketProtocol;->closeCodeExceptionMessage(I)Ljava/lang/String; HSPLokhttp3/internal/ws/WebSocketProtocol;->validateCloseCode(I)V HSPLokio/AsyncTimeout$Companion;->()V @@ -17652,7 +18222,6 @@ HSPLokio/AsyncTimeout;->()V HSPLokio/AsyncTimeout;->()V HSPLokio/AsyncTimeout;->access$getHead$cp()Lokio/AsyncTimeout; HSPLokio/AsyncTimeout;->access$getIDLE_TIMEOUT_MILLIS$cp()J -HSPLokio/AsyncTimeout;->access$getIDLE_TIMEOUT_NANOS$cp()J HSPLokio/AsyncTimeout;->access$getInQueue$p(Lokio/AsyncTimeout;)Z HSPLokio/AsyncTimeout;->access$getNext$p(Lokio/AsyncTimeout;)Lokio/AsyncTimeout; HSPLokio/AsyncTimeout;->access$remainingNanos(Lokio/AsyncTimeout;J)J @@ -17675,6 +18244,7 @@ HSPLokio/Buffer;->close()V HSPLokio/Buffer;->completeSegmentByteCount()J HSPLokio/Buffer;->copyTo(Lokio/Buffer;JJ)Lokio/Buffer; HSPLokio/Buffer;->exhausted()Z +HSPLokio/Buffer;->getByte(J)B HSPLokio/Buffer;->indexOf(BJJ)J HSPLokio/Buffer;->indexOfElement(Lokio/ByteString;J)J HSPLokio/Buffer;->read(Lokio/Buffer;J)J @@ -17687,14 +18257,11 @@ HSPLokio/Buffer;->readHexadecimalUnsignedLong()J HSPLokio/Buffer;->readInt()I HSPLokio/Buffer;->readIntLe()I HSPLokio/Buffer;->readShort()S -HSPLokio/Buffer;->readString(JLjava/nio/charset/Charset;)Ljava/lang/String; HSPLokio/Buffer;->readString(Ljava/nio/charset/Charset;)Ljava/lang/String; HSPLokio/Buffer;->readUtf8(J)Ljava/lang/String; HSPLokio/Buffer;->setSize$okio(J)V HSPLokio/Buffer;->size()J -HSPLokio/Buffer;->skip(J)V HSPLokio/Buffer;->writableSegment$okio(I)Lokio/Segment; -HSPLokio/Buffer;->write(Lokio/Buffer;J)V HSPLokio/Buffer;->write([B)Lokio/Buffer; HSPLokio/Buffer;->write([BII)Lokio/Buffer; HSPLokio/Buffer;->writeAll(Lokio/Source;)J @@ -17821,7 +18388,6 @@ HSPLokio/RealBufferedSource;->readShort()S HSPLokio/RealBufferedSource;->readString(Ljava/nio/charset/Charset;)Ljava/lang/String; HSPLokio/RealBufferedSource;->readUtf8LineStrict()Ljava/lang/String; HSPLokio/RealBufferedSource;->readUtf8LineStrict(J)Ljava/lang/String; -HSPLokio/RealBufferedSource;->request(J)Z HSPLokio/RealBufferedSource;->require(J)V HSPLokio/RealBufferedSource;->select(Lokio/Options;)I HSPLokio/RealBufferedSource;->skip(J)V @@ -17915,7 +18481,6 @@ HSPLorg/conscrypt/ActiveSession;->onPeerCertificateAvailable(Ljava/lang/String;I HSPLorg/conscrypt/ActiveSession;->onPeerCertificatesReceived(Ljava/lang/String;I[Ljava/security/cert/X509Certificate;)V HSPLorg/conscrypt/AddressUtils;->isLiteralIpAddress(Ljava/lang/String;)Z HSPLorg/conscrypt/AddressUtils;->isValidSniHostname(Ljava/lang/String;)Z -HSPLorg/conscrypt/ArrayUtils;->checkOffsetAndCount(III)V HSPLorg/conscrypt/BufferUtils;->checkNotNull([Ljava/nio/ByteBuffer;)V HSPLorg/conscrypt/BufferUtils;->getBufferLargerThan([Ljava/nio/ByteBuffer;I)Ljava/nio/ByteBuffer; HSPLorg/conscrypt/BufferUtils;->remaining([Ljava/nio/ByteBuffer;)J @@ -17932,11 +18497,6 @@ HSPLorg/conscrypt/ClientSessionContext;->onBeforeAddSession(Lorg/conscrypt/Nativ HSPLorg/conscrypt/ClientSessionContext;->onBeforeRemoveSession(Lorg/conscrypt/NativeSslSession;)V HSPLorg/conscrypt/ClientSessionContext;->putSession(Lorg/conscrypt/ClientSessionContext$HostAndPort;Lorg/conscrypt/NativeSslSession;)V HSPLorg/conscrypt/ClientSessionContext;->removeSession(Lorg/conscrypt/ClientSessionContext$HostAndPort;Lorg/conscrypt/NativeSslSession;)V -HSPLorg/conscrypt/Conscrypt$Version;->(III)V -HSPLorg/conscrypt/Conscrypt$Version;->(IIILorg/conscrypt/Conscrypt$1;)V -HSPLorg/conscrypt/Conscrypt;->()V -HSPLorg/conscrypt/Conscrypt;->checkAvailability()V -HSPLorg/conscrypt/Conscrypt;->newProvider()Ljava/security/Provider; HSPLorg/conscrypt/ConscryptEngine$1;->(Lorg/conscrypt/ConscryptEngine;)V HSPLorg/conscrypt/ConscryptEngine$1;->provideSession()Lorg/conscrypt/ConscryptSession; HSPLorg/conscrypt/ConscryptEngine$2;->(Lorg/conscrypt/ConscryptEngine;)V @@ -18062,6 +18622,8 @@ HSPLorg/conscrypt/ConscryptEngineSocket;->setEnabledProtocols([Ljava/lang/String HSPLorg/conscrypt/ConscryptEngineSocket;->setSSLParameters(Ljavax/net/ssl/SSLParameters;)V HSPLorg/conscrypt/ConscryptEngineSocket;->startHandshake()V HSPLorg/conscrypt/ConscryptEngineSocket;->waitForHandshake()V +HSPLorg/conscrypt/ConscryptSignal;->checkAvailability()V +HSPLorg/conscrypt/ConscryptSignal;->newProvider()Ljava/security/Provider; HSPLorg/conscrypt/EmptyArray;->()V HSPLorg/conscrypt/EvpMdRef$MD5;->()V HSPLorg/conscrypt/EvpMdRef$SHA1;->()V @@ -18074,9 +18636,6 @@ HSPLorg/conscrypt/ExternalSession;->getPacketBufferSize()I HSPLorg/conscrypt/ExternalSession;->getPeerCertificates()[Ljava/security/cert/X509Certificate; HSPLorg/conscrypt/ExternalSession;->getPeerHost()Ljava/lang/String; HSPLorg/conscrypt/ExternalSession;->getProtocol()Ljava/lang/String; -HSPLorg/conscrypt/GCMParameters;->(I[B)V -HSPLorg/conscrypt/GCMParameters;->getIV()[B -HSPLorg/conscrypt/GCMParameters;->getTLen()I HSPLorg/conscrypt/HandshakeListener;->()V HSPLorg/conscrypt/Java7ExtendedSSLSession;->()V HSPLorg/conscrypt/Java7ExtendedSSLSession;->(Lorg/conscrypt/ExternalSession;)V @@ -18122,7 +18681,6 @@ HSPLorg/conscrypt/NativeRef$EVP_PKEY;->doFree(J)V HSPLorg/conscrypt/NativeRef$HMAC_CTX;->(J)V HSPLorg/conscrypt/NativeRef$HMAC_CTX;->doFree(J)V HSPLorg/conscrypt/NativeRef$SSL_SESSION;->(J)V -HSPLorg/conscrypt/NativeRef$SSL_SESSION;->doFree(J)V HSPLorg/conscrypt/NativeRef;->(J)V HSPLorg/conscrypt/NativeRef;->finalize()V HSPLorg/conscrypt/NativeSsl$BioWrapper;->(Lorg/conscrypt/NativeSsl;)V @@ -18174,22 +18732,6 @@ HSPLorg/conscrypt/NativeSslSession;->getOcspResponse(Lorg/conscrypt/ConscryptSes HSPLorg/conscrypt/NativeSslSession;->newInstance(Lorg/conscrypt/NativeRef$SSL_SESSION;Lorg/conscrypt/ConscryptSession;)Lorg/conscrypt/NativeSslSession; HSPLorg/conscrypt/OidData;->()V HSPLorg/conscrypt/OidData;->oidToAlgorithmName(Ljava/lang/String;)Ljava/lang/String; -HSPLorg/conscrypt/OpenSSLAeadCipher;->()V -HSPLorg/conscrypt/OpenSSLAeadCipher;->(Lorg/conscrypt/OpenSSLCipher$Mode;)V -HSPLorg/conscrypt/OpenSSLAeadCipher;->allowsNonceReuse()Z -HSPLorg/conscrypt/OpenSSLAeadCipher;->checkInitialization()V -HSPLorg/conscrypt/OpenSSLAeadCipher;->checkSupportedTagLength(I)V -HSPLorg/conscrypt/OpenSSLAeadCipher;->doFinalInternal([BII)I -HSPLorg/conscrypt/OpenSSLAeadCipher;->engineInitInternal([BLjava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V -HSPLorg/conscrypt/OpenSSLAeadCipher;->expand(I)V -HSPLorg/conscrypt/OpenSSLAeadCipher;->reset()V -HSPLorg/conscrypt/OpenSSLAeadCipher;->updateInternal([BII[BII)I -HSPLorg/conscrypt/OpenSSLAeadCipherAES$GCM;->()V -HSPLorg/conscrypt/OpenSSLAeadCipherAES$GCM;->getEVP_AEAD(I)J -HSPLorg/conscrypt/OpenSSLAeadCipherAES;->(Lorg/conscrypt/OpenSSLCipher$Mode;)V -HSPLorg/conscrypt/OpenSSLAeadCipherAES;->checkSupportedKeySize(I)V -HSPLorg/conscrypt/OpenSSLAeadCipherAES;->getCipherBlockSize()I -HSPLorg/conscrypt/OpenSSLAeadCipherAES;->getOutputSizeForFinal(I)I HSPLorg/conscrypt/OpenSSLBIOInputStream;->(Ljava/io/InputStream;Z)V HSPLorg/conscrypt/OpenSSLBIOInputStream;->getBioContext()J HSPLorg/conscrypt/OpenSSLBIOInputStream;->read([B)I @@ -18341,7 +18883,6 @@ HSPLorg/conscrypt/Platform;->blockGuardOnNetwork()V HSPLorg/conscrypt/Platform;->checkServerTrusted(Ljavax/net/ssl/X509TrustManager;[Ljava/security/cert/X509Certificate;Ljava/lang/String;Lorg/conscrypt/ConscryptEngine;)V HSPLorg/conscrypt/Platform;->checkTrusted(Ljava/lang/String;Ljavax/net/ssl/X509TrustManager;[Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Object;)Z HSPLorg/conscrypt/Platform;->createEngineSocket(Ljava/net/Socket;Ljava/lang/String;IZLorg/conscrypt/SSLParametersImpl;)Lorg/conscrypt/ConscryptEngineSocket; -HSPLorg/conscrypt/Platform;->fromGCMParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Lorg/conscrypt/GCMParameters; HSPLorg/conscrypt/Platform;->getDefaultProviderName()Ljava/lang/String; HSPLorg/conscrypt/Platform;->getSSLParameters(Ljavax/net/ssl/SSLParameters;Lorg/conscrypt/SSLParametersImpl;Lorg/conscrypt/ConscryptEngine;)V HSPLorg/conscrypt/Platform;->getSSLParametersFromImpl(Ljavax/net/ssl/SSLParameters;Lorg/conscrypt/SSLParametersImpl;)V @@ -18411,7 +18952,6 @@ HSPLorg/conscrypt/SSLUtils;->toProtocolString([B)Ljava/lang/String; HSPLorg/conscrypt/SSLUtils;->unsignedByte(B)S HSPLorg/conscrypt/SSLUtils;->unsignedShort(S)I HSPLorg/conscrypt/ServerSessionContext;->()V -HSPLorg/conscrypt/io/IoUtils;->closeQuietly(Ljava/io/Closeable;)V HSPLorg/greenrobot/eventbus/AsyncPoster;->(Lorg/greenrobot/eventbus/EventBus;)V HSPLorg/greenrobot/eventbus/BackgroundPoster;->(Lorg/greenrobot/eventbus/EventBus;)V HSPLorg/greenrobot/eventbus/EventBus$1;->(Lorg/greenrobot/eventbus/EventBus;)V @@ -18424,12 +18964,15 @@ HSPLorg/greenrobot/eventbus/EventBus;->addInterfaces(Ljava/util/List;[Ljava/lang HSPLorg/greenrobot/eventbus/EventBus;->builder()Lorg/greenrobot/eventbus/EventBusBuilder; HSPLorg/greenrobot/eventbus/EventBus;->getDefault()Lorg/greenrobot/eventbus/EventBus; HSPLorg/greenrobot/eventbus/EventBus;->getStickyEvent(Ljava/lang/Class;)Ljava/lang/Object; +HSPLorg/greenrobot/eventbus/EventBus;->isRegistered(Ljava/lang/Object;)Z HSPLorg/greenrobot/eventbus/EventBus;->lookupAllEventTypes(Ljava/lang/Class;)Ljava/util/List; HSPLorg/greenrobot/eventbus/EventBus;->post(Ljava/lang/Object;)V HSPLorg/greenrobot/eventbus/EventBus;->postSingleEvent(Ljava/lang/Object;Lorg/greenrobot/eventbus/EventBus$PostingThreadState;)V HSPLorg/greenrobot/eventbus/EventBus;->postSingleEventForEventType(Ljava/lang/Object;Lorg/greenrobot/eventbus/EventBus$PostingThreadState;Ljava/lang/Class;)Z HSPLorg/greenrobot/eventbus/EventBus;->register(Ljava/lang/Object;)V HSPLorg/greenrobot/eventbus/EventBus;->subscribe(Ljava/lang/Object;Lorg/greenrobot/eventbus/SubscriberMethod;)V +HSPLorg/greenrobot/eventbus/EventBus;->unregister(Ljava/lang/Object;)V +HSPLorg/greenrobot/eventbus/EventBus;->unsubscribeByEventType(Ljava/lang/Object;Ljava/lang/Class;)V HSPLorg/greenrobot/eventbus/EventBusBuilder;->()V HSPLorg/greenrobot/eventbus/EventBusBuilder;->()V HSPLorg/greenrobot/eventbus/EventBusBuilder;->build()Lorg/greenrobot/eventbus/EventBus; @@ -18453,6 +18996,7 @@ HSPLorg/greenrobot/eventbus/SubscriberMethodFinder;->getMethodsAndRelease(Lorg/g HSPLorg/greenrobot/eventbus/SubscriberMethodFinder;->getSubscriberInfo(Lorg/greenrobot/eventbus/SubscriberMethodFinder$FindState;)Lorg/greenrobot/eventbus/meta/SubscriberInfo; HSPLorg/greenrobot/eventbus/SubscriberMethodFinder;->prepareFindState()Lorg/greenrobot/eventbus/SubscriberMethodFinder$FindState; HSPLorg/greenrobot/eventbus/Subscription;->(Ljava/lang/Object;Lorg/greenrobot/eventbus/SubscriberMethod;)V +HSPLorg/greenrobot/eventbus/Subscription;->equals(Ljava/lang/Object;)Z HSPLorg/greenrobot/eventbus/ThreadMode;->()V HSPLorg/greenrobot/eventbus/ThreadMode;->(Ljava/lang/String;I)V HSPLorg/signal/aesgcmprovider/AesGcmProvider;->()V @@ -18468,8 +19012,8 @@ HSPLorg/signal/benchmark/setup/TestMessages;->()V HSPLorg/signal/benchmark/setup/TestMessages;->imageAttachment()Lorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer; HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingImageMessage$default(Lorg/signal/benchmark/setup/TestMessages;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;ILjava/lang/Long;ZILjava/lang/Object;)J HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingImageMessage(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;ILjava/lang/Long;Z)J -HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingMediaMessage(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/mms/IncomingMediaMessage;Z)J -HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingMessage(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/mms/IncomingMediaMessage;)J +HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingMessage(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/mms/IncomingMessage;)J +HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingMessage(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/mms/IncomingMessage;Z)J HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingTextMessage$default(Lorg/signal/benchmark/setup/TestMessages;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)V HSPLorg/signal/benchmark/setup/TestMessages;->insertIncomingTextMessage(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;Ljava/lang/Long;)V HSPLorg/signal/benchmark/setup/TestMessages;->setMessageMediaFailed(J)V @@ -18478,6 +19022,25 @@ HSPLorg/signal/benchmark/setup/TestUsers;->()V HSPLorg/signal/benchmark/setup/TestUsers;->()V HSPLorg/signal/benchmark/setup/TestUsers;->setupSelf()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/signal/benchmark/setup/TestUsers;->setupTestRecipients(I)Ljava/util/List; +HSPLorg/signal/core/util/Base64;->()V +HSPLorg/signal/core/util/Base64;->()V +HSPLorg/signal/core/util/Base64;->decode(Ljava/lang/String;)[B +HSPLorg/signal/core/util/Base64;->decodeNullableOrThrow(Ljava/lang/String;)[B +HSPLorg/signal/core/util/Base64;->encodeWithPadding$default([BIIILjava/lang/Object;)Ljava/lang/String; +HSPLorg/signal/core/util/Base64;->encodeWithPadding([B)Ljava/lang/String; +HSPLorg/signal/core/util/Base64;->encodeWithPadding([BII)Ljava/lang/String; +HSPLorg/signal/core/util/Base64;->withPaddingIfNeeded(Ljava/lang/String;)Ljava/lang/String; +HSPLorg/signal/core/util/Base64Tools;->()V +HSPLorg/signal/core/util/Base64Tools;->decode(Ljava/lang/String;)[B +HSPLorg/signal/core/util/Base64Tools;->decode(Ljava/lang/String;I)[B +HSPLorg/signal/core/util/Base64Tools;->decode([BIII)[B +HSPLorg/signal/core/util/Base64Tools;->decode4to3([BI[BII)I +HSPLorg/signal/core/util/Base64Tools;->encode3to4([BII[BII)[B +HSPLorg/signal/core/util/Base64Tools;->encodeBytes([BII)Ljava/lang/String; +HSPLorg/signal/core/util/Base64Tools;->encodeBytes([BIII)Ljava/lang/String; +HSPLorg/signal/core/util/Base64Tools;->encodeBytesToBytes([BIII)[B +HSPLorg/signal/core/util/Base64Tools;->getAlphabet(I)[B +HSPLorg/signal/core/util/Base64Tools;->getDecodabet(I)[B HSPLorg/signal/core/util/Bitmask;->checkArgument(ZLjava/lang/String;)V HSPLorg/signal/core/util/Bitmask;->read(JII)J HSPLorg/signal/core/util/Bitmask;->twoToThe(J)J @@ -18486,6 +19049,8 @@ HSPLorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSy HSPLorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSyntheticApiModelOutline1;->m(Landroid/icu/text/BreakIterator;)I HSPLorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSyntheticApiModelOutline3;->m(Landroid/icu/text/BreakIterator;Ljava/lang/String;)V HSPLorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSyntheticApiModelOutline4;->m()Landroid/icu/text/BreakIterator; +HSPLorg/signal/core/util/ByteSize;->(J)V +HSPLorg/signal/core/util/ByteSize;->getInWholeBytes()J HSPLorg/signal/core/util/CharacterIterable$AndroidIcuBreakIterator;->(Ljava/lang/String;)V HSPLorg/signal/core/util/CharacterIterable$AndroidIcuBreakIterator;->first()I HSPLorg/signal/core/util/CharacterIterable$AndroidIcuBreakIterator;->isDone(I)Z @@ -18497,7 +19062,10 @@ HSPLorg/signal/core/util/CharacterIterable$CharacterIterator;->next()Ljava/lang/ HSPLorg/signal/core/util/CharacterIterable;->-$$Nest$fgetstring(Lorg/signal/core/util/CharacterIterable;)Ljava/lang/String; HSPLorg/signal/core/util/CharacterIterable;->(Ljava/lang/String;)V HSPLorg/signal/core/util/CharacterIterable;->iterator()Ljava/util/Iterator; +HSPLorg/signal/core/util/CollectionsExtensionsKt;->flatten(Ljava/util/List;)Ljava/util/Map; HSPLorg/signal/core/util/Conversions;->longTo4ByteArray([BIJ)I +HSPLorg/signal/core/util/CryptoUtil;->hmacSha256([B[B)[B +HSPLorg/signal/core/util/CursorExtensionsKt;->isNull(Landroid/database/Cursor;Ljava/lang/String;)Z HSPLorg/signal/core/util/CursorExtensionsKt;->optionalBlob(Landroid/database/Cursor;Ljava/lang/String;)Lj$/util/Optional; HSPLorg/signal/core/util/CursorExtensionsKt;->optionalBoolean(Landroid/database/Cursor;Ljava/lang/String;)Lj$/util/Optional; HSPLorg/signal/core/util/CursorExtensionsKt;->optionalInt(Landroid/database/Cursor;Ljava/lang/String;)Lj$/util/Optional; @@ -18507,6 +19075,7 @@ HSPLorg/signal/core/util/CursorExtensionsKt;->readToSingleInt$default(Landroid/d HSPLorg/signal/core/util/CursorExtensionsKt;->readToSingleInt(Landroid/database/Cursor;I)I HSPLorg/signal/core/util/CursorExtensionsKt;->readToSingleLong(Landroid/database/Cursor;J)J HSPLorg/signal/core/util/CursorExtensionsKt;->readToSingleObject(Landroid/database/Cursor;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +HSPLorg/signal/core/util/CursorExtensionsKt;->requireBlob(Landroid/database/Cursor;Ljava/lang/String;)[B HSPLorg/signal/core/util/CursorExtensionsKt;->requireBoolean(Landroid/database/Cursor;Ljava/lang/String;)Z HSPLorg/signal/core/util/CursorExtensionsKt;->requireInt(Landroid/database/Cursor;Ljava/lang/String;)I HSPLorg/signal/core/util/CursorExtensionsKt;->requireLong(Landroid/database/Cursor;Ljava/lang/String;)J @@ -18517,11 +19086,11 @@ HSPLorg/signal/core/util/CursorUtil;->getBoolean(Landroid/database/Cursor;Ljava/ HSPLorg/signal/core/util/CursorUtil;->getInt(Landroid/database/Cursor;Ljava/lang/String;)Lj$/util/Optional; HSPLorg/signal/core/util/CursorUtil;->getLong(Landroid/database/Cursor;Ljava/lang/String;)Lj$/util/Optional; HSPLorg/signal/core/util/CursorUtil;->getString(Landroid/database/Cursor;Ljava/lang/String;)Lj$/util/Optional; +HSPLorg/signal/core/util/CursorUtil;->isNull(Landroid/database/Cursor;Ljava/lang/String;)Z HSPLorg/signal/core/util/CursorUtil;->requireBlob(Landroid/database/Cursor;Ljava/lang/String;)[B HSPLorg/signal/core/util/CursorUtil;->requireBoolean(Landroid/database/Cursor;Ljava/lang/String;)Z HSPLorg/signal/core/util/CursorUtil;->requireInt(Landroid/database/Cursor;Ljava/lang/String;)I HSPLorg/signal/core/util/CursorUtil;->requireLong(Landroid/database/Cursor;Ljava/lang/String;)J -HSPLorg/signal/core/util/CursorUtil;->requireString(Landroid/database/Cursor;Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/DeleteBuilderPart1;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V HSPLorg/signal/core/util/DeleteBuilderPart1;->run()I HSPLorg/signal/core/util/DeleteBuilderPart1;->where(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/DeleteBuilderPart2; @@ -18541,6 +19110,7 @@ HSPLorg/signal/core/util/DimensionUnit;->(Ljava/lang/String;I)V HSPLorg/signal/core/util/DimensionUnit;->(Ljava/lang/String;ILorg/signal/core/util/DimensionUnit-IA;)V HSPLorg/signal/core/util/DimensionUnitExtensionsKt;->getDp(F)F HSPLorg/signal/core/util/DimensionUnitExtensionsKt;->getDp(I)I +HSPLorg/signal/core/util/DoubleExtensionsKt;->roundedString(DI)Ljava/lang/String; HSPLorg/signal/core/util/ExistsBuilderPart1;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V HSPLorg/signal/core/util/ExistsBuilderPart1;->where(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/ExistsBuilderPart2; HSPLorg/signal/core/util/ExistsBuilderPart1;->where(Ljava/lang/String;[Ljava/lang/String;)Lorg/signal/core/util/ExistsBuilderPart2; @@ -18549,12 +19119,13 @@ HSPLorg/signal/core/util/ExistsBuilderPart2;->run()Z HSPLorg/signal/core/util/Hex;->()V HSPLorg/signal/core/util/Hex;->appendHexChar(Ljava/lang/StringBuffer;I)V HSPLorg/signal/core/util/Hex;->fromStringCondensed(Ljava/lang/String;)[B -HSPLorg/signal/core/util/Hex;->fromStringOrThrow(Ljava/lang/String;)[B HSPLorg/signal/core/util/Hex;->toStringCondensed([B)Ljava/lang/String; HSPLorg/signal/core/util/InsertBuilderPart1;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V HSPLorg/signal/core/util/InsertBuilderPart1;->values([Lkotlin/Pair;)Lorg/signal/core/util/InsertBuilderPart2; HSPLorg/signal/core/util/InsertBuilderPart2;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;Landroid/content/ContentValues;)V +HSPLorg/signal/core/util/InsertBuilderPart2;->run$default(Lorg/signal/core/util/InsertBuilderPart2;IILjava/lang/Object;)J HSPLorg/signal/core/util/InsertBuilderPart2;->run(I)J +HSPLorg/signal/core/util/ListUtil;->chunk(Ljava/util/List;I)Ljava/util/List; HSPLorg/signal/core/util/MapUtil;->mapOrDefault(Ljava/util/Map;Ljava/lang/Object;Lj$/util/function/Function;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/signal/core/util/MemoryTracker$$ExternalSyntheticLambda1;->(Lorg/signal/core/util/MemoryTracker;)V HSPLorg/signal/core/util/MemoryTracker$AppHeapUsage;->(JJJ)V @@ -18563,11 +19134,14 @@ HSPLorg/signal/core/util/MemoryTracker;->()V HSPLorg/signal/core/util/MemoryTracker;->getAppJvmHeapUsage()Lorg/signal/core/util/MemoryTracker$AppHeapUsage; HSPLorg/signal/core/util/MemoryTracker;->start()V HSPLorg/signal/core/util/OptionalExtensionsKt;->or(Lj$/util/Optional;Lj$/util/Optional;)Lj$/util/Optional; +HSPLorg/signal/core/util/OptionalExtensionsKt;->orNull(Lj$/util/Optional;)Ljava/lang/Object; +HSPLorg/signal/core/util/OptionalExtensionsKt;->toOptional(Ljava/lang/Object;)Lj$/util/Optional; HSPLorg/signal/core/util/PendingIntentFlags;->()V HSPLorg/signal/core/util/PendingIntentFlags;->()V HSPLorg/signal/core/util/PendingIntentFlags;->immutable()I HSPLorg/signal/core/util/PendingIntentFlags;->mutable()I HSPLorg/signal/core/util/PendingIntentFlags;->updateCurrent()I +HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->count(Landroidx/sqlite/db/SupportSQLiteDatabase;)Lorg/signal/core/util/SelectBuilderPart1; HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->delete(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)Lorg/signal/core/util/DeleteBuilderPart1; HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->exists(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)Lorg/signal/core/util/ExistsBuilderPart1; HSPLorg/signal/core/util/SQLiteDatabaseExtensionsKt;->insertInto(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)Lorg/signal/core/util/InsertBuilderPart1; @@ -18579,12 +19153,14 @@ HSPLorg/signal/core/util/SelectBuilderPart1;->from(Ljava/lang/String;)Lorg/signa HSPLorg/signal/core/util/SelectBuilderPart2;->(Landroidx/sqlite/db/SupportSQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/SelectBuilderPart2;->run()Landroid/database/Cursor; HSPLorg/signal/core/util/SelectBuilderPart2;->where(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/SelectBuilderPart3; +HSPLorg/signal/core/util/SelectBuilderPart2;->where(Ljava/lang/String;[Ljava/lang/String;)Lorg/signal/core/util/SelectBuilderPart3; HSPLorg/signal/core/util/SelectBuilderPart3;->(Landroidx/sqlite/db/SupportSQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V HSPLorg/signal/core/util/SelectBuilderPart3;->limit(I)Lorg/signal/core/util/SelectBuilderPart4b; HSPLorg/signal/core/util/SelectBuilderPart3;->orderBy(Ljava/lang/String;)Lorg/signal/core/util/SelectBuilderPart4a; HSPLorg/signal/core/util/SelectBuilderPart3;->run()Landroid/database/Cursor; HSPLorg/signal/core/util/SelectBuilderPart4a;->(Landroidx/sqlite/db/SupportSQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/SelectBuilderPart4a;->limit(I)Lorg/signal/core/util/SelectBuilderPart5; +HSPLorg/signal/core/util/SelectBuilderPart4a;->limit(Ljava/lang/String;)Lorg/signal/core/util/SelectBuilderPart5; HSPLorg/signal/core/util/SelectBuilderPart4a;->run()Landroid/database/Cursor; HSPLorg/signal/core/util/SelectBuilderPart4b;->(Landroidx/sqlite/db/SupportSQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/SelectBuilderPart4b;->orderBy(Ljava/lang/String;)Lorg/signal/core/util/SelectBuilderPart5; @@ -18594,44 +19170,91 @@ HSPLorg/signal/core/util/SetUtil;->newHashSet([Ljava/lang/Object;)Ljava/util/Has HSPLorg/signal/core/util/ShakeDetector$SamplePool;->()V HSPLorg/signal/core/util/ShakeDetector$SampleQueue;->()V HSPLorg/signal/core/util/ShakeDetector;->(Lorg/signal/core/util/ShakeDetector$Listener;)V +HSPLorg/signal/core/util/SqlUtil$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/signal/core/util/SqlUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/signal/core/util/SqlUtil$CollectionOperator;->$values()[Lorg/signal/core/util/SqlUtil$CollectionOperator; +HSPLorg/signal/core/util/SqlUtil$CollectionOperator;->()V +HSPLorg/signal/core/util/SqlUtil$CollectionOperator;->(Ljava/lang/String;ILjava/lang/String;)V +HSPLorg/signal/core/util/SqlUtil$CollectionOperator;->getSql()Ljava/lang/String; HSPLorg/signal/core/util/SqlUtil$Query;->(Ljava/lang/String;[Ljava/lang/String;)V HSPLorg/signal/core/util/SqlUtil$Query;->getWhere()Ljava/lang/String; HSPLorg/signal/core/util/SqlUtil$Query;->getWhereArgs()[Ljava/lang/String; +HSPLorg/signal/core/util/SqlUtil$buildCustomCollectionQuery$1;->(Ljava/lang/String;)V +HSPLorg/signal/core/util/SqlUtil$buildCustomCollectionQuery$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/signal/core/util/SqlUtil$buildCustomCollectionQuery$1;->invoke(Ljava/util/List;)Lorg/signal/core/util/SqlUtil$Query; +HSPLorg/signal/core/util/SqlUtil;->$r8$lambda$zW4YXJaIlJT3vPgMCfyiQ3eZdqc(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; HSPLorg/signal/core/util/SqlUtil;->()V HSPLorg/signal/core/util/SqlUtil;->()V +HSPLorg/signal/core/util/SqlUtil;->access$buildSingleCustomCollectionQuery(Lorg/signal/core/util/SqlUtil;Ljava/lang/String;Ljava/util/List;)Lorg/signal/core/util/SqlUtil$Query; +HSPLorg/signal/core/util/SqlUtil;->appendArg([Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String; HSPLorg/signal/core/util/SqlUtil;->buildArgs(J)[Ljava/lang/String; HSPLorg/signal/core/util/SqlUtil;->buildArgs([Ljava/lang/Object;)[Ljava/lang/String; +HSPLorg/signal/core/util/SqlUtil;->buildCollectionQuery$default(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;ILorg/signal/core/util/SqlUtil$CollectionOperator;ILjava/lang/Object;)Ljava/util/List; +HSPLorg/signal/core/util/SqlUtil;->buildCollectionQuery(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;ILorg/signal/core/util/SqlUtil$CollectionOperator;)Ljava/util/List; +HSPLorg/signal/core/util/SqlUtil;->buildCustomCollectionQuery$lambda$11(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; +HSPLorg/signal/core/util/SqlUtil;->buildCustomCollectionQuery(Ljava/lang/String;Ljava/util/List;)Ljava/util/List; +HSPLorg/signal/core/util/SqlUtil;->buildCustomCollectionQuery(Ljava/lang/String;Ljava/util/List;I)Ljava/util/List; HSPLorg/signal/core/util/SqlUtil;->buildQuery(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; +HSPLorg/signal/core/util/SqlUtil;->buildSingleCollectionQuery$default(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;Lorg/signal/core/util/SqlUtil$CollectionOperator;ILjava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; +HSPLorg/signal/core/util/SqlUtil;->buildSingleCollectionQuery(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;Lorg/signal/core/util/SqlUtil$CollectionOperator;)Lorg/signal/core/util/SqlUtil$Query; +HSPLorg/signal/core/util/SqlUtil;->buildSingleCustomCollectionQuery(Ljava/lang/String;Ljava/util/List;)Lorg/signal/core/util/SqlUtil$Query; HSPLorg/signal/core/util/SqlUtil;->buildTrueUpdateQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/content/ContentValues;)Lorg/signal/core/util/SqlUtil$Query; HSPLorg/signal/core/util/SqlUtil;->tableExists(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)Z -HSPLorg/signal/core/util/Stopwatch$Split;->(JLjava/lang/String;)V +HSPLorg/signal/core/util/Stopwatch$Split;->(JJLjava/lang/String;)V +HSPLorg/signal/core/util/Stopwatch$Split;->displayString(I)Ljava/lang/String; +HSPLorg/signal/core/util/Stopwatch$Split;->getNanoTime()J +HSPLorg/signal/core/util/Stopwatch$stopAndGetLogString$splitString$1;->(Lorg/signal/core/util/Stopwatch;)V +HSPLorg/signal/core/util/Stopwatch$stopAndGetLogString$splitString$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/signal/core/util/Stopwatch$stopAndGetLogString$splitString$1;->invoke(Lorg/signal/core/util/Stopwatch$Split;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/Stopwatch;->(Ljava/lang/String;)V +HSPLorg/signal/core/util/Stopwatch;->(Ljava/lang/String;I)V +HSPLorg/signal/core/util/Stopwatch;->(Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/core/util/Stopwatch;->access$getDecimalPlaces$p(Lorg/signal/core/util/Stopwatch;)I HSPLorg/signal/core/util/Stopwatch;->split(Ljava/lang/String;)V HSPLorg/signal/core/util/Stopwatch;->stop(Ljava/lang/String;)V -HSPLorg/signal/core/util/StreamUtil;->()V -HSPLorg/signal/core/util/StreamUtil;->close(Ljava/io/Closeable;)V -HSPLorg/signal/core/util/StreamUtil;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;)J +HSPLorg/signal/core/util/Stopwatch;->stopAndGetLogString()Ljava/lang/String; +HSPLorg/signal/core/util/StringExtensionsKt;->nullIfBlank(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/StringExtensionsKt;->toSingleLine(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/StringUtil;->()V +HSPLorg/signal/core/util/StringUtil;->forceLtr(Ljava/lang/CharSequence;)Ljava/lang/String; HSPLorg/signal/core/util/StringUtil;->isEmpty(Ljava/lang/String;)Z HSPLorg/signal/core/util/StringUtil;->isolateBidi(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/StringUtil;->replace(Ljava/lang/CharSequence;CLjava/lang/String;)Ljava/lang/CharSequence; +HSPLorg/signal/core/util/StringUtil;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/StringUtil;->trimToFit(Ljava/lang/String;I)Ljava/lang/String; HSPLorg/signal/core/util/ThreadUtil;->()V HSPLorg/signal/core/util/ThreadUtil;->assertMainThread()V HSPLorg/signal/core/util/ThreadUtil;->assertNotMainThread()V HSPLorg/signal/core/util/ThreadUtil;->getHandler()Landroid/os/Handler; HSPLorg/signal/core/util/ThreadUtil;->isMainThread()Z +HSPLorg/signal/core/util/ThreadUtil;->postToMain(Ljava/lang/Runnable;)V HSPLorg/signal/core/util/ThreadUtil;->runOnMain(Ljava/lang/Runnable;)V HSPLorg/signal/core/util/ThreadUtil;->sleep(J)V +HSPLorg/signal/core/util/ToolbarExtensionsKt;->setActionItemTint(Landroidx/appcompat/widget/Toolbar;I)V HSPLorg/signal/core/util/UpdateBuilderPart1;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V HSPLorg/signal/core/util/UpdateBuilderPart1;->values(Landroid/content/ContentValues;)Lorg/signal/core/util/UpdateBuilderPart2; HSPLorg/signal/core/util/UpdateBuilderPart1;->values([Lkotlin/Pair;)Lorg/signal/core/util/UpdateBuilderPart2; HSPLorg/signal/core/util/UpdateBuilderPart2;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;Landroid/content/ContentValues;)V +HSPLorg/signal/core/util/UpdateBuilderPart2;->run$default(Lorg/signal/core/util/UpdateBuilderPart2;IILjava/lang/Object;)I +HSPLorg/signal/core/util/UpdateBuilderPart2;->run(I)I HSPLorg/signal/core/util/UpdateBuilderPart2;->where(Ljava/lang/String;[Ljava/lang/Object;)Lorg/signal/core/util/UpdateBuilderPart3; HSPLorg/signal/core/util/UpdateBuilderPart3;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)V HSPLorg/signal/core/util/UpdateBuilderPart3;->run$default(Lorg/signal/core/util/UpdateBuilderPart3;IILjava/lang/Object;)I HSPLorg/signal/core/util/UpdateBuilderPart3;->run(I)I +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread$$ExternalSyntheticLambda0;->(Lorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;)V +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread$$ExternalSyntheticLambda0;->run()V +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;->$r8$lambda$CzqZ8g-EFmZi6oXLrPkYehulx_E(Lorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;)V +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;->(JLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;->(JLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;->end()V +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;->getMainThreadDump()Ljava/lang/String; +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;->run()V +HSPLorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;->uiRunnable$lambda$0(Lorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread;)V +HSPLorg/signal/core/util/concurrent/AnrDetector;->()V +HSPLorg/signal/core/util/concurrent/AnrDetector;->()V +HSPLorg/signal/core/util/concurrent/AnrDetector;->access$getDateFormat$p()Ljava/text/SimpleDateFormat; +HSPLorg/signal/core/util/concurrent/AnrDetector;->access$getTAG$p()Ljava/lang/String; +HSPLorg/signal/core/util/concurrent/AnrDetector;->start(JLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V HSPLorg/signal/core/util/concurrent/DeadlockDetector$$ExternalSyntheticLambda0;->(Lorg/signal/core/util/concurrent/DeadlockDetector;)V HSPLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->()V HSPLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -18646,11 +19269,26 @@ HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->add(Lio/reactivex/rxja HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->bindTo(Landroidx/lifecycle/Lifecycle;)Lorg/signal/core/util/concurrent/LifecycleDisposable; HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->bindTo(Landroidx/lifecycle/LifecycleOwner;)Lorg/signal/core/util/concurrent/LifecycleDisposable; HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->plusAssign(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposableKt;->addTo(Lio/reactivex/rxjava3/disposables/Disposable;Lorg/signal/core/util/concurrent/LifecycleDisposable;)Lio/reactivex/rxjava3/disposables/Disposable; +HSPLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->subscribe(Lio/reactivex/rxjava3/core/MaybeEmitter;)V +HSPLorg/signal/core/util/concurrent/MaybeCompat;->$r8$lambda$aPKBr0JUhvb1CVWSMT6CNAHU584(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V +HSPLorg/signal/core/util/concurrent/MaybeCompat;->()V +HSPLorg/signal/core/util/concurrent/MaybeCompat;->()V +HSPLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable$lambda$0(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V +HSPLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable(Lkotlin/jvm/functions/Function0;)Lio/reactivex/rxjava3/core/Maybe; +HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->(Ljava/lang/Object;)V +HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->invoke(Ljava/lang/Object;)V +HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$2;->(Ljava/lang/Object;)V +HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$3;->(Ljava/lang/Object;)V HSPLorg/signal/core/util/concurrent/RxExtensions;->safeBlockingGet(Lio/reactivex/rxjava3/core/Single;)Ljava/lang/Object; +HSPLorg/signal/core/util/concurrent/RxExtensions;->subscribeWithSubject(Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/subjects/Subject;Lio/reactivex/rxjava3/disposables/CompositeDisposable;)Lio/reactivex/rxjava3/subjects/Subject; HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0;->()V HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda1;->(Ljava/lang/String;I)V HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; @@ -18695,30 +19333,32 @@ HSPLorg/signal/core/util/logging/AndroidLogger;->d(Ljava/lang/String;Ljava/lang/ HSPLorg/signal/core/util/logging/AndroidLogger;->flush()V HSPLorg/signal/core/util/logging/AndroidLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/AndroidLogger;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V -HSPLorg/signal/core/util/logging/CompoundLogger;->([Lorg/signal/core/util/logging/Log$Logger;)V -HSPLorg/signal/core/util/logging/CompoundLogger;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +HSPLorg/signal/core/util/logging/CompoundLogger;->(Ljava/util/List;)V +HSPLorg/signal/core/util/logging/CompoundLogger;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/CompoundLogger;->flush()V -HSPLorg/signal/core/util/logging/CompoundLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V HSPLorg/signal/core/util/logging/CompoundLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V -HSPLorg/signal/core/util/logging/CompoundLogger;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +HSPLorg/signal/core/util/logging/CompoundLogger;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/Log$Logger;->()V -HSPLorg/signal/core/util/logging/Log$Logger;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V -HSPLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V -HSPLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;Z)V -HSPLorg/signal/core/util/logging/Log$Logger;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V HSPLorg/signal/core/util/logging/Log;->()V +HSPLorg/signal/core/util/logging/Log;->()V HSPLorg/signal/core/util/logging/Log;->blockUntilAllWritesFinished()V HSPLorg/signal/core/util/logging/Log;->d(Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/logging/Log;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +HSPLorg/signal/core/util/logging/Log;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/Log;->i(Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/logging/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +HSPLorg/signal/core/util/logging/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/Log;->i(Ljava/lang/String;Ljava/lang/String;Z)V HSPLorg/signal/core/util/logging/Log;->initialize(Lorg/signal/core/util/logging/Log$InternalCheck;[Lorg/signal/core/util/logging/Log$Logger;)V HSPLorg/signal/core/util/logging/Log;->tag(Ljava/lang/Class;)Ljava/lang/String; HSPLorg/signal/core/util/logging/Log;->w(Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/logging/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +HSPLorg/signal/core/util/logging/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/Log;->w(Ljava/lang/String;Ljava/lang/Throwable;)V HSPLorg/signal/core/util/logging/NoopLogger;->()V +HSPLorg/signal/core/util/logging/NoopLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V +HSPLorg/signal/core/util/logging/Scrubber$identifierHmacKeyProvider$1;->()V +HSPLorg/signal/core/util/logging/Scrubber$identifierHmacKeyProvider$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubCallLinkKeys$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubCallLinkKeys$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubDomains$1;->()V @@ -18727,6 +19367,10 @@ HSPLorg/signal/core/util/logging/Scrubber$scrubDomains$1;->invoke(Ljava/lang/Obj HSPLorg/signal/core/util/logging/Scrubber$scrubDomains$1;->invoke(Ljava/util/regex/Matcher;Ljava/lang/StringBuilder;)V HSPLorg/signal/core/util/logging/Scrubber$scrubE164$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubE164$1;->()V +HSPLorg/signal/core/util/logging/Scrubber$scrubE164$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/signal/core/util/logging/Scrubber$scrubE164$1;->invoke(Ljava/util/regex/Matcher;Ljava/lang/StringBuilder;)V +HSPLorg/signal/core/util/logging/Scrubber$scrubE164Zero$1;->()V +HSPLorg/signal/core/util/logging/Scrubber$scrubE164Zero$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubEmail$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubEmail$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubGroupsV1$1;->()V @@ -18737,6 +19381,10 @@ HSPLorg/signal/core/util/logging/Scrubber$scrubIpv4$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubIpv4$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubIpv6$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubIpv6$1;->()V +HSPLorg/signal/core/util/logging/Scrubber$scrubPnis$1;->()V +HSPLorg/signal/core/util/logging/Scrubber$scrubPnis$1;->()V +HSPLorg/signal/core/util/logging/Scrubber$scrubPnis$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/signal/core/util/logging/Scrubber$scrubPnis$1;->invoke(Ljava/util/regex/Matcher;Ljava/lang/StringBuilder;)V HSPLorg/signal/core/util/logging/Scrubber$scrubUuids$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubUuids$1;->()V HSPLorg/signal/core/util/logging/Scrubber$scrubUuids$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -18744,102 +19392,98 @@ HSPLorg/signal/core/util/logging/Scrubber$scrubUuids$1;->invoke(Ljava/util/regex HSPLorg/signal/core/util/logging/Scrubber;->()V HSPLorg/signal/core/util/logging/Scrubber;->()V HSPLorg/signal/core/util/logging/Scrubber;->access$getTOP_100_TLDS$p()Ljava/util/Set; +HSPLorg/signal/core/util/logging/Scrubber;->access$hash(Lorg/signal/core/util/logging/Scrubber;Ljava/lang/String;)Ljava/lang/String; +HSPLorg/signal/core/util/logging/Scrubber;->hash(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/logging/Scrubber;->scrub(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrub(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Lkotlin/jvm/functions/Function2;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubCallLinkKeys(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubDomains(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubE164(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +HSPLorg/signal/core/util/logging/Scrubber;->scrubE164Zero(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubEmail(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubGroupsV1(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubGroupsV2(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubIpv4(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubIpv6(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +HSPLorg/signal/core/util/logging/Scrubber;->scrubPnis(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubUuids(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -HSPLorg/signal/core/util/tracing/TraceProtos$1;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation$Builder;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation$Builder;->(Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation$Builder-IA;)V -HSPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;->-$$Nest$msetStringValue(Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;->setName(Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;->setStringValue(Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder;->(Lorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder-IA;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder;->setSynchronizationMarker(Lcom/google/protobuf/ByteString;)Lorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder;->setTimestamp(J)Lorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder;->setTrackDescriptor(Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder;)Lorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder;->setTrackEvent(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder;)Lorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder;->setTrustedPacketSequenceId(I)Lorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->-$$Nest$msetSynchronizationMarker(Lorg/signal/core/util/tracing/TraceProtos$TracePacket;Lcom/google/protobuf/ByteString;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->-$$Nest$msetTimestamp(Lorg/signal/core/util/tracing/TraceProtos$TracePacket;J)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->-$$Nest$msetTrackDescriptor(Lorg/signal/core/util/tracing/TraceProtos$TracePacket;Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->-$$Nest$msetTrackEvent(Lorg/signal/core/util/tracing/TraceProtos$TracePacket;Lorg/signal/core/util/tracing/TraceProtos$TrackEvent;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->-$$Nest$msetTrustedPacketSequenceId(Lorg/signal/core/util/tracing/TraceProtos$TracePacket;I)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->-$$Nest$sfgetDEFAULT_INSTANCE()Lorg/signal/core/util/tracing/TraceProtos$TracePacket; -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->setSynchronizationMarker(Lcom/google/protobuf/ByteString;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->setTimestamp(J)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->setTrackDescriptor(Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->setTrackEvent(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TracePacket;->setTrustedPacketSequenceId(I)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder;->(Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder-IA;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder;->setName(Ljava/lang/String;)Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder;->setUuid(J)Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->-$$Nest$msetName(Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->-$$Nest$msetUuid(Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;J)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->-$$Nest$sfgetDEFAULT_INSTANCE()Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->dynamicMethod(Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->newBuilder()Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->setName(Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackDescriptor;->setUuid(J)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder;->(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder-IA;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder;->setName(Ljava/lang/String;)Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder;->setTrackUuid(J)Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type$1;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type$TypeVerifier;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type$TypeVerifier;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type;->$values()[Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type;->(Ljava/lang/String;II)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type;->getNumber()I -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type;->internalGetVerifier()Lcom/google/protobuf/Internal$EnumVerifier; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->-$$Nest$maddDebugAnnotations(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent;Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->-$$Nest$msetName(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent;Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->-$$Nest$msetTrackUuid(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent;J)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->-$$Nest$msetType(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent;Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->-$$Nest$sfgetDEFAULT_INSTANCE()Lorg/signal/core/util/tracing/TraceProtos$TrackEvent; -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->ensureDebugAnnotationsIsMutable()V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->setName(Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->setTrackUuid(J)V -HSPLorg/signal/core/util/tracing/TraceProtos$TrackEvent;->setType(Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type;)V +HSPLorg/signal/core/util/logging/Scrubber;->setIdentifierHmacKeyProvider(Lkotlin/jvm/functions/Function0;)V +HSPLorg/signal/core/util/stream/TruncatingInputStream$$ExternalSyntheticBackport0;->m(J)I +HSPLorg/signal/core/util/tracing/DebugAnnotation$Builder;->()V +HSPLorg/signal/core/util/tracing/DebugAnnotation$Builder;->name(Ljava/lang/String;)Lorg/signal/core/util/tracing/DebugAnnotation$Builder; +HSPLorg/signal/core/util/tracing/DebugAnnotation$Builder;->string_value(Ljava/lang/String;)Lorg/signal/core/util/tracing/DebugAnnotation$Builder; +HSPLorg/signal/core/util/tracing/DebugAnnotation$Companion$ADAPTER$1;->(Lcom/squareup/wire/FieldEncoding;Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;)V +HSPLorg/signal/core/util/tracing/DebugAnnotation$Companion;->()V +HSPLorg/signal/core/util/tracing/DebugAnnotation$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/core/util/tracing/DebugAnnotation;->()V +HSPLorg/signal/core/util/tracing/DebugAnnotation;->(Ljava/lang/Long;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/Long;Lorg/signal/core/util/tracing/DebugAnnotation$NestedValue;Lokio/ByteString;)V +HSPLorg/signal/core/util/tracing/DebugAnnotation;->equals(Ljava/lang/Object;)Z +HSPLorg/signal/core/util/tracing/TracePacket$Builder;->()V +HSPLorg/signal/core/util/tracing/TracePacket$Builder;->synchronization_marker(Lokio/ByteString;)Lorg/signal/core/util/tracing/TracePacket$Builder; +HSPLorg/signal/core/util/tracing/TracePacket$Builder;->timestamp(Ljava/lang/Long;)Lorg/signal/core/util/tracing/TracePacket$Builder; +HSPLorg/signal/core/util/tracing/TracePacket$Builder;->track_descriptor(Lorg/signal/core/util/tracing/TrackDescriptor;)Lorg/signal/core/util/tracing/TracePacket$Builder; +HSPLorg/signal/core/util/tracing/TracePacket$Builder;->track_event(Lorg/signal/core/util/tracing/TrackEvent;)Lorg/signal/core/util/tracing/TracePacket$Builder; +HSPLorg/signal/core/util/tracing/TracePacket$Builder;->trusted_packet_sequence_id(Ljava/lang/Integer;)Lorg/signal/core/util/tracing/TracePacket$Builder; +HSPLorg/signal/core/util/tracing/TracePacket$Companion$ADAPTER$1;->(Lcom/squareup/wire/FieldEncoding;Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;)V +HSPLorg/signal/core/util/tracing/TracePacket$Companion;->()V +HSPLorg/signal/core/util/tracing/TracePacket$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/core/util/tracing/TracePacket;->()V +HSPLorg/signal/core/util/tracing/TracePacket;->(Ljava/lang/Long;Ljava/lang/Integer;Lorg/signal/core/util/tracing/TrackEvent;Lorg/signal/core/util/tracing/TrackDescriptor;Lokio/ByteString;Ljava/lang/Integer;Lokio/ByteString;)V HSPLorg/signal/core/util/tracing/Tracer$$ExternalSyntheticLambda0;->()V HSPLorg/signal/core/util/tracing/Tracer$$ExternalSyntheticLambda0;->getTimeNanos()J HSPLorg/signal/core/util/tracing/Tracer;->()V HSPLorg/signal/core/util/tracing/Tracer;->()V -HSPLorg/signal/core/util/tracing/Tracer;->addPacket(Lorg/signal/core/util/tracing/TraceProtos$TracePacket;)V +HSPLorg/signal/core/util/tracing/Tracer;->addPacket(Lorg/signal/core/util/tracing/TracePacket;)V +HSPLorg/signal/core/util/tracing/Tracer;->debugAnnotation(Ljava/lang/String;Ljava/lang/String;)Lorg/signal/core/util/tracing/DebugAnnotation; +HSPLorg/signal/core/util/tracing/Tracer;->end(Ljava/lang/String;)V HSPLorg/signal/core/util/tracing/Tracer;->end(Ljava/lang/String;J)V -HSPLorg/signal/core/util/tracing/Tracer;->forMethodEnd(Ljava/lang/String;JJ)Lorg/signal/core/util/tracing/TraceProtos$TracePacket; -HSPLorg/signal/core/util/tracing/Tracer;->forSynchronization(J)Lorg/signal/core/util/tracing/TraceProtos$TracePacket; -HSPLorg/signal/core/util/tracing/Tracer;->forTrack(JLjava/lang/String;)Lorg/signal/core/util/tracing/TraceProtos$TracePacket; -HSPLorg/signal/core/util/tracing/Tracer;->forTrackId(J)Lorg/signal/core/util/tracing/TraceProtos$TracePacket; +HSPLorg/signal/core/util/tracing/Tracer;->forSynchronization(J)Lorg/signal/core/util/tracing/TracePacket; +HSPLorg/signal/core/util/tracing/Tracer;->forTrack(JLjava/lang/String;)Lorg/signal/core/util/tracing/TracePacket; +HSPLorg/signal/core/util/tracing/Tracer;->forTrackId(J)Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/Tracer;->getInstance()Lorg/signal/core/util/tracing/Tracer; HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;JLjava/util/Map;)V +HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;Ljava/util/Map;)V HSPLorg/signal/core/util/tracing/Tracer;->toByteArray(Ljava/util/UUID;)[B +HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->()V +HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->build()Lorg/signal/core/util/tracing/TrackDescriptor; +HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->name(Ljava/lang/String;)Lorg/signal/core/util/tracing/TrackDescriptor$Builder; +HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->uuid(Ljava/lang/Long;)Lorg/signal/core/util/tracing/TrackDescriptor$Builder; +HSPLorg/signal/core/util/tracing/TrackDescriptor$Companion$ADAPTER$1;->(Lcom/squareup/wire/FieldEncoding;Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;)V +HSPLorg/signal/core/util/tracing/TrackDescriptor$Companion;->()V +HSPLorg/signal/core/util/tracing/TrackDescriptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/core/util/tracing/TrackDescriptor;->()V +HSPLorg/signal/core/util/tracing/TrackDescriptor;->(Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Lorg/signal/core/util/tracing/ThreadDescriptor;Lorg/signal/core/util/tracing/CounterDescriptor;Lokio/ByteString;)V +HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->()V +HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->debug_annotations(Ljava/util/List;)Lorg/signal/core/util/tracing/TrackEvent$Builder; +HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->name(Ljava/lang/String;)Lorg/signal/core/util/tracing/TrackEvent$Builder; +HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->track_uuid(Ljava/lang/Long;)Lorg/signal/core/util/tracing/TrackEvent$Builder; +HSPLorg/signal/core/util/tracing/TrackEvent$Builder;->type(Lorg/signal/core/util/tracing/TrackEvent$Type;)Lorg/signal/core/util/tracing/TrackEvent$Builder; +HSPLorg/signal/core/util/tracing/TrackEvent$Companion$ADAPTER$1;->(Lcom/squareup/wire/FieldEncoding;Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;)V +HSPLorg/signal/core/util/tracing/TrackEvent$Companion;->()V +HSPLorg/signal/core/util/tracing/TrackEvent$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/core/util/tracing/TrackEvent$Type$Companion$ADAPTER$1;->(Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;Lorg/signal/core/util/tracing/TrackEvent$Type;)V +HSPLorg/signal/core/util/tracing/TrackEvent$Type$Companion;->()V +HSPLorg/signal/core/util/tracing/TrackEvent$Type$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/core/util/tracing/TrackEvent$Type;->$values()[Lorg/signal/core/util/tracing/TrackEvent$Type; +HSPLorg/signal/core/util/tracing/TrackEvent$Type;->()V +HSPLorg/signal/core/util/tracing/TrackEvent$Type;->(Ljava/lang/String;II)V +HSPLorg/signal/core/util/tracing/TrackEvent;->()V +HSPLorg/signal/core/util/tracing/TrackEvent;->(Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/Long;Ljava/lang/String;Lorg/signal/core/util/tracing/TrackEvent$Type;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Lokio/ByteString;)V HSPLorg/signal/glide/Log$Provider$1;->()V HSPLorg/signal/glide/Log$Provider;->()V HSPLorg/signal/glide/SignalGlideCodecs;->()V HSPLorg/signal/glide/SignalGlideCodecs;->setLogProvider(Lorg/signal/glide/Log$Provider;)V +HSPLorg/signal/glide/webp/WebpInputStreamResourceDecoder$Companion;->()V +HSPLorg/signal/glide/webp/WebpInputStreamResourceDecoder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/glide/webp/WebpInputStreamResourceDecoder;->()V +HSPLorg/signal/glide/webp/WebpInputStreamResourceDecoder;->(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)V +HSPLorg/signal/glide/webp/WebpLibraryGlideModule$Companion;->()V +HSPLorg/signal/glide/webp/WebpLibraryGlideModule$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/signal/glide/webp/WebpLibraryGlideModule;->()V +HSPLorg/signal/glide/webp/WebpLibraryGlideModule;->()V +HSPLorg/signal/glide/webp/WebpLibraryGlideModule;->registerComponents(Landroid/content/Context;Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/Registry;)V HSPLorg/signal/libsignal/internal/Native;->()V HSPLorg/signal/libsignal/internal/Native;->loadLibrary()V HSPLorg/signal/libsignal/internal/NativeHandleGuard;->(Lorg/signal/libsignal/internal/NativeHandleGuard$Owner;)V @@ -18862,13 +19506,13 @@ HSPLorg/signal/libsignal/protocol/ServiceId;->getRawUUID()Ljava/util/UUID; HSPLorg/signal/libsignal/protocol/ServiceId;->hashCode()I HSPLorg/signal/libsignal/protocol/ServiceId;->parseFromFixedWidthBinary([B)Lorg/signal/libsignal/protocol/ServiceId; HSPLorg/signal/libsignal/protocol/ServiceId;->parseFromString(Ljava/lang/String;)Lorg/signal/libsignal/protocol/ServiceId; -HSPLorg/signal/libsignal/protocol/ServiceId;->toServiceIdFixedWidthBinary()[B HSPLorg/signal/libsignal/protocol/ServiceId;->toServiceIdString()Ljava/lang/String; HSPLorg/signal/libsignal/protocol/ServiceId;->uuidFromBytes(Ljava/nio/ByteBuffer;)Ljava/util/UUID; HSPLorg/signal/libsignal/protocol/SignalProtocolAddress;->(Ljava/lang/String;I)V HSPLorg/signal/libsignal/protocol/SignalProtocolAddress;->finalize()V HSPLorg/signal/libsignal/protocol/SignalProtocolAddress;->getDeviceId()I HSPLorg/signal/libsignal/protocol/SignalProtocolAddress;->getName()Ljava/lang/String; +HSPLorg/signal/libsignal/protocol/SignalProtocolAddress;->getServiceId()Lorg/signal/libsignal/protocol/ServiceId; HSPLorg/signal/libsignal/protocol/SignalProtocolAddress;->toString()Ljava/lang/String; HSPLorg/signal/libsignal/protocol/SignalProtocolAddress;->unsafeNativeHandleWithoutGuard()J HSPLorg/signal/libsignal/protocol/ecc/Curve;->calculateSignature(Lorg/signal/libsignal/protocol/ecc/ECPrivateKey;[B)[B @@ -18921,7 +19565,6 @@ HSPLorg/signal/libsignal/protocol/state/SignedPreKeyRecord;->getKeyPair()Lorg/si HSPLorg/signal/libsignal/protocol/state/SignedPreKeyRecord;->getSignature()[B HSPLorg/signal/libsignal/protocol/state/SignedPreKeyRecord;->getTimestamp()J HSPLorg/signal/libsignal/protocol/state/SignedPreKeyRecord;->unsafeNativeHandleWithoutGuard()J -HSPLorg/signal/libsignal/protocol/util/ByteUtil;->trim([BI)[B HSPLorg/signal/libsignal/protocol/util/KeyHelper;->generateRegistrationId(Z)I HSPLorg/signal/libsignal/protocol/util/Medium;->()V HSPLorg/signal/libsignal/protocol/util/Pair;->(Ljava/lang/Object;Ljava/lang/Object;)V @@ -18933,9 +19576,6 @@ HSPLorg/signal/libsignal/zkgroup/internal/ByteArray;->([B)V HSPLorg/signal/libsignal/zkgroup/internal/ByteArray;->serialize()[B HSPLorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;->(Lorg/signal/libsignal/zkgroup/ServerPublicParams;)V HSPLorg/signal/libsignal/zkgroup/profiles/ProfileKey;->([B)V -HSPLorg/signal/libsignal/zkgroup/profiles/ProfileKey;->getProfileKeyVersion(Lorg/signal/libsignal/protocol/ServiceId$Aci;)Lorg/signal/libsignal/zkgroup/profiles/ProfileKeyVersion; -HSPLorg/signal/libsignal/zkgroup/profiles/ProfileKeyVersion;->([B)V -HSPLorg/signal/libsignal/zkgroup/profiles/ProfileKeyVersion;->serialize()Ljava/lang/String; HSPLorg/signal/libsignal/zkgroup/receipts/ClientZkReceiptOperations;->(Lorg/signal/libsignal/zkgroup/ServerPublicParams;)V HSPLorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda1;->(Lorg/signal/paging/BufferedPagingController;I)V HSPLorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda1;->run()V @@ -19010,7 +19650,6 @@ HSPLorg/signal/ringrtc/CallManager$NoOpLoader;->load(Ljava/lang/String;)Z HSPLorg/signal/ringrtc/CallManager;->()V HSPLorg/signal/ringrtc/CallManager;->buildFieldTrialsString(Ljava/util/Map;)Ljava/lang/String; HSPLorg/signal/ringrtc/CallManager;->initialize(Landroid/content/Context;Lorg/signal/ringrtc/Log$Logger;Ljava/util/Map;)V -HSPLorg/signal/ringrtc/Log;->()V HSPLorg/signal/ringrtc/Log;->d(Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/ringrtc/Log;->d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V HSPLorg/signal/ringrtc/Log;->i(Ljava/lang/String;Ljava/lang/String;)V @@ -19018,14 +19657,11 @@ HSPLorg/signal/ringrtc/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Th HSPLorg/signal/ringrtc/Log;->initialize(Lorg/signal/ringrtc/Log$Logger;)V HSPLorg/signal/ringrtc/WebRtcLogger;->()V HSPLorg/signal/ringrtc/WebRtcLogger;->()V -HSPLorg/thoughtcrime/securesms/AppCapabilities;->()V -HSPLorg/thoughtcrime/securesms/AppCapabilities;->()V -HSPLorg/thoughtcrime/securesms/AppCapabilities;->getCapabilities(Z)Lorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities; -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda0;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda10;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda10;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda11;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda11;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda12;->run()V @@ -19035,51 +19671,51 @@ HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda14;->< HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda14;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda15;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda16;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda16;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda17;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda18;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda19;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda19;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda1;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda20;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda20;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda21;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda21;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda21;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda22;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda22;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda23;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda23;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda23;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda24;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda24;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda24;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda25;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda25;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda25;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda26;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda26;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda26;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda27;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda27;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda28;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda28;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda28;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda29;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda29;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda2;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda30;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda30;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda30;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda31;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda31;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda31;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda32;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda32;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda33;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda33;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda34;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda34;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda34;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda35;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda35;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda36;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda36;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda36;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda37;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda37;->run()V @@ -19091,48 +19727,58 @@ HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda3;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda40;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda40;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda41;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda41;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda41;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda42;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda42;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda43;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda43;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda44;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda44;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda44;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda45;->(Lorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Companion;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda45;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda45;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda46;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda46;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda47;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda47;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda48;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda48;->(Lorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Companion;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda48;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda49;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda49;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda4;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda4;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda50;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda50;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda51;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda51;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda51;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda52;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda52;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda52;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda53;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda53;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda53;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda54;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda54;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda54;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda55;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda55;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda56;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda56;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda57;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda57;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda57;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda58;->()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda58;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda58;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda58;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda5;->run()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60;->run()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda61;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda61;->run()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda62;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda63;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda64;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda64;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda65;->()V +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda65;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda66;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda6;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda6;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V @@ -19142,51 +19788,54 @@ HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda8;->ru HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda9;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$1;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$-C9Peb3FgJUzS6NSCmy4GbYf_TI(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$-Us13jCXTd2iOM0Y6BraEZ1Ael8()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$-wHBiLBDa8OJf1k67fcIsduxfzw(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$1vBGBwM2yUq7VyFaTDG10uWDuPc(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$3QS0qrAN7nliLfSi63lQeukrNXw(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$4ypV1Vrlf8TQ_JMcxAfj87rIZ10(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$66l9coKQ_660ADutlicH4GeEP6I(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$6C1lVL7dG_-wAqmFY6Az_Qc88wU()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$6_YWJVxHZo1viw16tbrU7MDbDJg(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$6huj-CNiUCq08incBeS5_VdKXcY(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$6jOUg8y8V8AjFQVDC73SAPGSCaQ(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$74GuULvxFktNDe6rV-VHuIqPVJg(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$7zPKdwtEmk03-CX6PmLruPNQaJU()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$8LAgI8pE7DigK3aYaz2Nk9lcfrc(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$AGPtfUzlxykaeQb2_And4XR5_cI()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$BM9zXNQo3VjL7z8V2jLaBOSk3xM(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$C38kbsmhoy45H7BvcAkMdNLosx8(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$CadNTUODZG2Ef63Ub7A1il6CBD0(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$DG-_eyh8CcGxwAk-palhZ1OT2O0(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$IhFCWemzVRbrwoHW9Ns1V3CCNsI(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$EhXD2bA_njJxvcXV3OctyCch4wQ()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$Euao8MtJ5sFx1Uzh_MqEQ-p_wco()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$GzI-Jr48663DXUZ6ABZXYlOQuSQ(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$HAbYs3d3-yBwCTZTjClId9asWMo(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$JFFOXPLm4n83iu1CrQCwt8Rt1vs(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$MEJyjPRiOVBusJTwA48ER4J3M9A(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$QTEjfsRccjaeTw0od8y5UGofLnw()V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$RIVst1BPIo-PfHpYnrmNZ6n5IC4()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$QoPhFlm0XNA9Pq0eqhx6SpS3Yf8(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$RhzI01M6WPCcwVqZ9bQRQL3rEFk(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$VPmvaBBdqqvvVsnAcF1XPhfNAwg(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$Wc-lTVXx_Cj3iM16JtR6Ju_gG5s(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$WhOpCGkNoE806tpRKQr4cnlCHgs()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$XEBpgM6g0m715OxGVQde5BV4obs()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$YPJbusS4_A6ryTaa4uhXIPJboWA(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$Ziq45AtHm7EBURq_Andgbc-2PQA(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$avxGAGkfv3Ev4XZkSUGrF0ov8Xw(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$bErCCzC-UcRA-wciaIM0aFj_fYc(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$c1TXY-aF44w70IxUmUUKijqVDRQ(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$cQnTp954Na4k9YavnTCgv-5QUVQ()V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$d1IiCBeJCM6wI7G1fz_gXkhXmmY()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$dXZkn_yX1EofCAblV1XQ5RabFZk(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$gsuXSdfhwRFZebO53F99f8IHmAg(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$idYYlPtuECvmRBdMPMIWbD5a3kU()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$j9SYVZNI3aEbrOx6jxBWYL046uc()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$kC2GAeM9RoAdu5aL5vjepb8NRt4()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$ltM0LNCO0IpxItflkQs1-OW5yWo(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$nCL1qFe_6GUmC6LRVpbNvqPnxzs(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$nYPlff79P2l-muLhW8EMuKgR50w(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$oBwElCRwdRH0K-dD4FNR2zBIlik()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$ot12xp6xNVtSSQ4GK9tV7IySHoM(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$ruqqX1Z0LLWOgajy7Wtjs5N3iks(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$uRzpmm1efLVUhJMEHNtyfP7BiA8(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$wAw2Kp5XlAPghxmIdIo41QzCx9g(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$wIlBIGBTTiiajQBAE1x8xR74OLI()V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$xQ9ZfcE66PEynu9uNL9k6bEaLXs(Lorg/thoughtcrime/securesms/ApplicationContext;)V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$xsfc4Wa_kVMkmyR3F3728Xm6Sz0()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$vq13xoFA2KFXFtE5Jlx3i42fU-8(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$y2wfEuKgd8zQpNdKJyo7v3d1ZLs(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$zLJvo83whBob1hm-1YvxiH4EKqg(Lorg/thoughtcrime/securesms/ApplicationContext;)V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->$r8$lambda$zNA2sxapNn8tnXiST4flFZyy97A()[B HSPLorg/thoughtcrime/securesms/ApplicationContext;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->attachBaseContext(Landroid/content/Context;)V @@ -19214,9 +19863,9 @@ HSPLorg/thoughtcrime/securesms/ApplicationContext;->initializeRx()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->initializeScheduledMessageManager()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->initializeSecurityProvider()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->initializeTrimThreadsByDateManager()V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$initializeLogging$23()V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$initializeRx$24(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; -HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$initializeRx$25(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; +HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$initializeLogging$26()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$initializeRx$27(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; +HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$initializeRx$28(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Scheduler; HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$0()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$1()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$10()V @@ -19232,16 +19881,19 @@ HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$19()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$2()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$20()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$21()V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$3()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$22()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$23()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$3()[B HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$4()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$5()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$6()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$7()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$8()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onCreate$9()V -HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onForeground$22()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->lambda$onForeground$24()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->onCreate()V HSPLorg/thoughtcrime/securesms/ApplicationContext;->onForeground()V +HSPLorg/thoughtcrime/securesms/ApplicationContext;->startAnrDetector()V HSPLorg/thoughtcrime/securesms/BaseActivity;->()V HSPLorg/thoughtcrime/securesms/BaseActivity;->()V HSPLorg/thoughtcrime/securesms/BaseActivity;->applyOverrideConfiguration(Landroid/content/res/Configuration;)V @@ -19254,26 +19906,27 @@ HSPLorg/thoughtcrime/securesms/BaseActivity;->onResume()V HSPLorg/thoughtcrime/securesms/BaseActivity;->onStart()V HSPLorg/thoughtcrime/securesms/BaseActivity;->onStop()V HSPLorg/thoughtcrime/securesms/BuildConfig;->()V -HSPLorg/thoughtcrime/securesms/KbsEnclave;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/KbsEnclave;->getEnclaveName()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/KbsEnclave;->getMrEnclave()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/KbsEnclave;->getServiceId()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/LoggingFragment;->()V HSPLorg/thoughtcrime/securesms/LoggingFragment;->()V +HSPLorg/thoughtcrime/securesms/LoggingFragment;->(I)V HSPLorg/thoughtcrime/securesms/LoggingFragment;->logEvent(Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/LoggingFragment;->onCreate(Landroid/os/Bundle;)V HSPLorg/thoughtcrime/securesms/LoggingFragment;->onStart()V +HSPLorg/thoughtcrime/securesms/LoggingFragment;->onStop()V HSPLorg/thoughtcrime/securesms/MainActivity$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/MainActivity;)V HSPLorg/thoughtcrime/securesms/MainActivity$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/MainActivity$1;->(Lorg/thoughtcrime/securesms/MainActivity;Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/MainActivity$1;->onPreDraw()Z HSPLorg/thoughtcrime/securesms/MainActivity$2;->()V -HSPLorg/thoughtcrime/securesms/MainActivity;->$r8$lambda$ZtAiIk1vQDqkd5srupsNU2EDBr8(Lorg/thoughtcrime/securesms/MainActivity;Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State;)V +HSPLorg/thoughtcrime/securesms/MainActivity;->$r8$lambda$JMubGcyt2TPHL8nK5TRaxXztRe8(Lorg/thoughtcrime/securesms/MainActivity;Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$State;)V HSPLorg/thoughtcrime/securesms/MainActivity;->-$$Nest$fgetonFirstRender(Lorg/thoughtcrime/securesms/MainActivity;)Z HSPLorg/thoughtcrime/securesms/MainActivity;->()V HSPLorg/thoughtcrime/securesms/MainActivity;->getIntent()Landroid/content/Intent; +HSPLorg/thoughtcrime/securesms/MainActivity;->getNavigator()Lorg/thoughtcrime/securesms/MainNavigator; HSPLorg/thoughtcrime/securesms/MainActivity;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; HSPLorg/thoughtcrime/securesms/MainActivity;->handleCallLinkInIntent(Landroid/content/Intent;)V +HSPLorg/thoughtcrime/securesms/MainActivity;->handleDeeplinkIntent(Landroid/content/Intent;)V +HSPLorg/thoughtcrime/securesms/MainActivity;->handleDonateReturnIntent(Landroid/content/Intent;)V HSPLorg/thoughtcrime/securesms/MainActivity;->handleGroupLinkInIntent(Landroid/content/Intent;)V HSPLorg/thoughtcrime/securesms/MainActivity;->handleProxyInIntent(Landroid/content/Intent;)V HSPLorg/thoughtcrime/securesms/MainActivity;->handleSignalMeIntent(Landroid/content/Intent;)V @@ -19281,11 +19934,23 @@ HSPLorg/thoughtcrime/securesms/MainActivity;->onCreate(Landroid/os/Bundle;Z)V HSPLorg/thoughtcrime/securesms/MainActivity;->onFirstRender()V HSPLorg/thoughtcrime/securesms/MainActivity;->onPreCreate()V HSPLorg/thoughtcrime/securesms/MainActivity;->onResume()V -HSPLorg/thoughtcrime/securesms/MainActivity;->presentSlowNotificationState(Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State;)V +HSPLorg/thoughtcrime/securesms/MainActivity;->onStop()V +HSPLorg/thoughtcrime/securesms/MainActivity;->presentVitalsState(Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$State;)V HSPLorg/thoughtcrime/securesms/MainActivity;->updateTabVisibility()V HSPLorg/thoughtcrime/securesms/MainFragment;->()V +HSPLorg/thoughtcrime/securesms/MainFragment;->getNavigator()Lorg/thoughtcrime/securesms/MainNavigator; HSPLorg/thoughtcrime/securesms/MainFragment;->onAttach(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda0;->(II)V +HSPLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/MainNavigator;)V +HSPLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/MainNavigator;->$r8$lambda$BsmRZ7TbLMbFLO4HbBAA_UZA_dc(IILorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;)Landroid/content/Intent; +HSPLorg/thoughtcrime/securesms/MainNavigator;->$r8$lambda$QRR_-StramqxZCQdyuE0wK2mbHA(Lorg/thoughtcrime/securesms/MainNavigator;Landroid/content/Intent;)V HSPLorg/thoughtcrime/securesms/MainNavigator;->(Lorg/thoughtcrime/securesms/MainActivity;)V +HSPLorg/thoughtcrime/securesms/MainNavigator;->get(Landroid/app/Activity;)Lorg/thoughtcrime/securesms/MainNavigator; +HSPLorg/thoughtcrime/securesms/MainNavigator;->goToConversation(Lorg/thoughtcrime/securesms/recipients/RecipientId;JII)V +HSPLorg/thoughtcrime/securesms/MainNavigator;->lambda$goToConversation$0(IILorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;)Landroid/content/Intent; +HSPLorg/thoughtcrime/securesms/MainNavigator;->lambda$goToConversation$1(Landroid/content/Intent;)V HSPLorg/thoughtcrime/securesms/PassphraseRequiredActivity$1;->(Lorg/thoughtcrime/securesms/PassphraseRequiredActivity;)V HSPLorg/thoughtcrime/securesms/PassphraseRequiredActivity;->()V HSPLorg/thoughtcrime/securesms/PassphraseRequiredActivity;->()V @@ -19302,49 +19967,47 @@ HSPLorg/thoughtcrime/securesms/PassphraseRequiredActivity;->userMustSetProfileNa HSPLorg/thoughtcrime/securesms/R$styleable;->()V HSPLorg/thoughtcrime/securesms/animation/AnimationCompleteListener;->()V HSPLorg/thoughtcrime/securesms/animation/AnimationCompleteListener;->onAnimationStart(Landroid/animation/Animator;)V -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->(Ljava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[BLjava/lang/String;ZZZIIZJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;Lorg/thoughtcrime/securesms/audio/AudioHash;Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;)V -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getAudioHash()Lorg/thoughtcrime/securesms/audio/AudioHash; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getBlurHash()Lorg/thoughtcrime/securesms/blurhash/BlurHash; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getCaption()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getCdnNumber()I -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getContentType()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getDigest()[B -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getFastPreflightId()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getFileName()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getHeight()I -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getIncrementalDigest()[B -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getLocation()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getRelay()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getSize()J -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getTransferState()I -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getTransformProperties()Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties; -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getUploadTimestamp()J -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->getWidth()I -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->isBorderless()Z -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->isQuote()Z +HSPLorg/thoughtcrime/securesms/attachments/Attachment$Companion;->()V +HSPLorg/thoughtcrime/securesms/attachments/Attachment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/attachments/Attachment;->()V +HSPLorg/thoughtcrime/securesms/attachments/Attachment;->(Ljava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;[B[BLjava/lang/String;ZZZIIIZJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;Lorg/thoughtcrime/securesms/audio/AudioHash;Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;)V +HSPLorg/thoughtcrime/securesms/attachments/Attachment;->isInProgress()Z +HSPLorg/thoughtcrime/securesms/attachments/Attachment;->isPermanentlyFailed()Z HSPLorg/thoughtcrime/securesms/attachments/Attachment;->isSticker()Z -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->isVideoGif()Z -HSPLorg/thoughtcrime/securesms/attachments/Attachment;->isVoiceNote()Z -HSPLorg/thoughtcrime/securesms/attachments/AttachmentId$1;->()V +HSPLorg/thoughtcrime/securesms/attachments/AttachmentCreator;->()V +HSPLorg/thoughtcrime/securesms/attachments/AttachmentCreator;->()V +HSPLorg/thoughtcrime/securesms/attachments/AttachmentId$Creator;->()V HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->()V -HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->(JJ)V -HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->getRowId()J -HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->getUniqueId()J +HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->(J)V +HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->hashCode()I HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->toString()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/attachments/AttachmentId;->toStrings()[Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment$DisplayOrderComparator;->()V HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment$DisplayOrderComparator;->()V HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment$DisplayOrderComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment$DisplayOrderComparator;->compare(Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)I -HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->(Lorg/thoughtcrime/securesms/attachments/AttachmentId;JZZLjava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[BLjava/lang/String;ZZZIIZLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;Lorg/thoughtcrime/securesms/audio/AudioHash;Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;IJ)V -HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->getAttachmentId()Lorg/thoughtcrime/securesms/attachments/AttachmentId; +HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->()V HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->getDisplayOrder()I HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->getUri()Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->(Ljava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[BLjava/lang/String;ZZZIIJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;)V -HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->forPointer(Lj$/util/Optional;)Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->forPointer(Lj$/util/Optional;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Ljava/lang/String;)Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->forPointers(Lj$/util/Optional;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->hashCode()I +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->()V +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->forPointer$default(Lorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;Lj$/util/Optional;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Ljava/lang/String;ILjava/lang/Object;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->forPointer(Lj$/util/Optional;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Ljava/lang/String;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion;->forPointers(Lj$/util/Optional;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->()V +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->(Ljava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;[B[BILjava/lang/String;ZZZIIJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;)V +HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->(Ljava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;[B[BILjava/lang/String;ZZZIIJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->getUri()Landroid/net/Uri; +HSPLorg/thoughtcrime/securesms/audio/AudioRecorder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/audio/AudioRecorder;)V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorder;->()V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorder;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->()V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; +HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager26;->(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->()V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; HSPLorg/thoughtcrime/securesms/avatar/Avatar$Companion;->()V HSPLorg/thoughtcrime/securesms/avatar/Avatar$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId$DoNotPersist;->()V @@ -19352,10 +20015,6 @@ HSPLorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId$DoNotPersist;->()V HSPLorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId;->()V HSPLorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId;->()V HSPLorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->()V -HSPLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->(ILorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;)V -HSPLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->getColor()Lorg/thoughtcrime/securesms/avatar/Avatars$ColorPair; -HSPLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->getResourceId()I HSPLorg/thoughtcrime/securesms/avatar/Avatar$Text;->()V HSPLorg/thoughtcrime/securesms/avatar/Avatar$Text;->(Ljava/lang/String;Lorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;Lorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId;)V HSPLorg/thoughtcrime/securesms/avatar/Avatar$Text;->getColor()Lorg/thoughtcrime/securesms/avatar/Avatars$ColorPair; @@ -19366,26 +20025,13 @@ HSPLorg/thoughtcrime/securesms/avatar/Avatar;->(Lorg/thoughtcrime/securesm HSPLorg/thoughtcrime/securesms/avatar/AvatarPickerStorage;->()V HSPLorg/thoughtcrime/securesms/avatar/AvatarPickerStorage;->()V HSPLorg/thoughtcrime/securesms/avatar/AvatarPickerStorage;->cleanOrphans(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer$renderResource$1;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/avatar/Avatar$Resource;)V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer$renderResource$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer$renderResource$1;->invoke-IoAF18A(Landroid/graphics/Canvas;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->$r8$lambda$LMRb5EH7u5JsF-ZatOYl7HXPvGU(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->()V HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->()V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->createMedia(Landroid/net/Uri;J)Lorg/thoughtcrime/securesms/mediasend/Media; HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->createTextDrawable(Landroid/content/Context;Lorg/thoughtcrime/securesms/avatar/Avatar$Text;ZIZ)Landroid/graphics/drawable/Drawable; -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->getDIMENSIONS()I HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->getTypeface(Landroid/content/Context;)Landroid/graphics/Typeface; -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/avatar/Avatar;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderInBackground$lambda$1(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderInBackground(Landroid/content/Context;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderResource(Landroid/content/Context;Lorg/thoughtcrime/securesms/avatar/Avatar$Resource;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;->()V HSPLorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;->(IILjava/lang/String;)V HSPLorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;->(Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Lorg/thoughtcrime/securesms/avatar/Avatars$ForegroundColor;)V -HSPLorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;->getBackgroundColor()I HSPLorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;->getCode()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;->getForegroundColor()I HSPLorg/thoughtcrime/securesms/avatar/Avatars$DefaultAvatar;->()V @@ -19408,6 +20054,12 @@ HSPLorg/thoughtcrime/securesms/avatar/TextAvatarDrawable;->draw(Landroid/graphic HSPLorg/thoughtcrime/securesms/avatar/TextAvatarDrawable;->draw(Landroid/text/Layout;Landroid/graphics/Canvas;FF)V HSPLorg/thoughtcrime/securesms/avatar/TextAvatarDrawable;->getOpacity()I HSPLorg/thoughtcrime/securesms/avatar/TextAvatarDrawable;->getStartX(Landroid/text/StaticLayout;)F +HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView$WhenMappings;->()V +HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->()V +HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->displayChatAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V +HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->hideStoryRing()V +HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->setStoryRingFromState(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->()V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->clearDrawable()V @@ -19415,6 +20067,22 @@ HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->getGlideRequests()Lorg/th HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadge(Lorg/thoughtcrime/securesms/badges/models/Badge;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadgeFromRecipient(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadgeFromRecipient(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->()V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->()V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getAnimationState$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getMessageIdsOpenedThisSession$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLorg/thoughtcrime/securesms/blurhash/Base83;->()V HSPLorg/thoughtcrime/securesms/blurhash/Base83;->isValid(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/blurhash/BlurHash$1;->()V @@ -19422,9 +20090,59 @@ HSPLorg/thoughtcrime/securesms/blurhash/BlurHash;->()V HSPLorg/thoughtcrime/securesms/blurhash/BlurHash;->parseOrNull(Ljava/lang/String;)Lorg/thoughtcrime/securesms/blurhash/BlurHash; HSPLorg/thoughtcrime/securesms/blurhash/BlurHashModelLoader$Factory;->()V HSPLorg/thoughtcrime/securesms/blurhash/BlurHashResourceDecoder;->()V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCorners()V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCornersForSizeClass2()V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->getCells()[Lorg/thoughtcrime/securesms/components/ThumbnailView; +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->inflateLayout(I)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setCellBackgroundColor(I)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRadii(IIII)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRelativeRadii(Lorg/thoughtcrime/securesms/components/ThumbnailView;IIII)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlide(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;IZ)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlides(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;Z)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->showSlides(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->sizeClass(I)I HSPLorg/thoughtcrime/securesms/components/AlertView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/AlertView;->initialize()V HSPLorg/thoughtcrime/securesms/components/AlertView;->setNone()V +HSPLorg/thoughtcrime/securesms/components/AnimatingToggle;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/AnimatingToggle;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/AnimatingToggle;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +HSPLorg/thoughtcrime/securesms/components/AnimatingToggle;->display(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AudioView;)V +HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0;->onChanged(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/AudioView;)V +HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/components/AudioView;I)V +HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda4;->run()V +HSPLorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;)V +HSPLorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener-IA;)V +HSPLorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;)V +HSPLorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener-IA;)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->$r8$lambda$70S_ChWvvHg6uKYhRw5m0jX0OG0(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->$r8$lambda$ttH02xbblnAnQbQdy9cXzPNafwQ(Lorg/thoughtcrime/securesms/components/AudioView;I)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->()V +HSPLorg/thoughtcrime/securesms/components/AudioView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; +HSPLorg/thoughtcrime/securesms/components/AudioView;->hasAudioUri()Z +HSPLorg/thoughtcrime/securesms/components/AudioView;->isTarget(Landroid/net/Uri;)Z +HSPLorg/thoughtcrime/securesms/components/AudioView;->lambda$setTint$3(I)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->onAttachedToWindow()V +HSPLorg/thoughtcrime/securesms/components/AudioView;->onDuration(Landroid/net/Uri;J)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->onPlaybackState(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->onProgress(Landroid/net/Uri;DJ)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->onSpeedChanged(Landroid/net/Uri;F)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->onStart(Landroid/net/Uri;ZZ)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->setProgressAndPlayBackgroundTint(I)V +HSPLorg/thoughtcrime/securesms/components/AudioView;->setTint(I)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AvatarImageView;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions$Builder;->-$$Nest$fgetfixedSize(Lorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions$Builder;)I HSPLorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions$Builder;->-$$Nest$fgetquickContactEnabled(Lorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions$Builder;)Z @@ -19442,51 +20160,255 @@ HSPLorg/thoughtcrime/securesms/components/AvatarImageView$RecipientContactPhoto; HSPLorg/thoughtcrime/securesms/components/AvatarImageView$RecipientContactPhoto;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView$RecipientContactPhoto;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/contacts/avatars/ContactPhoto;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView$RecipientContactPhoto;->equals(Lorg/thoughtcrime/securesms/components/AvatarImageView$RecipientContactPhoto;)Z +HSPLorg/thoughtcrime/securesms/components/AvatarImageView$RedownloadRequestListener;->()V +HSPLorg/thoughtcrime/securesms/components/AvatarImageView$RedownloadRequestListener;->(Lorg/thoughtcrime/securesms/components/AvatarImageView$RedownloadRequestListener-IA;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->()V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->disableQuickContact()V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->initialize(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;ZZ)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatarClickHandler(Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V +HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setFallbackPhotoProvider(Lorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;)V +HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setOnClickListener(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText$1;->(Lorg/thoughtcrime/securesms/components/ComposeText;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->()V +HSPLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;Lorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener-IA;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText$QueryStart;->(IZ)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->()V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->changeSelectionForPartialMentions(Landroid/text/Spanned;II)Z +HSPLorg/thoughtcrime/securesms/components/ComposeText;->clearInlineQuery()V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->doAfterCursorChange(Landroid/text/Editable;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->ellipsizeToWidth(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +HSPLorg/thoughtcrime/securesms/components/ComposeText;->enoughToFilter(Landroid/text/Editable;Z)Z +HSPLorg/thoughtcrime/securesms/components/ComposeText;->findQueryStart(Ljava/lang/CharSequence;IC)I +HSPLorg/thoughtcrime/securesms/components/ComposeText;->findQueryStart(Ljava/lang/CharSequence;IZ)Lorg/thoughtcrime/securesms/components/ComposeText$QueryStart; +HSPLorg/thoughtcrime/securesms/components/ComposeText;->initialize()V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->isLandscape()Z +HSPLorg/thoughtcrime/securesms/components/ComposeText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; +HSPLorg/thoughtcrime/securesms/components/ComposeText;->onDraw(Landroid/graphics/Canvas;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->onMeasure(II)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->onSelectionChanged(II)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setCursorPositionChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$CursorPositionChangedListener;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setHint(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setHintWithChecks(Ljava/lang/CharSequence;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setInlineQueryChangedListener(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryChangedListener;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setMediaListener(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setMessageSendType(Lorg/thoughtcrime/securesms/conversation/MessageSendType;)V +HSPLorg/thoughtcrime/securesms/components/ComposeText;->setStylingChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$StylingChangedListener;)V +HSPLorg/thoughtcrime/securesms/components/ComposeTextStyleWatcher;->()V +HSPLorg/thoughtcrime/securesms/components/ComposeTextStyleWatcher;->()V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter$$ExternalSyntheticLambda0;->(I)V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/ConversationItemFooter;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter$$ExternalSyntheticLambda2;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->$r8$lambda$rILpFw6OPAVn7dsgVBus6R0qlZk(Lorg/thoughtcrime/securesms/components/ConversationItemFooter;Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->buildMessageId(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)J +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->disableBubbleBackground()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->getDateView()Landroid/view/View; +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->getPlaybackSpeedToggleTouchDelegateRect()Landroid/graphics/Rect; +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->hideAudioDurationViews()V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->init(Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->lambda$init$0(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->notifyTouchDelegateChanged(Landroid/graphics/Rect;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentAudioDuration(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDate(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/Locale;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDeliveryStatus(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentInsecureIndicator(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentSimInfo(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentTimer(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setIconColor(I)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setMessageRecord(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/Locale;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setOnTouchDelegateChangedListener(Lorg/thoughtcrime/securesms/components/ConversationItemFooter$OnTouchDelegateChangedListener;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setOnlyShowSendingStatus(ZLorg/thoughtcrime/securesms/database/model/MessageRecord;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setPlaybackSpeedListener(Lorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView$PlaybackSpeedListener;)V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setRevealDotColor(I)V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setTextColor(I)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->dispatchDraw(Landroid/graphics/Canvas;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->getFooter()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setBorderless(Z)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setClickable(Z)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setConversationColor(I)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCorners(IIII)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setFocusable(Z)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;ZZ)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMaximumThumbnailHeight(I)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMinimumThumbnailWidth(I)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailBounds([I)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showShade(Z)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showThumbnailView()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState$Creator;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->(ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIII)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->(ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->copy(ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIII)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$Creator;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState$Creator;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIII)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIIIILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->copy(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIII)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->()V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;Lorg/thoughtcrime/securesms/util/views/Stub;)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getAlbumViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getThumbnailViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->formatUnreadCount(I)Ljava/lang/CharSequence; +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setOnClickListener(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setShown(Z)V +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setUnreadCount(I)V +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setUnreadCountBackgroundTint(I)V +HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setWallpaperEnabled(Z)V +HSPLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->onFinishInflate()V +HSPLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->setEventListener(Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar$EventListener;)V HSPLorg/thoughtcrime/securesms/components/CornerMask;->(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/components/CornerMask;->mask(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/components/CornerMask;->setRadii(IIII)V +HSPLorg/thoughtcrime/securesms/components/CornerMask;->setRadius(I)V +HSPLorg/thoughtcrime/securesms/components/CornerMask;->setTopLeftRadius(I)V +HSPLorg/thoughtcrime/securesms/components/CornerMask;->setTopRightRadius(I)V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView$State;->$values()[Lorg/thoughtcrime/securesms/components/DeliveryStatusView$State; HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView$State;->()V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView$State;->(Ljava/lang/String;III)V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->clearAnimation()V +HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->isPending()Z HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->setNone()V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->setTint(I)V HSPLorg/thoughtcrime/securesms/components/DeliveryStatusView;->updateContentDescription()V HSPLorg/thoughtcrime/securesms/components/ExpirationTimerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ExpirationTimerView;->stopAnimation()V HSPLorg/thoughtcrime/securesms/components/FromTextView;->()V HSPLorg/thoughtcrime/securesms/components/FromTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/CharSequence;ZLjava/lang/String;)V HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/CharSequence;ZLjava/lang/String;Z)V HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V HSPLorg/thoughtcrime/securesms/components/FromTextView;->setText(Lorg/thoughtcrime/securesms/recipients/Recipient;ZLjava/lang/String;)V +HSPLorg/thoughtcrime/securesms/components/HidingLinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/HidingLinearLayout;->hide()V +HSPLorg/thoughtcrime/securesms/components/HidingLinearLayout;->show()V +HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->()V +HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->addInputListener(Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout$Listener;)V +HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->setFragmentManager(Landroidx/fragment/app/FragmentManager;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$RecordTime;->(Landroid/widget/TextView;Landroid/view/View;JLjava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$RecordTime;->(Landroid/widget/TextView;Landroid/view/View;JLjava/lang/Runnable;Lorg/thoughtcrime/securesms/components/InputPanel$RecordTime-IA;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel$SlideToCancel;->(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->()V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; +HSPLorg/thoughtcrime/securesms/components/InputPanel;->onFinishInflate()V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->setHideForMessageRequestState(Z)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->setListener(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->setMediaKeyboardToggleMode(Lorg/thoughtcrime/securesms/keyboard/KeyboardPage;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->setMediaListener(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->setStickerSuggestions(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->setWallpaperEnabled(Z)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->showMediaKeyboardToggle(Z)V +HSPLorg/thoughtcrime/securesms/components/InputPanel;->updateVisibility()V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$$ExternalSyntheticLambda1;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardInsetAnimator;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardInsetAnimator;->getAnimating()Z +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentStartGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentStartGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentStartGuideline$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$statusBarGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$statusBarGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$statusBarGuideline$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->$r8$lambda$wNlRlegYRZAGLCv-uS3_baE_8zg(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->()V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->_init_$lambda$0(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->addKeyboardStateListener(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardStateListener;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->applyInsets(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)V +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getKeyboardGuideline()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getNavigationBarGuideline()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getParentEndGuideline()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getParentStartGuideline()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getStatusBarGuideline()Landroidx/constraintlayout/widget/Guideline; +HSPLorg/thoughtcrime/securesms/components/LinkPreviewView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/LinkPreviewView;)V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewView;->init(Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewView;->setCloseClickedListener(Lorg/thoughtcrime/securesms/components/LinkPreviewView$CloseClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState$Creator;->()V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->()V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->()V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->(IIIILorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->(IIIILorg/thoughtcrime/securesms/mms/SlidesClickedListener;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->copy(IIIILorg/thoughtcrime/securesms/mms/SlidesClickedListener;)Lorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState; +HSPLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->getDownloadListener()Lorg/thoughtcrime/securesms/mms/SlidesClickedListener; HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/Material3SearchToolbar;)V HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/Material3SearchToolbar;)V HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar$special$$inlined$addTextChangedListener$default$1;->(Landroid/view/View;Lorg/thoughtcrime/securesms/components/Material3SearchToolbar;)V HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar;->()V HSPLorg/thoughtcrime/securesms/components/Material3SearchToolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$FloatingRecordButton;->(Landroid/content/Context;Landroid/widget/ImageView;)V +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$LockDropTarget;->(Landroid/content/Context;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State;->$values()[Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State; +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State;->()V +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->isRecordingLocked()Z +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->onFinishInflate()V +HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->setHandler(Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V HSPLorg/thoughtcrime/securesms/components/Outliner;->()V +HSPLorg/thoughtcrime/securesms/components/Outliner;->draw(Landroid/graphics/Canvas;IIII)V +HSPLorg/thoughtcrime/securesms/components/Outliner;->setColor(I)V +HSPLorg/thoughtcrime/securesms/components/Outliner;->setRadii(IIII)V +HSPLorg/thoughtcrime/securesms/components/Outliner;->setStrokeWidth(F)V HSPLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;)V HSPLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;->()V HSPLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;->getCurrentLabel()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;->setPlaybackSpeedListener(Lorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView$PlaybackSpeedListener;)V HSPLorg/thoughtcrime/securesms/components/QuoteView$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/components/QuoteView;)V HSPLorg/thoughtcrime/securesms/components/QuoteView$MessageType;->$values()[Lorg/thoughtcrime/securesms/components/QuoteView$MessageType; HSPLorg/thoughtcrime/securesms/components/QuoteView$MessageType;->-$$Nest$smfromCode(I)Lorg/thoughtcrime/securesms/components/QuoteView$MessageType; @@ -19496,11 +20418,80 @@ HSPLorg/thoughtcrime/securesms/components/QuoteView$MessageType;->fromCode(I)Lor HSPLorg/thoughtcrime/securesms/components/QuoteView$MessageType;->values()[Lorg/thoughtcrime/securesms/components/QuoteView$MessageType; HSPLorg/thoughtcrime/securesms/components/QuoteView;->()V HSPLorg/thoughtcrime/securesms/components/QuoteView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/QuoteView;->applyColorTheme()V +HSPLorg/thoughtcrime/securesms/components/QuoteView;->dismiss()V HSPLorg/thoughtcrime/securesms/components/QuoteView;->initialize(Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/QuoteView;->isStoryReply()Z HSPLorg/thoughtcrime/securesms/components/QuoteView;->setMessageType(Lorg/thoughtcrime/securesms/components/QuoteView$MessageType;)V +HSPLorg/thoughtcrime/securesms/components/QuoteView;->setWallpaperEnabled(Z)V HSPLorg/thoughtcrime/securesms/components/RatingManager;->()V HSPLorg/thoughtcrime/securesms/components/RatingManager;->showRatingDialogIfNecessary(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->()V +HSPLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->(Landroid/view/ViewGroup;Landroid/animation/LayoutTransition;)V +HSPLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->(Landroid/view/ViewGroup;Landroid/animation/LayoutTransition;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->findRecyclerParent()Landroidx/recyclerview/widget/RecyclerView; +HSPLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->onScrollStateChanged(Landroidx/recyclerview/widget/RecyclerView;I)V +HSPLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->onViewAttachedToWindow(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$2;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$2;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;)Z +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$4;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$5;->(Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$DefaultScrollStrategy;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$DefaultScrollStrategy;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;->(IZLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollStrategy;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;->getPosition()I +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->apply(JLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;)Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest; +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->()V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lio/reactivex/rxjava3/disposables/CompositeDisposable;)V +HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->notifyListCommitted()V +HSPLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/SearchView;->appendEmojiFilter(Landroid/widget/TextView;)[Landroid/text/InputFilter; +HSPLorg/thoughtcrime/securesms/components/SearchView;->initEmojiFilter()V +HSPLorg/thoughtcrime/securesms/components/SendButton;->()V +HSPLorg/thoughtcrime/securesms/components/SendButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/SendButton;->setPopupContainer(Landroid/view/ViewGroup;)V +HSPLorg/thoughtcrime/securesms/components/SendButton;->setScheduledSendListener(Lorg/thoughtcrime/securesms/components/SendButton$ScheduledSendListener;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport1;->m(Ljava/lang/Object;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport2;->m([Ljava/lang/Object;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$CancelClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$CancelClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;Lorg/thoughtcrime/securesms/components/ThumbnailView$CancelClickDispatcher-IA;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$DownloadClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$DownloadClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;Lorg/thoughtcrime/securesms/components/ThumbnailView$DownloadClickDispatcher-IA;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;Lorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher-IA;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->()V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->dispatchDraw(Landroid/graphics/Canvas;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->fillTargetDimensions([I[I[I)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->getNonZeroCount([I)I +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->hasSameContents(Lorg/thoughtcrime/securesms/mms/Slide;Lorg/thoughtcrime/securesms/mms/Slide;)Z +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->onMeasure(II)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->onSizeChanged(IIII)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setBounds(IIII)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setClickable(Z)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setFocusable(Z)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;ZZ)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;ZZII)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setRadii(IIII)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->showSecondaryText(Z)V HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->initialize(Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->setDotTint(I)V @@ -19508,6 +20499,7 @@ HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->stopAnimation()V HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->()V HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->()V HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->getTypingThreads()Landroidx/lifecycle/LiveData; +HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->getTypists(J)Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->()V HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->()V HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->()V @@ -19515,14 +20507,30 @@ HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->(Lkotlin/jv HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->getValue(Landroidx/fragment/app/Fragment;Lkotlin/reflect/KProperty;)Landroidx/viewbinding/ViewBinding; HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->getProgressDrawable()Landroid/graphics/drawable/Drawable; +HSPLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->init()V +HSPLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->setProgressDrawable(Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/components/emoji/AnimatingImageSpan;->(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable$Callback;)V HSPLorg/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel;->(ILjava/util/List;)V HSPLorg/thoughtcrime/securesms/components/emoji/Emoji;->(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/components/emoji/Emoji;->(Ljava/util/List;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/components/emoji/Emoji;->getRawVariation(I)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/components/emoji/Emoji;->getVariations()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiEditText;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText$$ExternalSyntheticLambda0;->onFocusChange(Landroid/view/View;Z)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->$r8$lambda$8pyXdt50o8im33POXP_o4TKoD6U(Lorg/thoughtcrime/securesms/components/emoji/EmojiEditText;Landroid/view/View;Z)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->addOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->appendEmojiFilter([Landroid/text/InputFilter;Z)[Landroid/text/InputFilter; +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->lambda$new$0(Landroid/view/View;Z)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiFilter;->(Landroid/widget/TextView;Z)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiProvider$$ExternalSyntheticLambda2;->(Landroid/widget/TextView;)V @@ -19546,29 +20554,49 @@ HSPLorg/thoughtcrime/securesms/components/emoji/EmojiProvider;->getEmojiDrawable HSPLorg/thoughtcrime/securesms/components/emoji/EmojiSpan;->(Landroid/graphics/drawable/Drawable;Landroid/widget/TextView;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiSpan;->draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiSpan;->getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda1;->()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda2;->run()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda3;->(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->$r8$lambda$5IPAQraRDnd37oqJyWeDCIArE8A(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Ljava/lang/String;)Ljava/lang/Float; HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->$r8$lambda$9VxJG--rce_LMrBbBVi5JkyJelM(Ljava/lang/Runnable;Landroid/view/View;)Lkotlin/Unit; HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->$r8$lambda$PicvuNf_O0Zy5LBsFpj6-AJMdsI(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->applyWidthMeasureRoundingFix(I)I HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->drawSpecialRenderers(Landroid/graphics/Canvas;Lorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate;Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->ellipsizeAnyTextForMaxLength()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->ellipsizeEmojiTextForMaxLines()V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->getLastLineWidth()I +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->getLongestLineWidth(Ljava/lang/CharSequence;)F HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->hasMetricAffectingSpan(Ljava/lang/CharSequence;)Z HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isEllipsizedAtEnd()Z +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isJumbomoji()Z +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isSingleLine()Z HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$ellipsizeEmojiTextForMaxLines$2()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$ellipsizeEmojiTextForMaxLines$3(Ljava/lang/Runnable;Landroid/view/View;)Lkotlin/Unit; +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$getLongestLineWidth$0(Ljava/lang/String;)Ljava/lang/Float; HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->onDraw(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->onMeasure(II)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->onSizeChanged(IIII)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setMentionBackgroundTint(I)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setOverflowText(Ljava/lang/CharSequence;)V -HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setTextColor(I)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setTextSize(IF)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->unchanged(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)Z HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->useSystemEmoji()Z +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiToggle$1;->()V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->initialize()V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->setStickerMode(Lorg/thoughtcrime/securesms/keyboard/KeyboardPage;)V +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->setToMedia()V +HSPLorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;->()V +HSPLorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;->(Landroid/content/Context;Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;->getPersistedCache()Ljava/util/LinkedHashSet; HSPLorg/thoughtcrime/securesms/components/emoji/SimpleEmojiTextView$$ExternalSyntheticLambda0;->(IILorg/thoughtcrime/securesms/components/emoji/SimpleEmojiTextView;)V HSPLorg/thoughtcrime/securesms/components/emoji/SimpleEmojiTextView$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/components/emoji/SimpleEmojiTextView;->$r8$lambda$4Klqi0f0CTTxkCnsSD7H1XDP4BU(IILorg/thoughtcrime/securesms/components/emoji/SimpleEmojiTextView;)V @@ -19586,6 +20614,7 @@ HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->$r8$lambd HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->(Lorg/thoughtcrime/securesms/emoji/EmojiCategory;Ljava/util/List;Landroid/net/Uri;)V HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->(Lorg/thoughtcrime/securesms/emoji/EmojiCategory;[Ljava/lang/String;Landroid/net/Uri;)V HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->getDisplayEmoji()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->getEmoji()Ljava/util/List; HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->getIconAttr()I HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->getSpriteUri()Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->lambda$new$0(Ljava/lang/String;)Lorg/thoughtcrime/securesms/components/emoji/Emoji; @@ -19625,11 +20654,18 @@ HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->() HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->(Ljava/lang/String;ILjava/lang/String;)V HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->fitzpatrickFromUnicode(Ljava/lang/CharSequence;I)Lorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick; HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->values()[Lorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick; +HSPLorg/thoughtcrime/securesms/components/mention/MentionAnnotation$$ExternalSyntheticLambda1;->()V +HSPLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;II)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/mention/MentionDeleter;->()V HSPLorg/thoughtcrime/securesms/components/mention/MentionRenderer$MultiLineMentionRenderer;->(IILandroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/components/mention/MentionRenderer$SingleLineMentionRenderer;->(IILandroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/components/mention/MentionRenderer;->(II)V HSPLorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate;->(Landroid/content/Context;I)V HSPLorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate;->draw(Landroid/graphics/Canvas;Landroid/text/Spanned;Landroid/text/Layout;)V +HSPLorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate;->setTint(I)V +HSPLorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher;->()V +HSPLorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V HSPLorg/thoughtcrime/securesms/components/menu/ActionItem;->()V HSPLorg/thoughtcrime/securesms/components/menu/ActionItem;->(ILjava/lang/CharSequence;ILjava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/components/menu/ActionItem;->(ILjava/lang/CharSequence;ILjava/lang/Runnable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -19640,6 +20676,16 @@ HSPLorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar;->( HSPLorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar;->present(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar;->setItems(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme$Companion;->resolveTheme(ZZZ)Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme; +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->$values()[Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme; +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->()V +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->(Ljava/lang/String;IIII)V +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->getBackgroundColor(Landroid/content/Context;)I +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->getBarColor(Landroid/content/Context;)I +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->getForegroundColor(Landroid/content/Context;)I +HSPLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->resolveTheme(ZZZ)Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme; HSPLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;J)V HSPLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;->(Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1;)V HSPLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;->onAnimationEnd(Landroid/animation/Animator;)V @@ -19678,6 +20724,16 @@ HSPLorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/No HSPLorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository;->()V HSPLorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository;->access$getDatabase$p(Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository;)Lorg/thoughtcrime/securesms/database/NotificationProfileDatabase; HSPLorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository;->getProfiles()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->()V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->(Landroidx/fragment/app/FragmentManager;Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->onPause(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationRepository;->()V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationRepository;->(Lorg/whispersystems/signalservice/api/services/DonationsService;)V +HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationRepository;->(Lorg/whispersystems/signalservice/api/services/DonationsService;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/errors/UnexpectedSubscriptionCancellation$Companion;->()V HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/errors/UnexpectedSubscriptionCancellation$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/settings/app/subscription/errors/UnexpectedSubscriptionCancellation$Companion;->fromStatus(Ljava/lang/String;)Lorg/thoughtcrime/securesms/components/settings/app/subscription/errors/UnexpectedSubscriptionCancellation; @@ -19701,8 +20757,10 @@ HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRenderer;->(Lorg/ HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1;->(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1;->onViewAttachedToWindow(Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->()V @@ -19712,8 +20770,86 @@ HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->access$getView$p(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;)Landroid/widget/TextView; HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->access$setCanAnimate$p(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;Z)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->access$setSystemAnimationsEnabled$p(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;Z)V +HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->access$stopAnimating(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->draw(Landroid/graphics/Canvas;Landroid/text/Spanned;Landroid/text/Layout;)V HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->stopAnimating()V +HSPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->updateFromTextColor()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Companion;->containsPlayableSlides(Ljava/util/List;)Z +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Companion;->getTransferState(Ljava/util/List;)I +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode;->$values()[Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress;->(JJ)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress;->toString()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setCancelClickListener$1;->(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setCancelClickListener$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setCancelClickListener$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setClickable$1;->(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setClickable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setClickable$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setFocusable$1;->(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setFocusable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setFocusable$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setShowSecondaryText$1;->(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setShowSecondaryText$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setShowSecondaryText$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setSlides$2;->(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setSlides$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setSlides$2;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setTransferClickListener$1;->(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setTransferClickListener$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setTransferClickListener$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setVisible$1;->(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setVisible$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setVisible$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->access$isUpdateToExistingSet(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;Ljava/util/List;)Z +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->access$slidesAsListOfTimestamps(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;Ljava/util/List;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->access$verboseLog(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->containsPlayableSlides(Ljava/util/List;)Z +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->deriveMode(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->getTransferState(Ljava/util/List;)I +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->isUpdateToExistingSet(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;Ljava/util/List;)Z +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->onAttachedToWindow()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setCancelClickListener(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setClickable(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setFocusable(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setShowSecondaryText(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setSlides(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setTransferClickListener(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setVisible(Z)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->slidesAsListOfTimestamps(Ljava/util/List;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->updateState(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->verboseLog(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->(ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZ)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->(ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->copy$default(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->copy(ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZ)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->equals(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->getNetworkProgress()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->getSlides()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->toString()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$Companion;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$State;->$values()[Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$State; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$State;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$State;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->()V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->(Landroid/content/Context;Landroid/util/AttributeSet;IIILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->progressPaint(I)Landroid/graphics/Paint; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->stopIconPaint(I)Landroid/graphics/Paint; +HSPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->trackPaint(I)Landroid/graphics/Paint; HSPLorg/thoughtcrime/securesms/components/voice/RetryableInitAudioSink$Companion;->()V HSPLorg/thoughtcrime/securesms/components/voice/RetryableInitAudioSink$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/voice/RetryableInitAudioSink;->()V @@ -19739,14 +20875,18 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController$createM HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->(Landroidx/fragment/app/FragmentActivity;Z)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->access$initializeMediaController(Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;Landroidx/media3/session/MediaController;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->clearProgressEventHandler()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->createMediaControllerAsync()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->finishPostpone()V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->getVoiceNotePlaybackState()Landroidx/lifecycle/MutableLiveData; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->getVoiceNotePlayerViewState()Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->initializeMediaController(Landroidx/media3/session/MediaController;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->notifyProgressEventHandler()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaNotificationProvider$Companion;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaNotificationProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaNotificationProvider;->()V @@ -19764,8 +20904,10 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService$MediaSe HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService$MediaSessionServiceListener;->(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService$MediaSessionServiceListener-IA;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService$VoiceNotePlayerEventListener;->(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService$VoiceNotePlayerEventListener;->(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService$VoiceNotePlayerEventListener-IA;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;->-$$Nest$fgetplayer(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;)Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;->()V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;->buildMediaSession(Z)Landroidx/media3/session/MediaSession; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;->onCreate()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService;->onGetSession(Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/session/MediaSession; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState$ClipType$Idle;->()V @@ -19783,6 +20925,12 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->compone HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->component5()F HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->component6()Z HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->component7()Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState$ClipType; +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getPlayheadPositionMillis()J +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getSpeed()F +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getTrackDuration()J +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getUri()Landroid/net/Uri; +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isAutoReset()Z +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isPlaying()Z HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;->(Landroid/content/Context;Landroidx/media3/exoplayer/ExoPlayer;)V @@ -19793,14 +20941,22 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback$Companio HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onConnect(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/session/MediaSession$ConnectionResult; +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onCustomCommand(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onDisconnected(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onPostConnect(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->setAudioStream(Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager$HardwareSensorEventListener;->(Lorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager$ProximityListener;->(Lorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->(Landroidx/fragment/app/FragmentActivity;Landroidx/media3/session/MediaController;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->cleanUpWakeLock()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->sendNewStreamTypeToPlayer(I)V +HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->unregisterCallbacksAndRelease()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManagerKt;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManagerKt;->access$getTAG$p()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/components/voice/WorkaroundRenderersFactory;->()V @@ -19821,6 +20977,7 @@ HSPLorg/thoughtcrime/securesms/contacts/ContactRepository;->(Landroid/cont HSPLorg/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto;->(Ljava/lang/String;II)V HSPLorg/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto;->asDrawable(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;)Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto;->asDrawable(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Z)Landroid/graphics/drawable/Drawable; +HSPLorg/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto;->asSmallDrawable(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Z)Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto;->hashCode()I HSPLorg/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto;->openInputStream(Landroid/content/Context;)Ljava/io/InputStream; @@ -19891,6 +21048,8 @@ HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$2;->invoke(L HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$3;->(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator;Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$3;->invoke(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchState;)V +HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$Companion;->()V +HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$SimpleCallbacks;->()V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$SimpleCallbacks;->()V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$SimpleCallbacks;->onAdapterListCommitted(I)V @@ -19948,16 +21107,86 @@ HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel;->getSelect HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel;->setConfiguration(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration;)V HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel;->setConversationFilterRequest$lambda$1(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchState;)Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchState; HSPLorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel;->setConversationFilterRequest(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)V -HSPLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->()V -HSPLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->()V -HSPLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->hasContactsPermissions(Landroid/content/Context;)Z -HSPLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->refreshAll(Landroid/content/Context;Z)V HSPLorg/thoughtcrime/securesms/conversation/BodyBubbleLayoutTransition;->()V HSPLorg/thoughtcrime/securesms/conversation/BodyBubbleLayoutTransition;->()V HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->()V HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->(Landroid/graphics/drawable/Drawable;)V +HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->draw(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->setProjections(Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZ)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZZZ)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->includeWarningUpdateMessage()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->isHidden()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->isMessageRequestAccepted()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->(Lorg/thoughtcrime/securesms/recipients/Recipient;JJIIIILorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;ZILjava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->getGroupMemberAcis()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->getMessageRequestData()Lorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData; +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->getStartPosition()I +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->getThreadSize()I +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->getUnreadCount()I +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->shouldJumpToMessage()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->shouldScrollToLastSeen()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->showUniversalExpireTimerMessage()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->(Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider-IA;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->hideDecoratorsIfContentIsNotPresent()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->hideDescription()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->prependIcon(Ljava/lang/CharSequence;I)Ljava/lang/CharSequence; +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAbout(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setLinkifyDescription(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setSubtitle(Ljava/lang/CharSequence;I)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->showBackgroundBubble(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;JLjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Ljava/util/ArrayList;Lorg/thoughtcrime/securesms/stickers/StickerLocator;ZIIZZLorg/thoughtcrime/securesms/badges/models/Badge;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->canInitializeFromDatabase()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->from(Landroid/os/Bundle;)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getConversationScreenType()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDistributionType()I +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftContentType()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMedia()Landroid/net/Uri; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMediaType()Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftText()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getMedia()Ljava/util/ArrayList; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getShareDataTimestamp()J +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getStartingPosition()I +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getStickerLocator()Lorg/thoughtcrime/securesms/stickers/StickerLocator; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getThreadId()J +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getWallpaper()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isBorderless()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isFirstTimeInSelfCreatedGroup()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isWithSearchOpen()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->(Landroid/content/Context;Ljava/lang/Class;Lorg/thoughtcrime/securesms/recipients/RecipientId;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->(Landroid/content/Context;Ljava/lang/Class;Lorg/thoughtcrime/securesms/recipients/RecipientId;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder-IA;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->build()Landroid/content/Intent; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->withDistributionType(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->withStartingPosition(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->$values()[Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->-$$Nest$fgetcode(Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)I +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->-$$Nest$smfrom(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->(Ljava/lang/String;II)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->from(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->isInBubble()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->isInPopup()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->values()[Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->-$$Nest$smcheckThreadId(J)J +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->checkThreadId(J)J +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->createBuilder(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lio/reactivex/rxjava3/core/Single; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->createBuilderSync(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->createParentFragmentArguments(Landroid/content/Intent;)Landroid/os/Bundle; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->getIntentData(Landroid/os/Bundle;)Landroid/net/Uri; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->getIntentType(Landroid/os/Bundle;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents;->isBubbleIntentUri(Landroid/net/Uri;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$$ExternalSyntheticLambda6;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$1;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$AttachmentDownloadClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$AttachmentDownloadClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$AttachmentDownloadClickListener-IA;)V @@ -19968,6 +21197,8 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$LinkPreviewClickLis HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$LinkPreviewClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$LinkPreviewClickListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$PassthroughClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$PassthroughClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$PassthroughClickListener-IA;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$PlayVideoClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$PlayVideoClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$PlayVideoClickListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$QuotedIndicatorClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$QuotedIndicatorClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$QuotedIndicatorClickListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$ScheduledIndicatorClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V @@ -19978,6 +21209,8 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$SharedContactEventL HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$SharedContactEventListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$SharedContactEventListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$SlideClickPassthroughListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$SlideClickPassthroughListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/conversation/ConversationItem$SlideClickPassthroughListener-IA;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$ThumbnailClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$ThumbnailClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$ThumbnailClickListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$TouchDelegateChangedListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$TouchDelegateChangedListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$TouchDelegateChangedListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$UrlClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V @@ -19986,15 +21219,166 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$ViewOnceMessageClic HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$ViewOnceMessageClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$ViewOnceMessageClickListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lj$/util/Optional;Lj$/util/Optional;Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;ZZZZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->canPlayContent()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->forceFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getActiveFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/components/ConversationItemFooter; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBodyBubbleCorners(IIII)Lorg/thoughtcrime/securesms/util/Projection$Corners; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getDefaultBubbleColor(Z)I +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getDefaultTopMarginForRecord(Lorg/thoughtcrime/securesms/database/model/MessageRecord;II)I +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getGiftId()J +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getOpenableGiftProjection(Z)Lorg/thoughtcrime/securesms/util/Projection; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getRoot()Landroid/view/ViewGroup; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getSnapshotProjections(Landroid/view/ViewGroup;ZZ)Lorg/thoughtcrime/securesms/util/ProjectionList; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasAudio(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasDocument(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasLinkPreview(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasNoBubble(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasOnlyThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasSharedContact(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasSticker(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->initializeAttributes()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isBorderless(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isCaptionlessMms(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isCondensedMode()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isContentCondensed()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isEndOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isFooterVisible(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isGiftMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isSingularMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isStartOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isStoryReaction(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isViewOnceMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isWithinClusteringTime(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->onFinishInflate()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->onMeasure(II)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->onRecipientChanged(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->readDimen(I)I +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->readDimen(Landroid/content/Context;I)I +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setAuthor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;ZZ)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setBodyText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/String;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setBubbleState(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setContactPhoto(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setEventListener(Lorg/thoughtcrime/securesms/BindableConversationItem$EventListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Ljava/util/Locale;ZZ)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGroupAuthorColor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGroupMessageStatus(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGutterSizes(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setHasBeenQuoted(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setHasBeenScheduled(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setInteractionState(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMediaAttributes(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;ZZZZ)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMessageShape(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMessageSpacing(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setOnClickListener(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setOutlinerRadii(Lorg/thoughtcrime/securesms/components/Outliner;IIII)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setParentScrolling(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setReactions(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setStatusIcons(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setStoryReactionLabel(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setThumbnailCorners(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->shouldDrawBodyBubbleOutline(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->shouldInterceptClicks(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->showProjectionArea()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->unbind()V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$ExternalSyntheticLambda2;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->getProjections()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->init()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onDrawForeground(Landroid/graphics/Canvas;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onSizeChanged(IIII)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setBackground(Landroid/graphics/drawable/Drawable;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setOnSizeChangedListener(Lorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$OnSizeChangedListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setOutliners(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setParentScrolling(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setQuoteViewProjection(Lorg/thoughtcrime/securesms/util/Projection;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setVideoPlayerProjection(Lorg/thoughtcrime/securesms/util/Projection;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Detailed;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Detailed;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$EditHistory;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$EditHistory;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Standard;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Standard;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->(ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->(ZLkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$SwipeAvailabilityProvider;Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$OnSwipeListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->attachToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener$Callback;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage$ComputedProperties;->(Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage$ConversationMessageFactory;->createWithUnresolvedData(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/CharSequence;Ljava/util/List;ZLorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/CharSequence;Ljava/util/List;ZLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/conversation/ConversationMessage$ComputedProperties;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/CharSequence;Ljava/util/List;ZLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/conversation/ConversationMessage$ComputedProperties;Lorg/thoughtcrime/securesms/conversation/ConversationMessage-IA;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->equals(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getBottomButton()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList$BodyRange$Button; +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getConversationTimestamp()J +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getFormattedDate(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate; +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getMessageRecord()Lorg/thoughtcrime/securesms/database/model/MessageRecord; +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getMultiselectCollection()Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getThreadRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hasBeenQuoted()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hasStyleLinks()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hashCode()I +HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->isTextOnly(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->(Landroid/view/Menu;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->(Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback;Lorg/signal/core/util/concurrent/LifecycleDisposable;Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->(Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback;Lorg/signal/core/util/concurrent/LifecycleDisposable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->applyTitleSpan(Landroid/view/MenuItem;Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->hideMenuItem(Landroid/view/Menu;I)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->onCreateMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->setAfterFirstRenderMode(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->(Lorg/thoughtcrime/securesms/recipients/Recipient;ZLio/reactivex/rxjava3/core/Observable;ZZZZIJZZ)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component1()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component10()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component11()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component2()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component3()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component4()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component5()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component6()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component7()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component8()I +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component9()J +HSPLorg/thoughtcrime/securesms/conversation/ConversationRepository;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationRepository;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationRepository;->getConversationData(JLorg/thoughtcrime/securesms/recipients/Recipient;I)Lorg/thoughtcrime/securesms/conversation/ConversationData; +HSPLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->getSearchResults()Landroidx/lifecycle/LiveData; +HSPLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter$EventListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->setStickers(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFF)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFFLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator-IA;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FF)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FFF)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->dpToPx(I)I +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->clearExpiring()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->onFinishInflate()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setIndividualRecipientTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setOnStoryRingClickListener(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setRecipientTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setStoryRingFromState(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setTitle(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setVerified(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->updateSubtitleVisibility()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->updateVerifiedSubtitleVisibility()V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$GroupDataManager$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$GroupDataManager;)V @@ -20009,6 +21393,44 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->onFinishInflate()V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->setOnClickListener(Landroid/view/View$OnClickListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$1;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$OnTickListener;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda0;->()V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda1;->()V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->run()V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->$r8$lambda$gcFI10LhFCaBEmJzQp8t_xBcU8U(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->()V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;Landroid/content/Context;Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->getLatestTimestamp(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;Landroidx/recyclerview/widget/LinearLayoutManager;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->ignoreViewReveals()V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->lambda$onViewsRevealed$1(J)V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->onViewsRevealed(J)V +HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->stopIgnoringViewReveals(Ljava/lang/Long;)V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType$Creator;->()V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType;->()V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType;->()V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;->$values()[Lorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType; +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;->()V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType;->()V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType;->(IIIIILorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;Lorg/thoughtcrime/securesms/util/CharacterCalculator;Ljava/lang/CharSequence;Ljava/lang/Integer;)V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType;->(IIIIILorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;Lorg/thoughtcrime/securesms/util/CharacterCalculator;Ljava/lang/CharSequence;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType;->(IIIIILorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;Lorg/thoughtcrime/securesms/util/CharacterCalculator;Ljava/lang/CharSequence;Ljava/lang/Integer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType;->getButtonDrawableRes()I +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType;->getComposeHintRes()I +HSPLorg/thoughtcrime/securesms/conversation/MessageSendType;->getTitleRes()I HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result$Companion;->getNO_STYLE()Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; @@ -20017,17 +21439,49 @@ HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->()V HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->(ZLorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList$BodyRange$Button;)V HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->(ZLorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList$BodyRange$Button;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->access$getNO_STYLE$cp()Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; +HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->getBottomButton()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList$BodyRange$Button; +HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->getHasStyleLinks()Z +HSPLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->none()Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->()V HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->()V +HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->boldStyle()Landroid/text/style/CharacterStyle; +HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->italicStyle()Landroid/text/style/CharacterStyle; +HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->monoStyle()Landroid/text/style/CharacterStyle; +HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->strikethroughStyle()Landroid/text/style/CharacterStyle; HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->style$default(Ljava/lang/Object;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/text/Spannable;ZILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->style(Ljava/lang/Object;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/text/Spannable;)Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->style(Ljava/lang/Object;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/text/Spannable;Z)Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda3;->(Lio/reactivex/rxjava3/core/ObservableEmitter;J)V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->(J)V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->$r8$lambda$2XiX_Dh66c_pIVZzuRFfoiDjp1A(JLio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->()V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->()V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount$lambda$6(JLio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount(J)Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->()V +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->clearDraft()V +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; +HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->setListener(Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$Listener;)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->()V +HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->(Landroidx/activity/ComponentActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener;->()V +HSPLorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->$values()[Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->(Ljava/lang/String;ILjava/lang/String;I)V HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->colorInt()I HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->deserialize(Ljava/lang/String;)Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; -HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->random()Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->serialize()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->values()[Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; HSPLorg/thoughtcrime/securesms/conversation/colors/AvatarColorHash$$ExternalSyntheticBackport0;->m(II)I @@ -20059,6 +21513,8 @@ HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$BuiltIn;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$NotSet;->()V +HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$NotSet;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id;->(J)V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id;->(JLkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -20068,17 +21524,1270 @@ HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$LinearGradient;->< HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors$LinearGradient;->(F[I[F)V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$LinearGradient;Ljava/lang/Integer;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->asSingleColor()I HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->equals(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->isGradient()Z HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->withId(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id;)Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColorsPalette$Bubbles;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColorsPalette$Bubbles;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/ChatColorsPalette$Bubbles;->getDefault()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer$onGroupMembershipChanged$$inlined$sortedBy$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->()V +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->()V +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getDefaultColor(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)I +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingBodyTextColor(Landroid/content/Context;Z)I +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingFooterIconColor(Landroid/content/Context;Z)I +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingFooterTextColor(Landroid/content/Context;Z)I +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingGroupSenderColor(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)I +HSPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->onGroupMembershipChanged(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$edgeEffectFactory$1;->(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->drawShaderMask(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1;->(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->()V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getChatColors$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayerXfermode$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroid/graphics/PorterDuffXfermode; +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayoutManager(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroidx/recyclerview/widget/LinearLayoutManager; +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getNoLayerXfermode$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroid/graphics/PorterDuffXfermode; +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getUseLayer$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Z +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$setUseLayer$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;Z)V +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->getLayoutManager()Landroidx/recyclerview/widget/LinearLayoutManager; +HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->setChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->()V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Ljava/lang/CharSequence;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component1()Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component2()Ljava/lang/CharSequence; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Lkotlin/Pair; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->()V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->access$getShareOrDraftDataInternal(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)Lkotlin/Pair; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftDataInternal(J)Lkotlin/Pair; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->loadDraftsInternal(J)Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->()V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->getVoiceNoteDraft()Lorg/thoughtcrime/securesms/database/DraftTable$Draft; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Lkotlin/Pair;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/MaybeSource; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->()V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->(JLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->getVoiceNoteDraft()Lorg/thoughtcrime/securesms/database/DraftTable$Draft; +HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->loadShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->run()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->$r8$lambda$IJ0Uk3eauzGuBkd_D1PotCUrlIQ(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateSlide(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->isRunning()Z +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished$lambda$4(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->getMmsParts(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord;)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->getParts(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion;->fromSet(Ljava/util/Set;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->(Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->toSet()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->$values()[Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->values()[Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$WhenMappings;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->(Landroid/content/Context;Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->cleanPulseAnimators()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->consumePulseRequest(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawFocusShadeOverIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawFocusShadeUnderIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawPulseShadeOverIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->findAdapterBridge(Landroidx/recyclerview/widget/RecyclerView;)Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getCurrentSelection(Landroidx/recyclerview/widget/RecyclerView;)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getDifferenceForPart(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->hasRunningPulseRequestAnimators()Z +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->invalidateIfEnterExitAnimatorsAreRunning(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->invalidateIfPulseRequestAnimatorsAreRunning(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->resolveMultiselectable(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselectable; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateChildOffsets(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateMultiselectPartAnimator(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->hashCode()I +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->hashCode()I +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;->()V +HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->()V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;Landroid/view/View;Landroid/view/ViewGroup;Lorg/thoughtcrime/securesms/components/ComposeText;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->access$getEmojiPopup$p(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup; +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->dismiss()V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->onOrientationChange(Z)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->updateList(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Results;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->()V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;Lorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;Lorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getResults()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getSelection()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->()V +HSPLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->(Lorg/thoughtcrime/securesms/database/RecipientTable;)V +HSPLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->(Lorg/thoughtcrime/securesms/database/RecipientTable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener$TransitionListener$$ExternalSyntheticLambda0;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener$TransitionListener;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0;->run()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$1;->(Landroidx/activity/ComponentActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$2;->(Landroidx/activity/ComponentActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$3;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$4;->(Landroidx/activity/ComponentActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$5;->(Landroidx/activity/ComponentActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$stripeRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->$r8$lambda$rJaCnn2xrQlJTPwnM83GXFMdMzE(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onCreate$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onCreate(Landroid/os/Bundle;Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onPreCreate()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onResume()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->replaceFragment()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$ContactShareEditor;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$ContactShareEditor;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$GifSearch;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$GifSearch;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaCapture;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaCapture;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaGallery;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaGallery;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaSelection;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaSelection;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectContact;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectContact;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectFile;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectFile;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectLocation;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectLocation;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$cameraLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$contactShareLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$gifSearchLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$mediaGalleryLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$mediaSelectionLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectContactLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectFileLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectLocationLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Callbacks;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda5;->createViewHolder(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda7;->createViewHolder(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->bindPayloadsIfAvailable()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->canPlayContent()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getBindable()Lorg/thoughtcrime/securesms/BindableConversationItem; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getDisplayMode()Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getNextMessage()Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getPreviousMessage()Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->showProjectionArea()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$OnScrollStateChangedListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->invoke(Ljava/lang/String;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->$r8$lambda$RwrnJe2SKX6YQ0B5PDojQRbXNOc(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind$lambda$1(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->$r8$lambda$0GW66dll143qhTHiVUdlBHolclI(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->$r8$lambda$u2AJxgyeBquqI1nF9ok3s6g0b5Q(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->_init_$lambda$4(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->_init_$lambda$6(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getColorizer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getCondensedMode$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getHasWallpaper$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getInlineContent$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getLifecycleOwner$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Landroidx/lifecycle/LifecycleOwner; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$get_selected$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Ljava/util/HashSet; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->consumePulseRequest()Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge$PulseRequest; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getClickListener()Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getColorizer()Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getConversationMessage(I)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getDisplayMode()Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getGlideRequests()Lorg/thoughtcrime/securesms/mms/GlideRequests; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getNextMessage(I)Lorg/thoughtcrime/securesms/database/model/MessageRecord; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getPreviousMessage(I)Lorg/thoughtcrime/securesms/database/model/MessageRecord; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSearchQuery()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSelectedItems()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->hasNoConversationMessages()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->hasWallpaper()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->isMessageRequestAccepted()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->isParentInScroll()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onHasWallpaperChanged(Z)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setMessageRequestAccepted(Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setMessageRequestIsAccepted(Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setSearchQuery(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->updateSearchQuery(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearReminder()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearRequestReview()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearUnverifiedBanner()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearVoiceNotePlayer()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getReminderStub()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getReviewBannerStub()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getUnverifiedBannerStub()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getVoiceNotePlayerStub()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->hide(Lorg/thoughtcrime/securesms/util/views/Stub;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$Listener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda13;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda14;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActionModeCallback;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActivityResultCallbacks;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentKeyboardFragmentListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentManagerListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$BackPressedDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationBannerListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationItemClickListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$1;->(Landroidx/appcompat/widget/SearchView;Landroidx/appcompat/widget/SearchView$OnQueryTextListener;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroid/view/Menu;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$queryListener$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->clearExpiring()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->getSnapshot()Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->onOptionsMenuCreated(Landroid/view/Menu;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DisabledInputListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelMediaListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$KeyboardEvents;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroidx/recyclerview/widget/LinearLayoutManager;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$MotionEventRelayDrain;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper;->bind(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->$r8$lambda$SqiWUifYWEV36mNfvnPsrkHWoAw(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled$lambda$0(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->presentComposeDivider()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SearchEventListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SendButtonListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SwipeAvailabilityProvider;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->setToolbarMargin(I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroidx/appcompat/widget/Toolbar;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener;->onGlobalLayout()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$VoiceMessageRecordingSessionCallbacks;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$WhenMappings;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->invoke(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationGroupViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationGroupViewModel$2;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationGroupViewModel$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->invoke(Lj$/util/Optional;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->accept(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->invoke(I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Lj$/util/Optional;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$attachListener$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$1;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$3;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->invoke()Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->invoke(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$jumpAndPulseScrollStrategy$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke(Landroidx/lifecycle/SavedStateHandle;)Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->invoke()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->accept(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2;->accept(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->apply(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)Lio/reactivex/rxjava3/core/ObservableSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0;->run()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->run()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1;->(Landroid/view/View;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->$r8$lambda$oOR6vln5-HH0T67uKvvWOaEanvw(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->invoke$lambda$1(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->invoke(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1;->invoke()Landroidx/lifecycle/ViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1;->invoke()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1;->get()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->invoke(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$reactionDelegate$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->onChanged(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelStore; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$2;->(Lkotlin/jvm/functions/Function0;Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$2;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Landroidx/lifecycle/ViewModelStore; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->(Lkotlin/jvm/functions/Function0;Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelStore; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->(Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Landroidx/lifecycle/ViewModelStore; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->(Landroidx/fragment/app/Fragment;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$voiceNotePlayerListener$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$doAfterFirstRender(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAdapter$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getArgs(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getBinding(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getColorizer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeText(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ComposeText; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getConversationItemDecorations$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getConversationRecipientRepository(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getGroupCallViewModel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInlineQueryViewModel$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInputPanel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/InputPanel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getLayoutManager$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Landroidx/recyclerview/widget/ConversationLayoutManager; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getMarkReadHelper$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/MarkReadHelper; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getMessageRequestRepository(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getScrollToPositionDelegate$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getSearchMenuItem$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Landroid/view/MenuItem; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getThreadHeaderMarginDecoration$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getViewModel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$handleScheduledMessagesCountChange(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$invalidateOptionsMenu(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$isScrolledToBottom(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$isSearchRequested$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$moveToStartPosition(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/ConversationData;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$onRecipientChanged(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentIdentityRecordsState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentInputReadyState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentRequestReviewState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentScrollButtons(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setSearchMenuItem$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroid/view/MenuItem;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$updateMessageRequestAcceptedState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$updateToggleButtonState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->doAfterFirstRender()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getArgs()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getBinding()Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getComposeText()Lorg/thoughtcrime/securesms/components/ComposeText; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getContainer()Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getConversationGroupViewModel()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getConversationRecipientRepository()Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getDraftViewModel()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getGroupCallViewModel()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getInlineQueryController()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getInputPanel()Lorg/thoughtcrime/securesms/components/InputPanel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getKeyboardPagerViewModel()Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getLinkPreviewViewModel()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getMessageRequestRepository()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getMotionEventRelay()Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getScheduledMessagesStub()Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchNav()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchViewModel()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendButton()Lorg/thoughtcrime/securesms/components/SendButton; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendEditButton()Landroid/widget/ImageButton; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getShareDataTimestampViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getStickerViewModel()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->handleScheduledMessagesCountChange(I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeConversationThreadUi()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeGiphyMp4()Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeInlineSearch()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeLinkPreviews()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeMediaKeyboard()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeSearch()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeStickerSuggestions()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->invalidateOptionsMenu()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->isScrolledToBottom()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->moveToStartPosition(Lorg/thoughtcrime/securesms/conversation/ConversationData;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->observeConversationThread()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onCreate(Landroid/os/Bundle;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onRecipientChanged(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onResume()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onViewStateRestored(Landroid/os/Bundle;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentActionBarMenu()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentConversationTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentGroupCallJoinButton()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentIdentityRecordsState(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentInputReadyState(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentNavigationIconForNormal()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentRequestReviewState(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentScrollButtons(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentStoryRing()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentTypingIndicator()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentWallpaper(Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->registerForResults()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->updateMessageRequestAcceptedState(Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->updateToggleButtonState()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getHeight()I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getItemView()Landroid/view/View; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->updateForWallpaper()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->(ZZ)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->(ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->access$timestamp(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHasWallpaper()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHeader(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->hasHeader(I)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->isFirstUnread(I)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->setCurrentItems(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->setFirstUnreadCount(I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->setHasWallpaper(Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->timestamp(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->toEpochDay(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->updateUnreadState(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$$ExternalSyntheticLambda0;->(J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$$ExternalSyntheticLambda0;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->apply(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/ObservableSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->$r8$lambda$C1ukP4YSsuxMkwIfGNrqsHmBxh0(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->(J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->invoke$lambda$0(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->invoke()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1$$ExternalSyntheticLambda0;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->$r8$lambda$NvFETYLxPBjE2XjrolSGmoCr9vc(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->apply$lambda$0(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lio/reactivex/rxjava3/core/SingleSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2;->invoke()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->(J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->getConversationRecipient()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->getGroupRecord()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7;->(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->(II)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->getMentions()I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->getUnread()I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$1;->apply(Lkotlin/Unit;)Ljava/lang/Integer; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->apply(I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$98QfcuQyzMi7mf2qZrmWDK7X98k(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$KdCOHPNqejWN1AhOnsjSsYWIQ1E(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$SEmY6z8BVO3vpDRoIUBmm8tqjes(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$jYghkNuRsI_xLxRgZRxsCeMcFTc(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->(Landroid/content/Context;Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->access$getUnreadCount(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->access$getUnreadMentionsCount(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getConversationThreadState$lambda$0(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getConversationThreadState(JI)Lio/reactivex/rxjava3/core/Single; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords$lambda$11(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Single; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getMessageCounts(J)Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder$lambda$10(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder(Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Maybe; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState$lambda$15(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)Lio/reactivex/rxjava3/core/Single; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadCount(J)I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadMentionsCount(J)I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->(ZZZIZ)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->(ZZZIZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->copy$default(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;ZZZIZILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->copy(ZZZIZ)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getHasMentions()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getShowScrollButtons()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getUnreadCount()I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->toString()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->(Lorg/signal/paging/ObservablePagedData;Lorg/thoughtcrime/securesms/conversation/ConversationData;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->getItems()Lorg/signal/paging/ObservablePagedData; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->getMeta()Lorg/thoughtcrime/securesms/conversation/ConversationData; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->(Landroid/app/Activity;Landroid/view/View;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getActiveColorSet()Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getActiveToolbarColor(Z)I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getInactiveColorSet()Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getInactiveToolbarColor(Z)I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$5;->(Landroidx/fragment/app/Fragment;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$State;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$State;->(Ljava/util/List;ZZZ)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$State;->(Ljava/util/List;ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$State;->getTypists()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter;->(Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter;->getItemCount()I +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->apply(Lkotlin/Unit;Lj$/util/Optional;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Lj$/util/Optional;)Lio/reactivex/rxjava3/core/MaybeSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Lkotlin/Unit;Lorg/thoughtcrime/securesms/recipients/Recipient;Lj$/util/Optional;)Lkotlin/Pair; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/SingleSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15$1;->(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$16;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$1;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda0;->(Lorg/signal/paging/PagingController;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda1;->(Lorg/signal/paging/PagingController;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda2;->(Lorg/signal/paging/PagingController;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda4;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->$r8$lambda$6vD-MGLKaMLR-d3fYoBu824GBvs(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;Lio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->apply$lambda$4(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;Lio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->apply(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)Lio/reactivex/rxjava3/core/ObservableSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->test(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$6;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$8;->(Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$8;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$8;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;Lj$/util/Optional;)Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9;->accept(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9;->accept(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)Lio/reactivex/rxjava3/core/SingleSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Lj$/util/Optional;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->(ZZ)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lio/reactivex/rxjava3/core/ObservableSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->(JILorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$getHasMessageRequestStateSubject$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lio/reactivex/rxjava3/subjects/BehaviorSubject; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$getIdentityRecordsStore$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$getRepository$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$get_conversationThreadState$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lio/reactivex/rxjava3/subjects/Subject; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$setRecipientSnapshot$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->canShowAsBubble(Landroid/content/Context;)Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getConversationThreadState()Lio/reactivex/rxjava3/core/Single; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getGroupMemberServiceIds()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getHasMessageRequestState()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getIdentityRecordsObservable()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getInputReadyState()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getPagingController()Lorg/signal/paging/ProxyPagingController; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRecipient()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRecipientSnapshot()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getReminder()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRequestReviewState()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScheduledMessagesCount()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScrollButtonState()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getSearchQuery()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getStoryRingState()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getThreadId()J +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getWallpaperSnapshot()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->isPushAvailable()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->setShowScrollButtonsForScrollPosition(ZZ)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->updateIdentityRecordsInBackground()V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$inflater$2;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->clear()V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$Listener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->setWallpaperEnabled(Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isGroup()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isUnverified()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isVerified()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZZ)V +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getConversationRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getGroupRecord()Lorg/thoughtcrime/securesms/database/model/GroupRecord; +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getMessageRequestState()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isActiveGroup()Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isAnnouncementGroup()Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isClientExpired()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isRequestingMember()Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isUnauthorized()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->shouldShowInviteToSignal()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->setDrain(Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay$Drain;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->shouldShowReviewBanner()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->getTimestamp()J +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/String;)Lio/reactivex/rxjava3/core/SingleSource; +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->access$getStickerSearchRepository$p(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository; +HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->getStickers()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/audio/AudioRecorder;Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$SessionCallback;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;->(ZZLjava/lang/String;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;->getValue()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$threadRecipient$2;->(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$threadRecipient$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$threadRecipient$2;->invoke()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->(Landroid/content/Context;JLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;ZILorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->(Landroid/content/Context;JLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;ZILorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->access$getThreadId$p(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;)J +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getKey(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getKey(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getSizeInternal()I +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getThreadRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->load(IIILorg/signal/paging/PagedDataSource$CancellationSignal;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->loadThreadHeader()Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->size()I +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->toMappingModel(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageBackedKey;->(J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageBackedKey;->hashCode()I +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda0;->(Ljava/util/concurrent/Callable;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda0;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda1;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda1;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda2;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda2;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda3;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda3;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda4;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda4;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda5;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda5;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda6;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda6;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda7;->(Ljava/util/List;Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda7;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->(Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->getAttachments()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->getCalls()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->getHasBeenQuoted()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->getMentionsById()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->getPayments()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->getReactions()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;->getTimeLog()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult;->(Ljava/lang/Object;J)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult;->getDuration()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult;->getDurationNanos()J +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult;->getResult()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$Cs9l2XA1WNP95TiUSxohh7ra3Ww(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$FrUVeLhot38doVCglQFObvc5AaY(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$RMAc6YctMyIBPxCbXNgRTW89bsw(Ljava/util/List;Landroid/app/Application;)Lkotlin/Unit; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$VVeGNqSH8Ds974z_DCkG6lrE4Vk(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$f-lfvLq_IbuaQLneolXX3ub4kj4(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$tRT3GzOp1DPXuQw76v5coP2Wv1s(Ljava/util/List;)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$xdS5DH5tLLZB1PgnkW3I8tIGiDw(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->$r8$lambda$y9zmNO5eO3RqgCXAGsDgImftxNM(Ljava/util/concurrent/Callable;)Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch$lambda$1(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch$lambda$10(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch$lambda$11(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch$lambda$15(Ljava/util/List;Landroid/app/Application;)Lkotlin/Unit; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch$lambda$2(Ljava/util/List;)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch$lambda$3(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch$lambda$4(Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch(Ljava/util/List;)Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->submitTimed$lambda$23(Ljava/util/concurrent/Callable;)Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->submitTimed(Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->updateModelsWithData(Ljava/util/List;Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->updateWithData(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->(Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->getRecipientInfo()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeaderKey;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeaderKey;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZZ)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->copy(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZZ)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getActiveV2Group()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getHasCapacity()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getOngoingCall()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1$1;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1;->(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->apply(Lkotlin/Unit;Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->test(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->apply(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->getHasOngoingGroupCallSnapshot()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->peekGroupCall()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$1;->test(Lj$/util/Optional;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$1;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$3;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$3;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$4;->(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$Factory;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$Factory;->(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$Factory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$Factory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$duplicates$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$duplicates$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$1;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$1;->test(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$2;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;->(JLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;->(JLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;->updateGroupStateIfNeeded()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion$$ExternalSyntheticLambda0;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion$$ExternalSyntheticLambda0;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->$r8$lambda$-arOo52soPOPIS27YgHWzsDQIu8(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->applyBounds(Landroid/graphics/Rect;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->attach$lambda$0(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->attach(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->setGlobalChatColors(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->access$getGlobalChatColors$cp()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->access$getGlobalMask$cp()Landroid/graphics/drawable/Drawable; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->access$setGlobalChatColors$cp(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->access$setGlobalMask$cp(Landroid/graphics/drawable/Drawable;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->access$setLatestBounds$cp(Landroid/graphics/Rect;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->draw(Landroid/graphics/Canvas;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getMask()Landroid/graphics/drawable/Drawable; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getOpacity()I +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getOutline(Landroid/graphics/Outline;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->isSolidColor()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setCorners(Lorg/thoughtcrime/securesms/util/Projection$Corners;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setCorners([F)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setLocalChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->addOnMeasureListener(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnMeasureListener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->onMeasure(II)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->removeOnMeasureListener(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnMeasureListener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->setOnDispatchTouchEventListener(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnDispatchTouchEventListener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;->$values()[Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;->(Ljava/lang/String;IFF)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;->getBottomPadding()F +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;->getTopPadding()F +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;->isEndingShape()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;->isStartingShape()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->access$getCollapsedSpacing$cp()F +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->access$getDefaultSpacing$cp()F +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->getCornersLTR()Lorg/thoughtcrime/securesms/util/Projection$Corners; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isEndOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isSingularMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isStartOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->isWithinClusteringTime(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->setBodyBubbleCorners(FFFF)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->setMessageShape(Lorg/thoughtcrime/securesms/database/model/MessageRecord;ZI)Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Lorg/thoughtcrime/securesms/components/AvatarImageView;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Landroid/view/ViewGroup;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Lcom/google/android/material/imageview/ShapeableImageView;Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView;Lorg/thoughtcrime/securesms/components/DeliveryStatusView;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/ExpirationTimerView;Landroid/view/View;Landroid/widget/Space;Lorg/thoughtcrime/securesms/components/AlertView;Z)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getAlert()Lorg/thoughtcrime/securesms/components/AlertView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getBody()Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getBodyWrapper()Landroid/view/ViewGroup; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getDeliveryStatus()Lorg/thoughtcrime/securesms/components/DeliveryStatusView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getFooterBackground()Landroid/view/View; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getFooterDate()Landroid/widget/TextView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getFooterExpiry()Lorg/thoughtcrime/securesms/components/ExpirationTimerView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getFooterSpace()Landroid/widget/Space; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getReactions()Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getReply()Lcom/google/android/material/imageview/ShapeableImageView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getRoot()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getSenderBadge()Lorg/thoughtcrime/securesms/badges/BadgeImageView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getSenderName()Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->getSenderPhoto()Lorg/thoughtcrime/securesms/components/AvatarImageView; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->isIncoming()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridgeKt;->bridge(Lorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;)Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda0;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda4;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$PassthroughClickListener;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$ReactionMeasureListener;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$replyDelegate$1;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->$r8$lambda$ocilDMoff9b132TfYhzB6ol1qqk(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->_init_$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->bind(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->bind(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->canPlayContent()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getShape()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateBodyBubbleDrawable(Landroid/view/ViewGroup;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateChatColorsDrawable(Landroid/view/ViewGroup;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateFooterDrawable(Landroid/view/ViewGroup;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->isContentCondensed()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->isForcedFooter()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->linkifyMessageBody(Landroid/text/Spannable;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentAlert()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentBody()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentDate()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentDeliveryStatus()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentFooterBackground()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentFooterEndPadding()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentFooterExpiry()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentReactions()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentSender()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentSenderNameBackground()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentSenderNameColor()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->setConversationMessage(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->setShape(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->showProjectionArea()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$1;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$2;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$2;->invoke(Landroid/content/Context;Z)Ljava/lang/Integer; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyBubbleColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyTextColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)I +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getFooterBubbleColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getReplyIconBackgroundColor()I +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils;->linkifyUrlLinks(Landroid/text/Spannable;ZLorg/thoughtcrime/securesms/util/UrlClickHandler;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder;->getShapeDelegate()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder;->getThemeDelegate()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate$DisplayState;->$values()[Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate$DisplayState; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate$DisplayState;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate$DisplayState;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;Ljava/util/List;Landroid/view/View;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/widget/Space;Lorg/thoughtcrime/securesms/util/views/Stub;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->displayTuckedIntoBody()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->getFooterWidth()I +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPostMeasure()Z +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPreMeasure()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2Payload;->$values()[Lorg/thoughtcrime/securesms/conversation/v2/items/V2Payload; +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2Payload;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2Payload;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;Landroid/view/View;II)Z +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;I)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/MotionEvent;)Z HSPLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->setCallback(Lorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior$Callback;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$$ExternalSyntheticLambda1;->onClick(Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationDiffCallback;->()V @@ -20088,9 +22797,13 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Conversa HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->$values()[Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->values()[Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->$r8$lambda$2QDH4q4xSHpazU1KhZ4uhNUhhdI(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$OnConversationClickListener;Lorg/thoughtcrime/securesms/conversationlist/ClearFilterViewHolder$OnClearFilterClickListener;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->getItem(I)Lorg/thoughtcrime/securesms/conversationlist/model/Conversation; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->getItemViewType(I)I +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->lambda$onCreateViewHolder$1(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->notifyTimestampPayloadUpdate()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;ILjava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; @@ -20116,6 +22829,10 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$Extern HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda10;->accept(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda26;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;ILjava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda26;->run()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda28;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda28;->run()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda29;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;JI)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda29;->run(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda32;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda32;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda34;->(Landroid/content/Context;)V @@ -20162,6 +22879,8 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$Extern HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda9;->accept(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->canStartNestedScroll()Z +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->onStopNestedScroll()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Z)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$4$1$$ExternalSyntheticLambda0;->run()V @@ -20182,22 +22901,27 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$l HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$CHaS6EtcD8ZUzRob16bd4t2DfYA(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchState;)Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$MXbnRw_QuSRvu0100HnXToK4Bec(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$P74OAYq-GE64Wer4ReNxsVIAZy4(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;ILjava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$SjqQGnCYg0hI4HkBpa5riMMrMQ4(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$WxM-bD4JoTmHJH8u0wyp1qN0HG0(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/whispersystems/signalservice/api/websocket/WebSocketConnectionState;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$XUCe97UTDs7M-HFYX56xCDoC2LU(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$gaHPeGBLj1T27XM2mYRLMFHpFZs(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration$Builder;)Lkotlin/Unit; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$gxdX3HpiKzsdIozb_s5Yw8Ffv2o(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lj$/util/Optional;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$hEZTRWazW93Jz7EQVXpXVQkY9VM(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$iJUotN70H_1yimzrBAvjzwLI6XI(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;JILjava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$lQNSZ9ZvUINlOiP87Y2YfwCK4mw(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Landroid/content/Context;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$ClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;)Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$q8M4HOpj-dzvXcjgSAWL0Tav6QQ(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$qMaEvHiJjK9-v37ev9D8tnKbApM(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$xY1tugayO1Yb7N8B0MgQZvOIMbA(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lcom/google/android/material/appbar/CollapsingToolbarLayout;ILorg/thoughtcrime/securesms/conversationlist/chatfilter/FilterPullState;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterSource;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$fgetdefaultAdapter(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$fgetlist(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Landroidx/recyclerview/widget/RecyclerView; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$fgetpullView(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$fgetstartupStopwatch(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Lorg/signal/core/util/Stopwatch; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$fgetviewModel(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$misSearchOpen(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Z HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$monFirstRender(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->handleCreateConversation(JLorg/thoughtcrime/securesms/recipients/Recipient;I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->initializeListAdapters()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->initializeSearchListener()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->initializeTypingObserver()V @@ -20206,6 +22930,8 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->initi HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->isArchived()Z HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->isSearchOpen()Z HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->isSearchVisible()Z +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$handleCreateConversation$46(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$handleCreateConversation$47(Lorg/thoughtcrime/securesms/recipients/Recipient;JILjava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$initializeSearchListener$19(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$initializeViewModel$23(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$initializeViewModel$24(Lorg/whispersystems/signalservice/api/websocket/WebSocketConnectionState;)V @@ -20220,16 +22946,19 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambd HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$updateReminders$28(Lj$/util/Optional;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->mapSearchStateToConfiguration(Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchState;)Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchConfiguration; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onAttach(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onConversationClick(Lorg/thoughtcrime/securesms/conversationlist/model/Conversation;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onConversationListChanged(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onCreate(Landroid/os/Bundle;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onFirstRender()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onMegaphoneChanged(Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onPause()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onPostSubmitList(I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onPrepareOptionsMenu(Landroid/view/Menu;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onResume()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onStart()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onStop()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->requireCallback()Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$Callback; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->setAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V @@ -20237,23 +22966,27 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updat HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateMultiSelectState()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateReminders()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateSearchToolbarHint(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4;->onChanged(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->onChanged(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->run()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda6;->onChanged(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$LAkoq7MeJO-fCezsfjX-mK5pWPo(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Landroid/text/SpannableString;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$dlLpa5X9k6koT8N7PU2hVGd424s(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$uO5laplVi7cVt9Dj9uPwXCNI7Tk(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;Ljava/lang/CharSequence;)Landroid/text/SpannableString; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$k1MmUJ3xOtwOkC4HHJE6kKVtClw(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$m6UBhFD1iIvqrclbuOW7C8gY-JM(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;Ljava/lang/CharSequence;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bindThread(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->createFinalBodyWithMediaIcon(Landroid/content/Context;Ljava/lang/CharSequence;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->getThreadDisplayBody(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->lambda$getThreadDisplayBody$6(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;Ljava/lang/CharSequence;)Landroid/text/SpannableString; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->lambda$bindThread$1(Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->lambda$getThreadDisplayBody$9(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;Ljava/lang/CharSequence;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->observeDisplayBody(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/LiveData;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->observeRecipient(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/recipients/LiveRecipient;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->onDisplayBodyChanged(Landroid/text/SpannableString;)V @@ -20278,6 +23011,8 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$E HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ChatFilterRepository;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ChatFilterRepository;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$Companion;->()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter;->(Landroid/content/Context;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V @@ -20393,7 +23128,9 @@ HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilte HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->()V HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->access$getBinding$p(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;)Lorg/thoughtcrime/securesms/databinding/ConversationListFilterPullViewBinding; +HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->onSaveInstanceState()Landroid/os/Parcelable; HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->onUserDrag(F)V +HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->onUserDragFinished()V HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->setOnCloseClicked(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView$OnCloseClicked;)V HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->setOnFilterStateChanged(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView$OnFilterStateChanged;)V HSPLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->setState(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/FilterPullState;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterSource;)V @@ -20448,7 +23185,6 @@ HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type;->values()[Lorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type; HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V -HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->getThreadRecord()Lorg/thoughtcrime/securesms/database/model/ThreadRecord; HSPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->getType()Lorg/thoughtcrime/securesms/conversationlist/model/Conversation$Type; HSPLorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;->$values()[Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter; @@ -20464,6 +23200,14 @@ HSPLorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;->() HSPLorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;->(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;->(Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;->isEmpty()Z +HSPLorg/thoughtcrime/securesms/crash/CrashConfig$patterns$2;->()V +HSPLorg/thoughtcrime/securesms/crash/CrashConfig$patterns$2;->()V +HSPLorg/thoughtcrime/securesms/crash/CrashConfig$patterns$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/crash/CrashConfig$patterns$2;->invoke()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/crash/CrashConfig;->()V +HSPLorg/thoughtcrime/securesms/crash/CrashConfig;->()V +HSPLorg/thoughtcrime/securesms/crash/CrashConfig;->computePatterns()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/crash/CrashConfig;->getPatterns()Ljava/util/List; HSPLorg/thoughtcrime/securesms/crypto/AsymmetricMasterSecret;->(Lorg/signal/libsignal/protocol/ecc/ECPublicKey;Lorg/signal/libsignal/protocol/ecc/ECPrivateKey;)V HSPLorg/thoughtcrime/securesms/crypto/AttachmentSecret$ByteArrayDeserializer;->()V HSPLorg/thoughtcrime/securesms/crypto/AttachmentSecret$ByteArrayDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; @@ -20535,9 +23279,6 @@ HSPLorg/thoughtcrime/securesms/crypto/PreKeyUtil;->storeLastResortKyberPreKey(Lo HSPLorg/thoughtcrime/securesms/crypto/PreKeyUtil;->storeSignedPreKey(Lorg/signal/libsignal/protocol/state/SignalProtocolStore;Lorg/thoughtcrime/securesms/crypto/storage/PreKeyMetadataStore;Lorg/signal/libsignal/protocol/state/SignedPreKeyRecord;)V HSPLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->()V HSPLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->createNew()Lorg/signal/libsignal/zkgroup/profiles/ProfileKey; -HSPLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->getSelfProfileKey()Lorg/signal/libsignal/zkgroup/profiles/ProfileKey; -HSPLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->profileKeyOptional([B)Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->profileKeyOrNull([B)Lorg/signal/libsignal/zkgroup/profiles/ProfileKey; HSPLorg/thoughtcrime/securesms/crypto/ReentrantSessionLock$$ExternalSyntheticLambda0;->(Ljava/util/concurrent/locks/ReentrantLock;)V HSPLorg/thoughtcrime/securesms/crypto/ReentrantSessionLock$$ExternalSyntheticLambda0;->close()V HSPLorg/thoughtcrime/securesms/crypto/ReentrantSessionLock;->$values()[Lorg/thoughtcrime/securesms/crypto/ReentrantSessionLock; @@ -20545,6 +23286,12 @@ HSPLorg/thoughtcrime/securesms/crypto/ReentrantSessionLock;->()V HSPLorg/thoughtcrime/securesms/crypto/ReentrantSessionLock;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/crypto/ReentrantSessionLock;->acquire()Lorg/whispersystems/signalservice/api/SignalSessionLock$Lock; HSPLorg/thoughtcrime/securesms/crypto/SenderKeyUtil;->clearAllState()V +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda1;->()V +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda2;->()V +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda3;->()V +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache;Ljava/lang/String;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache$$ExternalSyntheticLambda3;->run()V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache;->$r8$lambda$7HwivD63yrsET6yjsVpd_w19Vyg(Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache;Ljava/lang/String;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V @@ -20556,6 +23303,7 @@ HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache;- HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->()V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/IdentityTable;)V +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->getIdentityRecords(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/identity/IdentityRecordList; HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->saveIdentity(Lorg/signal/libsignal/protocol/SignalProtocolAddress;Lorg/signal/libsignal/protocol/IdentityKey;)Z HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->saveIdentity(Lorg/signal/libsignal/protocol/SignalProtocolAddress;Lorg/signal/libsignal/protocol/IdentityKey;Z)Lorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore$SaveResult; HSPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->saveIdentityWithoutSideEffects(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V @@ -20564,6 +23312,7 @@ HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore$SaveResult; HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore$SaveResult;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->(Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;Lj$/util/function/Supplier;)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->getIdentityKeyPair()Lorg/signal/libsignal/protocol/IdentityKeyPair; +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->getIdentityRecords(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/identity/IdentityRecordList; HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->saveIdentity(Lorg/signal/libsignal/protocol/SignalProtocolAddress;Lorg/signal/libsignal/protocol/IdentityKey;)Z HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->saveIdentityWithoutSideEffects(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalKyberPreKeyStore;->()V @@ -20588,26 +23337,34 @@ HSPLorg/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore;->storeSigne HSPLorg/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore;->()V HSPLorg/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore;->(Lorg/whispersystems/signalservice/api/push/ServiceId;)V HSPLorg/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore;->archiveAllSessions()V +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties$Companion;->empty()Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties$Companion;->parse(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties$Creator;->()V HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->()V -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->(ZZJJI)V -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->empty()Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties; -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->getSentMediaQuality()I -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->getVideoTrimEndTimeUs()J -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->getVideoTrimStartTimeUs()J -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->isVideoEdited()Z -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->isVideoTrim()Z -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->parse(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties; -HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->serialize()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->(ZZJJIZ)V +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->access$getDEFAULT_MEDIA_QUALITY$cp()I +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$insertAttachment$attachmentId$1;->(Lorg/thoughtcrime/securesms/attachments/Attachment;Lorg/thoughtcrime/securesms/database/AttachmentTable;JZLkotlin/jvm/internal/Ref$BooleanRef;)V +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$insertAttachment$attachmentId$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$insertAttachment$attachmentId$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)Lorg/thoughtcrime/securesms/attachments/AttachmentId; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->()V HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;Lorg/thoughtcrime/securesms/crypto/AttachmentSecret;)V -HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->containsStickerPackId(Ljava/lang/String;)Z +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->access$getVisualHashStringOrNull(Lorg/thoughtcrime/securesms/database/AttachmentTable;Lorg/thoughtcrime/securesms/attachments/Attachment;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->deleteAbandonedPreuploadedAttachments()I -HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachment(Lorg/thoughtcrime/securesms/attachments/AttachmentId;)Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachment(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachments(Landroid/database/Cursor;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachmentsForMessage(J)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachmentsForMessages(Ljava/util/Collection;)Ljava/util/Map; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getVisualHashStringOrNull(Lorg/thoughtcrime/securesms/attachments/Attachment;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->hasStickerAttachments()Z HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->insertAttachment(JLorg/thoughtcrime/securesms/attachments/Attachment;Z)Lorg/thoughtcrime/securesms/attachments/AttachmentId; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->insertAttachmentsForMessage(JLjava/util/List;Ljava/util/List;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->readAttachment(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->readAttachments(Landroid/database/Cursor;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->readStickerLocator(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/stickers/StickerLocator; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->setTransferProgressPermanentFailure(Lorg/thoughtcrime/securesms/attachments/AttachmentId;J)V HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->setTransferState(JLorg/thoughtcrime/securesms/attachments/AttachmentId;I)V HSPLorg/thoughtcrime/securesms/database/BodyAdjustment;->()V @@ -20618,8 +23375,16 @@ HSPLorg/thoughtcrime/securesms/database/CallLinkTable;->()V HSPLorg/thoughtcrime/securesms/database/CallLinkTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/CallTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/CallTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/CallTable$Event$Serializer;->()V +HSPLorg/thoughtcrime/securesms/database/CallTable$Event$Serializer;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/CallTable$Event$Serializer;->serialize(Lorg/thoughtcrime/securesms/database/CallTable$Event;)Ljava/lang/Integer; +HSPLorg/thoughtcrime/securesms/database/CallTable$Event;->$values()[Lorg/thoughtcrime/securesms/database/CallTable$Event; +HSPLorg/thoughtcrime/securesms/database/CallTable$Event;->()V +HSPLorg/thoughtcrime/securesms/database/CallTable$Event;->(Ljava/lang/String;II)V +HSPLorg/thoughtcrime/securesms/database/CallTable$Event;->access$getCode$p(Lorg/thoughtcrime/securesms/database/CallTable$Event;)I HSPLorg/thoughtcrime/securesms/database/CallTable;->()V HSPLorg/thoughtcrime/securesms/database/CallTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/CallTable;->getCalls(Ljava/util/Collection;)Ljava/util/Map; HSPLorg/thoughtcrime/securesms/database/CallTable;->getOldestDeletionTimestamp()J HSPLorg/thoughtcrime/securesms/database/CdsTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/CdsTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -20635,34 +23400,41 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onDelete(Ljava/lang/St HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onQuery(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onSql(Ljava/lang/String;[Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onUpdate(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda20;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda20;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda23;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda23;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda24;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda24;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda29;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda29;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda32;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda32;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda36;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda36;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda37;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda37;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda40;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda40;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda4;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5;->run()V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$6mdIgDDCV4XFVFnyxH8Vj4a6MqU(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$Aq7iz6-OcN5qdEpvMz8WyoOoHtc(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$FLqOSncPM9UHAHmQfH7ITyYgYis(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$P-H8JPj8WgBa8EorlTkjTC0yG1E(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$Q9T3e0x03-9UyovUEacfv32ZkYs(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$XcpL0fyOGdTr1sc4d0z4i8eoe14(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$dh6RWMfCAixhY74q-duAcBwIwmU(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$XpAe1b_YlxfSEkV3hD_v20iDkHw(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$mv9tymw4eNQuLtAMo52Pot0i2c4(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$nM9Xevlg3i5jd4hhWqCSJ8V0APs(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$v9-I7k7VKIptUuQHIpRZcaVjlwY(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$oXFDlhvhHFY1OBIQHYp3Oanmq-k(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$wnm9BEANNc03FZmWKcqOLSgrT_U(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$wtkgxGON7fTcqqEso3BleXuYIA8(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$zacSulZCbj18KAJ4fsL5guxghT4(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->(Landroid/app/Application;)V @@ -20670,11 +23442,13 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyAttachme HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversationListListeners$22()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversationListeners$19(J)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyRecipientChanged$34(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyStickerObservers$26()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyStickerPackObservers$27()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyStoryObservers$35(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerConversationListObserver$0(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerConversationObserver$1(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageInsertObserver$11(JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageUpdateObserver$10(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerNotificationProfileObserver$12(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerStoryObserver$13(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerVerboseConversationObserver$2(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$runPostSuccessfulTransaction$40(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyAttachmentObservers()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyConversationListListeners()V @@ -20682,11 +23456,15 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyConversationLis HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyMapped(Ljava/util/Map;Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyRecipientChanged(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifySet(Ljava/util/Set;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyStickerObservers()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyStickerPackObservers()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyStoryObservers(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerConversationListObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerConversationObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMapped(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMessageInsertObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMessageUpdateObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerNotificationProfileObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerScheduledMessageObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerStoryObserver(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerVerboseConversationObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->()V HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V @@ -20695,8 +23473,6 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->getWritableDatabase()Lor HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyAttachmentListeners()V HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyConversationListListeners()V HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyConversationListeners(J)V -HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyStickerListeners()V -HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyStickerPackListeners()V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$Companion;->()V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$ListTable;->()V @@ -20715,6 +23491,7 @@ HSPLorg/thoughtcrime/securesms/database/DraftTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/DraftTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->()V HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->getDraftOfType(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/DraftTable$Draft; HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->getSize()I HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->size()I HSPLorg/thoughtcrime/securesms/database/DraftTable;->()V @@ -20727,6 +23504,7 @@ HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable$setSearchIndex$1;->(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable$setSearchIndex$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable$setSearchIndex$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable;->()V HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/EmojiSearchTable;->setSearchIndex(Ljava/util/List;)V @@ -20754,6 +23532,10 @@ HSPLorg/thoughtcrime/securesms/database/GroupTable;->access$getTYPED_GROUP_PROJE HSPLorg/thoughtcrime/securesms/database/GroupTable;->getAllGroupV2Ids()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/GroupTable;->getGroup(Lorg/signal/core/util/SqlUtil$Query;)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/database/GroupTable;->getGroup(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/database/GroupTable;->getGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/GroupTable;->getGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZ)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/GroupTable;->getPushGroupNamesContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/GroupTable;->getPushGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/IdentityTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/IdentityTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus$Companion;->()V @@ -20769,29 +23551,25 @@ HSPLorg/thoughtcrime/securesms/database/IdentityTable;->(Landroid/content/ HSPLorg/thoughtcrime/securesms/database/IdentityTable;->getIdentityStoreRecord(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/model/IdentityStoreRecord; HSPLorg/thoughtcrime/securesms/database/IdentityTable;->saveIdentity(Ljava/lang/String;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V HSPLorg/thoughtcrime/securesms/database/IdentityTable;->saveIdentityInternal(Ljava/lang/String;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0;->()V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda1;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda2;->()V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda3;->()V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda3;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda4;->()V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda4;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda5;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda6;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda6;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/database/JobDatabase;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda7;->run()V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->$r8$lambda$BsPVVGZod2nqQD1HmywOGTfvp6Y(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->$r8$lambda$JoscJHptUxJSQTEVntAL30E5xnw(Lorg/thoughtcrime/securesms/database/JobDatabase;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->$r8$lambda$LlTWVaEVaZDbMICho_jDOtCOPf8(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->$r8$lambda$SY1Zrt2qASn5UxgOSFfDtu2aKo8(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/database/JobDatabase;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0;->run()V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$Companion;->getInstance(Landroid/app/Application;)Lorg/thoughtcrime/securesms/database/JobDatabase; +HSPLorg/thoughtcrime/securesms/database/JobDatabase$deleteJobs$1;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$deleteJobs$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/JobDatabase$deleteJobs$1;->invoke(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$insertJobs$2;->(Ljava/util/List;Lorg/thoughtcrime/securesms/database/JobDatabase;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase$insertJobs$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/JobDatabase$insertJobs$2;->invoke(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->$r8$lambda$ou_p531IVGikC2LNueT6qnVrWyc(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->()V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->constraintSpecFromCursor(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec; +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$getInstance$cp()Lorg/thoughtcrime/securesms/database/JobDatabase; +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$insertConstraintSpecs(Lorg/thoughtcrime/securesms/database/JobDatabase;Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$insertDependencySpecs(Lorg/thoughtcrime/securesms/database/JobDatabase;Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$insertJobSpec(Lorg/thoughtcrime/securesms/database/JobDatabase;Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->access$setInstance$cp(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->deleteJobs(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->dropTableIfPresent(Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->getAllConstraintSpecs()Ljava/util/List; @@ -20802,16 +23580,10 @@ HSPLorg/thoughtcrime/securesms/database/JobDatabase;->insertConstraintSpecs(Lnet HSPLorg/thoughtcrime/securesms/database/JobDatabase;->insertDependencySpecs(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->insertJobSpec(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->insertJobs(Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->jobSpecFromCursor(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->lambda$insertConstraintSpecs$2(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->lambda$insertDependencySpecs$3(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec;)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->lambda$onOpen$0()V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->lambda$updateJobs$1(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->markJobAsRunning(Ljava/lang/String;J)V +HSPLorg/thoughtcrime/securesms/database/JobDatabase;->onOpen$lambda$0(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->onOpen(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/JobDatabase;->updateAllJobsToBePending()V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->updateJobAfterRetry(Ljava/lang/String;ZIJ[B)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->updateJobRunningState(Ljava/lang/String;Z)V -HSPLorg/thoughtcrime/securesms/database/JobDatabase;->updateJobs(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$$ExternalSyntheticLambda0;->()V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/database/KeyValueDatabase$1;->()V @@ -20862,17 +23634,45 @@ HSPLorg/thoughtcrime/securesms/database/LocalMetricsDatabase;->splitPercent(Ljav HSPLorg/thoughtcrime/securesms/database/LogDatabase$Companion;->()V HSPLorg/thoughtcrime/securesms/database/LogDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/LogDatabase$Companion;->getInstance(Landroid/app/Application;)Lorg/thoughtcrime/securesms/database/LogDatabase; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$CrashTable$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$CrashTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$CrashTable;->()V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$CrashTable;->(Lorg/thoughtcrime/securesms/database/LogDatabase;)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$CrashTable;->anyMatch(Ljava/util/Collection;J)Z +HSPLorg/thoughtcrime/securesms/database/LogDatabase$CrashTable;->getWritableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$CrashTable;->trimToSize()V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable$Companion;->getDEFAULT_LIFESPAN()J +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable$Companion;->getLONGER_LIFESPAN()J +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable$insert$1;->(Ljava/util/List;J)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable$insert$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->()V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->(Lorg/thoughtcrime/securesms/database/LogDatabase;)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->access$getDEFAULT_LIFESPAN$cp()J +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->access$getLONGER_LIFESPAN$cp()J +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->getReadableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->getSize(Ljava/lang/String;[Ljava/lang/String;)J +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->getWritableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->insert(Ljava/util/List;J)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$LogTable;->trimToSize()V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$anrs$2;->(Lorg/thoughtcrime/securesms/database/LogDatabase;)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$crashes$2;->(Lorg/thoughtcrime/securesms/database/LogDatabase;)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$crashes$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$crashes$2;->invoke()Lorg/thoughtcrime/securesms/database/LogDatabase$CrashTable; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$logs$2;->(Lorg/thoughtcrime/securesms/database/LogDatabase;)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase$logs$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/LogDatabase$logs$2;->invoke()Lorg/thoughtcrime/securesms/database/LogDatabase$LogTable; HSPLorg/thoughtcrime/securesms/database/LogDatabase;->()V HSPLorg/thoughtcrime/securesms/database/LogDatabase;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;)V HSPLorg/thoughtcrime/securesms/database/LogDatabase;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/crypto/DatabaseSecret;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/LogDatabase;->access$getInstance$cp()Lorg/thoughtcrime/securesms/database/LogDatabase; +HSPLorg/thoughtcrime/securesms/database/LogDatabase;->access$getTAG$cp()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/LogDatabase;->access$setInstance$cp(Lorg/thoughtcrime/securesms/database/LogDatabase;)V -HSPLorg/thoughtcrime/securesms/database/LogDatabase;->buildValues(Lorg/thoughtcrime/securesms/database/model/LogEntry;)Landroid/content/ContentValues; +HSPLorg/thoughtcrime/securesms/database/LogDatabase;->crashes()Lorg/thoughtcrime/securesms/database/LogDatabase$CrashTable; HSPLorg/thoughtcrime/securesms/database/LogDatabase;->getInstance(Landroid/app/Application;)Lorg/thoughtcrime/securesms/database/LogDatabase; -HSPLorg/thoughtcrime/securesms/database/LogDatabase;->getSize(Ljava/lang/String;[Ljava/lang/String;)J -HSPLorg/thoughtcrime/securesms/database/LogDatabase;->insert(Ljava/util/List;J)V +HSPLorg/thoughtcrime/securesms/database/LogDatabase;->logs()Lorg/thoughtcrime/securesms/database/LogDatabase$LogTable; HSPLorg/thoughtcrime/securesms/database/LogDatabase;->onOpen(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V -HSPLorg/thoughtcrime/securesms/database/LogDatabase;->trimToSize()V HSPLorg/thoughtcrime/securesms/database/MediaTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/MediaTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/MediaTable;->()V @@ -20892,8 +23692,10 @@ HSPLorg/thoughtcrime/securesms/database/MegaphoneDatabase;->onOpen(Lnet/zetetic/ HSPLorg/thoughtcrime/securesms/database/MentionTable;->()V HSPLorg/thoughtcrime/securesms/database/MentionTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/MentionTable;->getMentionsForMessage(J)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/MentionTable;->getMentionsForMessages(Ljava/util/Collection;)Ljava/util/Map; HSPLorg/thoughtcrime/securesms/database/MentionTable;->insert(JJLjava/util/Collection;)V -HSPLorg/thoughtcrime/securesms/database/MentionUtil$$ExternalSyntheticLambda3;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/database/MentionTable;->readMentions(Landroid/database/Cursor;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/database/MentionUtil$$ExternalSyntheticLambda4;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/database/MentionUtil$UpdatedBodyAndMentions;->(Ljava/lang/CharSequence;Ljava/util/List;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/MentionUtil$UpdatedBodyAndMentions;->(Ljava/lang/CharSequence;Ljava/util/List;Ljava/util/List;Lorg/thoughtcrime/securesms/database/MentionUtil$UpdatedBodyAndMentions-IA;)V HSPLorg/thoughtcrime/securesms/database/MentionUtil$UpdatedBodyAndMentions;->getBody()Ljava/lang/CharSequence; @@ -20941,24 +23743,34 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable$InsertResult;->(JJLja HSPLorg/thoughtcrime/securesms/database/MessageTable$InsertResult;->getMessageId()J HSPLorg/thoughtcrime/securesms/database/MessageTable$MarkedMessageInfo;->()V HSPLorg/thoughtcrime/securesms/database/MessageTable$MarkedMessageInfo;->(JLorg/thoughtcrime/securesms/database/MessageTable$SyncMessageId;Lorg/thoughtcrime/securesms/database/model/MessageId;Lorg/thoughtcrime/securesms/database/MessageTable$ExpirationInfo;Lorg/thoughtcrime/securesms/database/model/StoryType;)V +HSPLorg/thoughtcrime/securesms/database/MessageTable$MessageQualifier;->$values()[Lorg/thoughtcrime/securesms/database/MessageTable$MessageQualifier; +HSPLorg/thoughtcrime/securesms/database/MessageTable$MessageQualifier;->()V +HSPLorg/thoughtcrime/securesms/database/MessageTable$MessageQualifier;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/database/MessageTable$MessageQualifier;->values()[Lorg/thoughtcrime/securesms/database/MessageTable$MessageQualifier; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$Companion;->()V HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$Companion;->buildSlideDeck(Landroid/content/Context;Ljava/util/List;)Lorg/thoughtcrime/securesms/mms/SlideDeck; +HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$Companion;->buildSlideDeck(Ljava/util/List;)Lorg/thoughtcrime/securesms/mms/SlideDeck; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$ReaderIterator;->(Lorg/thoughtcrime/securesms/database/MessageTable$MmsReader;)V HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$ReaderIterator;->hasNext()Z +HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$ReaderIterator;->next()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$ReaderIterator;->next()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->()V HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->(Landroid/database/Cursor;)V +HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->buildSlideDeck(Ljava/util/List;)Lorg/thoughtcrime/securesms/mms/SlideDeck; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->close()V HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getCurrent()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getCursor()Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getFailures(Ljava/lang/String;)Ljava/util/Set; -HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getMediaMmsMessageRecord(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord; +HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getMediaMmsMessageRecord(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getMismatchedIdentities(Ljava/lang/String;)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getNext()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getQuote(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/Quote; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->iterator()Ljava/util/Iterator; +HSPLorg/thoughtcrime/securesms/database/MessageTable$QuoteDescriptor;->(JLorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/MessageTable$QuoteDescriptor;->hashCode()I HSPLorg/thoughtcrime/securesms/database/MessageTable$SyncMessageId;->()V HSPLorg/thoughtcrime/securesms/database/MessageTable$SyncMessageId;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;J)V +HSPLorg/thoughtcrime/securesms/database/MessageTable$WhenMappings;->()V HSPLorg/thoughtcrime/securesms/database/MessageTable$getConversationSnippet$1;->()V HSPLorg/thoughtcrime/securesms/database/MessageTable$getConversationSnippet$1;->()V HSPLorg/thoughtcrime/securesms/database/MessageTable$getConversationSnippet$1;->invoke(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; @@ -20974,19 +23786,22 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable;->access$getOutgoingTypeCla HSPLorg/thoughtcrime/securesms/database/MessageTable;->access$getSerializedLinkPreviews(Lorg/thoughtcrime/securesms/database/MessageTable;Ljava/util/Map;Ljava/util/List;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/MessageTable;->access$getSerializedSharedContacts(Lorg/thoughtcrime/securesms/database/MessageTable;Ljava/util/Map;Ljava/util/List;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/MessageTable;->buildMeaningfulMessagesQuery(J)Lorg/signal/core/util/SqlUtil$Query; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->generatePduCompatTimestamp(J)J HSPLorg/thoughtcrime/securesms/database/MessageTable;->getAllRateLimitedMessageIds()Ljava/util/Set; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->getAllStoriesFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;I)Lorg/thoughtcrime/securesms/database/MessageTable$Reader; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->getConversation(JJJ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getConversationSnippet(J)Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getConversationSnippetCursor(J)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getExpirationStartedMessages()Landroid/database/Cursor; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->getMessageCountForThread(J)I HSPLorg/thoughtcrime/securesms/database/MessageTable;->getMessageRecord(J)Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getNearestExpiringViewOnceMessage()Lorg/thoughtcrime/securesms/revealable/ViewOnceExpirationInfo; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getOldestScheduledSendTimestamp()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getOldestStorySendTimestamp(Z)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getReleaseChannelThreadId(Z)J +HSPLorg/thoughtcrime/securesms/database/MessageTable;->getScheduledMessageCountForThread(J)I HSPLorg/thoughtcrime/securesms/database/MessageTable;->getSerializedLinkPreviews(Ljava/util/Map;Ljava/util/List;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getSerializedSharedContacts(Ljava/util/Map;Ljava/util/List;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->getStoryViewState(J)Lorg/thoughtcrime/securesms/database/model/StoryViewState; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->getStoryViewState(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/StoryViewState; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getThreadIdForMessage(J)J HSPLorg/thoughtcrime/securesms/database/MessageTable;->getUnreadCount(J)I HSPLorg/thoughtcrime/securesms/database/MessageTable;->getUnreadMentionCount(J)I @@ -20995,29 +23810,39 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable;->getUnreadStoryThreadRecip HSPLorg/thoughtcrime/securesms/database/MessageTable;->hasFailedOutgoingStory()Z HSPLorg/thoughtcrime/securesms/database/MessageTable;->hasMeaningfulMessage(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertMediaMessage(JLjava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/content/ContentValues;Lorg/thoughtcrime/securesms/database/MessageTable$InsertListener;ZZ)Lkotlin/Pair; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertMessageInbox(Lorg/thoughtcrime/securesms/mms/IncomingMediaMessage;Ljava/lang/String;JJLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;Z)Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertSecureDecryptedMessageInbox$default(Lorg/thoughtcrime/securesms/database/MessageTable;Lorg/thoughtcrime/securesms/mms/IncomingMediaMessage;JLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;ZILjava/lang/Object;)Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertSecureDecryptedMessageInbox(Lorg/thoughtcrime/securesms/mms/IncomingMediaMessage;JLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;Z)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertMessageInbox$default(Lorg/thoughtcrime/securesms/database/MessageTable;Lorg/thoughtcrime/securesms/mms/IncomingMessage;JLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;ZILjava/lang/Object;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertMessageInbox(Lorg/thoughtcrime/securesms/mms/IncomingMessage;JLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;Z)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->isQuoted(Ljava/util/Collection;)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/database/MessageTable;->mmsReaderFor(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/MessageTable$MmsReader; HSPLorg/thoughtcrime/securesms/database/MessageTable;->rawQueryWithAttachments$default(Lorg/thoughtcrime/securesms/database/MessageTable;Ljava/lang/String;[Ljava/lang/String;ZJILjava/lang/Object;)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->rawQueryWithAttachments(Ljava/lang/String;[Ljava/lang/String;ZJ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->rawQueryWithAttachments([Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;ZJ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->setAllMessagesRead()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/MessageTable;->setMessagesRead(Ljava/lang/String;[Ljava/lang/String;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->toMessageType(Lorg/thoughtcrime/securesms/mms/IncomingMessage;)J HSPLorg/thoughtcrime/securesms/database/MessageTable;->updatePendingSelfData(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/MessageType;->$values()[Lorg/thoughtcrime/securesms/database/MessageType; +HSPLorg/thoughtcrime/securesms/database/MessageType;->()V +HSPLorg/thoughtcrime/securesms/database/MessageType;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/database/MessageType;->values()[Lorg/thoughtcrime/securesms/database/MessageType; HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->()V HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isBadDecryptType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isBoostRequest(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isBundleKeyExchange(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isCallLog(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isChangeNumber(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isChatSessionRefresh(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isDraftMessageType(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isDuplicateMessageType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isEndSessionType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isExpirationTimerUpdate(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isFailedMessageType(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isForcedSms(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isGiftBadge(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isGroupCall(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isGroupQuit(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isGroupUpdate(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isGroupV1MigrationEvent(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isGroupV2(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isIdentityDefault(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isIdentityUpdate(J)Z @@ -21036,9 +23861,15 @@ HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isOutgoingVideoCall(J HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPaymentsActivated(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPaymentsNotification(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPaymentsRequestToActivate(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPendingInsecureSmsFallbackType(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPendingMessageType(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPendingSecureSmsFallbackType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isProfileChange(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPushType(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isRateLimited(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSecureType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSessionSwitchoverType(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSmsExport(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isStoryReaction(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isThreadMergeType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isUnsupportedMessageType(J)Z @@ -21072,6 +23903,7 @@ HSPLorg/thoughtcrime/securesms/database/OneTimePreKeyTable;->()V HSPLorg/thoughtcrime/securesms/database/OneTimePreKeyTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/PaymentTable;->()V HSPLorg/thoughtcrime/securesms/database/PaymentTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V +HSPLorg/thoughtcrime/securesms/database/PaymentTable;->getPayments(Ljava/util/Collection;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/PendingPniSignatureMessageTable;->()V @@ -21106,9 +23938,6 @@ HSPLorg/thoughtcrime/securesms/database/PnpIdResolver$PnpInsert;->(Ljava/l HSPLorg/thoughtcrime/securesms/database/PnpIdResolver$PnpInsert;->getAci()Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; HSPLorg/thoughtcrime/securesms/database/PnpIdResolver$PnpInsert;->getE164()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/PnpIdResolver$PnpInsert;->getPni()Lorg/whispersystems/signalservice/api/push/ServiceId$PNI; -HSPLorg/thoughtcrime/securesms/database/PnpIdResolver$PnpNoopId;->()V -HSPLorg/thoughtcrime/securesms/database/PnpIdResolver$PnpNoopId;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/PnpIdResolver$PnpNoopId;->getRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/PnpIdResolver;->()V HSPLorg/thoughtcrime/securesms/database/PnpIdResolver;->()V HSPLorg/thoughtcrime/securesms/database/PnpIdResolver;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -21116,18 +23945,12 @@ HSPLorg/thoughtcrime/securesms/database/ReactionTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/ReactionTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/ReactionTable;->()V HSPLorg/thoughtcrime/securesms/database/ReactionTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda11;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda2;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda3;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda5;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda5;->run()V +HSPLorg/thoughtcrime/securesms/database/ReactionTable;->getReactionsForMessages(Ljava/util/Collection;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda1;->run()V HSPLorg/thoughtcrime/securesms/database/RecipientTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$GetOrInsertResult;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$GetOrInsertResult;->getRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/database/RecipientTable$Companion;->maskCapabilitiesToLong(Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities;)J HSPLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting$Companion;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting$Companion;->fromId(I)Lorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting; @@ -21136,6 +23959,14 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;-> HSPLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;->(Ljava/lang/String;II)V HSPLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;->getId()I HSPLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;->values()[Lorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting; +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState$Companion;->fromId(I)Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;->$values()[Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;->(Ljava/lang/String;II)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;->getId()I +HSPLorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;->values()[Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; HSPLorg/thoughtcrime/securesms/database/RecipientTable$ProcessPnpTupleResult;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTable$ProcessPnpTupleResult;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZLjava/util/Set;Ljava/util/Set;Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/util/List;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable$ProcessPnpTupleResult;->getAffectedIds()Ljava/util/Set; @@ -21180,20 +24011,14 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;->() HSPLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;->(Ljava/lang/String;II)V HSPLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;->getId()I HSPLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;->values()[Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState; -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getRecipientExtras$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getRecipientExtras$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$forcedUnread$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$forcedUnread$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$forcedUnread$1;->invoke(I)Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$forcedUnread$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$groupMasterKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$groupMasterKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$identityKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$identityKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$identityStatus$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$identityStatus$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->$r8$lambda$H4xaRiSx07ilg9i2d971Z6FJviY(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->$r8$lambda$amPdLjLBHAwje9BgE-uLdoGDNrI()V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3$$ExternalSyntheticLambda0;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3$$ExternalSyntheticLambda0;->run()V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3;->$r8$lambda$VUPjpJzVVE8vlQGmPfSlIlqx-mg(Lkotlin/jvm/internal/Ref$ObjectRef;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lorg/thoughtcrime/securesms/database/RecipientTable;Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;ZZLorg/thoughtcrime/securesms/database/SQLiteDatabase;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3;->invoke$lambda$2(Lkotlin/jvm/internal/Ref$ObjectRef;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->$r8$lambda$aWzIz5YHb9jNapMRCuQVry5PhmE()V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->buildContentValuesForNewUser(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;)Landroid/content/ContentValues; @@ -21207,26 +24032,19 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getByColumn(Ljava/lang/ HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getByE164(Ljava/lang/String;)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getByPni(Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getByServiceId(Lorg/whispersystems/signalservice/api/push/ServiceId;)Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/recipients/Recipient$Extras; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getRecipientExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/databaseprotos/RecipientExtras; +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getRecipientIdIfAllFieldsMatch(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getRecipientsWithNotificationChannels()Lorg/thoughtcrime/securesms/database/RecipientTable$RecipientReader; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getRecord(Landroid/content/Context;Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getRecord(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getSyncExtras$lambda$135(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getSyncExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->insertReleaseChannelRecipient()Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getTAG()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->linkIdsForSelf(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->markNeedsSync(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->markRegistered(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId;)Z HSPLorg/thoughtcrime/securesms/database/RecipientTable;->markRegisteredOrThrow(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->parseBadgeList([B)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->processPnpTuple(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;ZZ)Lorg/thoughtcrime/securesms/database/RecipientTable$ProcessPnpTupleResult; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->processPnpTupleToChangeSet(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;ZZ)Lorg/thoughtcrime/securesms/database/PnpChangeSet; -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->readCapabilities(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities; +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->rotateStorageId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setCapabilities(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setMuted(Lorg/thoughtcrime/securesms/recipients/RecipientId;J)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileAvatar(Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileKey$lambda$53()V +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileKey$lambda$58()V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileKey(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;)Z HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileKeyIfAbsent(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;)Z HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileName(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/profiles/ProfileName;)V @@ -21235,6 +24053,33 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable;->update(Lorg/signal/core HSPLorg/thoughtcrime/securesms/database/RecipientTable;->update(Lorg/thoughtcrime/securesms/recipients/RecipientId;Landroid/content/ContentValues;)Z HSPLorg/thoughtcrime/securesms/database/RecipientTable;->updatePendingSelfData(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->writePnpChangeSetToDisk(Lorg/thoughtcrime/securesms/database/PnpChangeSet;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;)Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda2;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda3;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda4;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getRecipientExtras$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getRecipientExtras$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->invoke(I)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$groupMasterKey$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$groupMasterKey$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityKey$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityKey$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityStatus$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityStatus$1;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->$r8$lambda$3gC4IvWj9S7nLeLK-eONY0kYlPA(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/recipients/Recipient$Extras; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getRecipientExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/databaseprotos/RecipientExtras; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getRecord(Landroid/content/Context;Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getSyncExtras$lambda$2(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->parseBadgeList([B)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->readCapabilities(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities; HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables$Companion;->()V HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/RemappedRecordTables;->()V @@ -21248,8 +24093,10 @@ HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLam HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda0;->subscribe(Lio/reactivex/rxjava3/core/FlowableEmitter;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;->(Lio/reactivex/rxjava3/core/Emitter;)V -HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;->onChanged()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;->prime()V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversation$1;->(J)V +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversation$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversation$1;->invoke(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2;->()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2;->()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2;->invoke()Lio/reactivex/rxjava3/core/Flowable; @@ -21275,6 +24122,7 @@ HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->()V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->access$conversationListFlowable(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver;)Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->access$notificationProfilesFlowable(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver;)Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->conversation(J)Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->conversationListFlowable()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->databaseFlowable$lambda$1(Lkotlin/jvm/functions/Function1;Lio/reactivex/rxjava3/core/FlowableEmitter;)V HSPLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->databaseFlowable(Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/core/Flowable; @@ -21347,6 +24195,7 @@ HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->insertWithOnConflict(Lj HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->lambda$beginTransaction$0()V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->lambda$delete$14(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Integer; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->lambda$execSQL$19(Ljava/lang/String;[Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->lambda$insert$9(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->lambda$insertWithOnConflict$13(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->lambda$query$3(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->lambda$query$4(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; @@ -21366,6 +24215,8 @@ HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->runPostSuccessfulTransa HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->setTransactionSuccessful()V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->trace(Ljava/lang/String;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceLockEnd()V +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceLockStart()V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/SQLiteDatabase$Returnable;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/SQLiteDatabase$Returnable;)Ljava/lang/Object; @@ -21412,7 +24263,9 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->messageLog()L HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->messageSearch()Lorg/thoughtcrime/securesms/database/SearchTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->messages()Lorg/thoughtcrime/securesms/database/MessageTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->notificationProfiles()Lorg/thoughtcrime/securesms/database/NotificationProfileDatabase; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->payments()Lorg/thoughtcrime/securesms/database/PaymentTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->pendingRetryReceipts()Lorg/thoughtcrime/securesms/database/PendingRetryReceiptTable; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->reactions()Lorg/thoughtcrime/securesms/database/ReactionTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->recipients()Lorg/thoughtcrime/securesms/database/RecipientTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->remoteMegaphones()Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->runPostSuccessfulTransaction(Ljava/lang/Runnable;)V @@ -21443,10 +24296,12 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getMentionTable()Lorg/t HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getMessageSendLogTables()Lorg/thoughtcrime/securesms/database/MessageSendLogTables; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getMessageTable()Lorg/thoughtcrime/securesms/database/MessageTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getNotificationProfileDatabase()Lorg/thoughtcrime/securesms/database/NotificationProfileDatabase; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getPaymentTable()Lorg/thoughtcrime/securesms/database/PaymentTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getPendingRetryReceiptTable()Lorg/thoughtcrime/securesms/database/PendingRetryReceiptTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRawDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRawReadableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRawWritableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; +HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getReactionTable()Lorg/thoughtcrime/securesms/database/ReactionTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRecipientTable()Lorg/thoughtcrime/securesms/database/RecipientTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getRemoteMegaphoneTable()Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase;->getSearchTable()Lorg/thoughtcrime/securesms/database/SearchTable; @@ -21493,16 +24348,9 @@ HSPLorg/thoughtcrime/securesms/database/SqlCipherErrorHandler;->(Ljava/lan HSPLorg/thoughtcrime/securesms/database/SqlCipherLibraryLoader;->()V HSPLorg/thoughtcrime/securesms/database/SqlCipherLibraryLoader;->()V HSPLorg/thoughtcrime/securesms/database/SqlCipherLibraryLoader;->load()V -HSPLorg/thoughtcrime/securesms/database/StickerTable$StickerPackRecordReader;->(Landroid/database/Cursor;)V -HSPLorg/thoughtcrime/securesms/database/StickerTable$StickerPackRecordReader;->getNext()Lorg/thoughtcrime/securesms/database/model/StickerPackRecord; HSPLorg/thoughtcrime/securesms/database/StickerTable;->()V HSPLorg/thoughtcrime/securesms/database/StickerTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;Lorg/thoughtcrime/securesms/crypto/AttachmentSecret;)V -HSPLorg/thoughtcrime/securesms/database/StickerTable;->deleteOrphanedPacks()V -HSPLorg/thoughtcrime/securesms/database/StickerTable;->deleteStickersInPackExceptCover(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/database/StickerTable;->getStickerPack(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/model/StickerPackRecord; -HSPLorg/thoughtcrime/securesms/database/StickerTable;->isPackAvailableAsReference(Ljava/lang/String;)Z -HSPLorg/thoughtcrime/securesms/database/StickerTable;->uninstallPack(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/database/StickerTable;->updatePackInstalled(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;Ljava/lang/String;ZZ)V +HSPLorg/thoughtcrime/securesms/database/StickerTable;->getAllStickerPacks(Ljava/lang/String;)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/StorySendTable;->()V @@ -21520,6 +24368,11 @@ HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->getFormattedBodyFor(Lan HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->getFormattedBodyForMms(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord;)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; HSPLorg/thoughtcrime/securesms/database/ThreadTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/ThreadTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->()V +HSPLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->(JZJI)V +HSPLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->getLastScrolled()J +HSPLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->getLastSeen()J +HSPLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->getUnreadCount()I HSPLorg/thoughtcrime/securesms/database/ThreadTable$Extra$Companion;->()V HSPLorg/thoughtcrime/securesms/database/ThreadTable$Extra$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$Extra$Companion;->forAlbum(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/ThreadTable$Extra; @@ -21548,6 +24401,7 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable$Reader;->(Lorg/thought HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->()V HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->(Landroid/database/Cursor;Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->close()V +HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->getCurrent()Lorg/thoughtcrime/securesms/database/model/ThreadRecord; HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->getNext()Lorg/thoughtcrime/securesms/database/model/ThreadRecord; HSPLorg/thoughtcrime/securesms/database/ThreadTable$StaticReader;->getSnippetUri(Landroid/database/Cursor;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/database/ThreadTable$WhenMappings;->()V @@ -21574,6 +24428,7 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createThreadForRecipient(L HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getArchivedConversationListCount(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;)I HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getAttachmentUriFor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getContentTypeFor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getConversationMetadata(J)Lorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getExtrasFor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;)Lorg/thoughtcrime/securesms/database/ThreadTable$Extra; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getOrCreateThreadIdFor(Lorg/thoughtcrime/securesms/recipients/Recipient;)J HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getOrCreateThreadIdFor(Lorg/thoughtcrime/securesms/recipients/Recipient;I)J @@ -21610,26 +24465,53 @@ HSPLorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$ HSPLorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline22;->m(Landroid/app/NotificationChannel;)I HSPLorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline3;->m(Landroid/app/NotificationChannel;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline6;->m(Landroid/app/NotificationChannel;Landroid/net/Uri;Landroid/media/AudioAttributes;)V +HSPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->()V +HSPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->(Ljava/util/Collection;)V +HSPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isUnverified()Z +HSPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isUnverified(Ljava/util/Collection;)Z +HSPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isVerified()Z +HSPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isVerified(Ljava/util/Collection;)Z HSPLorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase$Companion;->()V HSPLorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase;->()V HSPLorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase;->getAllAvatars()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->(Ljava/lang/String;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/recipients/Recipient;JJJIIJII)V +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->(Ljava/lang/String;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/recipients/Recipient;JJJIZJZZ)V HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getBody()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getDateReceived()J -HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getDeliveryReceiptCount()I +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getDateSent()J HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getDeliveryStatus()I HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getFromRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getReadReceiptCount()I HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getThreadId()J +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getToRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->hasDeliveryReceipt()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->hasReadReceipt()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isBoostRequest()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isCallLog()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isChangeNumber()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isEndSession()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isExpirationTimerUpdate()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isFailed()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isGroupAction()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isGroupCall()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isGroupQuit()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isGroupUpdate()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingAudioCall()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingVideoCall()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isJoined()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isKeyExchange()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedAudioCall()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedVideoCall()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoing()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoingAudioCall()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoingVideoCall()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPaymentNotification()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPaymentsActivated()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPaymentsRequestToActivate()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPending()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPendingInsecureSmsFallback()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isProfileChange()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isViewed()Z HSPLorg/thoughtcrime/securesms/database/model/DistributionListId$1;->()V HSPLorg/thoughtcrime/securesms/database/model/DistributionListId;->()V HSPLorg/thoughtcrime/securesms/database/model/DistributionListId;->(J)V @@ -21647,18 +24529,24 @@ HSPLorg/thoughtcrime/securesms/database/model/EmojiSearchData;->getRank()I HSPLorg/thoughtcrime/securesms/database/model/EmojiSearchData;->getTags()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/model/IdentityRecord;->()V HSPLorg/thoughtcrime/securesms/database/model/IdentityRecord;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V +HSPLorg/thoughtcrime/securesms/database/model/IdentityRecord;->getVerifiedStatus()Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus; HSPLorg/thoughtcrime/securesms/database/model/IdentityStoreRecord;->()V HSPLorg/thoughtcrime/securesms/database/model/IdentityStoreRecord;->(Ljava/lang/String;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V +HSPLorg/thoughtcrime/securesms/database/model/IdentityStoreRecord;->toIdentityRecord(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/IdentityRecord; +HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent$WhenMappings;->()V HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->()V HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->(JLjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/concurrent/TimeUnit;)V +HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->fractionalMillis(JLjava/util/concurrent/TimeUnit;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->getCreatedAt()J HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->getEventId()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->getEventName()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->getSplits()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->getTimeunit()Ljava/util/concurrent/TimeUnit; HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsEvent;->toString()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsSplit$WhenMappings;->()V HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsSplit;->()V HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsSplit;->(Ljava/lang/String;JLjava/util/concurrent/TimeUnit;)V +HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsSplit;->fractionalMillis(JLjava/util/concurrent/TimeUnit;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsSplit;->getDuration()J HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsSplit;->getName()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/LocalMetricsSplit;->toString()Ljava/lang/String; @@ -21667,11 +24555,6 @@ HSPLorg/thoughtcrime/securesms/database/model/LogEntry;->(JZLjava/lang/Str HSPLorg/thoughtcrime/securesms/database/model/LogEntry;->getBody()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/LogEntry;->getCreatedAt()J HSPLorg/thoughtcrime/securesms/database/model/LogEntry;->getKeepLonger()Z -HSPLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->()V -HSPLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->(JLorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJIJLjava/lang/String;Lorg/thoughtcrime/securesms/mms/SlideDeck;JLjava/util/Set;Ljava/util/Set;IJJZILorg/thoughtcrime/securesms/database/model/Quote;Ljava/util/List;Ljava/util/List;ZLjava/util/List;ZZJIJLorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;Lorg/thoughtcrime/securesms/payments/Payment;Lorg/thoughtcrime/securesms/database/CallTable$Call;JLorg/thoughtcrime/securesms/database/model/MessageId;Lorg/thoughtcrime/securesms/database/model/MessageId;I)V -HSPLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->getMessageRanges()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; -HSPLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->getScheduledDate()J -HSPLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->isMmsNotification()Z HSPLorg/thoughtcrime/securesms/database/model/MegaphoneRecord;->(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;IJJZ)V HSPLorg/thoughtcrime/securesms/database/model/MegaphoneRecord;->getEvent()Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event; HSPLorg/thoughtcrime/securesms/database/model/MegaphoneRecord;->getFirstVisible()J @@ -21684,19 +24567,87 @@ HSPLorg/thoughtcrime/securesms/database/model/MessageId$Creator;->()V HSPLorg/thoughtcrime/securesms/database/model/MessageId;->()V HSPLorg/thoughtcrime/securesms/database/model/MessageId;->(J)V HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->()V -HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->(JLjava/lang/String;Lorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJJIIJLjava/util/Set;Ljava/util/Set;IJJIZLjava/util/List;ZJIJLorg/thoughtcrime/securesms/database/model/MessageId;I)V +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->(JLjava/lang/String;Lorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJJIZJLjava/util/Set;Ljava/util/Set;IJJZZLjava/util/List;ZJZJLorg/thoughtcrime/securesms/database/model/MessageId;I)V +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Landroid/text/SpannableString; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getExpireStarted()J HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getExpiresIn()J +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getFromDeviceId()I HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getId()J +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getIdentityKeyMismatches()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getNetworkFailures()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getNotifiedTimestamp()J +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getOriginalMessageId()Lorg/thoughtcrime/securesms/database/model/MessageId; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getReactions()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getReceiptTimestamp()J +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getRevisionNumber()I +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getServerTimestamp()J +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getSubscriptionId()I HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getTimestamp()J HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getType()J +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getUpdateDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Lorg/thoughtcrime/securesms/database/model/UpdateDescription; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->hashCode()I +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isBadDecryptType()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isBundleKeyExchange()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isChatSessionRefresh()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isDisplayBodyEmpty(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isEditMessage()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isGroupV1MigrationEvent()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityDefault()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityUpdate()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityVerified()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isJumbomoji(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isLegacyMessage()Z HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isPush()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isRateLimited()Z HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isRemoteDelete()Z -HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->(JLjava/lang/String;Lorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJJIIJLjava/util/Set;Ljava/util/Set;IJJZLorg/thoughtcrime/securesms/mms/SlideDeck;ILorg/thoughtcrime/securesms/database/model/Quote;Ljava/util/List;Ljava/util/List;ZLjava/util/List;ZJIJLorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;Lorg/thoughtcrime/securesms/database/model/MessageId;I)V +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSecure()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSessionSwitchoverEventType()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSmsExportType()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isThreadMergeEventType()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isUnidentified()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isUpdate()Z +HSPLorg/thoughtcrime/securesms/database/model/MessageRecordExtensionsKt;->withAttachments(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda1;->(Ljava/util/Map;)V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda2;->(Ljava/util/Map;)V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda3;->()V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda4;->()V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda5;->()V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda6;->()V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda7;->()V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda8;->(Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda8;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda9;->(Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda9;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->$r8$lambda$61cfVwuT9NopES3EvrpU58ByOrs(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->$r8$lambda$yFErtnyhgG1o4FUJh3c90u9IkrI(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->()V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->(JLorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJZJLjava/lang/String;Lorg/thoughtcrime/securesms/mms/SlideDeck;JLjava/util/Set;Ljava/util/Set;IJJZZLorg/thoughtcrime/securesms/database/model/Quote;Ljava/util/List;Ljava/util/List;ZLjava/util/List;ZZJZJLorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;Lorg/thoughtcrime/securesms/payments/Payment;Lorg/thoughtcrime/securesms/database/CallTable$Call;JLorg/thoughtcrime/securesms/database/model/MessageId;Lorg/thoughtcrime/securesms/database/model/MessageId;IZ)V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getCall()Lorg/thoughtcrime/securesms/database/CallTable$Call; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getGiftBadge()Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getLatestRevisionId()Lorg/thoughtcrime/securesms/database/model/MessageId; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getLinkPreviews()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getMessageRanges()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getParentStoryId()Lorg/thoughtcrime/securesms/database/model/ParentStoryId; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getPayment()Lorg/thoughtcrime/securesms/payments/Payment; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getQuote()Lorg/thoughtcrime/securesms/database/model/Quote; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getScheduledDate()J HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getSharedContacts()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getSlideDeck()Lorg/thoughtcrime/securesms/mms/SlideDeck; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getStoryType()Lorg/thoughtcrime/securesms/database/model/StoryType; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getUpdateDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Lorg/thoughtcrime/securesms/database/model/UpdateDescription; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->isMediaPending()Z HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->isMms()Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->isMmsNotification()Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->isRead()Z HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->isViewOnce()Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->lambda$withAttachments$0(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->lambda$withAttachments$1(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->updateContacts(Ljava/util/List;Ljava/util/Map;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->updateLinkPreviews(Ljava/util/List;Ljava/util/Map;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->updateQuote(Lorg/thoughtcrime/securesms/database/model/Quote;Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/Quote; +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->withAttachments(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord; HSPLorg/thoughtcrime/securesms/database/model/ParentStoryId$Companion;->()V HSPLorg/thoughtcrime/securesms/database/model/ParentStoryId$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/model/ParentStoryId$Companion;->deserialize(J)Lorg/thoughtcrime/securesms/database/model/ParentStoryId; @@ -21715,7 +24666,7 @@ HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;->()V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras;->([BLorg/signal/libsignal/zkgroup/groups/GroupMasterKey;[BLorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZZJLjava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->()V -HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Lorg/thoughtcrime/securesms/database/RecipientTable$RecipientType;ZJLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Landroid/net/Uri;Landroid/net/Uri;ILorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZJLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras;Lorg/thoughtcrime/securesms/recipients/Recipient$Extras;ZLjava/util/List;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;Lorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;)V +HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Lorg/thoughtcrime/securesms/database/RecipientTable$RecipientType;ZJLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Landroid/net/Uri;Landroid/net/Uri;ILorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZJLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras;Lorg/thoughtcrime/securesms/recipients/Recipient$Extras;ZLjava/util/List;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;Lorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;)V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getAbout()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getAboutEmoji()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getAci()Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; @@ -21741,6 +24692,7 @@ HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getMessageRingto HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getMessageVibrateState()Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState; HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getMuteUntil()J HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getNotificationChannel()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getPhoneNumberSharing()Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getPni()Lorg/whispersystems/signalservice/api/push/ServiceId$PNI; HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getProfileAvatar()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getProfileAvatarFileDetails()Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails; @@ -21775,20 +24727,35 @@ HSPLorg/thoughtcrime/securesms/database/model/StoryType;->()V HSPLorg/thoughtcrime/securesms/database/model/StoryType;->(Ljava/lang/String;II)V HSPLorg/thoughtcrime/securesms/database/model/StoryType;->getCode()I HSPLorg/thoughtcrime/securesms/database/model/StoryType;->isStory()Z +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda1;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda2;->(Lio/reactivex/rxjava3/core/ObservableEmitter;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->$r8$lambda$qlVsO3gJogFXwiR82wyUg4D6NdU(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getForRecipientId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getState$lambda$3$refresh(Lio/reactivex/rxjava3/core/ObservableEmitter;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getState$lambda$3(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lio/reactivex/rxjava3/core/ObservableEmitter;)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getState(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState;->$values()[Lorg/thoughtcrime/securesms/database/model/StoryViewState; +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState;->()V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/database/model/StoryViewState;->values()[Lorg/thoughtcrime/securesms/database/model/StoryViewState; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetarchived(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetbody(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetcontentType(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetdate(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)J -HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetdeliveryReceiptCount(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)I HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetdeliveryStatus(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)J HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetdistributionType(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)I HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetexpiresIn(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)J HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetextra(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Lorg/thoughtcrime/securesms/database/ThreadTable$Extra; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetforcedUnread(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgethasDeliveryReceipt(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgethasReadReceipt(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetisPinned(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetlastSeen(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)J HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetmeaningfulMessages(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z -HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetreadReceiptCount(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)I HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetrecipient(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetsnippetUri(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetthreadId(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)J @@ -21801,16 +24768,16 @@ HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setArchived HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setBody(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setContentType(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setDate(J)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; -HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setDeliveryReceiptCount(I)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setDeliveryStatus(J)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setDistributionType(I)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setExpiresIn(J)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setExtra(Lorg/thoughtcrime/securesms/database/ThreadTable$Extra;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setForcedUnread(Z)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setHasDeliveryReceipt(Z)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setHasReadReceipt(Z)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setLastSeen(J)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setMeaningfulMessages(Z)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setPinned(Z)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; -HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setReadReceiptCount(I)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setRecipient(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setSnippetUri(Landroid/net/Uri;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setType(J)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; @@ -21818,10 +24785,10 @@ HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setUnreadCo HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->setUnreadSelfMentionsCount(I)Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)V HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;Lorg/thoughtcrime/securesms/database/model/ThreadRecord-IA;)V -HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getBody()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getBodyRanges()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getDate()J +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getDistributionType()I HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getExtra()Lorg/thoughtcrime/securesms/database/ThreadTable$Extra; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getGroupMessageSender()Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getIndividualRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; @@ -21836,14 +24803,38 @@ HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isMessageRequestAcc HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isOutgoing()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isRead()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isScheduledMessage()Z +HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion$ADAPTER$1;->(Lcom/squareup/wire/FieldEncoding;Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;)V +HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion;->()V +HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation;->()V +HSPLorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding;->(Landroid/view/View;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Lorg/thoughtcrime/securesms/components/AvatarImageView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/view/View;Landroidx/constraintlayout/widget/ConstraintLayout;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V +HSPLorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding; +HSPLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->(Lorg/thoughtcrime/securesms/components/InputPanel;Landroid/widget/ImageButton;Landroidx/constraintlayout/widget/Barrier;Lorg/thoughtcrime/securesms/components/InputPanel;Lorg/thoughtcrime/securesms/components/AnimatingToggle;Landroid/view/View;Landroidx/constraintlayout/widget/Barrier;Lcom/google/android/material/imageview/ShapeableImageView;Landroidx/appcompat/widget/AppCompatTextView;Lorg/thoughtcrime/securesms/components/ComposeText;Lorg/thoughtcrime/securesms/components/emoji/EmojiToggle;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/components/HidingLinearLayout;Landroidx/appcompat/widget/AppCompatImageButton;Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/components/LinkPreviewView;Lorg/thoughtcrime/securesms/components/HidingLinearLayout;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/components/QuoteView;Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView;Lorg/thoughtcrime/securesms/components/SendButton;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;)V +HSPLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding; +HSPLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->getRoot()Lorg/thoughtcrime/securesms/components/InputPanel; HSPLorg/thoughtcrime/securesms/databinding/ConversationListFilterPullViewBinding;->(Landroid/view/View;Lorg/thoughtcrime/securesms/conversationlist/chatfilter/FilterCircleView;Lcom/google/android/material/chip/Chip;Landroid/widget/TextView;)V HSPLorg/thoughtcrime/securesms/databinding/ConversationListFilterPullViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationListFilterPullViewBinding; HSPLorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding;->(Landroidx/constraintlayout/widget/ConstraintLayout;Landroid/widget/ImageView;Landroid/view/View;Lcom/airbnb/lottie/LottieAnimationView;Landroid/widget/TextView;Landroid/view/View;Landroid/widget/TextView;Landroid/widget/ImageView;Landroid/view/View;Lcom/airbnb/lottie/LottieAnimationView;Landroid/widget/TextView;Landroid/view/View;Landroid/widget/TextView;Landroid/widget/ImageView;Landroid/view/View;Lcom/airbnb/lottie/LottieAnimationView;Landroid/widget/TextView;Landroid/view/View;Landroid/widget/TextView;)V HSPLorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding; HSPLorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding;->getRoot()Landroidx/constraintlayout/widget/ConstraintLayout; +HSPLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->(Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;Landroidx/appcompat/widget/AppCompatImageView;Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;Landroid/widget/TextView;Lcom/pnikosis/materialishprogress/ProgressWheel;Landroidx/appcompat/widget/AppCompatImageView;)V +HSPLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding; +HSPLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->getRoot()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; +HSPLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->(Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/avatar/view/AvatarView;Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/components/FromTextView;Landroidx/appcompat/widget/AppCompatImageView;Landroid/widget/TextView;)V +HSPLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding; +HSPLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->getRoot()Lorg/thoughtcrime/securesms/conversation/ConversationTitleView; HSPLorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding;->(Lcom/google/android/material/card/MaterialCardView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/TextView;)V HSPLorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding; HSPLorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding;->getRoot()Lcom/google/android/material/card/MaterialCardView; +HSPLorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding;->(Landroid/view/View;Landroidx/constraintlayout/widget/Guideline;Landroidx/appcompat/widget/AppCompatImageView;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;Landroidx/constraintlayout/widget/Guideline;)V +HSPLorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding; +HSPLorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding; +HSPLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->(Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;Landroid/view/ViewStub;Landroid/view/View;Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar;Landroidx/constraintlayout/widget/Barrier;Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;Lcom/google/android/material/button/MaterialButton;Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;Landroidx/constraintlayout/widget/Barrier;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;Landroid/widget/FrameLayout;Landroid/view/ViewStub;Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;Landroid/widget/FrameLayout;Landroid/widget/ImageView;Landroid/view/View;Landroidx/fragment/app/FragmentContainerView;Landroidx/fragment/app/FragmentContainerView;Landroidx/fragment/app/FragmentContainerView;Landroid/widget/FrameLayout;Landroid/view/ViewStub;Landroid/view/ViewStub;Landroid/view/ViewStub;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/ConversationScrollToView;Lorg/thoughtcrime/securesms/components/ConversationScrollToView;Lorg/thoughtcrime/securesms/util/views/DarkOverflowToolbar;Landroid/view/View;Landroid/view/ViewStub;Landroid/view/ViewStub;)V +HSPLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; +HSPLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->getRoot()Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; +HSPLorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Lorg/thoughtcrime/securesms/components/AvatarImageView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/components/ExpirationTimerView;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView;Lcom/google/android/material/imageview/ShapeableImageView;Landroid/widget/Space;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V +HSPLorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding; +HSPLorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;->getRoot()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies$$ExternalSyntheticLambda0;->()V HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies$$ExternalSyntheticLambda0;->get()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->$r8$lambda$TTNxYGZvGlMOp1oidmVJeKiRxZs()Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration; @@ -21854,6 +24845,7 @@ HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getApplica HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getDatabaseObserver()Lorg/thoughtcrime/securesms/database/DatabaseObserver; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getDeadlockDetector()Lorg/signal/core/util/concurrent/DeadlockDetector; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getDeletedCallEventManager()Lorg/thoughtcrime/securesms/service/DeletedCallEventManager; +HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getDonationsService()Lorg/whispersystems/signalservice/api/services/DonationsService; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getExoPlayerPool()Lorg/thoughtcrime/securesms/video/exo/ExoPlayerPool; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getExpireStoriesManager()Lorg/thoughtcrime/securesms/service/ExpiringStoriesManager; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getExpiringMessageManager()Lorg/thoughtcrime/securesms/service/ExpiringMessageManager; @@ -21862,19 +24854,17 @@ HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getGiphyMp HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getGroupsV2Operations()Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getIncomingMessageObserver()Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getJobManager()Lorg/thoughtcrime/securesms/jobmanager/JobManager; -HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getKeyBackupService(Lorg/thoughtcrime/securesms/KbsEnclave;)Lorg/whispersystems/signalservice/api/KeyBackupService; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getMegaphoneRepository()Lorg/thoughtcrime/securesms/megaphone/MegaphoneRepository; +HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getMessageNotifier()Lorg/thoughtcrime/securesms/notifications/MessageNotifier; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getOkHttpClient()Lokhttp3/OkHttpClient; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getPendingRetryReceiptCache()Lorg/thoughtcrime/securesms/database/PendingRetryReceiptCache; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getPendingRetryReceiptManager()Lorg/thoughtcrime/securesms/service/PendingRetryReceiptManager; -HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getProfileService()Lorg/whispersystems/signalservice/api/services/ProfileService; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getProtocolStore()Lorg/thoughtcrime/securesms/crypto/storage/SignalServiceDataStoreImpl; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getRecipientCache()Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getScheduledMessageManager()Lorg/thoughtcrime/securesms/service/ScheduledMessageManager; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getShakeToReport()Lorg/thoughtcrime/securesms/shakereport/ShakeToReport; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getSignalOkHttpClient()Lokhttp3/OkHttpClient; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getSignalServiceAccountManager()Lorg/whispersystems/signalservice/api/SignalServiceAccountManager; -HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getSignalServiceMessageReceiver()Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getSignalServiceNetworkAccess()Lorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getSignalWebSocket()Lorg/whispersystems/signalservice/api/SignalWebSocket; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getTypingStatusRepository()Lorg/thoughtcrime/securesms/components/TypingStatusRepository; @@ -21902,6 +24892,7 @@ HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->prov HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideDatabaseObserver()Lorg/thoughtcrime/securesms/database/DatabaseObserver; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideDeadlockDetector()Lorg/signal/core/util/concurrent/DeadlockDetector; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideDeletedCallEventManager()Lorg/thoughtcrime/securesms/service/DeletedCallEventManager; +HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideDonationsService(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations;)Lorg/whispersystems/signalservice/api/services/DonationsService; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideExoPlayerPool()Lorg/thoughtcrime/securesms/video/exo/SimpleExoPlayerPool; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideExpiringMessageManager()Lorg/thoughtcrime/securesms/service/ExpiringMessageManager; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideExpiringStoriesManager()Lorg/thoughtcrime/securesms/service/ExpiringStoriesManager; @@ -21910,17 +24901,15 @@ HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->prov HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideGroupsV2Operations(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;)Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideIncomingMessageObserver()Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideJobManager()Lorg/thoughtcrime/securesms/jobmanager/JobManager; -HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideKeyBackupService(Lorg/whispersystems/signalservice/api/SignalServiceAccountManager;Ljava/security/KeyStore;Lorg/thoughtcrime/securesms/KbsEnclave;)Lorg/whispersystems/signalservice/api/KeyBackupService; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideMegaphoneRepository()Lorg/thoughtcrime/securesms/megaphone/MegaphoneRepository; +HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideMessageNotifier()Lorg/thoughtcrime/securesms/notifications/MessageNotifier; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->providePendingRetryReceiptCache()Lorg/thoughtcrime/securesms/database/PendingRetryReceiptCache; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->providePendingRetryReceiptManager()Lorg/thoughtcrime/securesms/service/PendingRetryReceiptManager; -HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideProfileService(Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;Lorg/whispersystems/signalservice/api/SignalWebSocket;)Lorg/whispersystems/signalservice/api/services/ProfileService; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideProtocolStore()Lorg/thoughtcrime/securesms/crypto/storage/SignalServiceDataStoreImpl; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideRecipientCache()Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideScheduledMessageManager()Lorg/thoughtcrime/securesms/service/ScheduledMessageManager; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideShakeToReport()Lorg/thoughtcrime/securesms/shakereport/ShakeToReport; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideSignalServiceAccountManager(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations;)Lorg/whispersystems/signalservice/api/SignalServiceAccountManager; -HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideSignalServiceMessageReceiver(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;)Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideSignalServiceNetworkAccess()Lorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideSignalWebSocket(Lj$/util/function/Supplier;)Lorg/whispersystems/signalservice/api/SignalWebSocket; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideTypingStatusRepository()Lorg/thoughtcrime/securesms/components/TypingStatusRepository; @@ -21985,10 +24974,8 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version$Companion;->isVersionVal HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version$Companion;->readVersion$default(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version$Companion;Landroid/content/Context;ZILjava/lang/Object;)Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version$Companion;->readVersion(Landroid/content/Context;)Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version$Companion;->readVersion(Landroid/content/Context;Z)Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version; -HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version$Companion;->writeVersion(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->(ILjava/util/UUID;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->access$getObjectMapper$cp()Lcom/fasterxml/jackson/databind/ObjectMapper; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->getDensity()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->getDirectory(Landroid/content/Context;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->getFile(Landroid/content/Context;Ljava/util/UUID;)Ljava/io/File; @@ -21996,17 +24983,14 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->getUuid()Ljava/util/UU HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->getVersion()I HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->isVersionValid(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)Z HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->readVersion(Landroid/content/Context;)Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version; -HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->writeVersion(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$getLatestEmojiData$1$1;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$getLatestEmojiData$1$1;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$getLatestEmojiData$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles$getLatestEmojiData$1$1;->invoke(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles;->()V -HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles;->getBaseDirectory(Landroid/content/Context;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles;->getLatestEmojiData(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)Lorg/thoughtcrime/securesms/emoji/ParsedEmojiData; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles;->getMd5(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;Ljava/util/UUID;)[B -HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles;->openForReading(Landroid/content/Context;Ljava/lang/String;)Ljava/io/InputStream; HSPLorg/thoughtcrime/securesms/emoji/EmojiFiles;->openForWriting(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;Ljava/util/UUID;)Ljava/io/OutputStream; HSPLorg/thoughtcrime/securesms/emoji/EmojiFilesKt;->access$getEmojiDirectory(Landroid/content/Context;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/emoji/EmojiFilesKt;->access$getFilesUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; @@ -22048,6 +25032,7 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->buildEmojiSourceFromNode( HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->createPage(Ljava/lang/String;Ljava/lang/String;Lcom/fasterxml/jackson/databind/JsonNode;Lkotlin/jvm/functions/Function2;)Lorg/thoughtcrime/securesms/components/emoji/EmojiPageModel; HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->getDataPages$lambda$0(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->getDataPages(Ljava/lang/String;Lcom/fasterxml/jackson/databind/JsonNode;Lkotlin/jvm/functions/Function2;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->getJumboPages(Lcom/fasterxml/jackson/databind/JsonNode;)Ljava/util/Map; HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->mergeToDisplayPages(Ljava/util/List;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->parse-gIAlu-s(Ljava/io/InputStream;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParserKt;->access$asCategoryKey(Ljava/lang/String;)Ljava/lang/String; @@ -22070,12 +25055,12 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiMetrics;->(III)V HSPLorg/thoughtcrime/securesms/emoji/EmojiMetrics;->getPerRow()I HSPLorg/thoughtcrime/securesms/emoji/EmojiMetrics;->getRawHeight()I HSPLorg/thoughtcrime/securesms/emoji/EmojiMetrics;->getRawWidth()I -HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->()V -HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->(Landroid/net/Uri;)V -HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->equals(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->getUri()Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->hashCode()I -HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->toString()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Asset;->()V +HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Asset;->(Landroid/net/Uri;)V +HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Asset;->equals(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Asset;->getUri()Landroid/net/Uri; +HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Asset;->hashCode()I +HSPLorg/thoughtcrime/securesms/emoji/EmojiPage$Asset;->toString()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/emoji/EmojiPage;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiPage;->(Landroid/net/Uri;)V HSPLorg/thoughtcrime/securesms/emoji/EmojiPage;->(Landroid/net/Uri;Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -22102,7 +25087,6 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->$r8$lambda$NLSLe3cZ9aQvIzn HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->$r8$lambda$prHxAb0TF9CtP8w7EJ9vg507J70(Lorg/thoughtcrime/securesms/util/ListenableFutureTask;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$EmojiPageRequest;Lkotlin/Unit;)V HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->()V -HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->clear()V HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->load$lambda$0(Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$EmojiPageRequest;Landroid/content/Context;)Landroid/graphics/Bitmap; HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->load$lambda$1(Lorg/thoughtcrime/securesms/util/ListenableFutureTask;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$EmojiPageRequest;Lkotlin/Unit;)V HSPLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->load$run__proxy(Lorg/thoughtcrime/securesms/util/ListenableFutureTask;)Lkotlin/Unit; @@ -22115,14 +25099,12 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiRemote;->getObject(Lorg/thoughtcrime/s HSPLorg/thoughtcrime/securesms/emoji/EmojiRemote;->getVersion()I HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$1;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$1;->()V +HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$1;->invoke(Landroid/net/Uri;)Lorg/thoughtcrime/securesms/emoji/EmojiPage; +HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$parsedData$1;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$parsedData$1;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$parsedData$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$parsedData$1;->invoke(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->()V -HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->()V -HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->invoke(Landroid/net/Uri;)Lorg/thoughtcrime/securesms/emoji/EmojiPage; -HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion;->getEmojiSource()Lorg/thoughtcrime/securesms/emoji/EmojiSource; @@ -22135,6 +25117,8 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$emojiTree$2;->(Lorg/thoug HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$emojiTree$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$emojiTree$2;->invoke()Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$maxEmojiLength$2;->(Lorg/thoughtcrime/securesms/emoji/EmojiSource;)V +HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$maxEmojiLength$2;->invoke()Ljava/lang/Integer; +HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$maxEmojiLength$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource$variationsToCanonical$2;->(Lorg/thoughtcrime/securesms/emoji/EmojiSource;)V HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->(FLorg/thoughtcrime/securesms/emoji/EmojiData;Lkotlin/jvm/functions/Function1;)V @@ -22146,22 +25130,21 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->getDecodeScale()F HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->getEmojiTree()Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->getJumboPages()Ljava/util/Map; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->getLatest()Lorg/thoughtcrime/securesms/emoji/EmojiSource; +HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->getMaxEmojiLength()I HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->getMetrics()Lorg/thoughtcrime/securesms/emoji/EmojiMetrics; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->getObsolete()Ljava/util/List; HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->refresh()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$getAssetsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$getPAGE_EMOTICONS$p()Lorg/thoughtcrime/securesms/components/emoji/EmojiPageModel; +HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$maxOrZero(Ljava/util/List;)I HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->getAssetsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V -HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4;->run()V +HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->maxOrZero(Ljava/util/List;)I HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda5;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda5;->run()V -HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji;->$r8$lambda$1MZfAT8L5tWrN2t8lIV1c9aeWgA(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji;->$r8$lambda$U8tEMIKRjYoTvIByfnS46m01TB0(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji;->()V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji;->()V -HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji;->updateCurrentVersion$lambda$1$lambda$0(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji;->updateCurrentVersion$lambda$1(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji;->updateCurrentVersion(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/emoji/ParsedEmojiData;->()V @@ -22179,14 +25162,8 @@ HSPLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->()V HSPLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->getMap(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;)Lorg/thoughtcrime/securesms/fonts/FontFileMap; HSPLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->getNameOnDisk(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;Ljava/lang/String;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->put(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;Ljava/lang/String;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->setMap(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;Lorg/thoughtcrime/securesms/fonts/FontFileMap;)V HSPLorg/thoughtcrime/securesms/fonts/FontFileMap;->()V -HSPLorg/thoughtcrime/securesms/fonts/FontFileMap;->(Ljava/util/Map;)V -HSPLorg/thoughtcrime/securesms/fonts/FontFileMap;->access$getObjectMapper$cp()Lcom/fasterxml/jackson/databind/ObjectMapper; HSPLorg/thoughtcrime/securesms/fonts/FontFileMap;->access$getTAG$cp()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/fonts/FontFileMap;->copy(Ljava/util/Map;)Lorg/thoughtcrime/securesms/fonts/FontFileMap; -HSPLorg/thoughtcrime/securesms/fonts/FontFileMap;->getMap()Ljava/util/Map; HSPLorg/thoughtcrime/securesms/fonts/FontManifest$Companion;->()V HSPLorg/thoughtcrime/securesms/fonts/FontManifest$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/fonts/FontManifest$Companion;->fromDisk(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;)Lorg/thoughtcrime/securesms/fonts/FontManifest; @@ -22255,7 +25232,6 @@ HSPLorg/thoughtcrime/securesms/fonts/Fonts;->downloadLatestVersionLong()J HSPLorg/thoughtcrime/securesms/fonts/Fonts;->getDirectory(Landroid/content/Context;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/fonts/Fonts;->getScriptPath(Lorg/thoughtcrime/securesms/fonts/TextFont;Lorg/thoughtcrime/securesms/fonts/FontManifest$FontScript;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/fonts/Fonts;->getSupportedScript(Ljava/util/List;Lorg/thoughtcrime/securesms/fonts/SupportedScript;)Lorg/thoughtcrime/securesms/fonts/SupportedScript; -HSPLorg/thoughtcrime/securesms/fonts/Fonts;->loadFontIntoTypeface(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;Ljava/lang/String;)Landroid/graphics/Typeface; HSPLorg/thoughtcrime/securesms/fonts/Fonts;->resolveFont$lambda$2$lambda$1(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/SupportedScript;Lorg/thoughtcrime/securesms/fonts/TextFont;Lorg/thoughtcrime/securesms/fonts/FontVersion;Lorg/thoughtcrime/securesms/fonts/FontManifest;Lorg/thoughtcrime/securesms/fonts/Fonts$FontResult$Immediate;Lorg/thoughtcrime/securesms/fonts/Fonts$FontDownloadKey;)Landroid/graphics/Typeface; HSPLorg/thoughtcrime/securesms/fonts/Fonts;->resolveFont(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/TextFont;Lorg/thoughtcrime/securesms/fonts/SupportedScript;)Lorg/thoughtcrime/securesms/fonts/Fonts$FontResult; HSPLorg/thoughtcrime/securesms/fonts/Fonts;->resolveFontScriptFromScriptName(Lorg/thoughtcrime/securesms/fonts/SupportedScript;Lorg/thoughtcrime/securesms/fonts/FontManifest;)Lorg/thoughtcrime/securesms/fonts/FontManifest$FontScript; @@ -22278,6 +25254,44 @@ HSPLorg/thoughtcrime/securesms/gcm/FcmFetchManager;->()V HSPLorg/thoughtcrime/securesms/gcm/FcmFetchManager;->()V HSPLorg/thoughtcrime/securesms/gcm/FcmFetchManager;->cancelMayHaveMessagesNotification(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/gcm/FcmFetchManager;->onForeground(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->()V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->setParentRecyclerTranslationY(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->(Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->(II)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Integer;Ljava/lang/Integer;)I +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->attach(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->findFirstVisibleItemPositions(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)[I +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->findLastVisibleItemPositions(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)[I +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSet(Ljava/util/Set;II)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSetForMaximumDistance(Ljava/util/Set;[I[I)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->performPlaybackUpdate(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackPolicy;->maxSimultaneousPlaybackInConversation()I +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->()V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->(Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->injectVideoViews(Landroid/content/Context;Landroidx/lifecycle/Lifecycle;Landroid/view/ViewGroup;I)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->getCurrentHolder(I)Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder; +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->stopAndReleaseAssignedVideos(Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->update(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/List;Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->updateVideoDisplayPositionAndSize(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4Playable;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->()V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->setResizeMode(I)V HSPLorg/thoughtcrime/securesms/glide/BadgeLoader$Factory;->(Lokhttp3/OkHttpClient;)V HSPLorg/thoughtcrime/securesms/glide/BadgeLoader$Factory;->(Lokhttp3/OkHttpClient;Lorg/thoughtcrime/securesms/glide/BadgeLoader$Factory-IA;)V HSPLorg/thoughtcrime/securesms/glide/BadgeLoader;->createFactory()Lorg/thoughtcrime/securesms/glide/BadgeLoader$Factory; @@ -22328,6 +25342,9 @@ HSPLorg/thoughtcrime/securesms/groups/SelectionLimits$1;->()V HSPLorg/thoughtcrime/securesms/groups/SelectionLimits;->()V HSPLorg/thoughtcrime/securesms/groups/SelectionLimits;->(II)V HSPLorg/thoughtcrime/securesms/groups/SelectionLimits;->getHardLimit()I +HSPLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;->()V +HSPLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository;->(Landroid/content/Context;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler$$ExternalSyntheticLambda0;->()V HSPLorg/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobmanager/CompositeScheduler;->([Lorg/thoughtcrime/securesms/jobmanager/Scheduler;)V @@ -22335,17 +25352,13 @@ HSPLorg/thoughtcrime/securesms/jobmanager/CompositeScheduler;->schedule(JLjava/u HSPLorg/thoughtcrime/securesms/jobmanager/Constraint$-CC;->$default$getJobSchedulerKeyPart(Lorg/thoughtcrime/securesms/jobmanager/Constraint;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator;->(Ljava/util/Map;)V HSPLorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator;->instantiate(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/Constraint; -HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler;)V -HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->$r8$lambda$hBEn_48T9NK-BhOmjEIwF4k281g(Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler;)V HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->()V HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V -HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->lambda$schedule$0()V HSPLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->schedule(JLjava/util/List;)V HSPLorg/thoughtcrime/securesms/jobmanager/Job$1;->()V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->()V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZ)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZI)V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->addConstraint(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->build()Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setConstraints(Ljava/util/List;)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; @@ -22356,8 +25369,8 @@ HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setMaxAttempt HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setMaxInstancesForFactory(I)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setMaxInstancesForQueue(I)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setQueue(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZ)V -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZLorg/thoughtcrime/securesms/jobmanager/Job$Parameters-IA;)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZI)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->(Ljava/lang/String;JJIIILjava/lang/String;Ljava/util/List;[BZILorg/thoughtcrime/securesms/jobmanager/Job$Parameters-IA;)V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getConstraintKeys()Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getCreateTime()J HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getId()Ljava/lang/String; @@ -22365,6 +25378,7 @@ HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getLifespan()J HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getMaxAttempts()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getMaxInstancesForFactory()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getMaxInstancesForQueue()I +HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getPriority()I HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->getQueue()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Parameters;->isMemoryOnly()Z HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType;->$values()[Lorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType; @@ -22373,39 +25387,27 @@ HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType;->(Ljava/l HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType;->values()[Lorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->()V HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType;Ljava/lang/RuntimeException;[BJ)V -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->failure()Lorg/thoughtcrime/securesms/jobmanager/Job$Result; -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->getBackoffInterval()J HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->getException()Ljava/lang/RuntimeException; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->getOutputData()[B HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->isFailure()Z HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->isRetry()Z HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->isSuccess()Z -HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->retry(J)Lorg/thoughtcrime/securesms/jobmanager/Job$Result; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->success([B)Lorg/thoughtcrime/securesms/jobmanager/Job$Result; HSPLorg/thoughtcrime/securesms/jobmanager/Job$Result;->toString()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/Job;->()V HSPLorg/thoughtcrime/securesms/jobmanager/Job;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V HSPLorg/thoughtcrime/securesms/jobmanager/Job;->getId()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobmanager/Job;->getNextRunAttemptTime()J +HSPLorg/thoughtcrime/securesms/jobmanager/Job;->getLastRunAttemptTime()J +HSPLorg/thoughtcrime/securesms/jobmanager/Job;->getNextBackoffInterval()J HSPLorg/thoughtcrime/securesms/jobmanager/Job;->getParameters()Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters; HSPLorg/thoughtcrime/securesms/jobmanager/Job;->getRunAttempt()I HSPLorg/thoughtcrime/securesms/jobmanager/Job;->isCanceled()Z HSPLorg/thoughtcrime/securesms/jobmanager/Job;->onAdded()V -HSPLorg/thoughtcrime/securesms/jobmanager/Job;->onRetry()V HSPLorg/thoughtcrime/securesms/jobmanager/Job;->onSubmit()V HSPLorg/thoughtcrime/securesms/jobmanager/Job;->setContext(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/jobmanager/Job;->setNextRunAttemptTime(J)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job;->setLastRunAttemptTime(J)V +HSPLorg/thoughtcrime/securesms/jobmanager/Job;->setNextBackoffInterval(J)V HSPLorg/thoughtcrime/securesms/jobmanager/Job;->setRunAttempt(I)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda0;->()V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13;->()V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobStorage;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda14;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda16;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda17;->accept(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda19;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V @@ -22414,6 +25416,8 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda20;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda22;->(Lorg/thoughtcrime/securesms/jobmanager/JobPredicate;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda22;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda23;->(Lorg/thoughtcrime/securesms/jobmanager/JobController$Callback;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda23;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda4;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;Lorg/thoughtcrime/securesms/jobmanager/Job;)V @@ -22424,11 +25428,9 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda7;->accept(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda8;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda8;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$AFTJhIYz2IJLxa5cdEvspxyDnpk(Lorg/thoughtcrime/securesms/jobmanager/JobController;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)Lorg/thoughtcrime/securesms/jobmanager/Job; HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$FnYUQJ9nqVuTdiLe8l57LDvJzOE(Lorg/thoughtcrime/securesms/jobmanager/JobController;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$Ka2rmpP3tDCT7kzx5KQlHQUrhA4(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec; HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$YXMN5Ij_rYm1dFbxzMPP4rhbPPI(Lorg/thoughtcrime/securesms/jobmanager/JobController;Lorg/thoughtcrime/securesms/jobmanager/Job;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$_WG2KEwBlGL1eFDhBUpj1kHB45I(Lorg/thoughtcrime/securesms/jobmanager/JobController;Lorg/thoughtcrime/securesms/jobmanager/Job;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$cs0r6RT3Ty9GlYLxMBZkIHg08dM(Lorg/thoughtcrime/securesms/jobmanager/JobController;Lorg/thoughtcrime/securesms/jobmanager/Job;Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec; HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobStorage;Lorg/thoughtcrime/securesms/jobmanager/JobInstantiator;Lorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator;Lorg/thoughtcrime/securesms/jobmanager/JobTracker;Lorg/thoughtcrime/securesms/jobmanager/Scheduler;Lorg/thoughtcrime/securesms/util/Debouncer;Lorg/thoughtcrime/securesms/jobmanager/JobController$Callback;)V @@ -22442,13 +25444,9 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->init()V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->insertJobChain(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$buildFullSpec$10(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec; HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$buildFullSpec$11(Lorg/thoughtcrime/securesms/jobmanager/Job;Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec; -HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$onFailure$3(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$onFailure$4(Lorg/thoughtcrime/securesms/jobmanager/Job;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$triggerOnSubmit$8(Lorg/thoughtcrime/securesms/jobmanager/Job;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$triggerOnSubmit$9(Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->onFailure(Lorg/thoughtcrime/securesms/jobmanager/Job;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->onJobFinished(Lorg/thoughtcrime/securesms/jobmanager/Job;)V -HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->onRetry(Lorg/thoughtcrime/securesms/jobmanager/Job;J)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->onSuccess(Lorg/thoughtcrime/securesms/jobmanager/Job;[B)V HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->pullNextEligibleJobForExecution(Lorg/thoughtcrime/securesms/jobmanager/JobPredicate;)Lorg/thoughtcrime/securesms/jobmanager/Job; HSPLorg/thoughtcrime/securesms/jobmanager/JobController;->scheduleJobs(Ljava/util/List;)V @@ -22465,6 +25463,8 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda0;- HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda10;->run()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda14;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda15;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/lang/Runnable;)V @@ -22474,6 +25474,7 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda5;- HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda7;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda7;->shouldRunOnExecutor()Z HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda8;->onEmpty()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda9;->run()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;->(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/util/List;)V @@ -22505,6 +25506,8 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$DYTfX8v0cQlWrG HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$XT2SMZJxrQFMSviwHBjZhWrZ8u4(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$bAbo4Wrv-lAy710xL25n75tW6EQ(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$EmptyQueueListener;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$g0KT-wHqpu8YO4Bvu-23NaTXOYA(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$sAhOIfgF3Tsjgqk6ejbaAJGNqJA(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->$r8$lambda$tbQpu2orId1zOGFwRjHuKH7CxGc(Lorg/thoughtcrime/securesms/jobmanager/JobManager;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->-$$Nest$menqueueChain(Lorg/thoughtcrime/securesms/jobmanager/JobManager;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->(Landroid/app/Application;Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;)V @@ -22516,12 +25519,15 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$addOnEmptyQueueLis HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$beginJobLoop$1()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$enqueueChain$12(Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$new$0(Lorg/thoughtcrime/securesms/jobmanager/JobManager$Configuration;Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$onEmptyQueue$13()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->lambda$runOnExecutor$14(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->onConstraintMet(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->onEmptyQueue()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->runOnExecutor(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->startChain(Lorg/thoughtcrime/securesms/jobmanager/Job;)Lorg/thoughtcrime/securesms/jobmanager/JobManager$Chain; HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->waitUntilInitialized()V HSPLorg/thoughtcrime/securesms/jobmanager/JobManager;->wakeUp()V +HSPLorg/thoughtcrime/securesms/jobmanager/JobMigration;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JobMigration;->(I)V HSPLorg/thoughtcrime/securesms/jobmanager/JobMigration;->getEndVersion()I HSPLorg/thoughtcrime/securesms/jobmanager/JobMigrator;->()V @@ -22570,21 +25576,15 @@ HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->build()Lorg/thou HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->putBoolean(Ljava/lang/String;Z)Lorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->putLong(Ljava/lang/String;J)Lorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->putString(Ljava/lang/String;Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder; +HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->putStringListAsArray(Ljava/lang/String;Ljava/util/List;)Lorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder; HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->serialize()[B HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->()V HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Lorg/thoughtcrime/securesms/jobmanager/JsonJobData-IA;)V HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->deserialize([B)Lorg/thoughtcrime/securesms/jobmanager/JsonJobData; -HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getBoolean(Ljava/lang/String;)Z -HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getBooleanOrDefault(Ljava/lang/String;Z)Z -HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getLong(Ljava/lang/String;)J -HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getString(Ljava/lang/String;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->hasBoolean(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->hasInt(Ljava/lang/String;)Z -HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->hasString(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->isEmpty()Z HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->serialize()[B -HSPLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->throwIfAbsent(Ljava/util/Map;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint$Factory;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint$Factory;->create()Lorg/thoughtcrime/securesms/jobmanager/Constraint; HSPLorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint$Factory;->create()Lorg/thoughtcrime/securesms/jobmanager/impl/AutoDownloadEmojiConstraint; @@ -22669,6 +25669,8 @@ HSPLorg/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraint$Fact HSPLorg/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver;->()V HSPLorg/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver;->register(Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier;)V +HSPLorg/thoughtcrime/securesms/jobmanager/migrations/DonationReceiptRedemptionJobMigration;->()V +HSPLorg/thoughtcrime/securesms/jobmanager/migrations/DonationReceiptRedemptionJobMigration;->()V HSPLorg/thoughtcrime/securesms/jobmanager/migrations/PushDecryptMessageJobEnvelopeMigration;->()V HSPLorg/thoughtcrime/securesms/jobmanager/migrations/PushProcessMessageJobMigration$Companion;->()V HSPLorg/thoughtcrime/securesms/jobmanager/migrations/PushProcessMessageJobMigration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -22686,6 +25688,7 @@ HSPLorg/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigratio HSPLorg/thoughtcrime/securesms/jobmanager/migrations/SenderKeyDistributionSendJobRecipientMigration;->()V HSPLorg/thoughtcrime/securesms/jobmanager/migrations/SenderKeyDistributionSendJobRecipientMigration;->()V HSPLorg/thoughtcrime/securesms/jobmanager/migrations/SenderKeyDistributionSendJobRecipientMigration;->(Lorg/thoughtcrime/securesms/database/GroupTable;)V +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec;->()V HSPLorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec;->(Ljava/lang/String;Ljava/lang/String;Z)V HSPLorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec;->getFactoryKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec;->getJobSpecId()Ljava/lang/String; @@ -22695,21 +25698,27 @@ HSPLorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec;->(Lj HSPLorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec;->getDependsOnJobId()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec;->getJobId()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/DependencySpec;->isMemoryOnly()Z +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->()V HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;Ljava/util/List;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->component1()Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->component2()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->component3()Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->getConstraintSpecs()Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->getDependencySpecs()Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->getJobSpec()Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/FullSpec;->isMemoryOnly()Z HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->()V -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJIIJ[B[BZZ)V -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy$default(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJIIJ[B[BZZILjava/lang/Object;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJIIJ[B[BZZ)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZI)V +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy$default(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZIILjava/lang/Object;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->copy(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJJIIJ[B[BZZI)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getCreateTime()J HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getFactoryKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getId()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getLastRunAttemptTime()J HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getLifespan()J HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getMaxAttempts()I -HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getNextRunAttemptTime()J +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getNextBackoffInterval()J +HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getPriority()I HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getQueueKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getRunAttempt()I HSPLorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;->getSerializedData()[B @@ -22721,34 +25730,25 @@ HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Companion;->enqueueIfNecessary()V HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob; HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->()V HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->()V HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V -HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->enqueueIfNecessary()V HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->onRun()V -HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->onShouldRetry(Ljava/lang/Exception;)Z HSPLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->serialize()[B +HSPLorg/thoughtcrime/securesms/jobs/ApkUpdateJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/ApkUpdateJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AttachmentCompressionJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AttachmentCopyJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->()V -HSPLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->(JLorg/thoughtcrime/securesms/attachments/AttachmentId;Z)V -HSPLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;JLorg/thoughtcrime/securesms/attachments/AttachmentId;Z)V -HSPLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->onAdded()V -HSPLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/AttachmentMarkUploadedJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/AttachmentUploadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AttachmentUploadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AutomaticSessionResetJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AvatarGroupsV1DownloadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/AvatarGroupsV2DownloadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->()V HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V -HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->getNextRunAttemptBackoff(ILjava/lang/Exception;)J HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->run()Lorg/thoughtcrime/securesms/jobmanager/Job$Result; HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->shouldTrace()Z HSPLorg/thoughtcrime/securesms/jobs/BaseJob;->warn(Ljava/lang/String;Ljava/lang/String;)V @@ -22778,42 +25778,21 @@ HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Companion;->(L HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Companion;->create()Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob; HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob; -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1;->(Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/util/concurrent/CountDownLatch;)V -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1;->invoke(Lorg/thoughtcrime/securesms/mediasend/Media;)V -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$2;->(Ljava/util/concurrent/CountDownLatch;)V HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->()V HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->access$getContext$p$s1046862181(Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;)Landroid/content/Context; HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->onRun()V HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->serialize()[B -HSPLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->setAvatar(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob; HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->()V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V -HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/recipients/Recipient;ZLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob-IA;)V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->(Z)V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->onRun()V HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->serialize()[B -HSPLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->shouldTrace()Z HSPLorg/thoughtcrime/securesms/jobs/DonationReceiptRedemptionJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda0;->()V -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;)V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda10;->produce()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda1;->(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda2;->(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda3;->()V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda4;->(I)V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda4;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda5;->()V @@ -22828,23 +25807,17 @@ HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheti HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob; -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->$r8$lambda$QoH7dcHnoANVuwa796Z9UVq8P10(Ljava/lang/String;Ljava/io/File;)Z HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->$r8$lambda$dkoZGu-68WkVhszwd5d_cWNZrJU(ILcom/annimon/stream/IntPair;Lcom/annimon/stream/IntPair;)I -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->$r8$lambda$svSYKFZ54wbzF4p08Dr861zOX4Y(Ljava/lang/String;Ljava/io/File;)Z HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->()V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->(Z)V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->assertRemoteDownloadConstraints(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->clearOldEmojiData(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->downloadImages(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;Ljava/util/List;Ljava/lang/String;Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$Producer;)V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->downloadJson(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)Lorg/thoughtcrime/securesms/emoji/EmojiData; HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->getDesiredRemoteBucketForDensity(Lorg/thoughtcrime/securesms/util/ScreenDensity;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->getFactoryKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->getRemoteImageHash(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;Ljava/lang/String;Ljava/lang/String;)[B -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->lambda$clearOldEmojiData$2(Ljava/lang/String;Ljava/io/File;)Z -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->lambda$clearOldEmojiData$3(Ljava/lang/String;Ljava/io/File;)Z HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->lambda$resolveDensity$0(ILcom/annimon/stream/IntPair;Lcom/annimon/stream/IntPair;)I -HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->markComplete(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->onRun()V HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->resolveDensity(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->scheduleIfNecessary(Landroid/content/Context;)V @@ -22867,6 +25840,15 @@ HSPLorg/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob;->onRun()V HSPLorg/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob;->scheduleIfNecessary()V HSPLorg/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob;->scheduleImmediately()V HSPLorg/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob;->serialize()[B +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Companion;->()V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Companion;->enqueueIfNecessary()V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory$Companion;->()V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob;->()V +HSPLorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob;->enqueueIfNecessary()V HSPLorg/thoughtcrime/securesms/jobs/FailingJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z @@ -22875,27 +25857,28 @@ HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$deleteJobs$1;->invoke(Ljava/l HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$deleteJobs$1;->invoke(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$$inlined$sortedBy$1;->()V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$$inlined$sortedBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->$r8$lambda$ys67DGXV-kRB6SrpydXOSDM-zSo(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$$inlined$sortedByDescending$1;->()V +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$$inlined$sortedByDescending$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$lambda$8$$inlined$sortedBy$1;->()V +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$lambda$8$$inlined$sortedBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->$r8$lambda$Xu-rS-eV7EMHJJ0ct-GtD7_wnkc(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->()V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->(Lorg/thoughtcrime/securesms/database/JobDatabase;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->deleteJob(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->deleteJobs$lambda$26(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->deleteJobs$lambda$28(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->deleteJobs(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getAllJobSpecs()Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getConstraintSpecs(Ljava/lang/String;)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getDependencySpecsThatDependOnJob(Ljava/lang/String;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobById(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobCountForFactory(Ljava/lang/String;)I HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobCountForFactoryAndQueue(Ljava/lang/String;Ljava/lang/String;)I HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobSpec(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getMigrationJob()Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getPendingJobsWithNoDependenciesInCreatedOrder(J)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getSingleLayerOfDependencySpecsThatDependOnJob(Ljava/lang/String;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->hasEligibleRunTime(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;J)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->init()V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->insertJobs(Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->markJobAsRunning(Ljava/lang/String;J)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->updateAllJobsToBePending()V -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->updateJobAfterRetry(Ljava/lang/String;ZIJ[B)V -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->updateJobRunningState(Ljava/lang/String;Z)V HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->updateJobs(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/jobs/FcmRefreshJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/FetchRemoteMegaphoneImageJob$Factory;->()V @@ -22907,8 +25890,6 @@ HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/FontDownloaderJob; HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$onRun$listener$1;->(Ljava/util/concurrent/CountDownLatch;Ljava/util/concurrent/atomic/AtomicInteger;)V -HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$onRun$listener$1;->onSuccess(Landroid/graphics/Typeface;)V -HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$onRun$listener$1;->onSuccess(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob;->()V HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob;->()V HSPLorg/thoughtcrime/securesms/jobs/FontDownloaderJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V @@ -22925,7 +25906,17 @@ HSPLorg/thoughtcrime/securesms/jobs/GiftSendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/GroupCallPeekJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/GroupCallPeekWorkerJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/GroupCallUpdateSendJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/GroupV1MigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Companion;->()V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Companion;->enqueue()V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob;->()V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob;->enqueue()V +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob;->getFactoryKey()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/GroupV2UpdateSelfProfileKeyJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/GroupV2UpdateSelfProfileKeyJob;->()V HSPLorg/thoughtcrime/securesms/jobs/GroupV2UpdateSelfProfileKeyJob;->enqueueForGroupsIfNecessary()V @@ -22940,12 +25931,11 @@ HSPLorg/thoughtcrime/securesms/jobs/LeaveGroupV2Job$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/LeaveGroupV2Job$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/LegacyAttachmentUploadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/LocalBackupJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/LocalBackupJobApi29$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MarkerJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MessageFetchJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/MmsDownloadJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/MmsReceiveJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MmsSendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceCallLinkSyncJob$Factory;->()V @@ -22959,14 +25949,10 @@ HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceMessageRequestResponseJob$Factory HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceOutgoingPaymentSyncJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileContentUpdateJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob; HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V -HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob-IA;)V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->onFailure()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceStickerPackOperationJob$Factory;->()V @@ -22979,8 +25965,6 @@ HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceSubscriptionSyncRequestJob$Factor HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceVerifiedUpdateJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceViewOnceOpenJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/MultiDeviceViewedUpdateJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/NewRegistrationUsernameSyncJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/NewRegistrationUsernameSyncJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/NullMessageSendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/OptimizeMessageSearchIndexJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/OptimizeMessageSearchIndexJob$Factory;->()V @@ -23014,21 +25998,14 @@ HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->access$getTAG$cp()Ljava/lan HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->enqueue()V HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->enqueueIfNeeded()V HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->onFailure()V HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->onRun()V -HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->onShouldRetry(Ljava/lang/Exception;)Z HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->serialize()[B -HSPLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->syncPreKeys(Lorg/whispersystems/signalservice/api/push/ServiceIdType;Lorg/whispersystems/signalservice/api/push/ServiceId;Lorg/whispersystems/signalservice/api/SignalServiceAccountDataStore;Lorg/thoughtcrime/securesms/crypto/storage/PreKeyMetadataStore;)V HSPLorg/thoughtcrime/securesms/jobs/ProfileKeySendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/ProfileUploadJob; HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->()V HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->()V HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V -HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/jobs/ProfileUploadJob-IA;)V HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->onFailure()V HSPLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/PushDistributionListSendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/PushGroupSendJob$Factory;->()V @@ -23042,18 +26019,14 @@ HSPLorg/thoughtcrime/securesms/jobs/PushProcessMessageJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/ReactionSendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RebuildMessageSearchIndexJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RebuildMessageSearchIndexJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/ReclaimUsernameAndLinkJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/ReclaimUsernameAndLinkJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/RefreshAttributesJob; HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->()V HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->()V HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Z)V -HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;ZLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob-IA;)V HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->(Z)V HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->onFailure()V -HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->onRun()V -HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->onShouldRetry(Ljava/lang/Exception;)Z HSPLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/RefreshCallLinkDetailsJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RefreshCallLinkDetailsJob$Factory;->()V @@ -23080,9 +26053,20 @@ HSPLorg/thoughtcrime/securesms/jobs/ResetSvrGuessCountJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/ResetSvrGuessCountJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/ResumableUploadSpecJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion;->()V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion;->enqueue(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion;->enqueueRoutineFetchIfNecessary()V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion;->forRecipients(Ljava/util/Set;)Ljava/util/List; +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->()V -HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->enqueueRoutineFetchIfNecessary(Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->(Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Ljava/util/Set;)V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->access$getTAG$cp()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->enqueueRoutineFetchIfNecessary()V +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->getFactoryKey()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob$Companion;->()V HSPLorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob$Companion;->enqueue$default(Lorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob$Companion;ZILjava/lang/Object;)V @@ -23093,7 +26077,6 @@ HSPLorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob;->access$getTAG$cp()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob;->enqueue()V -HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob$1;->()V HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/RotateCertificateJob; @@ -23103,9 +26086,7 @@ HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->(Lorg/thoughtcr HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/jobs/RotateCertificateJob-IA;)V HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->getFactoryKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->onAdded()V -HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->onFailure()V HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->onRun()V -HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->onShouldRetry(Ljava/lang/Exception;)Z HSPLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/RotateProfileKeyJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/RotateProfileKeyJob;->()V @@ -23117,19 +26098,10 @@ HSPLorg/thoughtcrime/securesms/jobs/SendRetryReceiptJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/SendViewedReceiptJob$Factory;->(Landroid/app/Application;)V HSPLorg/thoughtcrime/securesms/jobs/SenderKeyDistributionSendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/SmsReceiveJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/SmsSendJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/SmsSentJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/StickerDownloadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob; -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob;->()V -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Ljava/lang/String;Ljava/lang/String;ZZ)V -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Ljava/lang/String;Ljava/lang/String;ZZLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob-IA;)V -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob;->onFailure()V -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob;->onRun()V -HSPLorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob;->onShouldRetry(Ljava/lang/Exception;)Z HSPLorg/thoughtcrime/securesms/jobs/StorageAccountRestoreJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/StorageAccountRestoreJob;->()V HSPLorg/thoughtcrime/securesms/jobs/StorageForcePushJob$Factory;->()V @@ -23140,15 +26112,11 @@ HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Companion;->creat HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Companion;->enqueueIfNeeded()V HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob; HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->()V HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->access$getTAG$cp()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->getFactoryKey()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->getLocaleCodes()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->onRun()V HSPLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/SubmitRateLimitPushChallengeJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/SubscriptionKeepAliveJob$Factory;->()V @@ -23167,20 +26135,28 @@ HSPLorg/thoughtcrime/securesms/jobs/SyncSystemContactLinksJob$Factory;->() HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob$$ExternalSyntheticLambda0;->(J)V HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; -HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/ThreadUpdateJob; HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->$r8$lambda$JSigGKNJwOMmimqwpu8xPBnW5UQ(J)V HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->(J)V HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;J)V -HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;JLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob-IA;)V HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->enqueue(J)V HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->getFactoryKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->lambda$enqueue$0(J)V -HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->onRun()V HSPLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->serialize()[B HSPLorg/thoughtcrime/securesms/jobs/TrimThreadJob$Factory;->()V HSPLorg/thoughtcrime/securesms/jobs/TypingSendJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/jobs/UpdateApkJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->$values()[Lorg/thoughtcrime/securesms/keyboard/KeyboardPage; +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->()V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->values()[Lorg/thoughtcrime/securesms/keyboard/KeyboardPage; +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;)V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->$r8$lambda$XJkrNaIPPzC8wWYTIkWhYRIl3fM(Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;Ljava/lang/Boolean;)V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->()V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->()V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->_init_$lambda$1(Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;Ljava/lang/Boolean;)V +HSPLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->switchToPage(Lorg/thoughtcrime/securesms/keyboard/KeyboardPage;)V +HSPLorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;->()V +HSPLorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues$Companion;->()V HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues$aciPreKeys$1;->()V @@ -23215,13 +26191,13 @@ HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->generatePniIdentityKeyIf HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getAci()Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getAciIdentityKey()Lorg/signal/libsignal/protocol/IdentityKeyPair; HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getDeviceId()I -HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getDeviceName()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getE164()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getPni()Lorg/whispersystems/signalservice/api/push/ServiceId$PNI; HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getPniIdentityKey()Lorg/signal/libsignal/protocol/IdentityKeyPair; HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getPniRegistrationId()I HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getRegistrationId()I HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getServicePassword()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getUsername()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->hasAciIdentityKey()Z HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->hasPniIdentityKey()Z HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->hasStringData(Landroid/content/SharedPreferences;Ljava/lang/String;)Z @@ -23238,6 +26214,14 @@ HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->setPniRegistrationId(I)V HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->setRegistered(Z)V HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->setRegistrationId(I)V HSPLorg/thoughtcrime/securesms/keyvalue/AccountValues;->setServicePassword(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/keyvalue/ApkUpdateValues$Companion;->()V +HSPLorg/thoughtcrime/securesms/keyvalue/ApkUpdateValues$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/keyvalue/ApkUpdateValues;->()V +HSPLorg/thoughtcrime/securesms/keyvalue/ApkUpdateValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V +HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues$Companion;->()V +HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues;->()V +HSPLorg/thoughtcrime/securesms/keyvalue/BackupValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/BlobValue;->(Ljava/lang/String;[BLorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/BooleanValue;->(Ljava/lang/String;ZLorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/BooleanValue;->getValue$Signal_Android_playProdBenchmark(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)Ljava/lang/Boolean; @@ -23247,7 +26231,6 @@ HSPLorg/thoughtcrime/securesms/keyvalue/BooleanValue;->setValue$Signal_Android_p HSPLorg/thoughtcrime/securesms/keyvalue/CertificateType;->$values()[Lorg/thoughtcrime/securesms/keyvalue/CertificateType; HSPLorg/thoughtcrime/securesms/keyvalue/CertificateType;->()V HSPLorg/thoughtcrime/securesms/keyvalue/CertificateType;->(Ljava/lang/String;I)V -HSPLorg/thoughtcrime/securesms/keyvalue/CertificateType;->values()[Lorg/thoughtcrime/securesms/keyvalue/CertificateType; HSPLorg/thoughtcrime/securesms/keyvalue/CertificateValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/ChatColorsValues$Companion;->()V HSPLorg/thoughtcrime/securesms/keyvalue/ChatColorsValues$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -23257,20 +26240,26 @@ HSPLorg/thoughtcrime/securesms/keyvalue/ChatColorsValues;->getChatColors()Lorg/t HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$Companion;->()V HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$observableOneTimeCurrency$2;->(Lorg/thoughtcrime/securesms/keyvalue/DonationsValues;)V +HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$observablePendingOneTimeDonation$2;->(Lorg/thoughtcrime/securesms/keyvalue/DonationsValues;)V HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$observableSubscriptionCurrency$2;->(Lorg/thoughtcrime/securesms/keyvalue/DonationsValues;)V HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$oneTimeCurrencyPublisher$2;->(Lorg/thoughtcrime/securesms/keyvalue/DonationsValues;)V +HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$pendingOneTimeDonationPublisher$2;->(Lorg/thoughtcrime/securesms/keyvalue/DonationsValues;)V HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues$subscriptionCurrencyPublisher$2;->(Lorg/thoughtcrime/securesms/keyvalue/DonationsValues;)V HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V +HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->consumePending3DSData(J)Lorg/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData; +HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->consumeTerminalDonations()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->consumeVerifiedSubscription3DSData()Lorg/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData; HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->getExpiredBadge()Lorg/thoughtcrime/securesms/badges/models/Badge; HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->getLastKeepAliveLaunchTime()J HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->getUnexpectedSubscriptionCancelationReason()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->getUnexpectedSubscriptionCancelationTimestamp()J HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->getUnexpectedSubscriptionCancelationWatermark()J HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->setLastKeepAliveLaunchTime(J)V +HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->setPending3DSData(Lorg/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData;)V +HSPLorg/thoughtcrime/securesms/keyvalue/DonationsValues;->setVerifiedSubscription3DSData(Lorg/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData;)V HSPLorg/thoughtcrime/securesms/keyvalue/EmojiValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/EmojiValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V -HSPLorg/thoughtcrime/securesms/keyvalue/EmojiValues;->getJumboEmojiSheets(I)Ljava/util/HashSet; HSPLorg/thoughtcrime/securesms/keyvalue/EmojiValues;->getLastSearchIndexCheck()J HSPLorg/thoughtcrime/securesms/keyvalue/EmojiValues;->getNextScheduledImageCheck()J HSPLorg/thoughtcrime/securesms/keyvalue/EmojiValues;->getSearchVersion()I @@ -23288,10 +26277,11 @@ HSPLorg/thoughtcrime/securesms/keyvalue/IntValue;->getValue$Signal_Android_playP HSPLorg/thoughtcrime/securesms/keyvalue/IntValue;->setValue$Signal_Android_playProdBenchmark(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;I)V HSPLorg/thoughtcrime/securesms/keyvalue/IntValue;->setValue$Signal_Android_playProdBenchmark(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/keyvalue/InternalValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V +HSPLorg/thoughtcrime/securesms/keyvalue/InternalValues;->callingDisableLBRed()Z HSPLorg/thoughtcrime/securesms/keyvalue/InternalValues;->forceBuiltInEmoji()Z HSPLorg/thoughtcrime/securesms/keyvalue/InternalValues;->isWebsocketModeForced()Z HSPLorg/thoughtcrime/securesms/keyvalue/InternalValues;->shakeToReport()Z -HSPLorg/thoughtcrime/securesms/keyvalue/InternalValues;->useConversationItemV2()Z +HSPLorg/thoughtcrime/securesms/keyvalue/InternalValues;->useConversationItemV2Media()Z HSPLorg/thoughtcrime/securesms/keyvalue/KeepMessagesDuration;->$values()[Lorg/thoughtcrime/securesms/keyvalue/KeepMessagesDuration; HSPLorg/thoughtcrime/securesms/keyvalue/KeepMessagesDuration;->()V HSPLorg/thoughtcrime/securesms/keyvalue/KeepMessagesDuration;->(Ljava/lang/String;IIIJ)V @@ -23314,6 +26304,7 @@ HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;->putLong(Ljava/lang/Str HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;->putString(Ljava/lang/String;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;->readValueAsType(Ljava/lang/String;Ljava/lang/Class;Z)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;->removeAll(Ljava/util/Collection;)V +HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueProtoValue;->(Ljava/lang/String;Lcom/squareup/wire/ProtoAdapter;Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueStore$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;Lorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet;Ljava/util/Collection;)V HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueStore$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/keyvalue/KeyValueStore$Writer;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V @@ -23387,10 +26378,11 @@ HSPLorg/thoughtcrime/securesms/keyvalue/PaymentsValues;->(Lorg/thoughtcrim HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->$values()[Lorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode; HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->()V HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->(Ljava/lang/String;II)V -HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->isDiscoverable()Z +HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->deserialize(I)Lorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode; +HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->serialize()I +HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->values()[Lorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode; HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V -HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues;->getAllCertificateTypes()Ljava/util/Collection; HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues;->getPhoneNumberListingMode()Lorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode; HSPLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues;->getPhoneNumberListingModeTimestamp()J HSPLorg/thoughtcrime/securesms/keyvalue/PinValues;->()V @@ -23411,7 +26403,6 @@ HSPLorg/thoughtcrime/securesms/keyvalue/ReleaseChannelValues$Companion;->( HSPLorg/thoughtcrime/securesms/keyvalue/ReleaseChannelValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/ReleaseChannelValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/ReleaseChannelValues;->getReleaseChannelRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; -HSPLorg/thoughtcrime/securesms/keyvalue/ReleaseChannelValues;->setReleaseChannelRecipientId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/keyvalue/RemoteConfigValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/RemoteConfigValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/RemoteConfigValues;->getCurrentConfig()Ljava/lang/String; @@ -23428,16 +26419,22 @@ HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->$values()[Lorg/th HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->()V HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->(Ljava/lang/String;ILjava/lang/String;)V HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->deserialize(Ljava/lang/String;)Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme; +HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->values()[Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme; HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getCensorshipCircumventionEnabled()Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$CensorshipCircumventionEnabled; HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getKeepMessagesDuration()Lorg/thoughtcrime/securesms/keyvalue/KeepMessagesDuration; HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getLanguage()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageFontSize()I HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageLedColor()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageNotificationSound()Landroid/net/Uri; +HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageNotificationsPrivacy()Lorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference; HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getTheme()Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme; +HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getUniversalExpireTimer()I HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getUseCompactNavigationBar()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isBackupEnabled()Z +HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isEnterKeySends()Z +HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isLinkPreviewsEnabled()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isMessageNotificationsEnabled()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isMessageVibrateEnabled()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isPreferSystemContactPhotos()Z @@ -23475,6 +26472,7 @@ HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegatesKt;->blobValue( HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegatesKt;->booleanValue(Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;Ljava/lang/String;Z)Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegatesKt;->integerValue(Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;Ljava/lang/String;I)Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegatesKt;->longValue(Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;Ljava/lang/String;J)Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate; +HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegatesKt;->protoValue(Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;Ljava/lang/String;Lcom/squareup/wire/ProtoAdapter;)Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegatesKt;->stringValue(Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;Ljava/lang/String;Ljava/lang/String;)Lorg/thoughtcrime/securesms/keyvalue/SignalStoreValueDelegate; HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;->getBlob(Ljava/lang/String;[B)[B @@ -23487,6 +26485,7 @@ HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;->getString(Ljava/lang HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;->putBoolean(Ljava/lang/String;Z)V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;->putLong(Ljava/lang/String;J)V HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;->putString(Ljava/lang/String;Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/keyvalue/SignalStoreValues;->remove(Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/keyvalue/StorageServiceValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/StorageServiceValues;->getLastSyncTime()J HSPLorg/thoughtcrime/securesms/keyvalue/StorageServiceValues;->needsAccountRestore()Z @@ -23501,7 +26500,6 @@ HSPLorg/thoughtcrime/securesms/keyvalue/StoryValues;->getLastFontVersionCheck()J HSPLorg/thoughtcrime/securesms/keyvalue/StoryValues;->getLatestActiveStorySendTimestamps(J)Ljava/util/List; HSPLorg/thoughtcrime/securesms/keyvalue/StoryValues;->getUserHasViewedOnboardingStory()Z HSPLorg/thoughtcrime/securesms/keyvalue/StoryValues;->isFeatureDisabled()Z -HSPLorg/thoughtcrime/securesms/keyvalue/StoryValues;->setHasDownloadedOnboardingStory(Z)V HSPLorg/thoughtcrime/securesms/keyvalue/StoryValues;->setLastFontVersionCheck(J)V HSPLorg/thoughtcrime/securesms/keyvalue/StringValue;->(Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/StringValue;->getValue$Signal_Android_playProdBenchmark(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)Ljava/lang/Object; @@ -23509,11 +26507,9 @@ HSPLorg/thoughtcrime/securesms/keyvalue/StringValue;->getValue$Signal_Android_pl HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->clearRegistrationLockAndPin()V HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->getLocalPinHash()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->getMasterKey()Lorg/whispersystems/signalservice/api/kbs/MasterKey; -HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->getRecoveryPassword()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->getOrCreateMasterKey()Lorg/whispersystems/signalservice/api/kbs/MasterKey; HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->hasOptedOut()Z HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->hasPin()Z -HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->isRegistrationLockEnabled()Z HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->lastPinCreateFailed()Z HSPLorg/thoughtcrime/securesms/keyvalue/SvrValues;->optOut()V HSPLorg/thoughtcrime/securesms/keyvalue/TooltipValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V @@ -23524,12 +26520,39 @@ HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->()V HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->(Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore;)V HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->getCurrentWallpaper()Lorg/thoughtcrime/securesms/database/model/databaseprotos/Wallpaper; HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->getWallpaper()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; +HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->hasWallpaperSet()Z +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->forNoLinks()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Creator;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->(Ljava/lang/String;ZZLorg/thoughtcrime/securesms/linkpreview/LinkPreview;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository$Error;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->(Ljava/lang/String;ZZLorg/thoughtcrime/securesms/linkpreview/LinkPreview;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository$Error;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->hasContent()Z +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->hasLinks()Z +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->invoke()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1;->(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1;->invoke(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->()V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Landroidx/lifecycle/SavedStateHandle;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;Z)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Landroidx/lifecycle/SavedStateHandle;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->access$setSavedLinkPreviewState(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->getLinkPreviewState()Lio/reactivex/rxjava3/core/Flowable; +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->getSavedLinkPreviewState()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; +HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->setSavedLinkPreviewState(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V HSPLorg/thoughtcrime/securesms/logging/CustomSignalProtocolLogger;->()V HSPLorg/thoughtcrime/securesms/logging/CustomSignalProtocolLogger;->log(ILjava/lang/String;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$Companion;->()V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/Throwable;Z)V -HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest;->getCreateTime()J HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest;->getKeepLonger()Z HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest;->getLevel()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest;->getMessage()Ljava/lang/String; @@ -23553,6 +26576,7 @@ HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->getThreadString()Ljava HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger;->write(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V +HSPLorg/thoughtcrime/securesms/logsubmit/LogSectionNotifications$$ExternalSyntheticApiModelOutline2;->m(Landroid/app/NotificationChannel;)Z HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda0;->()V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda0;->run()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment;)V @@ -23596,6 +26620,7 @@ HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->getSearchTool HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->goToStateFromConversationList(Lorg/thoughtcrime/securesms/stories/tabs/ConversationListTabsState;Landroidx/navigation/NavController;)V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->initializeProfileIcon(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->initializeSettingsTouchTarget()V +HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->onPause()V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->onResume$lambda$2()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->onResume()V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V @@ -23603,10 +26628,6 @@ HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->presentToolba HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->presentToolbarForDestination(Landroidx/navigation/NavDestination;)V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->updateNotificationProfileStatus(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->updateProxyStatus(Lorg/whispersystems/signalservice/api/websocket/WebSocketConnectionState;)V -HSPLorg/thoughtcrime/securesms/mediasend/Media$1;->()V -HSPLorg/thoughtcrime/securesms/mediasend/Media;->()V -HSPLorg/thoughtcrime/securesms/mediasend/Media;->(Landroid/net/Uri;Ljava/lang/String;JIIJJZZLj$/util/Optional;Lj$/util/Optional;Lj$/util/Optional;)V -HSPLorg/thoughtcrime/securesms/mediasend/Media;->getUri()Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/megaphone/ForeverSchedule;->(Z)V HSPLorg/thoughtcrime/securesms/megaphone/ForeverSchedule;->shouldDisplay(IJJJ)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetbodyText(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/megaphone/MegaphoneText; @@ -23673,24 +26694,24 @@ HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneRepository;->resetDatabaseCach HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder$1;->()V HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder;->build(Landroid/content/Context;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/megaphone/MegaphoneActionController;)Landroid/view/View; HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder;->buildOnboardingMegaphone(Landroid/content/Context;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/megaphone/MegaphoneActionController;)Landroid/view/View; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda22;->(Ljava/util/Map;J)V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda22;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda23;->()V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda23;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda24;->(Ljava/util/Map;)V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda24;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda25;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda25;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18;->(Ljava/util/Map;J)V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda19;->()V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda19;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda20;->(Ljava/util/Map;)V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda20;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda21;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda21;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda2;->()V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;)V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda3;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda4;->()V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda4;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;)V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda4;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda5;->()V HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda5;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda6;->()V HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda6;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda7;->()V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda7;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda8;->()V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda8;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$1;->(Landroid/content/Context;Ljava/util/Map;)V HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$3;->()V HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->$values()[Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event; @@ -23700,17 +26721,17 @@ HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->fromKey(Ljava/lang/S HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->getKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->hasKey(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->values()[Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$FDbv6uSpRzHyYNDnZTF-2s_O_3g(Ljava/lang/Long;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$_2K77hIOFzrtJ762LZYBsNHIYfw(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$57Iylt9yWAB65XCua6kCFNHv3Ho(Ljava/util/Map$Entry;)Ljava/lang/Long; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$Jd3YY1Tctc615OoR-BunWBsX5AM(Ljava/lang/Long;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$StkmuqSPG82Z8-YWKFWZC31YUUs(Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$bfAOsFTMV105nBLDPhyo5-_RYW0(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$jKOYs4kAlzGKOSd0Gb2wil_axMM(Ljava/util/Map;JLjava/util/Map$Entry;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$p95meu3kraxrQi7DBKBuyQrZXNc(Ljava/util/Map$Entry;)Ljava/lang/Long; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$pta7ncLgHvVO2uhbLUhCHhk1XfM(Ljava/util/Map$Entry;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$ya9b6y2SFOc06_b4NHtqa2lYZ44(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MegaphoneRecord;)Lorg/thoughtcrime/securesms/megaphone/Megaphone; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$sfgetALWAYS()Lorg/thoughtcrime/securesms/megaphone/MegaphoneSchedule; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$sfgetNEVER()Lorg/thoughtcrime/securesms/megaphone/MegaphoneSchedule; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$smshouldShowAddAProfilePhotoMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$smshouldShowBackupSchedulePermissionMegaphone(Landroid/content/Context;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$smshouldShowDonateMegaphone(Landroid/content/Context;Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$smshouldShowGrantFullScreenIntentPermission(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$smshouldShowNotificationsMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$smshouldShowOnboardingMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$smshouldShowRemoteMegaphone(Ljava/util/Map;)Z @@ -23723,13 +26744,13 @@ HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->forRecord(Landroid/content HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->getNextMegaphone(Landroid/content/Context;Ljava/util/Map;)Lorg/thoughtcrime/securesms/megaphone/Megaphone; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$getNextMegaphone$0(Ljava/util/Map;JLjava/util/Map$Entry;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$getNextMegaphone$1(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MegaphoneRecord;)Lorg/thoughtcrime/securesms/megaphone/Megaphone; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$25(Ljava/util/Map$Entry;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$26(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$27(Ljava/util/Map$Entry;)Ljava/lang/Long; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$28(Ljava/lang/Long;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$22(Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$23(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$24(Ljava/util/Map$Entry;)Ljava/lang/Long; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$25(Ljava/lang/Long;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowAddAProfilePhotoMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowBackupSchedulePermissionMegaphone(Landroid/content/Context;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowDonateMegaphone(Landroid/content/Context;Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowGrantFullScreenIntentPermission(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowNotificationsMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowOnboardingMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowRemoteMegaphone(Ljava/util/Map;)Z @@ -23772,6 +26793,8 @@ HSPLorg/thoughtcrime/securesms/megaphone/PinsForAllSchedule;->shouldDisplay(IJJJ HSPLorg/thoughtcrime/securesms/megaphone/RecurringSchedule;->([J)V HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$donate$1;->()V HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$donate$1;->()V +HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$donateForFriend$1;->()V +HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$donateForFriend$1;->()V HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$finish$1;->()V HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$finish$1;->()V HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$getRemoteMegaphoneToShow$1;->()V @@ -23797,9 +26820,24 @@ HSPLorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule;->(Land HSPLorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule;->shouldDisplay(IJJJ)Z HSPLorg/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver;->()V HSPLorg/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver;->startOrUpdateAlarm(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->()V +HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->(IILjava/lang/String;)V +HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->getDescription()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->()V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/GroupInfo;Ljava/util/List;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component1()Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component2()Lorg/thoughtcrime/securesms/messagerequests/GroupInfo; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component3()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component4()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->()V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getMessageRequestState(Lorg/thoughtcrime/securesms/recipients/Recipient;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getRecipientInfo(Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->$values()[Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->()V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$2;->(Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$2;->onForeground()V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$BackgroundService$Companion;->()V @@ -23823,7 +26861,6 @@ HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$MessageRetrieval HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$MessageRetrievalThread$run$webSocketDisposable$1;->accept(Lorg/whispersystems/signalservice/api/websocket/WebSocketConnectionState;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$MessageRetrievalThread;->(Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$MessageRetrievalThread;->run()V -HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$isConnectionNecessary$1$removedKeepAliveToken$1;->(J)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$networkConnectionListener$1;->(Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$networkConnectionListener$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$networkConnectionListener$1;->invoke(Lkotlin/jvm/functions/Function0;)V @@ -23841,7 +26878,6 @@ HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->access$setDecr HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->access$waitForConnectionNecessary(Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->addDecryptionDrainedListener(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->disconnect()V -HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->getDecryptionDrained()Z HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->isConnectionNecessary()Z HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->notifyRegistrationChanged()V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->onAppForegrounded()V @@ -23890,6 +26926,8 @@ HSPLorg/thoughtcrime/securesms/migrations/BlobStorageLocationMigrationJob$Factor HSPLorg/thoughtcrime/securesms/migrations/CachedAttachmentsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/ClearGlideCacheMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/ClearGlideCacheMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/CopyUsernameToSignalStoreMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/CopyUsernameToSignalStoreMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/DatabaseMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/DeleteDeprecatedLogsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/DirectoryRefreshMigrationJob$Factory;->()V @@ -23912,26 +26950,35 @@ HSPLorg/thoughtcrime/securesms/migrations/ProfileMigrationJob$Factory;->() HSPLorg/thoughtcrime/securesms/migrations/ProfileSharingUpdateMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/RebuildMessageSearchIndexMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/RebuildMessageSearchIndexMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/RecheckPaymentsMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/RecheckPaymentsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/RecipientSearchMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/SelfRegisteredStateMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/SelfRegisteredStateMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StickerAdditionMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StickerDayByDayMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StickerLaunchMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StickerMyDailyLifeMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StorageCapabilityMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/StorageFixLocalUnknownMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/StorageFixLocalUnknownMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StorageServiceMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/migrations/StoryReadStateMigrationJob$Factory;->()V -HSPLorg/thoughtcrime/securesms/migrations/StoryReadStateMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StoryViewedReceiptsStateMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/StoryViewedReceiptsStateMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/Svr2MirrorMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/Svr2MirrorMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/SyncDistributionListsMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/SyncKeysMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/migrations/SyncKeysMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/TrimByLengthSettingsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/UpdateSmsJobsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/UpdateSmsJobsMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/UserNotificationMigrationJob$Factory;->()V HSPLorg/thoughtcrime/securesms/migrations/UuidMigrationJob$Factory;->()V +HSPLorg/thoughtcrime/securesms/mms/AttachmentManager;->()V +HSPLorg/thoughtcrime/securesms/mms/AttachmentManager;->(Landroid/content/Context;Landroid/view/View;Lorg/thoughtcrime/securesms/mms/AttachmentManager$AttachmentListener;)V +HSPLorg/thoughtcrime/securesms/mms/AttachmentManager;->isAttachmentPresent()Z HSPLorg/thoughtcrime/securesms/mms/AttachmentStreamUriLoader$Factory;->()V HSPLorg/thoughtcrime/securesms/mms/DecryptableStreamUriLoader$Factory;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/mms/GlideApp;->get(Landroid/content/Context;)Lcom/bumptech/glide/Glide; @@ -23952,6 +26999,9 @@ HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->apply(Lcom/bumptech/glide/requ HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->diskCacheStrategy(Lcom/bumptech/glide/load/engine/DiskCacheStrategy;)Lorg/thoughtcrime/securesms/mms/GlideRequest; HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->error(Landroid/graphics/drawable/Drawable;)Lorg/thoughtcrime/securesms/mms/GlideRequest; HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->load(Ljava/lang/Object;)Lorg/thoughtcrime/securesms/mms/GlideRequest; +HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->override(I)Lorg/thoughtcrime/securesms/mms/GlideRequest; +HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->override(II)Lcom/bumptech/glide/request/BaseRequestOptions; +HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->override(II)Lorg/thoughtcrime/securesms/mms/GlideRequest; HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->transform(Lcom/bumptech/glide/load/Transformation;)Lorg/thoughtcrime/securesms/mms/GlideRequest; HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->as(Ljava/lang/Class;)Lcom/bumptech/glide/RequestBuilder; @@ -23961,37 +27011,35 @@ HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->setRequestOptions(Lcom/bumpte HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->()V HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->(Lorg/thoughtcrime/securesms/attachments/Attachment;)V HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->hasImage()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->()V -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/groups/GroupId;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;ZJJJIJZLorg/thoughtcrime/securesms/mms/QuoteModel;ZZLjava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;ZZZ)V -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/groups/GroupId;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;ZJJJIJZLorg/thoughtcrime/securesms/mms/QuoteModel;ZZLjava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getAttachments()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getBody()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getExpiresIn()J -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getFrom()Lorg/thoughtcrime/securesms/recipients/RecipientId; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getGiftBadge()Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getLinkPreviews()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getMentions()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getMessageRanges()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getParentStoryId()Lorg/thoughtcrime/securesms/database/model/ParentStoryId; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getQuote()Lorg/thoughtcrime/securesms/mms/QuoteModel; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getReceivedTimeMillis()J -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getSentTimeMillis()J -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getServerGuid()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getServerTimeMillis()J -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getSharedContacts()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getStoryType()Lorg/thoughtcrime/securesms/database/model/StoryType; -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->getSubscriptionId()I -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isActivatePaymentsRequest()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isExpirationUpdate()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isGroupMessage()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isPaymentsActivated()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isPaymentsNotification()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isPushMessage()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isStoryReaction()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isUnidentified()Z -HSPLorg/thoughtcrime/securesms/mms/IncomingMediaMessage;->isViewOnce()Z +HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->hasPlaceholder()Z +HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->isBorderless()Z +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage$Companion;->()V +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->()V +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->(Lorg/thoughtcrime/securesms/database/MessageType;Lorg/thoughtcrime/securesms/recipients/RecipientId;JJJLorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/mms/MessageGroupContext;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;ZIJLorg/thoughtcrime/securesms/mms/QuoteModel;ZZLjava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;)V +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->(Lorg/thoughtcrime/securesms/database/MessageType;Lorg/thoughtcrime/securesms/recipients/RecipientId;JJJLorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/mms/MessageGroupContext;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;ZIJLorg/thoughtcrime/securesms/mms/QuoteModel;ZZLjava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getAttachments()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getBody()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getExpiresIn()J +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getFrom()Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getGiftBadge()Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getLinkPreviews()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getMentions()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getMessageRanges()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getParentStoryId()Lorg/thoughtcrime/securesms/database/model/ParentStoryId; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getQuote()Lorg/thoughtcrime/securesms/mms/QuoteModel; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getReceivedTimeMillis()J +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getSentTimeMillis()J +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getServerGuid()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getServerTimeMillis()J +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getSharedContacts()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getStoryType()Lorg/thoughtcrime/securesms/database/model/StoryType; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getSubscriptionId()I +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->getType()Lorg/thoughtcrime/securesms/database/MessageType; +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->isGroupMessage()Z +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->isUnidentified()Z +HSPLorg/thoughtcrime/securesms/mms/IncomingMessage;->isViewOnce()Z HSPLorg/thoughtcrime/securesms/mms/PartAuthority;->()V -HSPLorg/thoughtcrime/securesms/mms/PartAuthority;->getEmojiFilename(Landroid/net/Uri;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/mms/PartAuthority;->getEmojiUri(Ljava/lang/String;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/mms/SentMediaQuality;->$values()[Lorg/thoughtcrime/securesms/mms/SentMediaQuality; HSPLorg/thoughtcrime/securesms/mms/SentMediaQuality;->()V @@ -24010,19 +27058,37 @@ HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->isManifestParsingEnabled( HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->registerComponents(Landroid/content/Context;Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/Registry;)V HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->setRegisterGlideComponents(Lorg/thoughtcrime/securesms/mms/RegisterGlideComponents;)V HSPLorg/thoughtcrime/securesms/mms/Slide;->(Lorg/thoughtcrime/securesms/attachments/Attachment;)V +HSPLorg/thoughtcrime/securesms/mms/Slide;->asAttachment()Lorg/thoughtcrime/securesms/attachments/Attachment; +HSPLorg/thoughtcrime/securesms/mms/Slide;->getBody()Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/mms/Slide;->getCaption()Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/mms/Slide;->getContentType()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/mms/Slide;->getFileSize()J +HSPLorg/thoughtcrime/securesms/mms/Slide;->getPlaceholderBlur()Lorg/thoughtcrime/securesms/blurhash/BlurHash; +HSPLorg/thoughtcrime/securesms/mms/Slide;->getTransferState()I HSPLorg/thoughtcrime/securesms/mms/Slide;->getUri()Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/mms/Slide;->hasAudio()Z HSPLorg/thoughtcrime/securesms/mms/Slide;->hasDocument()Z HSPLorg/thoughtcrime/securesms/mms/Slide;->hasSticker()Z HSPLorg/thoughtcrime/securesms/mms/Slide;->hasVideo()Z +HSPLorg/thoughtcrime/securesms/mms/Slide;->hashCode()I +HSPLorg/thoughtcrime/securesms/mms/Slide;->isInProgress()Z +HSPLorg/thoughtcrime/securesms/mms/Slide;->isPendingDownload()Z HSPLorg/thoughtcrime/securesms/mms/Slide;->isVideoGif()Z -HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->(Landroid/content/Context;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/mms/SlideDeck$$ExternalSyntheticLambda0;->()V +HSPLorg/thoughtcrime/securesms/mms/SlideDeck$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getAudioSlide()Lorg/thoughtcrime/securesms/mms/AudioSlide; +HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getBody()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getDocumentSlide()Lorg/thoughtcrime/securesms/mms/DocumentSlide; HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getSlides()Ljava/util/List; HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getStickerSlide()Lorg/thoughtcrime/securesms/mms/StickerSlide; +HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getTextSlide()Lorg/thoughtcrime/securesms/mms/TextSlide; HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getThumbnailSlide()Lorg/thoughtcrime/securesms/mms/Slide; +HSPLorg/thoughtcrime/securesms/mms/SlideDeck;->getThumbnailSlides()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->$values()[Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; +HSPLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->()V +HSPLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->(Ljava/lang/String;ILjava/lang/String;)V +HSPLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->from(Ljava/lang/String;)Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; HSPLorg/thoughtcrime/securesms/net/ContentProxySafetyInterceptor;->()V HSPLorg/thoughtcrime/securesms/net/ContentProxySafetyInterceptor;->()V HSPLorg/thoughtcrime/securesms/net/ContentProxySelector$1;->(Lorg/thoughtcrime/securesms/net/ContentProxySelector;I)V @@ -24113,6 +27179,9 @@ HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->onUpgrade(La HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->setLedPreference(Landroid/app/NotificationChannel;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->setVibrationEnabled(Landroid/app/NotificationChannel;Z)V HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->supported()Z +HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->(Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->getNotifier()Lorg/thoughtcrime/securesms/notifications/MessageNotifier; +HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->setVisibleThread(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;)V HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->()V HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->()V HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->getConfiguration()Lorg/thoughtcrime/securesms/notifications/Configuration; @@ -24122,45 +27191,71 @@ HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->hasRep HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->haveEnoughData(Ljava/lang/String;J)Z HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->isFailingToDrainQueue(Ljava/util/List;JI)Z HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->isHavingDelayedNotifications()Z -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$$ExternalSyntheticLambda0;->()V -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$$ExternalSyntheticLambda0;->call()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$1;->(Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;)V -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$1;->apply(Lkotlin/Unit;)Lio/reactivex/rxjava3/core/SingleSource; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State;->$values()[Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State;->()V -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State;->(Ljava/lang/String;I)V -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State;->values()[Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->$r8$lambda$EUBtm_zT47bPDOd0wVM8cVHFFek()Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->()V -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->()V -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->access$checkHeuristics(Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;)Lio/reactivex/rxjava3/core/Single; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->checkHeuristics$lambda$0()Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->checkHeuristics()Lio/reactivex/rxjava3/core/Single; -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->checkSlowNotificationHeuristics()V -HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel;->getSlowNotificationState()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/notifications/VitalsViewModel;)V +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$$ExternalSyntheticLambda0;->call()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$1;->(Lorg/thoughtcrime/securesms/notifications/VitalsViewModel;)V +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$1;->apply(Lkotlin/Unit;)Lio/reactivex/rxjava3/core/SingleSource; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$State;->$values()[Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$State; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$State;->()V +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$State;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel$State;->values()[Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$State; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->$r8$lambda$U_V7OZ_aXNSNkBigbMvFTCSaUpQ(Lorg/thoughtcrime/securesms/notifications/VitalsViewModel;)Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$State; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->()V +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->(Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->access$checkHeuristics(Lorg/thoughtcrime/securesms/notifications/VitalsViewModel;)Lio/reactivex/rxjava3/core/Single; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->checkHeuristics$lambda$0(Lorg/thoughtcrime/securesms/notifications/VitalsViewModel;)Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$State; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->checkHeuristics()Lio/reactivex/rxjava3/core/Single; +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->checkSlowNotificationHeuristics()V +HSPLorg/thoughtcrime/securesms/notifications/VitalsViewModel;->getVitalsState()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/notifications/profiles/NotificationProfiles;->()V HSPLorg/thoughtcrime/securesms/notifications/profiles/NotificationProfiles;->()V HSPLorg/thoughtcrime/securesms/notifications/profiles/NotificationProfiles;->getActiveProfile$default(Ljava/util/List;JLj$/time/ZoneId;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/notifications/profiles/NotificationProfile; HSPLorg/thoughtcrime/securesms/notifications/profiles/NotificationProfiles;->getActiveProfile(Ljava/util/List;JLj$/time/ZoneId;)Lorg/thoughtcrime/securesms/notifications/profiles/NotificationProfile; -HSPLorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/permissions/Permissions;->$r8$lambda$Q0AcdMcPXUgr1QQ_HDTcoSx0sHo(Landroid/content/Context;Ljava/lang/String;)Z -HSPLorg/thoughtcrime/securesms/permissions/Permissions;->()V -HSPLorg/thoughtcrime/securesms/permissions/Permissions;->hasAll(Landroid/content/Context;[Ljava/lang/String;)Z -HSPLorg/thoughtcrime/securesms/permissions/Permissions;->lambda$hasAll$2(Landroid/content/Context;Ljava/lang/String;)Z +HSPLorg/thoughtcrime/securesms/notifications/v2/CancelableExecutor;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion;->forConversation(J)Lorg/thoughtcrime/securesms/notifications/v2/ConversationId; +HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Creator;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->(JLjava/lang/Long;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->hashCode()I +HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->(Landroid/app/Application;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->setVisibleThread(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->getEMPTY()Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$messageCount$2;->(Lorg/thoughtcrime/securesms/notifications/v2/NotificationState;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationIds$2;->(Lorg/thoughtcrime/securesms/notifications/v2/NotificationState;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationItems$2;->(Lorg/thoughtcrime/securesms/notifications/v2/NotificationState;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->()V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->access$getEMPTY$cp()Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->-$$Nest$fgetcountryCode(Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;)I +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->(Ljava/lang/String;ILjava/lang/String;)V +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->getCountryCode()I +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->()V +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->get(Landroid/content/Context;)Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter; +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->parseAreaCode(Ljava/lang/String;I)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrint(Ljava/lang/String;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrintFormat(Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/pin/SvrRepository;->()V HSPLorg/thoughtcrime/securesms/pin/SvrRepository;->()V HSPLorg/thoughtcrime/securesms/pin/SvrRepository;->onRegistrationComplete(Lorg/whispersystems/signalservice/api/kbs/MasterKey;Ljava/lang/String;ZZ)V +HSPLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->(Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->isDisplayContact()Z +HSPLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->toString()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->()V HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/io/InputStream; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarDirectory(Landroid/content/Context;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/io/File; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFileDetails(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails; -HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getOutputStream(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/io/OutputStream; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->hasAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Z -HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->setAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/io/InputStream;)V HSPLorg/thoughtcrime/securesms/profiles/ProfileName$$ExternalSyntheticLambda0;->()V HSPLorg/thoughtcrime/securesms/profiles/ProfileName$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/profiles/ProfileName$$ExternalSyntheticLambda1;->()V @@ -24169,8 +27264,6 @@ HSPLorg/thoughtcrime/securesms/profiles/ProfileName$1;->()V HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->$r8$lambda$pNHvm3E5R2_hKbty_0luXfn7Cik(Ljava/lang/Boolean;Ljava/lang/String;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->()V HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->(Ljava/lang/String;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->asGiven(Ljava/lang/String;)Lorg/thoughtcrime/securesms/profiles/ProfileName; -HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->fromParts(Ljava/lang/String;Ljava/lang/String;)Lorg/thoughtcrime/securesms/profiles/ProfileName; HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->getFamilyName()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/profiles/ProfileName;->getGivenName()Ljava/lang/String; @@ -24190,69 +27283,17 @@ HSPLorg/thoughtcrime/securesms/providers/BaseContentProvider;->attachInfo(Landro HSPLorg/thoughtcrime/securesms/providers/BlobContentProvider;->()V HSPLorg/thoughtcrime/securesms/providers/BlobContentProvider;->()V HSPLorg/thoughtcrime/securesms/providers/BlobContentProvider;->onCreate()Z -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;J)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda10;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda11;->run()V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;Ljava/io/OutputStream;Landroid/net/Uri;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda1;->call()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda9;->(JLandroid/net/Uri;)V HSPLorg/thoughtcrime/securesms/providers/BlobProvider$1;->(I)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$2;->()V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Ljava/io/InputStream;J)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Ljava/io/InputStream;JLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder-IA;)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->buildBlobSpec(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->createForSingleSessionOnDisk(Landroid/content/Context;)Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$fgetid(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetData(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/io/InputStream; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetFileName(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetFileSize(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)J -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetId(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetMimeType(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetStorageType(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->(Ljava/io/InputStream;Ljava/lang/String;Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;Ljava/lang/String;Ljava/lang/String;J)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->(Ljava/io/InputStream;Ljava/lang/String;Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;Ljava/lang/String;Ljava/lang/String;JLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec-IA;)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getData()Ljava/io/InputStream; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getFileName()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getFileSize()J -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getId()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getMimeType()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getStorageType()Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->$values()[Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->-$$Nest$mencode(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->-$$Nest$misMemory(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Z -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->-$$Nest$smdecode(Ljava/lang/String;)Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->()V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->(Ljava/lang/String;ILjava/lang/String;Z)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->decode(Ljava/lang/String;)Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->encode()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->isMemory()Z -HSPLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->values()[Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->$r8$lambda$ODJ5xh2VOR1mLM-AV1r-HG7pEAk(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->$r8$lambda$hszeKLE-J5rLAuyYe0jTaWcOLg4(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;JLjava/io/File;)Ljava/io/InputStream; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->$r8$lambda$vEFatZFK1evY8Xp8zObuRkcU_8Q(Lorg/thoughtcrime/securesms/providers/BlobProvider;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;Ljava/io/OutputStream;Landroid/net/Uri;Landroid/content/Context;)Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->-$$Nest$mwriteBlobSpecToDisk(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->()V HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->()V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->buildFileName(Ljava/lang/String;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->buildUri(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->deleteOrphanedDraftFiles(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->forData(Ljava/io/InputStream;J)Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->getAttachmentSecret(Landroid/content/Context;)Lorg/thoughtcrime/securesms/crypto/AttachmentSecret; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->getBlobRepresentation(Landroid/content/Context;Landroid/net/Uri;Lorg/thoughtcrime/securesms/util/IOFunction;Lorg/thoughtcrime/securesms/util/IOFunction;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->getDirectory(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->getInstance()Lorg/thoughtcrime/securesms/providers/BlobProvider; HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->getOrCreateDirectory(Landroid/content/Context;Ljava/lang/String;)Ljava/io/File; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->getStream(Landroid/content/Context;Landroid/net/Uri;)Ljava/io/InputStream; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->getStream(Landroid/content/Context;Landroid/net/Uri;J)Ljava/io/InputStream; HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->initialize(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->isAuthority(Landroid/net/Uri;)Z -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->lambda$getStream$1(Landroid/content/Context;JLjava/io/File;)Ljava/io/InputStream; HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->lambda$initialize$3(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->lambda$writeBlobSpecToDiskAsync$4(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;Ljava/io/OutputStream;Landroid/net/Uri;Landroid/content/Context;)Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->waitUntilInitialized()V -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->writeBlobSpecToDisk(Landroid/content/Context;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/providers/BlobProvider;->writeBlobSpecToDiskAsync(Landroid/content/Context;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/util/concurrent/Future; HSPLorg/thoughtcrime/securesms/providers/MmsBodyProvider;->()V HSPLorg/thoughtcrime/securesms/providers/MmsBodyProvider;->()V HSPLorg/thoughtcrime/securesms/providers/MmsBodyProvider;->onCreate()Z @@ -24264,9 +27305,6 @@ HSPLorg/thoughtcrime/securesms/push/AccountManagerFactory;->()V HSPLorg/thoughtcrime/securesms/push/AccountManagerFactory;->setInstance(Lorg/thoughtcrime/securesms/push/AccountManagerFactory;)V HSPLorg/thoughtcrime/securesms/push/DomainFrontingDigicertTrustStore;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/push/DomainFrontingTrustStore;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/push/IasTrustStore;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/push/IasTrustStore;->getKeyStoreInputStream()Ljava/io/InputStream; -HSPLorg/thoughtcrime/securesms/push/IasTrustStore;->getKeyStorePassword()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess$Companion;->()V HSPLorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess$Companion;->access$stripProtocol(Lorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess$Companion;Ljava/lang/String;)Ljava/lang/String; @@ -24289,22 +27327,35 @@ HSPLorg/thoughtcrime/securesms/ratelimit/RateLimitUtil;->()V HSPLorg/thoughtcrime/securesms/ratelimit/RateLimitUtil;->retryAllRateLimitedMessages(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->()V HSPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->clear()V HSPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->init(Landroid/util/AttributeSet;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda4;->()V -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda4;->contentsMatch(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda5;->()V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda5;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda6;->()V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9;->run()V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$4o-q--s8xb4fbde9teliyQxlyww(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$CYcq6dHxZW6RfEGMe0s6kvofKaE(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$bhowCzW_4HRIO1hvMslBpl08AJE(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/Recipient; +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$pGM0bNiB06y_fkMUloVDwF8BcLs(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->()V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->fetchAndCacheRecipientFromDisk(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->get()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->getId()Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->getLiveData()Landroidx/lifecycle/LiveData; +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$0(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$1(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$2(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->refresh()V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$observeForever$6(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->observable()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->observeForever(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V +HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->refresh()Lorg/thoughtcrime/securesms/recipients/LiveRecipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->refresh(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->resolve()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->set(Lorg/thoughtcrime/securesms/recipients/Recipient;)V @@ -24334,7 +27385,6 @@ HSPLorg/thoughtcrime/securesms/recipients/LiveRecipientCache;->lambda$addToCache HSPLorg/thoughtcrime/securesms/recipients/LiveRecipientCache;->lambda$new$0()Z HSPLorg/thoughtcrime/securesms/recipients/LiveRecipientCache;->lambda$warmUp$3(Lorg/signal/core/util/Stopwatch;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipientCache;->warmUp()V -HSPLorg/thoughtcrime/securesms/recipients/Recipient$$ExternalSyntheticLambda3;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient$Capability;->$values()[Lorg/thoughtcrime/securesms/recipients/Recipient$Capability; HSPLorg/thoughtcrime/securesms/recipients/Recipient$Capability;->()V HSPLorg/thoughtcrime/securesms/recipients/Recipient$Capability;->(Ljava/lang/String;II)V @@ -24356,27 +27406,32 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getAutoChatColor()Lorg/tho HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getAvatarColor()Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getBadges()Ljava/util/List; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getCombinedAboutAndEmoji()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getContactPhoto()Lorg/thoughtcrime/securesms/contacts/avatars/ContactPhoto; +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getContactUri()Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getDisplayName(Landroid/content/Context;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getDisplayNameOrUsername(Landroid/content/Context;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getE164()Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getExpiresInSeconds()I HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getFallbackContactPhoto(Lorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;I)Lorg/thoughtcrime/securesms/contacts/avatars/FallbackContactPhoto; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getFallbackContactPhotoDrawable(Landroid/content/Context;ZLorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;I)Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getGroupName(Landroid/content/Context;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getId()Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getNameFromLocalData(Landroid/content/Context;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getNotificationChannel()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getPhoneNumberSharing()Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileAvatar()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileAvatarFileDetails()Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails; -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileKey()[B HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileName()Lorg/thoughtcrime/securesms/profiles/ProfileName; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getRegistered()Lorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getServiceId()Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getUsername()Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getSmallFallbackContactPhotoDrawable(Landroid/content/Context;ZLorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;I)Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getWallpaper()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hasE164()Z -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hasSameContent(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hasServiceId()Z +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hasWallpaper()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hashCode()I +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isActiveGroup()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isBlocked()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isCallLink()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isDistributionList()Z @@ -24388,12 +27443,16 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isMuted()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isMyStory()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isProfileSharing()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isPushGroup()Z +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isPushV1Group()Z +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isPushV2Group()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isRegistered()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isReleaseNotes()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isResolving()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isSelf()Z +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isSystemContact()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->live()Lorg/thoughtcrime/securesms/recipients/LiveRecipient; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->live(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/recipients/LiveRecipient; +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->observable(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->requireE164()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->requireServiceId()Lorg/whispersystems/signalservice/api/push/ServiceId; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->resolve()Lorg/thoughtcrime/securesms/recipients/Recipient; @@ -24401,7 +27460,7 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient;->resolved(Lorg/thoughtcrime HSPLorg/thoughtcrime/securesms/recipients/Recipient;->resolvedList(Ljava/util/Collection;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->self()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->shouldBlurAvatar()Z -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->shouldHideStory()Z +HSPLorg/thoughtcrime/securesms/recipients/Recipient;->shouldShowE164()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->showVerified()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->trustedPush(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V @@ -24415,9 +27474,8 @@ HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails$Companion;->(Lk HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails$Companion;->forIndividual(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/RecipientRecord;)Lorg/thoughtcrime/securesms/recipients/RecipientDetails; HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails$Companion;->forUnknown()Lorg/thoughtcrime/securesms/recipients/RecipientDetails; HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->()V -HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->(Ljava/lang/String;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;Lorg/thoughtcrime/securesms/database/model/RecipientRecord;Ljava/util/List;ZLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Lj$/util/Optional;)V -HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Landroid/net/Uri;Lj$/util/Optional;Landroid/net/Uri;Landroid/net/Uri;JLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;ZILjava/util/List;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;ZJZLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lj$/util/Optional;ZLjava/util/List;ZZLorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lj$/util/Optional;)V -HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Landroid/net/Uri;Lj$/util/Optional;Landroid/net/Uri;Landroid/net/Uri;JLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;ZILjava/util/List;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;ZJZLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lj$/util/Optional;ZLjava/util/List;ZZLorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lj$/util/Optional;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Landroid/net/Uri;Lj$/util/Optional;Landroid/net/Uri;Landroid/net/Uri;JLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;ZILjava/util/List;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;ZJZLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lj$/util/Optional;ZLjava/util/List;ZZLorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lj$/util/Optional;Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;)V +HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Landroid/net/Uri;Lj$/util/Optional;Landroid/net/Uri;Landroid/net/Uri;JLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;ZILjava/util/List;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;ZJZLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Lj$/util/Optional;ZLjava/util/List;ZZLorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lj$/util/Optional;Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->forIndividual(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/RecipientRecord;)Lorg/thoughtcrime/securesms/recipients/RecipientDetails; HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails;->forUnknown()Lorg/thoughtcrime/securesms/recipients/RecipientDetails; HSPLorg/thoughtcrime/securesms/recipients/RecipientId$1;->()V @@ -24431,10 +27489,10 @@ HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Ljava/lang/String;) HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Lorg/whispersystems/signalservice/api/push/ServiceId;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Lorg/whispersystems/signalservice/api/push/ServiceId;Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;)Lorg/thoughtcrime/securesms/recipients/RecipientId; -HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->fromSidOrE164(Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->hashCode()I HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->isUnknown()Z HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->serialize()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->toLong()J HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->toString()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/RecipientIdCache$1;->(Lorg/thoughtcrime/securesms/recipients/RecipientIdCache;IFZI)V HSPLorg/thoughtcrime/securesms/recipients/RecipientIdCache$1;->removeEldestEntry(Ljava/util/Map$Entry;)Z @@ -24444,8 +27502,10 @@ HSPLorg/thoughtcrime/securesms/recipients/RecipientIdCache;->get(Lorg/whispersys HSPLorg/thoughtcrime/securesms/recipients/RecipientIdCache;->put(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/RecipientIdCache;->put(Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId;)V HSPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->()V +HSPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isLegacyProfileSharingAccepted(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z +HSPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isMessageRequestAccepted(Landroid/content/Context;J)Z HSPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isMessageRequestAccepted(Ljava/lang/Long;Lorg/thoughtcrime/securesms/recipients/Recipient;)Z -HSPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->toSignalServiceAddress(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; +HSPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isRecipientHidden(J)Z HSPLorg/thoughtcrime/securesms/registration/RegistrationData;->()V HSPLorg/thoughtcrime/securesms/registration/RegistrationData;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILorg/signal/libsignal/zkgroup/profiles/ProfileKey;Ljava/lang/String;ILjava/lang/String;)V HSPLorg/thoughtcrime/securesms/registration/RegistrationData;->getE164()Ljava/lang/String; @@ -24479,12 +27539,6 @@ HSPLorg/thoughtcrime/securesms/registration/VerifyResponse;->getMasterKey()Lorg/ HSPLorg/thoughtcrime/securesms/registration/VerifyResponse;->getPin()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/registration/VerifyResponse;->getPniPreKeyCollection()Lorg/whispersystems/signalservice/api/account/PreKeyCollection; HSPLorg/thoughtcrime/securesms/registration/VerifyResponse;->getVerifyAccountResponse()Lorg/whispersystems/signalservice/internal/push/VerifyAccountResponse; -HSPLorg/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel$$ExternalSyntheticLambda3;->()V -HSPLorg/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->()V -HSPLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->()V -HSPLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->insertReleaseChannelMessage$default(Lorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/lang/String;JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/database/MessageTable$InsertResult; -HSPLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->insertReleaseChannelMessage(Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/lang/String;JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;)Lorg/thoughtcrime/securesms/database/MessageTable$InsertResult; HSPLorg/thoughtcrime/securesms/revealable/ViewOnceMessageManager;->()V HSPLorg/thoughtcrime/securesms/revealable/ViewOnceMessageManager;->(Landroid/app/Application;)V HSPLorg/thoughtcrime/securesms/revealable/ViewOnceMessageManager;->getNextClosestEvent()Ljava/lang/Object; @@ -24534,7 +27588,6 @@ HSPLorg/thoughtcrime/securesms/service/ExpiringStoriesManager;->getNextClosestEv HSPLorg/thoughtcrime/securesms/service/KeyCachingService;->()V HSPLorg/thoughtcrime/securesms/service/KeyCachingService;->isLocked(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/service/KeyCachingService;->onAppForegrounded(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/service/LocalBackupListener$$ExternalSyntheticBackport0;->m(J)I HSPLorg/thoughtcrime/securesms/service/LocalBackupListener;->()V HSPLorg/thoughtcrime/securesms/service/LocalBackupListener;->schedule(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/service/PendingRetryReceiptManager;->()V @@ -24586,12 +27639,15 @@ HSPLorg/thoughtcrime/securesms/shakereport/ShakeToReport;->()V HSPLorg/thoughtcrime/securesms/shakereport/ShakeToReport;->(Landroid/app/Application;)V HSPLorg/thoughtcrime/securesms/shakereport/ShakeToReport;->enable()V HSPLorg/thoughtcrime/securesms/shakereport/ShakeToReport;->registerActivity(Landroidx/appcompat/app/AppCompatActivity;)V -HSPLorg/thoughtcrime/securesms/stickers/BlessedPacks$1;->()V -HSPLorg/thoughtcrime/securesms/stickers/BlessedPacks$Pack;->(Ljava/lang/String;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/stickers/BlessedPacks$Pack;->getPackId()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/stickers/BlessedPacks;->()V -HSPLorg/thoughtcrime/securesms/stickers/BlessedPacks;->contains(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/stickers/StickerRemoteUriLoader$Factory;->()V +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository$$ExternalSyntheticLambda0;->run()V +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->$r8$lambda$WI32balUk_XG4AC9j0YR1mfsJE0(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->()V +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->getStickerFeatureAvailability(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->getStickerFeatureAvailabilitySync()Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->lambda$getStickerFeatureAvailability$2(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V +HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->searchByEmoji(Ljava/lang/String;)Lio/reactivex/rxjava3/core/Single; HSPLorg/thoughtcrime/securesms/storage/StorageSyncHelper$$ExternalSyntheticLambda0;->()V HSPLorg/thoughtcrime/securesms/storage/StorageSyncHelper$$ExternalSyntheticLambda0;->generate()[B HSPLorg/thoughtcrime/securesms/storage/StorageSyncHelper;->$r8$lambda$Qu9GyOxIHYeSe2KLWGmWWrZGbxY()[B @@ -24747,6 +27803,7 @@ HSPLorg/thoughtcrime/securesms/util/AppForegroundObserver;->()V HSPLorg/thoughtcrime/securesms/util/AppForegroundObserver;->addListener(Lorg/thoughtcrime/securesms/util/AppForegroundObserver$Listener;)V HSPLorg/thoughtcrime/securesms/util/AppForegroundObserver;->begin()V HSPLorg/thoughtcrime/securesms/util/AppForegroundObserver;->onForeground()V +HSPLorg/thoughtcrime/securesms/util/AppForegroundObserver;->removeListener(Lorg/thoughtcrime/securesms/util/AppForegroundObserver$Listener;)V HSPLorg/thoughtcrime/securesms/util/AppStartup$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/AppStartup;)V HSPLorg/thoughtcrime/securesms/util/AppStartup$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/util/AppStartup;)V HSPLorg/thoughtcrime/securesms/util/AppStartup$Task;->(Lorg/thoughtcrime/securesms/util/AppStartup;Ljava/lang/String;Ljava/lang/Runnable;)V @@ -24769,9 +27826,12 @@ HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->loadIconIntoImageView(Lorg/thou HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->request(Lorg/thoughtcrime/securesms/mms/GlideRequest;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;ILcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;)Lorg/thoughtcrime/securesms/mms/GlideRequest; HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->request(Lorg/thoughtcrime/securesms/mms/GlideRequest;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;ZILcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;)Lorg/thoughtcrime/securesms/mms/GlideRequest; HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->requestCircle(Lorg/thoughtcrime/securesms/mms/GlideRequest;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;I)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/util/Base64;->decode(Ljava/lang/String;)[B -HSPLorg/thoughtcrime/securesms/util/Base64;->decodeNullableOrThrow(Ljava/lang/String;)[B -HSPLorg/thoughtcrime/securesms/util/Base64;->encodeBytes([B)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel; +HSPLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationManager;)Z +HSPLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline2;->m(Landroid/app/NotificationManager;)I +HSPLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline3;->m(Landroid/app/NotificationManager;)Z +HSPLorg/thoughtcrime/securesms/util/BubbleUtil;->()V +HSPLorg/thoughtcrime/securesms/util/BubbleUtil;->canBubble(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Long;)Z HSPLorg/thoughtcrime/securesms/util/ByteUnit$1;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/util/ByteUnit$1;->(Ljava/lang/String;ILorg/thoughtcrime/securesms/util/ByteUnit$1-IA;)V HSPLorg/thoughtcrime/securesms/util/ByteUnit$2;->(Ljava/lang/String;I)V @@ -24806,17 +27866,45 @@ HSPLorg/thoughtcrime/securesms/util/CachedInflater;->cacheUntilLimit(ILandroid/v HSPLorg/thoughtcrime/securesms/util/CachedInflater;->clear()V HSPLorg/thoughtcrime/securesms/util/CachedInflater;->from(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/CachedInflater; HSPLorg/thoughtcrime/securesms/util/CachedInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View; +HSPLorg/thoughtcrime/securesms/util/CenteredImageSpan;->(Landroid/graphics/drawable/Drawable;)V +HSPLorg/thoughtcrime/securesms/util/CenteredImageSpan;->draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V +HSPLorg/thoughtcrime/securesms/util/CenteredImageSpan;->getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I +HSPLorg/thoughtcrime/securesms/util/CharacterCalculator;->()V HSPLorg/thoughtcrime/securesms/util/ConfigurationUtil;->getFontScale(Landroid/content/res/Configuration;)F HSPLorg/thoughtcrime/securesms/util/ConfigurationUtil;->getNightModeConfiguration(Landroid/content/Context;)I HSPLorg/thoughtcrime/securesms/util/ConfigurationUtil;->getNightModeConfiguration(Landroid/content/res/Configuration;)I HSPLorg/thoughtcrime/securesms/util/ContextUtil;->requireDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/util/ConversationShortcutPhoto$Loader$Factory;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/util/ConversationUtil;->()V +HSPLorg/thoughtcrime/securesms/util/ConversationUtil;->getChannelId(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/util/ConversationUtil;->getShortcutId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2;->()V +HSPLorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2;->()V +HSPLorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2;->invoke()Ljava/text/SimpleDateFormat; HSPLorg/thoughtcrime/securesms/util/DateUtils;->()V +HSPLorg/thoughtcrime/securesms/util/DateUtils;->()V HSPLorg/thoughtcrime/securesms/util/DateUtils;->getBriefRelativeTimeSpanString(Landroid/content/Context;Ljava/util/Locale;J)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/util/DateUtils;->isWithin(JJLjava/util/concurrent/TimeUnit;)Z +HSPLorg/thoughtcrime/securesms/util/DateUtils;->getConversationDateHeaderString(Landroid/content/Context;Ljava/util/Locale;J)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/util/DateUtils;->getDatelessRelativeTimeSpanFormattedDate(Landroid/content/Context;Ljava/util/Locale;J)Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate; +HSPLorg/thoughtcrime/securesms/util/DateUtils;->getSameDayDateFormat()Ljava/text/SimpleDateFormat; +HSPLorg/thoughtcrime/securesms/util/DateUtils;->isNow(J)Z +HSPLorg/thoughtcrime/securesms/util/DateUtils;->isSameDay(JJ)Z +HSPLorg/thoughtcrime/securesms/util/DateUtils;->isSameExtendedRelativeTimestamp(JJ)Z +HSPLorg/thoughtcrime/securesms/util/DateUtils;->isWithin-HG0u8IE(JJ)Z HSPLorg/thoughtcrime/securesms/util/Debouncer;->(J)V HSPLorg/thoughtcrime/securesms/util/Debouncer;->(JLjava/util/concurrent/TimeUnit;)V +HSPLorg/thoughtcrime/securesms/util/Debouncer;->publish(Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->getLazyDefault()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->setValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->getValue()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->postValue(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->setValue(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/util/Deferred;->()V HSPLorg/thoughtcrime/securesms/util/Deferred;->executeIfNecessary()V HSPLorg/thoughtcrime/securesms/util/Deferred;->isDeferred()Z @@ -24845,15 +27933,16 @@ HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->callingFieldTrialAnyAddressPo HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->cdsRefreshIntervalSeconds()I HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->clientExpiration()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->computeChanges(Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->crashPromptConfig()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->delayedNotificationsPromptConfig()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getBackgroundMessageProcessInterval()J HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getBoolean(Ljava/lang/String;Z)Z -HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getDefaultMaxBackoff()J HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getInteger(Ljava/lang/String;I)I HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getLong(Ljava/lang/String;J)J HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->groupLimits()Lorg/thoughtcrime/securesms/groups/SelectionLimits; HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->init()V +HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->instantVideoPlayback()Z HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->internalUser()Z HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->mapToJson(Ljava/util/Map;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->okHttpAutomaticRetry()Z @@ -24878,7 +27967,13 @@ HSPLorg/thoughtcrime/securesms/util/FrameRateTracker;->(Landroid/app/Appli HSPLorg/thoughtcrime/securesms/util/FrameRateTracker;->getDisplayRefreshRate(Landroid/content/Context;)F HSPLorg/thoughtcrime/securesms/util/FrameRateTracker;->start()V HSPLorg/thoughtcrime/securesms/util/FrameRateTracker;->updateRefreshRate()V -HSPLorg/thoughtcrime/securesms/util/IasKeyStore;->getIasKeyStore(Landroid/content/Context;)Ljava/security/KeyStore; +HSPLorg/thoughtcrime/securesms/util/FullscreenHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowManager$LayoutParams;I)V +HSPLorg/thoughtcrime/securesms/util/FullscreenHelper;->(Landroid/app/Activity;)V +HSPLorg/thoughtcrime/securesms/util/FullscreenHelper;->(Landroid/app/Activity;Z)V +HSPLorg/thoughtcrime/securesms/util/FullscreenHelper;->showSystemUI()V +HSPLorg/thoughtcrime/securesms/util/FullscreenHelper;->showSystemUI(Landroid/view/Window;)V +HSPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate$default(JLj$/time/ZoneId;ILjava/lang/Object;)Lj$/time/LocalDate; +HSPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate(JLj$/time/ZoneId;)Lj$/time/LocalDate; HSPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDateTime(JLj$/time/ZoneId;)Lj$/time/LocalDateTime; HSPLorg/thoughtcrime/securesms/util/JsonUtils$SaneJSONObject;->(Lorg/json/JSONObject;)V HSPLorg/thoughtcrime/securesms/util/JsonUtils$SaneJSONObject;->getInt(Ljava/lang/String;)I @@ -24887,10 +27982,12 @@ HSPLorg/thoughtcrime/securesms/util/JsonUtils$SaneJSONObject;->getString(Ljava/l HSPLorg/thoughtcrime/securesms/util/JsonUtils$SaneJSONObject;->isNull(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/util/JsonUtils;->()V HSPLorg/thoughtcrime/securesms/util/JsonUtils;->fromJson(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/JsonUtils;->fromJson([BLjava/lang/Class;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/JsonUtils;->getMapper()Lcom/fasterxml/jackson/databind/ObjectMapper; HSPLorg/thoughtcrime/securesms/util/JsonUtils;->toJson(Ljava/lang/Object;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/LRUCache;->(I)V HSPLorg/thoughtcrime/securesms/util/LRUCache;->removeEldestEntry(Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->()V +HSPLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->(IJLandroid/os/Handler;)V HSPLorg/thoughtcrime/securesms/util/ListenableFutureTask$2;->(Lorg/thoughtcrime/securesms/util/ListenableFutureTask;)V HSPLorg/thoughtcrime/securesms/util/ListenableFutureTask$2;->run()V HSPLorg/thoughtcrime/securesms/util/ListenableFutureTask;->-$$Nest$fgetlisteners(Lorg/thoughtcrime/securesms/util/ListenableFutureTask;)Ljava/util/List; @@ -24935,6 +28032,11 @@ HSPLorg/thoughtcrime/securesms/util/LocalMetrics;->start(Ljava/lang/String;Ljava HSPLorg/thoughtcrime/securesms/util/LocaleUtil;->()V HSPLorg/thoughtcrime/securesms/util/LocaleUtil;->()V HSPLorg/thoughtcrime/securesms/util/LocaleUtil;->getLocaleDefaults()Ljava/util/List; +HSPLorg/thoughtcrime/securesms/util/LongClickMovementMethod$1;->(Lorg/thoughtcrime/securesms/util/LongClickMovementMethod;)V +HSPLorg/thoughtcrime/securesms/util/LongClickMovementMethod;->(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/util/LongClickMovementMethod;->getInstance(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/LongClickMovementMethod; +HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIII)V +HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1;->(Landroid/app/Activity;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1;->invoke(I)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -24943,8 +28045,10 @@ HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$2;->invoke()Ljava/la HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet;->()V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet;->(I)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet;->(II)V @@ -24952,8 +28056,10 @@ HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet;->getStatus HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet;->getToolbarColorRes()I HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$OnScrollListener;->(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$OnScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V +HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->$r8$lambda$T0JnL_tDtAWK4RNMpbrK8xUunio(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->()V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->(Landroid/app/Activity;Ljava/util/List;Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;)V +HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->(Landroid/app/Activity;Ljava/util/List;Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->(Landroid/content/Context;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Ljava/util/List;Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->access$updateActiveState(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;Z)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->attach(Landroidx/recyclerview/widget/RecyclerView;)V @@ -24961,6 +28067,7 @@ HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->getActiveColorSet( HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->getInactiveColorSet()Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet; HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->setColorImmediate()V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->setToolbarColor(I)V +HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState$lambda$7$lambda$6(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState(Z)V HSPLorg/thoughtcrime/securesms/util/MediaUtil$1;->()V HSPLorg/thoughtcrime/securesms/util/MediaUtil$SlideType;->$values()[Lorg/thoughtcrime/securesms/util/MediaUtil$SlideType; @@ -24968,16 +28075,32 @@ HSPLorg/thoughtcrime/securesms/util/MediaUtil$SlideType;->()V HSPLorg/thoughtcrime/securesms/util/MediaUtil$SlideType;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/util/MediaUtil$SlideType;->values()[Lorg/thoughtcrime/securesms/util/MediaUtil$SlideType; HSPLorg/thoughtcrime/securesms/util/MediaUtil;->()V -HSPLorg/thoughtcrime/securesms/util/MediaUtil;->getSlideForAttachment(Landroid/content/Context;Lorg/thoughtcrime/securesms/attachments/Attachment;)Lorg/thoughtcrime/securesms/mms/Slide; +HSPLorg/thoughtcrime/securesms/util/MediaUtil;->getSlideForAttachment(Lorg/thoughtcrime/securesms/attachments/Attachment;)Lorg/thoughtcrime/securesms/mms/Slide; HSPLorg/thoughtcrime/securesms/util/MediaUtil;->getSlideTypeFromContentType(Ljava/lang/String;)Lorg/thoughtcrime/securesms/util/MediaUtil$SlideType; HSPLorg/thoughtcrime/securesms/util/MediaUtil;->isAudioType(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/util/MediaUtil;->isGif(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/util/MediaUtil;->isImageType(Ljava/lang/String;)Z -HSPLorg/thoughtcrime/securesms/util/MediaUtil;->isVideo(Ljava/lang/String;)Z +HSPLorg/thoughtcrime/securesms/util/MediaUtil;->isInstantVideoSupported(Lorg/thoughtcrime/securesms/mms/Slide;)Z +HSPLorg/thoughtcrime/securesms/util/MediaUtil;->isLongTextType(Ljava/lang/String;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasAudio(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasDocument(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasGiftBadge(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasLinkPreview(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasLocation(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasNoBubble(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasOnlyThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasSharedContact(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasSticker(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isBorderless(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isCaptionlessMms(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isEditMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isScheduled(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isStoryReaction(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isTextOnly(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isViewOnceMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/util/NameUtil;->()V HSPLorg/thoughtcrime/securesms/util/NameUtil;->()V HSPLorg/thoughtcrime/securesms/util/NameUtil;->firstGrapheme(Ljava/lang/String;)Ljava/lang/String; @@ -24985,32 +28108,43 @@ HSPLorg/thoughtcrime/securesms/util/NameUtil;->getAbbreviation(Ljava/lang/String HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->getNetworkInfo(Landroid/content/Context;)Landroid/net/NetworkInfo; HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->isConnected(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->isConnectedWifi(Landroid/content/Context;)Z -HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator;->()V +HSPLorg/thoughtcrime/securesms/util/NullableSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda2;->()V -HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda3;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda3;->call()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda4;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda4;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->$r8$lambda$64DRPwLhDKidiYVBrJ1oGsaeSVY(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/internal/ServiceResponse;)Lorg/signal/libsignal/protocol/util/Pair; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->$r8$lambda$cqO5Ws54dRBOxkD_sPlVLlSYwIg(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->$r8$lambda$dDuBqdOM1yCYB_18NZWtjJd7BlA(Lorg/whispersystems/signalservice/api/services/ProfileService;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;)Lio/reactivex/rxjava3/core/SingleSource; HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->()V HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->handleSelfProfileKeyChange()V -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->lambda$retrieveProfile$0(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->lambda$retrieveProfile$1(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/internal/ServiceResponse;)Lorg/signal/libsignal/protocol/util/Pair; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->lambda$retrieveProfile$2(Lorg/whispersystems/signalservice/api/services/ProfileService;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;)Lio/reactivex/rxjava3/core/SingleSource; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->retrieveProfile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Z)Lio/reactivex/rxjava3/core/Single; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->retrieveProfileSync(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Z)Lorg/whispersystems/signalservice/api/profiles/ProfileAndCredential; -HSPLorg/thoughtcrime/securesms/util/ProfileUtil;->toSignalServiceAddress(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; +HSPLorg/thoughtcrime/securesms/util/Projection$Corners;->()V +HSPLorg/thoughtcrime/securesms/util/Projection$Corners;->(F)V +HSPLorg/thoughtcrime/securesms/util/Projection$Corners;->(FFFF)V +HSPLorg/thoughtcrime/securesms/util/Projection$Corners;->([F)V +HSPLorg/thoughtcrime/securesms/util/Projection$Corners;->toRadii()[F +HSPLorg/thoughtcrime/securesms/util/Projection$Corners;->toRelativeRadii(Z)[F HSPLorg/thoughtcrime/securesms/util/ProjectionList;->()V HSPLorg/thoughtcrime/securesms/util/ProjectionList;->()V HSPLorg/thoughtcrime/securesms/util/ProjectionList;->(I)V HSPLorg/thoughtcrime/securesms/util/ProjectionList;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/util/ProjectionList;->close()V +HSPLorg/thoughtcrime/securesms/util/ProjectionList;->getSize()I +HSPLorg/thoughtcrime/securesms/util/ProjectionList;->size()I +HSPLorg/thoughtcrime/securesms/util/PushCharacterCalculator$1;->()V +HSPLorg/thoughtcrime/securesms/util/PushCharacterCalculator;->()V +HSPLorg/thoughtcrime/securesms/util/PushCharacterCalculator;->()V HSPLorg/thoughtcrime/securesms/util/RemoteDeprecation;->()V HSPLorg/thoughtcrime/securesms/util/RemoteDeprecation;->getTimeUntilDeprecation()J HSPLorg/thoughtcrime/securesms/util/RemoteDeprecation;->getTimeUntilDeprecation(Ljava/lang/String;JLjava/lang/String;)J +HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt$delegate$1;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;)Lkotlin/properties/ReadWriteProperty; +HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Ljava/lang/Object;)Lkotlin/properties/ReadWriteProperty; +HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Lkotlin/properties/ReadWriteProperty; +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->invoke()Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory; +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion;->()V +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion;->factoryProducer(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)Lkotlin/jvm/functions/Function0; +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->()V +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->(Lkotlin/jvm/functions/Function1;Landroidx/savedstate/SavedStateRegistryOwner;)V +HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;Landroidx/lifecycle/SavedStateHandle;)Landroidx/lifecycle/ViewModel; HSPLorg/thoughtcrime/securesms/util/ScreenDensity$1;->()V HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->()V HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->(Ljava/lang/String;I)V @@ -25018,8 +28152,10 @@ HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->get(Landroid/content/Context HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->getBucket()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->isKnownDensity()Z HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->xhdpiRelativeDensityScaleFactor(Ljava/lang/String;)F +HSPLorg/thoughtcrime/securesms/util/SearchUtil;->getHighlightedSpan(Ljava/util/Locale;Lorg/thoughtcrime/securesms/util/SearchUtil$StyleFactory;Landroid/text/Spannable;Ljava/lang/String;I)Landroid/text/Spannable; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getActivityManager(Landroid/content/Context;)Landroid/app/ActivityManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getAlarmManager(Landroid/content/Context;)Landroid/app/AlarmManager; +HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getAudioManager(Landroid/content/Context;)Landroid/media/AudioManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getConnectivityManager(Landroid/content/Context;)Landroid/net/ConnectivityManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getNotificationManager(Landroid/content/Context;)Landroid/app/NotificationManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getPowerManager(Landroid/content/Context;)Landroid/os/PowerManager; @@ -25031,6 +28167,12 @@ HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ColdStart;->onConversatio HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ColdStart;->onRenderFinished()V HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ColdStart;->onRenderStart()V HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ColdStart;->start()V +HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onDataLoaded()V +HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onDataPostedToMain()V +HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onMetadataLoadStarted()V +HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onMetadataLoaded()V +HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onRenderFinished()V +HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->start()V HSPLorg/thoughtcrime/securesms/util/SignalProxyUtil;->()V HSPLorg/thoughtcrime/securesms/util/SignalProxyUtil;->startListeningToWebsocket()V HSPLorg/thoughtcrime/securesms/util/SignalTrace$$ExternalSyntheticLambda0;->()V @@ -25065,12 +28207,23 @@ HSPLorg/thoughtcrime/securesms/util/SoftHashMap$SoftValue;->(Ljava/lang/Ob HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->()V HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->(I)V HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->addToStrongReferences(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->clear()V HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->processQueue()V HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->trimStrongReferencesIfNecessary()V +HSPLorg/thoughtcrime/securesms/util/SpanUtil;->()V +HSPLorg/thoughtcrime/securesms/util/SpanUtil;->buildCenteredImageSpan(Landroid/graphics/drawable/Drawable;)Ljava/lang/CharSequence; +HSPLorg/thoughtcrime/securesms/util/SpanUtil;->space(ILorg/signal/core/util/DimensionUnit;)Ljava/lang/CharSequence; +HSPLorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;)Landroid/window/SplashScreen; +HSPLorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline1;->m(Landroid/window/SplashScreen;I)V +HSPLorg/thoughtcrime/securesms/util/SplashScreenUtil$1;->()V +HSPLorg/thoughtcrime/securesms/util/SplashScreenUtil;->setSplashScreenThemeIfNecessary(Landroid/app/Activity;Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;)V HSPLorg/thoughtcrime/securesms/util/StorageUtil;->getCleanFileName(Ljava/lang/String;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->$values()[Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->()V +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->valueOf(Ljava/lang/String;)Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->values()[Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->()V HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getAppMigrationVersion(Landroid/content/Context;)I HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getAttachmentEncryptedSecret(Landroid/content/Context;)Ljava/lang/String; @@ -25086,10 +28239,13 @@ HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getLanguage(Landroid HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getLastVersionCode(Landroid/content/Context;)I HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getLongPreference(Landroid/content/Context;Ljava/lang/String;J)J HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMediaDownloadAllowed(Landroid/content/Context;Ljava/lang/String;I)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMediaKeyboardMode(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMessageBodyTextSize(Landroid/content/Context;)I HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMobileMediaDownloadAllowed(Landroid/content/Context;)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getNotificationChannelVersion(Landroid/content/Context;)I HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getNotificationLedColor(Landroid/content/Context;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getNotificationMessagesChannelVersion(Landroid/content/Context;)I +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getNotificationPrivacy(Landroid/content/Context;)Lorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getNotificationRingtone(Landroid/content/Context;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getRatingLaterTimestamp(Landroid/content/Context;)J HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getRoamingMediaDownloadAllowed(Landroid/content/Context;)Ljava/util/Set; @@ -25101,7 +28257,9 @@ HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getStringSetPreferen HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getTheme(Landroid/content/Context;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getUnidentifiedAccessCertificateRotationTime(Landroid/content/Context;)J HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->hasPromptedPushRegistration(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->hasSeenStickerIntroTooltip(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isBackupEnabled(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isEnterSendsEnabled(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isIncognitoKeyboardEnabled(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isNotificationVibrateEnabled(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isNotificationsEnabled(Landroid/content/Context;)Z @@ -25112,7 +28270,6 @@ HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isScreenLockEnabled( HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isScreenSecurityEnabled(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isSystemEmojiPreferred(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isUnauthorizedReceived(Landroid/content/Context;)Z -HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isUniversalUnidentifiedAccess(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->needsFullContactSync(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->setBooleanPreference(Landroid/content/Context;Ljava/lang/String;Z)V HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->setDirectoryRefreshTime(Landroid/content/Context;J)V @@ -25126,6 +28283,9 @@ HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->setPromptedPushRegis HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->setSignedPreKeyRotationTime(Landroid/content/Context;J)V HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->setUnauthorizedReceived(Landroid/content/Context;Z)V HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->setUnidentifiedAccessCertificateRotationTime(Landroid/content/Context;J)V +HSPLorg/thoughtcrime/securesms/util/ThemeUtil;->getAttribute(Landroid/content/Context;ILjava/lang/String;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/util/ThemeUtil;->getThemedBoolean(Landroid/content/Context;I)Z +HSPLorg/thoughtcrime/securesms/util/ThemeUtil;->isDarkTheme(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/ThrottledDebouncer$OverflowHandler;->-$$Nest$fgetlastRun(Lorg/thoughtcrime/securesms/util/ThrottledDebouncer$OverflowHandler;)J HSPLorg/thoughtcrime/securesms/util/ThrottledDebouncer$OverflowHandler;->()V HSPLorg/thoughtcrime/securesms/util/ThrottledDebouncer$OverflowHandler;->handleMessage(Landroid/os/Message;)V @@ -25143,8 +28303,10 @@ HSPLorg/thoughtcrime/securesms/util/Util;->getSecretBytes(I)[B HSPLorg/thoughtcrime/securesms/util/Util;->getSecretBytes(Ljava/security/SecureRandom;I)[B HSPLorg/thoughtcrime/securesms/util/Util;->getTimeUntilBuildExpiry()J HSPLorg/thoughtcrime/securesms/util/Util;->hasItems(Ljava/util/Collection;)Z +HSPLorg/thoughtcrime/securesms/util/Util;->hashCode([Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/util/Util;->isDefaultSmsProvider(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/Util;->isEmpty(Ljava/lang/CharSequence;)Z +HSPLorg/thoughtcrime/securesms/util/Util;->isEmpty(Ljava/util/Collection;)Z HSPLorg/thoughtcrime/securesms/util/Util;->join(Ljava/util/Collection;Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/Util;->join([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/Util;->uri(Ljava/lang/String;)Landroid/net/Uri; @@ -25153,29 +28315,115 @@ HSPLorg/thoughtcrime/securesms/util/VersionTracker;->()V HSPLorg/thoughtcrime/securesms/util/VersionTracker;->getDaysSinceFirstInstalled(Landroid/content/Context;)J HSPLorg/thoughtcrime/securesms/util/VersionTracker;->getLastSeenVersion(Landroid/content/Context;)I HSPLorg/thoughtcrime/securesms/util/VersionTracker;->updateLastSeenVersion(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->drawAsTopItemDecoration(Landroid/view/View;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;I)V HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->getLifecycle(Landroid/view/View;)Landroidx/lifecycle/Lifecycle; +HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->getVisible(Landroid/view/View;)Z +HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->layoutIn(Landroid/view/View;Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->padding$default(Landroid/view/View;IIIIILjava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->padding(Landroid/view/View;IIII)V HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->setVisible(Landroid/view/View;Z)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion$factoryProducer$1;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion$factoryProducer$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion$factoryProducer$1;->invoke()Lorg/thoughtcrime/securesms/util/ViewModelFactory; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion;->()V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion;->factoryProducer(Lkotlin/jvm/functions/Function0;)Lkotlin/jvm/functions/Function0; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory;->()V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelStore; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->invoke()Landroidx/savedstate/SavedStateRegistryOwner; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelStore; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->animateOut(Landroid/view/View;Landroid/view/animation/Animation;I)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; HSPLorg/thoughtcrime/securesms/util/ViewUtil;->dpToPx(I)I +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;I)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;II)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; HSPLorg/thoughtcrime/securesms/util/ViewUtil;->findStubById(Landroid/view/View;I)Lorg/thoughtcrime/securesms/util/views/Stub; +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->getAlphaAnimation(FFI)Landroid/view/animation/Animation; +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->getLeftMargin(Landroid/view/View;)I +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->getRightMargin(Landroid/view/View;)I +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->getTopMargin(Landroid/view/View;)I HSPLorg/thoughtcrime/securesms/util/ViewUtil;->getWidth(Landroid/view/View;)I +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/view/View;)Z +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/content/Context;)Z +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/view/View;)Z +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->mirrorIfRtl(Landroid/view/View;Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingBottom(Landroid/view/View;I)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingEnd(Landroid/view/View;I)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingStart(Landroid/view/View;I)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingTop(Landroid/view/View;I)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setTextViewGravityStart(Landroid/widget/TextView;Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setTopMargin(Landroid/view/View;I)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setTopMargin(Landroid/view/View;IZ)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->setVisibilityIfNonNull(Landroid/view/View;I)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->updateLayoutParams(Landroid/view/View;II)V +HSPLorg/thoughtcrime/securesms/util/ViewUtil;->updateLayoutParamsIfNonNull(Landroid/view/View;II)V HSPLorg/thoughtcrime/securesms/util/WakeLockUtil;->()V HSPLorg/thoughtcrime/securesms/util/WakeLockUtil;->acquire(Landroid/content/Context;IJLjava/lang/String;)Landroid/os/PowerManager$WakeLock; HSPLorg/thoughtcrime/securesms/util/WakeLockUtil;->prefixTag(Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/WakeLockUtil;->release(Landroid/os/PowerManager$WakeLock;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/util/WindowUtil;->getStatusBarColor(Landroid/view/Window;)I HSPLorg/thoughtcrime/securesms/util/WindowUtil;->initializeScreenshotSecurity(Landroid/content/Context;Landroid/view/Window;)V +HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setLightNavigationBar(Landroid/view/Window;)V +HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setLightNavigationBarFromTheme(Landroid/app/Activity;)V +HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setLightStatusBar(Landroid/view/Window;)V +HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setLightStatusBarFromTheme(Landroid/app/Activity;)V HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setNavigationBarColor(Landroid/app/Activity;I)V HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setNavigationBarColor(Landroid/content/Context;Landroid/view/Window;I)V HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setStatusBarColor(Landroid/view/Window;I)V +HSPLorg/thoughtcrime/securesms/util/WindowUtil;->setSystemUiFlags(Landroid/view/Window;I)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory;->(Lj$/util/function/Function;I)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory;->createViewHolder(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->()V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->(Z)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->getItemTypes()Ljava/util/Map; +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;ILjava/util/List;)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;I)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;ILjava/util/List;)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewAttachedToWindow(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->registerFactory(Ljava/lang/Class;Lj$/util/function/Function;I)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->registerFactory(Ljava/lang/Class;Lorg/thoughtcrime/securesms/util/adapter/mapping/Factory;)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->()V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingModelList;->(Ljava/util/Collection;)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->onAttachedToWindow()V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->setPayload(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter$$ExternalSyntheticLambda0;->(II)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->()V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->(II)V +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItem(I)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItem(I)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel; +HSPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItemViewType(I)I HSPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->setPagingController(Lorg/signal/paging/PagingController;)V HSPLorg/thoughtcrime/securesms/util/cjkv/CJKVUtil;->isCJKV(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/util/cjkv/CJKVUtil;->isCodepointCJKV(I)Z @@ -25188,7 +28436,17 @@ HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->(Ljava/uti HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->execute(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->lambda$execute$0(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->scheduleNext()V +HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->(Ljava/util/concurrent/Executor;)V +HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->enqueue(Ljava/lang/Runnable;)Z +HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->execute(Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->scheduleNext()V +HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->()V +HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->(Ljava/lang/Object;)V +HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->notifyAllListeners()V +HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->set(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat;->()V +HSPLorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper;->getUsersSelectedLocale(Landroid/content/Context;)Ljava/util/Locale; HSPLorg/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper;->prepareOverrideConfiguration(Landroid/content/Context;Landroid/content/res/Configuration;)V HSPLorg/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper;->updateContext(Landroid/content/Context;)V @@ -25266,10 +28524,17 @@ HSPLorg/thoughtcrime/securesms/util/storage/FileStorage;->getAllFiles(Landroid/c HSPLorg/thoughtcrime/securesms/util/views/DarkOverflowToolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/util/views/DarkOverflowToolbar;->init()V HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->(Landroid/view/ViewStub;)V +HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->get()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->isResolvable()Z +HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->require()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->resolved()Z HSPLorg/thoughtcrime/securesms/util/views/SlideUpWithSnackbarBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/util/views/Stub;->(Landroid/view/ViewStub;)V HSPLorg/thoughtcrime/securesms/util/views/Stub;->get()Landroid/view/View; +HSPLorg/thoughtcrime/securesms/util/views/Stub;->getVisibility()I +HSPLorg/thoughtcrime/securesms/util/views/Stub;->isVisible()Z HSPLorg/thoughtcrime/securesms/util/views/Stub;->resolved()Z +HSPLorg/thoughtcrime/securesms/util/views/Stub;->setVisibility(I)V HSPLorg/thoughtcrime/securesms/video/exo/ExoPlayerPool$Companion;->()V HSPLorg/thoughtcrime/securesms/video/exo/ExoPlayerPool$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/video/exo/ExoPlayerPool$PoolStats;->()V @@ -25318,19 +28583,9 @@ HSPLorg/webrtc/PeerConnectionFactory$InitializationOptions;->(Landroid/con HSPLorg/webrtc/PeerConnectionFactory$InitializationOptions;->builder(Landroid/content/Context;)Lorg/webrtc/PeerConnectionFactory$InitializationOptions$Builder; HSPLorg/webrtc/PeerConnectionFactory;->initialize(Lorg/webrtc/PeerConnectionFactory$InitializationOptions;)V HSPLorg/webrtc/WebRtcClassLoader;->getClassLoader()Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/api/KeyBackupService;->()V -HSPLorg/whispersystems/signalservice/api/KeyBackupService;->(Ljava/security/KeyStore;Ljava/lang/String;[BLjava/lang/String;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;I)V HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->()V HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/util/CredentialsProvider;Ljava/lang/String;Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations;Z)V -HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->getKeyBackupService(Ljava/security/KeyStore;Ljava/lang/String;[BLjava/lang/String;I)Lorg/whispersystems/signalservice/api/KeyBackupService; -HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->getPreKeyCounts(Lorg/whispersystems/signalservice/api/push/ServiceIdType;)Lorg/whispersystems/signalservice/internal/push/OneTimePreKeyCounts; HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->getSecureValueRecoveryV2(Ljava/lang/String;)Lorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV2; -HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->getSenderCertificate()[B -HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->setAccountAttributes(Lorg/whispersystems/signalservice/api/account/AccountAttributes;)V -HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver$$ExternalSyntheticLambda0;->()V -HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/util/CredentialsProvider;Ljava/lang/String;Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Z)V -HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->retrieveProfile(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; -HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->retrieveStickerManifest([B[B)Lorg/whispersystems/signalservice/api/messages/SignalServiceStickerManifest; HSPLorg/whispersystems/signalservice/api/SignalWebSocket$$ExternalSyntheticLambda0;->(Lio/reactivex/rxjava3/subjects/BehaviorSubject;)V HSPLorg/whispersystems/signalservice/api/SignalWebSocket$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->()V @@ -25344,39 +28599,10 @@ HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->getUnidentifiedWebSoc HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->getWebSocket()Lorg/whispersystems/signalservice/internal/websocket/WebSocketConnection; HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->getWebSocketState()Lio/reactivex/rxjava3/core/Observable; HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->readMessageBatch(JILorg/whispersystems/signalservice/api/SignalWebSocket$MessageReceivedCallback;)Z -HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->request(Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;)Lio/reactivex/rxjava3/core/Single; -HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->request(Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;Lj$/util/Optional;)Lio/reactivex/rxjava3/core/Single; HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->waitForSingleMessage(J)Lj$/util/Optional; -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->(ZZZZZZZZ)V -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getAnnouncementGroup()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getChangeNumber()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getGiftBadges()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getPaymentActivation()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getPni()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getSenderKey()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getStorage()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getStories()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->toString()Ljava/lang/String; -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->(Ljava/lang/String;IZLjava/lang/String;[BZLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;ZLjava/lang/String;ILjava/lang/String;)V -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->(Ljava/lang/String;IZZZLjava/lang/String;[BZZLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;Ljava/lang/String;ILjava/lang/String;)V -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getCapabilities()Lorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities; -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getDiscoverableByPhoneNumber()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getFetchesMessages()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getName()Ljava/lang/String; -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getPniRegistrationId()I -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getRecoveryPassword()Ljava/lang/String; -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getRegistrationId()I -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getRegistrationLock()Ljava/lang/String; -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getSignalingKey()Ljava/lang/String; -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getUnidentifiedAccessKey()[B -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getUnrestrictedUnidentifiedAccess()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getVideo()Z -HSPLorg/whispersystems/signalservice/api/account/AccountAttributes;->getVoice()Z HSPLorg/whispersystems/signalservice/api/account/PreKeyCollection;->(Lorg/signal/libsignal/protocol/IdentityKey;Lorg/signal/libsignal/protocol/state/SignedPreKeyRecord;Lorg/signal/libsignal/protocol/state/KyberPreKeyRecord;)V HSPLorg/whispersystems/signalservice/api/account/PreKeyCollection;->getLastResortKyberPreKey()Lorg/signal/libsignal/protocol/state/KyberPreKeyRecord; HSPLorg/whispersystems/signalservice/api/account/PreKeyCollection;->getSignedPreKey()Lorg/signal/libsignal/protocol/state/SignedPreKeyRecord; -HSPLorg/whispersystems/signalservice/api/crypto/UnidentifiedAccess;->createEmptyByteArray(I)[B -HSPLorg/whispersystems/signalservice/api/crypto/UnidentifiedAccess;->deriveAccessKeyFrom(Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;)[B HSPLorg/whispersystems/signalservice/api/groupsv2/ClientZkOperations;->(Lorg/signal/libsignal/zkgroup/ServerPublicParams;)V HSPLorg/whispersystems/signalservice/api/groupsv2/ClientZkOperations;->create(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;)Lorg/whispersystems/signalservice/api/groupsv2/ClientZkOperations; HSPLorg/whispersystems/signalservice/api/groupsv2/ClientZkOperations;->getAuthOperations()Lorg/signal/libsignal/zkgroup/auth/ClientZkAuthOperations; @@ -25387,11 +28613,13 @@ HSPLorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations;->(Lo HSPLorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations;->getProfileOperations()Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations; HSPLorg/whispersystems/signalservice/api/kbs/MasterKey;->([B)V HSPLorg/whispersystems/signalservice/api/kbs/MasterKey;->createNew(Ljava/security/SecureRandom;)Lorg/whispersystems/signalservice/api/kbs/MasterKey; +HSPLorg/whispersystems/signalservice/api/kbs/MasterKey;->derive(Ljava/lang/String;)[B +HSPLorg/whispersystems/signalservice/api/kbs/MasterKey;->deriveLoggingKey()[B HSPLorg/whispersystems/signalservice/api/kbs/MasterKey;->serialize()[B HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachment;->(Ljava/lang/String;)V HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachment;->asPointer()Lorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer; HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachment;->getContentType()Ljava/lang/String; -HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->(ILorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentRemoteId;Ljava/lang/String;[BLj$/util/Optional;Lj$/util/Optional;IILj$/util/Optional;Lj$/util/Optional;Lj$/util/Optional;ZZZLj$/util/Optional;Lj$/util/Optional;J)V +HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->(ILorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentRemoteId;Ljava/lang/String;[BLj$/util/Optional;Lj$/util/Optional;IILj$/util/Optional;Lj$/util/Optional;ILj$/util/Optional;ZZZLj$/util/Optional;Lj$/util/Optional;J)V HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getBlurHash()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getCaption()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getCdnNumber()I @@ -25399,6 +28627,7 @@ HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getFileName()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getHeight()I HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getIncrementalDigest()Lj$/util/Optional; +HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getIncrementalMacChunkSize()I HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getKey()[B HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getRemoteId()Lorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentRemoteId; HSPLorg/whispersystems/signalservice/api/messages/SignalServiceAttachmentPointer;->getSize()Lj$/util/Optional; @@ -25432,9 +28661,6 @@ HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilit HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities;->isPnp()Z HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities;->isSenderKey()Z HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities;->isStories()Z -HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->$values()[Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType; -HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->()V -HSPLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->(Ljava/lang/String;I)V HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion;->()V HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion;->from(Ljava/util/UUID;)Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; @@ -25443,7 +28669,6 @@ HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion;->parseOrT HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->()V HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->(Lorg/signal/libsignal/protocol/ServiceId$Aci;)V HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->equals(Ljava/lang/Object;)Z -HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->getLibSignalAci()Lorg/signal/libsignal/protocol/ServiceId$Aci; HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->hashCode()I HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->parseOrThrow(Ljava/lang/String;)Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; HSPLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->toString()Ljava/lang/String; @@ -25466,40 +28691,16 @@ HSPLorg/whispersystems/signalservice/api/push/ServiceId$PNI;->toString()Ljava/la HSPLorg/whispersystems/signalservice/api/push/ServiceId;->()V HSPLorg/whispersystems/signalservice/api/push/ServiceId;->(Lorg/signal/libsignal/protocol/ServiceId;)V HSPLorg/whispersystems/signalservice/api/push/ServiceId;->(Lorg/signal/libsignal/protocol/ServiceId;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/whispersystems/signalservice/api/push/ServiceId;->fromLibSignal(Lorg/signal/libsignal/protocol/ServiceId;)Lorg/whispersystems/signalservice/api/push/ServiceId; HSPLorg/whispersystems/signalservice/api/push/ServiceId;->isUnknown()Z -HSPLorg/whispersystems/signalservice/api/push/ServiceId;->parseOrThrow(Ljava/lang/String;)Lorg/whispersystems/signalservice/api/push/ServiceId; HSPLorg/whispersystems/signalservice/api/push/ServiceId;->toString()Ljava/lang/String; -HSPLorg/whispersystems/signalservice/api/push/ServiceIdType;->$values()[Lorg/whispersystems/signalservice/api/push/ServiceIdType; -HSPLorg/whispersystems/signalservice/api/push/ServiceIdType;->()V -HSPLorg/whispersystems/signalservice/api/push/ServiceIdType;->(Ljava/lang/String;ILjava/lang/String;)V -HSPLorg/whispersystems/signalservice/api/push/ServiceIdType;->queryParam()Ljava/lang/String; HSPLorg/whispersystems/signalservice/api/push/SignalServiceAddress;->(Lorg/whispersystems/signalservice/api/push/ServiceId;Lj$/util/Optional;)V HSPLorg/whispersystems/signalservice/api/push/SignalServiceAddress;->(Lorg/whispersystems/signalservice/api/push/ServiceId;Ljava/lang/String;)V HSPLorg/whispersystems/signalservice/api/push/SignalServiceAddress;->getNumber()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/api/push/SignalServiceAddress;->getServiceId()Lorg/whispersystems/signalservice/api/push/ServiceId; -HSPLorg/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException;->(ILjava/lang/String;)V -HSPLorg/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException;->getCode()I -HSPLorg/whispersystems/signalservice/api/services/MessagingService$$ExternalSyntheticLambda4;->(Lorg/whispersystems/signalservice/internal/websocket/ResponseMapper;)V -HSPLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda1;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)V -HSPLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda2;->()V -HSPLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda3;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)V -HSPLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseMapper;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/signal/libsignal/zkgroup/profiles/ProfileKeyCredentialRequestContext;)V -HSPLorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseProcessor;->(Lorg/whispersystems/signalservice/internal/ServiceResponse;)V -HSPLorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseProcessor;->getError()Ljava/lang/Throwable; -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->$r8$lambda$qreHJhpvwxlLuI7XzIfP9eBBI24(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->$r8$lambda$vXxdyhUGBLq7AFV9vG9NvMDxbNI(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->()V -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->(Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;Lorg/whispersystems/signalservice/api/SignalWebSocket;)V -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->getProfile(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lio/reactivex/rxjava3/core/Single; -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->getProfileRestFallback(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lio/reactivex/rxjava3/core/Single; -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->lambda$getProfile$0(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; -HSPLorg/whispersystems/signalservice/api/services/ProfileService;->lambda$getProfileRestFallback$3(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; -HSPLorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV1$Companion;->()V -HSPLorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV1$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV1;->()V -HSPLorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV1;->(Lorg/whispersystems/signalservice/api/KeyBackupService;)V +HSPLorg/whispersystems/signalservice/api/services/DonationsService;->()V +HSPLorg/whispersystems/signalservice/api/services/DonationsService;->(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/util/CredentialsProvider;Ljava/lang/String;Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations;Z)V +HSPLorg/whispersystems/signalservice/api/services/DonationsService;->(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;)V HSPLorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV2$Companion;->()V HSPLorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV2;->()V @@ -25530,15 +28731,10 @@ HSPLorg/whispersystems/signalservice/api/websocket/WebSocketConnectionState;->is HSPLorg/whispersystems/signalservice/api/websocket/WebSocketConnectionState;->values()[Lorg/whispersystems/signalservice/api/websocket/WebSocketConnectionState; HSPLorg/whispersystems/signalservice/api/websocket/WebSocketUnavailableException;->()V HSPLorg/whispersystems/signalservice/internal/ServiceResponse;->(ILjava/lang/String;Ljava/lang/Object;Ljava/lang/Throwable;Ljava/lang/Throwable;)V -HSPLorg/whispersystems/signalservice/internal/ServiceResponse;->forApplicationError(Ljava/lang/Throwable;ILjava/lang/String;)Lorg/whispersystems/signalservice/internal/ServiceResponse; HSPLorg/whispersystems/signalservice/internal/ServiceResponse;->forResult(Ljava/lang/Object;ILjava/lang/String;)Lorg/whispersystems/signalservice/internal/ServiceResponse; -HSPLorg/whispersystems/signalservice/internal/ServiceResponse;->forUnknownError(Ljava/lang/Throwable;)Lorg/whispersystems/signalservice/internal/ServiceResponse; -HSPLorg/whispersystems/signalservice/internal/ServiceResponse;->getApplicationError()Lj$/util/Optional; -HSPLorg/whispersystems/signalservice/internal/ServiceResponse;->getExecutionError()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/internal/ServiceResponse;->getResult()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/internal/ServiceResponseProcessor$DefaultProcessor;->(Lorg/whispersystems/signalservice/internal/ServiceResponse;)V HSPLorg/whispersystems/signalservice/internal/ServiceResponseProcessor;->(Lorg/whispersystems/signalservice/internal/ServiceResponse;)V -HSPLorg/whispersystems/signalservice/internal/ServiceResponseProcessor;->getError()Ljava/lang/Throwable; HSPLorg/whispersystems/signalservice/internal/ServiceResponseProcessor;->getResult()Ljava/lang/Object; HSPLorg/whispersystems/signalservice/internal/ServiceResponseProcessor;->getResultOrThrow()Ljava/lang/Object; HSPLorg/whispersystems/signalservice/internal/ServiceResponseProcessor;->hasResult()Z @@ -25547,12 +28743,10 @@ HSPLorg/whispersystems/signalservice/internal/configuration/SignalCdnUrl;->(Ljava/lang/String;Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/TrustStore;Lokhttp3/ConnectionSpec;)V HSPLorg/whispersystems/signalservice/internal/configuration/SignalCdsiUrl;->(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/TrustStore;)V HSPLorg/whispersystems/signalservice/internal/configuration/SignalKeyBackupServiceUrl;->(Ljava/lang/String;Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/TrustStore;Lokhttp3/ConnectionSpec;)V -HSPLorg/whispersystems/signalservice/internal/configuration/SignalKeyBackupServiceUrl;->(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/TrustStore;)V -HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->([Lorg/whispersystems/signalservice/internal/configuration/SignalServiceUrl;Ljava/util/Map;[Lorg/whispersystems/signalservice/internal/configuration/SignalKeyBackupServiceUrl;[Lorg/whispersystems/signalservice/internal/configuration/SignalStorageUrl;[Lorg/whispersystems/signalservice/internal/configuration/SignalCdsiUrl;[Lorg/whispersystems/signalservice/internal/configuration/SignalSvr2Url;Ljava/util/List;Lj$/util/Optional;Lj$/util/Optional;[B[B)V +HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->([Lorg/whispersystems/signalservice/internal/configuration/SignalServiceUrl;Ljava/util/Map;[Lorg/whispersystems/signalservice/internal/configuration/SignalStorageUrl;[Lorg/whispersystems/signalservice/internal/configuration/SignalCdsiUrl;[Lorg/whispersystems/signalservice/internal/configuration/SignalSvr2Url;Ljava/util/List;Lj$/util/Optional;Lj$/util/Optional;[B[B[B)V HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->getDns()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->getNetworkInterceptors()Ljava/util/List; HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->getSignalCdnUrlMap()Ljava/util/Map; -HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->getSignalKeyBackupServiceUrls()[Lorg/whispersystems/signalservice/internal/configuration/SignalKeyBackupServiceUrl; HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->getSignalProxy()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->getSignalServiceUrls()[Lorg/whispersystems/signalservice/internal/configuration/SignalServiceUrl; HSPLorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;->getSignalStorageUrls()[Lorg/whispersystems/signalservice/internal/configuration/SignalStorageUrl; @@ -25569,55 +28763,27 @@ HSPLorg/whispersystems/signalservice/internal/configuration/SignalUrl;->getConne HSPLorg/whispersystems/signalservice/internal/configuration/SignalUrl;->getHostHeader()Lj$/util/Optional; HSPLorg/whispersystems/signalservice/internal/configuration/SignalUrl;->getTrustStore()Lorg/whispersystems/signalservice/api/push/TrustStore; HSPLorg/whispersystems/signalservice/internal/configuration/SignalUrl;->getUrl()Ljava/lang/String; +HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda10;->()V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda11;->()V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda12;->()V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda13;->()V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda15;->()V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$1;->(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;Lorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$1;->onResponse(Lokhttp3/Call;Lokhttp3/Response;)V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$2;->()V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->(Lokhttp3/OkHttpClient;Ljava/lang/String;Lj$/util/Optional;)V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->(Lokhttp3/OkHttpClient;Ljava/lang/String;Lj$/util/Optional;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder-IA;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->getClient()Lokhttp3/OkHttpClient; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->getHostHeader()Lj$/util/Optional; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->getUrl()Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$EmptyResponseCodeHandler;->()V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$EmptyResponseCodeHandler;->(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$EmptyResponseCodeHandler-IA;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$EmptyResponseCodeHandler;->handle(ILokhttp3/ResponseBody;)V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ServiceConnectionHolder;->(Lokhttp3/OkHttpClient;Lokhttp3/OkHttpClient;Ljava/lang/String;Lj$/util/Optional;)V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ServiceConnectionHolder;->(Lokhttp3/OkHttpClient;Lokhttp3/OkHttpClient;Ljava/lang/String;Lj$/util/Optional;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ServiceConnectionHolder-IA;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->-$$Nest$mvalidateServiceResponse(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;Lokhttp3/Response;)Lokhttp3/Response; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->()V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/util/CredentialsProvider;Ljava/lang/String;Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Z)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->buildOkHttpClient(Z)Lokhttp3/OkHttpClient; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->buildServiceRequest(Ljava/lang/String;Ljava/lang/String;Lokhttp3/RequestBody;Ljava/util/Map;Lj$/util/Optional;Z)Lokhttp3/Request; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->createCdnClientsMap(Ljava/util/Map;Ljava/util/List;Lj$/util/Optional;Lj$/util/Optional;)Ljava/util/Map; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->createConnectionClient(Lorg/whispersystems/signalservice/internal/configuration/SignalUrl;Ljava/util/List;Lj$/util/Optional;Lj$/util/Optional;)Lokhttp3/OkHttpClient; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->createConnectionHolders([Lorg/whispersystems/signalservice/internal/configuration/SignalUrl;Ljava/util/List;Lj$/util/Optional;Lj$/util/Optional;)[Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->createServiceConnectionHolders([Lorg/whispersystems/signalservice/internal/configuration/SignalUrl;Ljava/util/List;Lj$/util/Optional;Lj$/util/Optional;)[Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ServiceConnectionHolder; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->downloadFromCdn(Ljava/io/OutputStream;JILjava/lang/String;JLorg/whispersystems/signalservice/api/messages/SignalServiceAttachment$ProgressListener;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getAuthorizationHeader(Lorg/whispersystems/signalservice/api/util/CredentialsProvider;)Ljava/lang/String; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getAvailablePreKeys(Lorg/whispersystems/signalservice/api/push/ServiceIdType;)Lorg/whispersystems/signalservice/internal/push/OneTimePreKeyCounts; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getRandom([Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;Ljava/security/SecureRandom;)Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getSenderCertificate()[B -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getServiceConnection(Ljava/lang/String;Ljava/lang/String;Lokhttp3/RequestBody;Ljava/util/Map;Lj$/util/Optional;Z)Lokhttp3/Response; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->jsonRequestBody(Ljava/lang/String;)Lokhttp3/RequestBody; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ResponseCodeHandler;Lj$/util/Optional;)Ljava/lang/String; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Lokhttp3/RequestBody;Ljava/util/Map;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ResponseCodeHandler;Lj$/util/Optional;Z)Lokhttp3/Response; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->retrieveStickerManifest([B)[B -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->retrieveVersionedProfile(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;Lj$/util/Optional;Ljava/util/Locale;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->setAccountAttributes(Lorg/whispersystems/signalservice/api/account/AccountAttributes;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->submitServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lj$/util/Optional;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->validateConfiguration(Ljava/util/Map;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->validateServiceResponse(Lokhttp3/Response;)Lokhttp3/Response; HSPLorg/whispersystems/signalservice/internal/push/VerifyAccountResponse;->(Ljava/lang/String;Ljava/lang/String;Z)V HSPLorg/whispersystems/signalservice/internal/push/VerifyAccountResponse;->getPni()Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/push/VerifyAccountResponse;->getUuid()Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/push/VerifyAccountResponse;->isStorageCapable()Z -HSPLorg/whispersystems/signalservice/internal/push/http/AcceptLanguagesUtil;->formatLanguages(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -HSPLorg/whispersystems/signalservice/internal/push/http/AcceptLanguagesUtil;->getAcceptLanguageHeader(Ljava/util/Locale;)Ljava/lang/String; -HSPLorg/whispersystems/signalservice/internal/push/http/AcceptLanguagesUtil;->getHeadersWithAcceptLanguage(Ljava/util/Locale;)Ljava/util/Map; HSPLorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager$1;->()V HSPLorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager;->()V HSPLorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager;->(Ljavax/net/ssl/X509TrustManager;)V @@ -25625,35 +28791,10 @@ HSPLorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager;->ch HSPLorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager;->createFor(Lorg/whispersystems/signalservice/api/push/TrustStore;)[Ljavax/net/ssl/TrustManager; HSPLorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager;->createFor([Ljavax/net/ssl/TrustManager;)[Ljavax/net/ssl/TrustManager; HSPLorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager;->getAcceptedIssuers()[Ljava/security/cert/X509Certificate; -HSPLorg/whispersystems/signalservice/internal/util/Hex;->()V -HSPLorg/whispersystems/signalservice/internal/util/Hex;->appendHexChar(Ljava/lang/StringBuffer;I)V -HSPLorg/whispersystems/signalservice/internal/util/Hex;->toStringCondensed([B)Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/util/JsonUtil;->()V HSPLorg/whispersystems/signalservice/internal/util/JsonUtil;->fromJson(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/internal/util/JsonUtil;->toJson(Ljava/lang/Object;)Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/util/Util;->immutableList([Ljava/lang/Object;)Ljava/util/List; HSPLorg/whispersystems/signalservice/internal/util/Util;->wait(Ljava/lang/Object;J)V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer;->(Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture;Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer;)V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers;->map(Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture;Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->()V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->get()Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->notifyAllListeners()V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->setException(Ljava/lang/Throwable;)Z -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder;->()V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder;->build()Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper; -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->()V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->()V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->(Ljava/util/Map;)V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->(Ljava/util/Map;Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper-IA;)V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->extend()Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder; -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder;->(Ljava/lang/Class;)V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder;->build()Lorg/whispersystems/signalservice/internal/websocket/ResponseMapper; -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder;->withResponseMapper(Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$CustomResponseMapper;)Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder; -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper;->(Ljava/lang/Class;Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$CustomResponseMapper;Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper;)V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper;->(Ljava/lang/Class;Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$CustomResponseMapper;Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper;Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper-IA;)V -HSPLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper;->extend(Ljava/lang/Class;)Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder; HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->()V HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->(Ljava/lang/String;Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lj$/util/Optional;Ljava/lang/String;Lorg/whispersystems/signalservice/api/websocket/HealthMonitor;Ljava/lang/String;Z)V HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->(Ljava/lang/String;Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lj$/util/Optional;Ljava/lang/String;Lorg/whispersystems/signalservice/api/websocket/HealthMonitor;Z)V @@ -25662,33 +28803,24 @@ HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->co HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->createTlsSocketFactory(Lorg/whispersystems/signalservice/api/push/TrustStore;)Lorg/signal/libsignal/protocol/util/Pair; HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->disconnect()V HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->elapsedTime(J)J +HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->getConnectionInfo()Lorg/signal/libsignal/protocol/util/Pair; HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->isDead()Z HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->log(Ljava/lang/String;)V HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->onFailure(Lokhttp3/WebSocket;Ljava/lang/Throwable;Lokhttp3/Response;)V HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->readRequest(J)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage; HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketConnection;->warn(Ljava/lang/String;Ljava/lang/Throwable;)V -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->()V -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->build()Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage; -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->headers(Ljava/util/List;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->id(Ljava/lang/Long;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->path(Ljava/lang/String;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->verb(Ljava/lang/String;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion$ADAPTER$1;->(Lcom/squareup/wire/FieldEncoding;Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;)V -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion;->()V -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;->()V -HSPLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;->(Ljava/lang/String;Ljava/lang/String;Lokio/ByteString;Ljava/util/List;Ljava/lang/Long;Lokio/ByteString;)V -HSPLorg/whispersystems/util/Base64;->()V -HSPLorg/whispersystems/util/Base64;->decode(Ljava/lang/String;)[B -HSPLorg/whispersystems/util/Base64;->decode(Ljava/lang/String;I)[B -HSPLorg/whispersystems/util/Base64;->decode([BIII)[B -HSPLorg/whispersystems/util/Base64;->decode4to3([BI[BII)I -HSPLorg/whispersystems/util/Base64;->encode3to4([BII[BII)[B -HSPLorg/whispersystems/util/Base64;->encodeBytes([B)Ljava/lang/String; -HSPLorg/whispersystems/util/Base64;->encodeBytes([BIII)Ljava/lang/String; -HSPLorg/whispersystems/util/Base64;->encodeBytesToBytes([BIII)[B -HSPLorg/whispersystems/util/Base64;->getAlphabet(I)[B -HSPLorg/whispersystems/util/Base64;->getDecodabet(I)[B +HSPLorg/whispersystems/util/StringUtil;->utf8(Ljava/lang/String;)[B +HSPLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda0;->(Lrxdogtag2/DogTagMaybeObserver;)V +HSPLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda1;->(Lrxdogtag2/DogTagMaybeObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda1;->run()V +HSPLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda4;->(Lrxdogtag2/DogTagMaybeObserver;)V +HSPLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda5;->(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda5;->run()V +HSPLrxdogtag2/DogTagMaybeObserver;->$r8$lambda$oZbZwTXdH3PbkXhPwGJJZ5hucwc(Lrxdogtag2/DogTagMaybeObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagMaybeObserver;->(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/MaybeObserver;)V +HSPLrxdogtag2/DogTagMaybeObserver;->lambda$onSubscribe$1(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagMaybeObserver;->onComplete()V +HSPLrxdogtag2/DogTagMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLrxdogtag2/DogTagObserver$$ExternalSyntheticLambda2;->(Lrxdogtag2/DogTagObserver;)V HSPLrxdogtag2/DogTagObserver$$ExternalSyntheticLambda3;->(Lio/reactivex/rxjava3/core/Observer;)V HSPLrxdogtag2/DogTagObserver$$ExternalSyntheticLambda3;->run()V @@ -25706,6 +28838,19 @@ HSPLrxdogtag2/DogTagObserver;->lambda$onSubscribe$1(Lio/reactivex/rxjava3/dispos HSPLrxdogtag2/DogTagObserver;->onComplete()V HSPLrxdogtag2/DogTagObserver;->onNext(Ljava/lang/Object;)V HSPLrxdogtag2/DogTagObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda0;->(Lrxdogtag2/DogTagSingleObserver;)V +HSPLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda1;->(Lrxdogtag2/DogTagSingleObserver;Ljava/lang/Object;)V +HSPLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda1;->run()V +HSPLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda4;->(Lrxdogtag2/DogTagSingleObserver;)V +HSPLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda5;->(Lrxdogtag2/DogTagSingleObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda5;->run()V +HSPLrxdogtag2/DogTagSingleObserver;->$r8$lambda$XHPr6lQHRHXcw_CKIYStMAqfnNo(Lrxdogtag2/DogTagSingleObserver;Ljava/lang/Object;)V +HSPLrxdogtag2/DogTagSingleObserver;->$r8$lambda$bu5rZib8qIaCqFy3X5GHmz5VHo0(Lrxdogtag2/DogTagSingleObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagSingleObserver;->(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/SingleObserver;)V +HSPLrxdogtag2/DogTagSingleObserver;->lambda$onSubscribe$1(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagSingleObserver;->lambda$onSuccess$3(Ljava/lang/Object;)V +HSPLrxdogtag2/DogTagSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +HSPLrxdogtag2/DogTagSingleObserver;->onSuccess(Ljava/lang/Object;)V HSPLrxdogtag2/DogTagSubscriber$$ExternalSyntheticLambda2;->(Lrxdogtag2/DogTagSubscriber;)V HSPLrxdogtag2/DogTagSubscriber$$ExternalSyntheticLambda3;->(Lrxdogtag2/DogTagSubscriber;Ljava/lang/Object;)V HSPLrxdogtag2/DogTagSubscriber$$ExternalSyntheticLambda3;->run()V @@ -25720,6 +28865,7 @@ HSPLrxdogtag2/DogTagSubscriber;->lambda$onSubscribe$1(Lorg/reactivestreams/Subsc HSPLrxdogtag2/DogTagSubscriber;->onNext(Ljava/lang/Object;)V HSPLrxdogtag2/DogTagSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V HSPLrxdogtag2/ObserverHandler$-CC;->$default$handle(Lrxdogtag2/ObserverHandler;Lio/reactivex/rxjava3/core/Flowable;Lorg/reactivestreams/Subscriber;)Lorg/reactivestreams/Subscriber; +HSPLrxdogtag2/ObserverHandler$-CC;->$default$handle(Lrxdogtag2/ObserverHandler;Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; HSPLrxdogtag2/ObserverHandler$-CC;->$default$handle(Lrxdogtag2/ObserverHandler;Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/core/Observer;)Lio/reactivex/rxjava3/core/Observer; HSPLrxdogtag2/ObserverHandler$-CC;->$default$handle(Lrxdogtag2/ObserverHandler;Lio/reactivex/rxjava3/core/Single;Lio/reactivex/rxjava3/core/SingleObserver;)Lio/reactivex/rxjava3/core/SingleObserver; HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda0;->(Lrxdogtag2/RxDogTag$Configuration;)V @@ -25729,16 +28875,19 @@ HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;Ljava HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda2;->(Lrxdogtag2/RxDogTag$Configuration;)V HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda3;->(Lrxdogtag2/RxDogTag$Configuration;)V +HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda4;->(Lrxdogtag2/RxDogTag$Configuration;)V HSPLrxdogtag2/RxDogTag$$ExternalSyntheticLambda5;->(Ljava/lang/Thread$UncaughtExceptionHandler;Lrxdogtag2/RxDogTag$NonCheckingConsumer;)V HSPLrxdogtag2/RxDogTag$Builder;->()V HSPLrxdogtag2/RxDogTag$Builder;->install()V HSPLrxdogtag2/RxDogTag$Configuration$1;->()V HSPLrxdogtag2/RxDogTag$Configuration$1;->handle(Lio/reactivex/rxjava3/core/Flowable;Lorg/reactivestreams/Subscriber;)Lorg/reactivestreams/Subscriber; +HSPLrxdogtag2/RxDogTag$Configuration$1;->handle(Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; HSPLrxdogtag2/RxDogTag$Configuration$1;->handle(Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/core/Observer;)Lio/reactivex/rxjava3/core/Observer; HSPLrxdogtag2/RxDogTag$Configuration$1;->handle(Lio/reactivex/rxjava3/core/Single;Lio/reactivex/rxjava3/core/SingleObserver;)Lio/reactivex/rxjava3/core/SingleObserver; HSPLrxdogtag2/RxDogTag$Configuration;->()V HSPLrxdogtag2/RxDogTag$Configuration;->(Lrxdogtag2/RxDogTag$Builder;)V +HSPLrxdogtag2/RxDogTag;->$r8$lambda$G5J9svI7_WWihw7QCY8ugVE_Jmo(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; HSPLrxdogtag2/RxDogTag;->$r8$lambda$Lb2Lkgs3_Lyd4he53yEk5j3ezFM(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Flowable;Lorg/reactivestreams/Subscriber;)Lorg/reactivestreams/Subscriber; HSPLrxdogtag2/RxDogTag;->$r8$lambda$YP26HIb1nhHqbV4QlRgnyBuwHqU(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/core/Observer;)Lio/reactivex/rxjava3/core/Observer; HSPLrxdogtag2/RxDogTag;->$r8$lambda$gpUPCywIa6QwbpyvYi5dNfOg-gs(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Single;Lio/reactivex/rxjava3/core/SingleObserver;)Lio/reactivex/rxjava3/core/SingleObserver; @@ -25749,6 +28898,7 @@ HSPLrxdogtag2/RxDogTag;->installWithBuilder(Lrxdogtag2/RxDogTag$Configuration;)V HSPLrxdogtag2/RxDogTag;->lambda$installWithBuilder$0(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/core/Observer;)Lio/reactivex/rxjava3/core/Observer; HSPLrxdogtag2/RxDogTag;->lambda$installWithBuilder$1(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Flowable;Lorg/reactivestreams/Subscriber;)Lorg/reactivestreams/Subscriber; HSPLrxdogtag2/RxDogTag;->lambda$installWithBuilder$2(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Single;Lio/reactivex/rxjava3/core/SingleObserver;)Lio/reactivex/rxjava3/core/SingleObserver; +HSPLrxdogtag2/RxDogTag;->lambda$installWithBuilder$3(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; HSPLrxdogtag2/RxDogTag;->shouldDecorate(Ljava/lang/Object;)Z Landroid/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$$ExternalSyntheticThrowCCEIfNotNull0; Landroid/support/v4/media/session/IMediaSession$Stub; @@ -25852,7 +29002,6 @@ Landroidx/appcompat/app/AppLocalesMetadataHolderService$Api24Impl; Landroidx/appcompat/app/AppLocalesMetadataHolderService; Landroidx/appcompat/app/AppLocalesStorageHelper$SerialExecutor; Landroidx/appcompat/app/AppLocalesStorageHelper$ThreadPerTaskExecutor; -Landroidx/appcompat/app/LayoutIncludeDetector; Landroidx/appcompat/app/ToolbarActionBar$1; Landroidx/appcompat/app/ToolbarActionBar$2; Landroidx/appcompat/app/ToolbarActionBar$ActionMenuPresenterCallback; @@ -25865,11 +29014,14 @@ Landroidx/appcompat/resources/R$drawable; Landroidx/appcompat/view/ActionBarPolicy; Landroidx/appcompat/view/ActionMode$Callback; Landroidx/appcompat/view/ActionMode; +Landroidx/appcompat/view/CollapsibleActionView; Landroidx/appcompat/view/ContextThemeWrapper; Landroidx/appcompat/view/SupportMenuInflater$MenuState; Landroidx/appcompat/view/SupportMenuInflater; Landroidx/appcompat/view/WindowCallbackWrapper; Landroidx/appcompat/view/menu/ActionMenuItem; +Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback; +Landroidx/appcompat/view/menu/ActionMenuItemView; Landroidx/appcompat/view/menu/BaseMenuPresenter; Landroidx/appcompat/view/menu/MenuBuilder$Callback; Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker; @@ -25877,8 +29029,11 @@ Landroidx/appcompat/view/menu/MenuBuilder; Landroidx/appcompat/view/menu/MenuItemImpl; Landroidx/appcompat/view/menu/MenuPresenter$Callback; Landroidx/appcompat/view/menu/MenuPresenter; +Landroidx/appcompat/view/menu/MenuView$ItemView; Landroidx/appcompat/view/menu/MenuView; +Landroidx/appcompat/view/menu/SubMenuBuilder; Landroidx/appcompat/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback; +Landroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback; Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton$1; Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton; Landroidx/appcompat/widget/ActionMenuPresenter$PopupPresenterCallback; @@ -25889,6 +29044,7 @@ Landroidx/appcompat/widget/ActionMenuView$LayoutParams; Landroidx/appcompat/widget/ActionMenuView$MenuBuilderCallback; Landroidx/appcompat/widget/ActionMenuView$OnMenuItemClickListener; Landroidx/appcompat/widget/ActionMenuView; +Landroidx/appcompat/widget/AppCompatAutoCompleteTextView; Landroidx/appcompat/widget/AppCompatBackgroundHelper; Landroidx/appcompat/widget/AppCompatButton; Landroidx/appcompat/widget/AppCompatCheckBox; @@ -25898,9 +29054,13 @@ Landroidx/appcompat/widget/AppCompatDrawableManager; Landroidx/appcompat/widget/AppCompatEditText; Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper; Landroidx/appcompat/widget/AppCompatEmojiTextHelper; +Landroidx/appcompat/widget/AppCompatHintHelper; Landroidx/appcompat/widget/AppCompatImageButton; Landroidx/appcompat/widget/AppCompatImageHelper; Landroidx/appcompat/widget/AppCompatImageView; +Landroidx/appcompat/widget/AppCompatProgressBarHelper; +Landroidx/appcompat/widget/AppCompatSeekBar; +Landroidx/appcompat/widget/AppCompatSeekBarHelper; Landroidx/appcompat/widget/AppCompatTextClassifierHelper$Api26Impl$$ExternalSyntheticApiModelOutline0; Landroidx/appcompat/widget/AppCompatTextClassifierHelper; Landroidx/appcompat/widget/AppCompatTextHelper$1; @@ -25919,6 +29079,10 @@ Landroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper; Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener; Landroidx/appcompat/widget/ContentFrameLayout; Landroidx/appcompat/widget/DecorToolbar; +Landroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0; +Landroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline1; +Landroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline2; +Landroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline3; Landroidx/appcompat/widget/DrawableUtils; Landroidx/appcompat/widget/FitWindowsFrameLayout; Landroidx/appcompat/widget/ForwardingListener; @@ -25929,6 +29093,20 @@ Landroidx/appcompat/widget/ResourceManagerInternal$ResourceManagerHooks; Landroidx/appcompat/widget/ResourceManagerInternal; Landroidx/appcompat/widget/ResourcesWrapper; Landroidx/appcompat/widget/RtlSpacingHelper; +Landroidx/appcompat/widget/SearchView$10; +Landroidx/appcompat/widget/SearchView$1; +Landroidx/appcompat/widget/SearchView$2; +Landroidx/appcompat/widget/SearchView$3; +Landroidx/appcompat/widget/SearchView$4; +Landroidx/appcompat/widget/SearchView$5; +Landroidx/appcompat/widget/SearchView$6; +Landroidx/appcompat/widget/SearchView$7; +Landroidx/appcompat/widget/SearchView$8; +Landroidx/appcompat/widget/SearchView$9; +Landroidx/appcompat/widget/SearchView$OnQueryTextListener; +Landroidx/appcompat/widget/SearchView$SearchAutoComplete$1; +Landroidx/appcompat/widget/SearchView$SearchAutoComplete; +Landroidx/appcompat/widget/SearchView; Landroidx/appcompat/widget/ThemeUtils; Landroidx/appcompat/widget/TintContextWrapper; Landroidx/appcompat/widget/TintInfo; @@ -25941,6 +29119,8 @@ Landroidx/appcompat/widget/Toolbar$3; Landroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter; Landroidx/appcompat/widget/Toolbar$LayoutParams; Landroidx/appcompat/widget/Toolbar$OnMenuItemClickListener; +Landroidx/appcompat/widget/Toolbar$SavedState$1; +Landroidx/appcompat/widget/Toolbar$SavedState; Landroidx/appcompat/widget/Toolbar; Landroidx/appcompat/widget/ToolbarWidgetWrapper$1; Landroidx/appcompat/widget/ToolbarWidgetWrapper; @@ -25975,6 +29155,7 @@ Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateRequest; Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateThread; Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$OnInflateFinishedListener; Landroidx/asynclayoutinflater/view/AsyncLayoutInflater; +Landroidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl$OutputConfigurationParamsApi24$$ExternalSyntheticBackport1; Landroidx/camera/view/PreviewView$1$$ExternalSyntheticBackportWithForwarding0; Landroidx/cardview/R$style; Landroidx/cardview/R$styleable; @@ -25999,11 +29180,11 @@ Landroidx/collection/SimpleArrayMap; Landroidx/collection/SparseArrayCompat; Landroidx/collection/SparseArrayKt$valueIterator$1; Landroidx/collection/SparseArrayKt; -Landroidx/compose/animation/FlingCalculator$FlingInfo$$ExternalSyntheticBackport0; Landroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline1; Landroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline1; Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticApiModelOutline0; +Landroidx/compose/ui/platform/coreshims/SoftwareKeyboardControllerCompat$Impl30$$ExternalSyntheticApiModelOutline1; Landroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline0; Landroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline1; Landroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline2; @@ -26017,8 +29198,10 @@ Landroidx/constraintlayout/core/Cache; Landroidx/constraintlayout/core/LinearSystem$Row; Landroidx/constraintlayout/core/LinearSystem$ValuesRow; Landroidx/constraintlayout/core/LinearSystem; +Landroidx/constraintlayout/core/Metrics; Landroidx/constraintlayout/core/Pools$Pool; Landroidx/constraintlayout/core/Pools$SimplePool; +Landroidx/constraintlayout/core/PriorityGoalRow$1; Landroidx/constraintlayout/core/PriorityGoalRow$GoalVariableAccessor; Landroidx/constraintlayout/core/PriorityGoalRow; Landroidx/constraintlayout/core/SolverVariable$Type; @@ -26027,12 +29210,14 @@ Landroidx/constraintlayout/core/state/WidgetFrame; Landroidx/constraintlayout/core/widgets/Barrier; Landroidx/constraintlayout/core/widgets/Chain; Landroidx/constraintlayout/core/widgets/ChainHead; +Landroidx/constraintlayout/core/widgets/ConstraintAnchor$1; Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type; Landroidx/constraintlayout/core/widgets/ConstraintAnchor; Landroidx/constraintlayout/core/widgets/ConstraintWidget$1; Landroidx/constraintlayout/core/widgets/ConstraintWidget$DimensionBehaviour; Landroidx/constraintlayout/core/widgets/ConstraintWidget; Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer; +Landroidx/constraintlayout/core/widgets/Guideline$1; Landroidx/constraintlayout/core/widgets/Guideline; Landroidx/constraintlayout/core/widgets/Helper; Landroidx/constraintlayout/core/widgets/HelperWidget; @@ -26065,9 +29250,11 @@ Landroidx/constraintlayout/widget/ConstraintSet$Motion; Landroidx/constraintlayout/widget/ConstraintSet$PropertySet; Landroidx/constraintlayout/widget/ConstraintSet$Transform; Landroidx/constraintlayout/widget/ConstraintSet; +Landroidx/constraintlayout/widget/ConstraintsChangedListener; Landroidx/constraintlayout/widget/Guideline; Landroidx/constraintlayout/widget/R$id; Landroidx/constraintlayout/widget/R$styleable; +Landroidx/constraintlayout/widget/SharedValues; Landroidx/constraintlayout/widget/VirtualLayout; Landroidx/coordinatorlayout/R$attr; Landroidx/coordinatorlayout/R$styleable; @@ -26076,6 +29263,8 @@ Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior; Landroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener; Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams; Landroidx/coordinatorlayout/widget/CoordinatorLayout$OnPreDrawListener; +Landroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState$1; +Landroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState; Landroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator; Landroidx/coordinatorlayout/widget/CoordinatorLayout; Landroidx/coordinatorlayout/widget/DirectedAcyclicGraph; @@ -26083,12 +29272,13 @@ Landroidx/coordinatorlayout/widget/ViewGroupUtils; Landroidx/core/R$attr; Landroidx/core/R$id; Landroidx/core/R$styleable; +Landroidx/core/app/ActivityCompat$Api21Impl; Landroidx/core/app/ActivityCompat$OnRequestPermissionsResultCallback; Landroidx/core/app/ActivityCompat$RequestPermissionsRequestCodeValidator; +Landroidx/core/app/ActivityCompat; Landroidx/core/app/AppOpsManagerCompat$Api23Impl$$ExternalSyntheticApiModelOutline1; Landroidx/core/app/AppOpsManagerCompat$Api23Impl; Landroidx/core/app/AppOpsManagerCompat; -Landroidx/core/app/BundleCompat$Api18Impl; Landroidx/core/app/BundleCompat; Landroidx/core/app/ComponentActivity; Landroidx/core/app/CoreComponentFactory; @@ -26100,7 +29290,6 @@ Landroidx/core/app/OnPictureInPictureModeChangedProvider; Landroidx/core/app/SharedElementCallback; Landroidx/core/app/TaskStackBuilder$SupportParentable; Landroidx/core/content/ContentValuesKt; -Landroidx/core/content/ContextCompat$Api19Impl; Landroidx/core/content/ContextCompat$Api21Impl; Landroidx/core/content/ContextCompat$Api23Impl$$ExternalSyntheticApiModelOutline1; Landroidx/core/content/ContextCompat$Api23Impl; @@ -26108,8 +29297,6 @@ Landroidx/core/content/ContextCompat$Api26Impl; Landroidx/core/content/ContextCompat$Api28Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/content/ContextCompat$Api28Impl; Landroidx/core/content/ContextCompat; -Landroidx/core/content/FileProvider$PathStrategy; -Landroidx/core/content/FileProvider$SimplePathStrategy; Landroidx/core/content/FileProvider; Landroidx/core/content/OnConfigurationChangedProvider; Landroidx/core/content/OnTrimMemoryProvider; @@ -26124,6 +29311,7 @@ Landroidx/core/content/res/ResourcesCompat$FontCallback$$ExternalSyntheticLambda Landroidx/core/content/res/ResourcesCompat$FontCallback; Landroidx/core/content/res/ResourcesCompat; Landroidx/core/graphics/ColorUtils; +Landroidx/core/graphics/Insets; Landroidx/core/graphics/TypefaceCompat; Landroidx/core/graphics/TypefaceCompatApi29Impl; Landroidx/core/graphics/TypefaceCompatBaseImpl; @@ -26137,11 +29325,15 @@ Landroidx/core/graphics/drawable/WrappedDrawable; Landroidx/core/internal/view/SupportMenu; Landroidx/core/internal/view/SupportMenuItem; Landroidx/core/math/MathUtils; -Landroidx/core/os/BuildCompat$Extensions30Impl$$ExternalSyntheticApiModelOutline0; -Landroidx/core/os/BuildCompat$Extensions30Impl; +Landroidx/core/os/BuildCompat$Api30Impl$$ExternalSyntheticApiModelOutline0; +Landroidx/core/os/BuildCompat$Api30Impl; Landroidx/core/os/BuildCompat; +Landroidx/core/os/BundleCompat$Api18Impl; +Landroidx/core/os/BundleCompat; +Landroidx/core/os/BundleKt; Landroidx/core/os/CancellationSignal$OnCancelListener; Landroidx/core/os/CancellationSignal; +Landroidx/core/os/ConfigurationCompat$Api24Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/os/ConfigurationCompat$Api24Impl; Landroidx/core/os/ConfigurationCompat; Landroidx/core/os/LocaleListCompat$Api21Impl; @@ -26149,13 +29341,14 @@ Landroidx/core/os/LocaleListCompat$Api24Impl; Landroidx/core/os/LocaleListCompat; Landroidx/core/os/LocaleListInterface; Landroidx/core/os/LocaleListPlatformWrapper$$ExternalSyntheticApiModelOutline0; -Landroidx/core/os/LocaleListPlatformWrapper$$ExternalSyntheticApiModelOutline2; Landroidx/core/os/LocaleListPlatformWrapper; Landroidx/core/os/TraceCompat$Api18Impl; Landroidx/core/os/TraceCompat; Landroidx/core/os/UserManagerCompat$Api24Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/os/UserManagerCompat$Api24Impl; Landroidx/core/os/UserManagerCompat; +Landroidx/core/text/util/LinkifyCompat$$ExternalSyntheticLambda0; +Landroidx/core/text/util/LinkifyCompat; Landroidx/core/util/Consumer; Landroidx/core/util/ObjectsCompat$Api19Impl; Landroidx/core/util/ObjectsCompat; @@ -26164,6 +29357,7 @@ Landroidx/core/util/Pools$SimplePool; Landroidx/core/util/Pools$SynchronizedPool; Landroidx/core/util/Preconditions; Landroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter; +Landroidx/core/view/AccessibilityDelegateCompat$Api16Impl; Landroidx/core/view/AccessibilityDelegateCompat; Landroidx/core/view/ActionProvider$SubUiVisibilityListener; Landroidx/core/view/GestureDetectorCompat$GestureDetectorCompatImpl; @@ -26190,7 +29384,10 @@ Landroidx/core/view/OnReceiveContentListener; Landroidx/core/view/OnReceiveContentViewBehavior; Landroidx/core/view/OneShotPreDrawListener; Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda1; +Landroidx/core/view/ViewCompat$1; Landroidx/core/view/ViewCompat$2; +Landroidx/core/view/ViewCompat$3; +Landroidx/core/view/ViewCompat$4; Landroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager; Landroidx/core/view/ViewCompat$AccessibilityViewProperty; Landroidx/core/view/ViewCompat$Api15Impl; @@ -26200,14 +29397,20 @@ Landroidx/core/view/ViewCompat$Api19Impl; Landroidx/core/view/ViewCompat$Api20Impl; Landroidx/core/view/ViewCompat$Api21Impl$1; Landroidx/core/view/ViewCompat$Api21Impl; +Landroidx/core/view/ViewCompat$Api23Impl$$ExternalSyntheticApiModelOutline1; +Landroidx/core/view/ViewCompat$Api23Impl; Landroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/view/ViewCompat$Api26Impl; +Landroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline0; +Landroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline10; Landroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline2; -Landroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline9; +Landroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline4; Landroidx/core/view/ViewCompat$Api28Impl; -Landroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline1; Landroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline2; +Landroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline3; Landroidx/core/view/ViewCompat$Api29Impl; +Landroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline2; +Landroidx/core/view/ViewCompat$Api30Impl; Landroidx/core/view/ViewCompat; Landroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiModelOutline1; @@ -26215,8 +29418,44 @@ Landroidx/core/view/ViewConfigurationCompat$Api26Impl; Landroidx/core/view/ViewConfigurationCompat$Api28Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/view/ViewConfigurationCompat$Api28Impl; Landroidx/core/view/ViewConfigurationCompat; +Landroidx/core/view/ViewGroupKt$children$1; +Landroidx/core/view/ViewGroupKt$iterator$1; +Landroidx/core/view/ViewGroupKt; Landroidx/core/view/ViewKt$doOnPreDraw$1; Landroidx/core/view/ViewKt; +Landroidx/core/view/ViewParentCompat; +Landroidx/core/view/WindowInsetsAnimationCompat$Callback; +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30$$ExternalSyntheticApiModelOutline2; +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback; +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30; +Landroidx/core/view/WindowInsetsAnimationCompat$Impl; +Landroidx/core/view/WindowInsetsAnimationCompat; +Landroidx/core/view/WindowInsetsCompat$Builder; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline5; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline6; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline8; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl29; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl30; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl; +Landroidx/core/view/WindowInsetsCompat$Impl20; +Landroidx/core/view/WindowInsetsCompat$Impl21; +Landroidx/core/view/WindowInsetsCompat$Impl28$$ExternalSyntheticApiModelOutline1; +Landroidx/core/view/WindowInsetsCompat$Impl28; +Landroidx/core/view/WindowInsetsCompat$Impl29; +Landroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline1; +Landroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline3; +Landroidx/core/view/WindowInsetsCompat$Impl30; +Landroidx/core/view/WindowInsetsCompat$Impl; +Landroidx/core/view/WindowInsetsCompat$Type; +Landroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline0; +Landroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline1; +Landroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline2; +Landroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline6; +Landroidx/core/view/WindowInsetsCompat$TypeImpl30; +Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline11; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline3; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline6; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline0; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline11; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline13; @@ -26235,6 +29474,10 @@ Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActio Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline6; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline7; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl$$ExternalSyntheticApiModelOutline0; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; +Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; Landroidx/core/view/accessibility/AccessibilityViewCommand$CommandArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveAtGranularityArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveHtmlArguments; @@ -26246,17 +29489,27 @@ Landroidx/core/view/accessibility/AccessibilityViewCommand$SetTextArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand; Landroidx/core/view/animation/PathInterpolatorCompat$Api21Impl; Landroidx/core/view/animation/PathInterpolatorCompat; +Landroidx/core/view/inputmethod/EditorInfoCompat$$ExternalSyntheticApiModelOutline0; +Landroidx/core/view/inputmethod/EditorInfoCompat; +Landroidx/core/view/inputmethod/InputConnectionCompat$1; +Landroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener; +Landroidx/core/view/inputmethod/InputConnectionCompat; Landroidx/core/widget/ImageViewCompat$Api21Impl; Landroidx/core/widget/ImageViewCompat; Landroidx/core/widget/NestedScrollView$OnScrollChangeListener; Landroidx/core/widget/TextViewCompat$Api16Impl; Landroidx/core/widget/TextViewCompat$Api17Impl; +Landroidx/core/widget/TextViewCompat$Api23Impl$$ExternalSyntheticApiModelOutline5; +Landroidx/core/widget/TextViewCompat$Api23Impl; Landroidx/core/widget/TextViewCompat; Landroidx/core/widget/TextViewOnReceiveContentListener; Landroidx/core/widget/TintableCompoundButton; Landroidx/core/widget/TintableCompoundDrawablesView; Landroidx/customview/poolingcontainer/PoolingContainer; Landroidx/customview/poolingcontainer/R$id; +Landroidx/customview/view/AbsSavedState$1; +Landroidx/customview/view/AbsSavedState$2; +Landroidx/customview/view/AbsSavedState; Landroidx/customview/widget/ExploreByTouchHelper$1; Landroidx/customview/widget/ExploreByTouchHelper$2; Landroidx/customview/widget/ExploreByTouchHelper; @@ -26295,6 +29548,8 @@ Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19; Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal; Landroidx/emoji2/viewsintegration/EmojiEditTextHelper; Landroidx/emoji2/viewsintegration/EmojiEditableFactory; +Landroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper; +Landroidx/emoji2/viewsintegration/EmojiInputConnection; Landroidx/emoji2/viewsintegration/EmojiInputFilter; Landroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper; Landroidx/emoji2/viewsintegration/EmojiKeyListener; @@ -26318,6 +29573,7 @@ Landroidx/fragment/app/Fragment$6; Landroidx/fragment/app/Fragment$7; Landroidx/fragment/app/Fragment$9; Landroidx/fragment/app/Fragment$AnimationInfo; +Landroidx/fragment/app/Fragment$Api19Impl; Landroidx/fragment/app/Fragment$OnPreAttachedListener; Landroidx/fragment/app/Fragment$SavedState; Landroidx/fragment/app/Fragment; @@ -26345,17 +29601,24 @@ Landroidx/fragment/app/FragmentManager$2; Landroidx/fragment/app/FragmentManager$3; Landroidx/fragment/app/FragmentManager$4; Landroidx/fragment/app/FragmentManager$5; +Landroidx/fragment/app/FragmentManager$6; Landroidx/fragment/app/FragmentManager$7; Landroidx/fragment/app/FragmentManager$8; Landroidx/fragment/app/FragmentManager$9; Landroidx/fragment/app/FragmentManager$FragmentIntentSenderContract; +Landroidx/fragment/app/FragmentManager$LifecycleAwareResultListener; Landroidx/fragment/app/FragmentManager$OnBackStackChangedListener; Landroidx/fragment/app/FragmentManager$OpGenerator; Landroidx/fragment/app/FragmentManager; Landroidx/fragment/app/FragmentManagerImpl; +Landroidx/fragment/app/FragmentManagerState$1; +Landroidx/fragment/app/FragmentManagerState; Landroidx/fragment/app/FragmentManagerViewModel$1; Landroidx/fragment/app/FragmentManagerViewModel; Landroidx/fragment/app/FragmentOnAttachListener; +Landroidx/fragment/app/FragmentResultListener; +Landroidx/fragment/app/FragmentState$1; +Landroidx/fragment/app/FragmentState; Landroidx/fragment/app/FragmentStateManager$1; Landroidx/fragment/app/FragmentStateManager$2; Landroidx/fragment/app/FragmentStateManager; @@ -26383,6 +29646,8 @@ Landroidx/interpolator/view/animation/FastOutLinearInInterpolator; Landroidx/interpolator/view/animation/FastOutSlowInInterpolator; Landroidx/interpolator/view/animation/LinearOutSlowInInterpolator; Landroidx/interpolator/view/animation/LookupTableInterpolator; +Landroidx/lifecycle/AbstractSavedStateViewModelFactory$Companion; +Landroidx/lifecycle/AbstractSavedStateViewModelFactory; Landroidx/lifecycle/AndroidViewModel; Landroidx/lifecycle/ClassesInfoCache$CallbackInfo; Landroidx/lifecycle/ClassesInfoCache$MethodReference; @@ -26393,6 +29658,7 @@ Landroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings; Landroidx/lifecycle/DefaultLifecycleObserverAdapter; Landroidx/lifecycle/EmptyActivityLifecycleCallbacks; Landroidx/lifecycle/HasDefaultViewModelProviderFactory; +Landroidx/lifecycle/LegacySavedStateHandleController$OnRecreation; Landroidx/lifecycle/LegacySavedStateHandleController; Landroidx/lifecycle/Lifecycle$Event$Companion$WhenMappings; Landroidx/lifecycle/Lifecycle$Event$Companion; @@ -26434,6 +29700,8 @@ Landroidx/lifecycle/ReportFragment$Companion; Landroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion; Landroidx/lifecycle/ReportFragment$LifecycleCallbacks; Landroidx/lifecycle/ReportFragment; +Landroidx/lifecycle/SavedStateHandle$$ExternalSyntheticLambda0; +Landroidx/lifecycle/SavedStateHandle$Companion; Landroidx/lifecycle/SavedStateHandle; Landroidx/lifecycle/SavedStateHandleAttacher; Landroidx/lifecycle/SavedStateHandleController; @@ -26632,6 +29900,11 @@ Landroidx/media3/decoder/DecoderInputBuffer; Landroidx/media3/exoplayer/AudioBecomingNoisyManager$AudioBecomingNoisyReceiver; Landroidx/media3/exoplayer/AudioBecomingNoisyManager$EventListener; Landroidx/media3/exoplayer/AudioBecomingNoisyManager; +Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline1; +Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline2; +Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline3; +Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline5; +Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline6; Landroidx/media3/exoplayer/AudioFocusManager$AudioFocusListener; Landroidx/media3/exoplayer/AudioFocusManager$PlayerControl; Landroidx/media3/exoplayer/AudioFocusManager; @@ -26846,6 +30119,7 @@ Landroidx/media3/session/CacheBitmapLoader; Landroidx/media3/session/CommandButton$$ExternalSyntheticLambda0; Landroidx/media3/session/CommandButton$Builder; Landroidx/media3/session/CommandButton; +Landroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0; Landroidx/media3/session/ConnectedControllersManager$ConnectedControllerRecord; Landroidx/media3/session/ConnectedControllersManager; Landroidx/media3/session/ConnectionRequest$$ExternalSyntheticLambda0; @@ -26863,6 +30137,7 @@ Landroidx/media3/session/IMediaSession$Stub; Landroidx/media3/session/IMediaSession; Landroidx/media3/session/IMediaSessionService$Stub; Landroidx/media3/session/IMediaSessionService; +Landroidx/media3/session/MediaController$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaController$Builder$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaController$Builder$1; Landroidx/media3/session/MediaController$Builder; @@ -26878,8 +30153,12 @@ Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda113; Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda118; Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda38; Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda39; +Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda41; +Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda81; +Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda82; Landroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler; +Landroidx/media3/session/MediaControllerImplBase$RemoteSessionTask; Landroidx/media3/session/MediaControllerImplBase$SessionServiceConnection; Landroidx/media3/session/MediaControllerImplBase$SurfaceCallback; Landroidx/media3/session/MediaControllerImplBase; @@ -26899,6 +30178,7 @@ Landroidx/media3/session/MediaNotificationManager; Landroidx/media3/session/MediaSession$Builder$1; Landroidx/media3/session/MediaSession$Builder; Landroidx/media3/session/MediaSession$BuilderBase; +Landroidx/media3/session/MediaSession$Callback$-CC; Landroidx/media3/session/MediaSession$Callback; Landroidx/media3/session/MediaSession$ConnectionResult; Landroidx/media3/session/MediaSession$ControllerCb; @@ -26926,8 +30206,15 @@ Landroidx/media3/session/MediaSessionService$MediaSessionListener; Landroidx/media3/session/MediaSessionService$MediaSessionServiceStub$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaSessionService$MediaSessionServiceStub; Landroidx/media3/session/MediaSessionService; +Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11; Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda19; +Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda25; +Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda68; +Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda72; +Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda76; +Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda81; Landroidx/media3/session/MediaSessionStub$Controller2Cb; +Landroidx/media3/session/MediaSessionStub$SessionTask; Landroidx/media3/session/MediaSessionStub; Landroidx/media3/session/MediaUtils; Landroidx/media3/session/PlayerInfo$$ExternalSyntheticLambda0; @@ -26954,6 +30241,17 @@ Landroidx/media3/session/SessionTokenImplBase$$ExternalSyntheticLambda0; Landroidx/media3/session/SessionTokenImplBase; Landroidx/media3/session/SimpleBitmapLoader$$ExternalSyntheticLambda0; Landroidx/media3/session/SimpleBitmapLoader; +Landroidx/media3/ui/AspectRatioFrameLayout$AspectRatioUpdateDispatcher; +Landroidx/media3/ui/AspectRatioFrameLayout; +Landroidx/media3/ui/PlayerControlView$OnFullScreenModeChangedListener; +Landroidx/media3/ui/PlayerControlView$VisibilityListener; +Landroidx/media3/ui/PlayerControlView; +Landroidx/media3/ui/PlayerView$ComponentListener; +Landroidx/media3/ui/PlayerView; +Landroidx/media3/ui/R$id; +Landroidx/media3/ui/R$layout; +Landroidx/media3/ui/R$styleable; +Landroidx/media3/ui/SubtitleView; Landroidx/multidex/MultiDex; Landroidx/multidex/MultiDexApplication; Landroidx/navigation/ActivityNavigator$Companion; @@ -26967,6 +30265,9 @@ Landroidx/navigation/NavBackStackEntry$Companion; Landroidx/navigation/NavBackStackEntry$defaultFactory$2; Landroidx/navigation/NavBackStackEntry$savedStateHandle$2; Landroidx/navigation/NavBackStackEntry; +Landroidx/navigation/NavBackStackEntryState$Companion$CREATOR$1; +Landroidx/navigation/NavBackStackEntryState$Companion; +Landroidx/navigation/NavBackStackEntryState; Landroidx/navigation/NavController$$ExternalSyntheticLambda0; Landroidx/navigation/NavController$Companion; Landroidx/navigation/NavController$NavControllerNavigatorState; @@ -27071,6 +30372,13 @@ Landroidx/recyclerview/widget/BatchingListUpdateCallback; Landroidx/recyclerview/widget/ChildHelper$Bucket; Landroidx/recyclerview/widget/ChildHelper$Callback; Landroidx/recyclerview/widget/ChildHelper; +Landroidx/recyclerview/widget/ConcatAdapter$Config$StableIdMode; +Landroidx/recyclerview/widget/ConcatAdapter$Config; +Landroidx/recyclerview/widget/ConcatAdapter; +Landroidx/recyclerview/widget/ConcatAdapterController$WrapperAndLocalPosition; +Landroidx/recyclerview/widget/ConcatAdapterController; +Landroidx/recyclerview/widget/ConversationLayoutManager$Companion; +Landroidx/recyclerview/widget/ConversationLayoutManager; Landroidx/recyclerview/widget/DefaultItemAnimator$3; Landroidx/recyclerview/widget/DefaultItemAnimator$5; Landroidx/recyclerview/widget/DefaultItemAnimator; @@ -27097,10 +30405,15 @@ Landroidx/recyclerview/widget/ItemTouchHelper; Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo; Landroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult; Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState; +Landroidx/recyclerview/widget/LinearLayoutManager$SavedState$1; +Landroidx/recyclerview/widget/LinearLayoutManager$SavedState; Landroidx/recyclerview/widget/LinearLayoutManager; Landroidx/recyclerview/widget/ListAdapter$1; Landroidx/recyclerview/widget/ListAdapter; Landroidx/recyclerview/widget/ListUpdateCallback; +Landroidx/recyclerview/widget/NestedAdapterWrapper$1; +Landroidx/recyclerview/widget/NestedAdapterWrapper$Callback; +Landroidx/recyclerview/widget/NestedAdapterWrapper; Landroidx/recyclerview/widget/OpReorderer$Callback; Landroidx/recyclerview/widget/OpReorderer; Landroidx/recyclerview/widget/OrientationHelper$1; @@ -27135,6 +30448,9 @@ Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData; Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; Landroidx/recyclerview/widget/RecyclerView$Recycler; Landroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver; +Landroidx/recyclerview/widget/RecyclerView$SavedState$1; +Landroidx/recyclerview/widget/RecyclerView$SavedState; +Landroidx/recyclerview/widget/RecyclerView$SimpleOnItemTouchListener; Landroidx/recyclerview/widget/RecyclerView$SmoothScroller$ScrollVectorProvider; Landroidx/recyclerview/widget/RecyclerView$State; Landroidx/recyclerview/widget/RecyclerView$StretchEdgeEffectFactory; @@ -27145,16 +30461,26 @@ Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate; Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate; Landroidx/recyclerview/widget/ScrollbarHelper; Landroidx/recyclerview/widget/SimpleItemAnimator; +Landroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage$1; +Landroidx/recyclerview/widget/StableIdStorage$NoStableIdStorage; +Landroidx/recyclerview/widget/StableIdStorage$StableIdLookup; +Landroidx/recyclerview/widget/StableIdStorage; Landroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags; Landroidx/recyclerview/widget/ViewBoundsCheck$Callback; Landroidx/recyclerview/widget/ViewBoundsCheck; Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord; Landroidx/recyclerview/widget/ViewInfoStore$ProcessCallback; Landroidx/recyclerview/widget/ViewInfoStore; +Landroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage$WrapperViewTypeLookup; +Landroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage; +Landroidx/recyclerview/widget/ViewTypeStorage$ViewTypeLookup; +Landroidx/recyclerview/widget/ViewTypeStorage; Landroidx/savedstate/R$id; Landroidx/savedstate/Recreator$Companion; +Landroidx/savedstate/Recreator$SavedStateProvider; Landroidx/savedstate/Recreator; Landroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0; +Landroidx/savedstate/SavedStateRegistry$AutoRecreated; Landroidx/savedstate/SavedStateRegistry$Companion; Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; Landroidx/savedstate/SavedStateRegistry; @@ -27186,6 +30512,8 @@ Lcom/airbnb/lottie/LottieAnimationView$$ExternalSyntheticLambda1; Lcom/airbnb/lottie/LottieAnimationView$$ExternalSyntheticLambda2; Lcom/airbnb/lottie/LottieAnimationView$1; Lcom/airbnb/lottie/LottieAnimationView$2; +Lcom/airbnb/lottie/LottieAnimationView$SavedState$1; +Lcom/airbnb/lottie/LottieAnimationView$SavedState; Lcom/airbnb/lottie/LottieAnimationView$UserActionTaken; Lcom/airbnb/lottie/LottieAnimationView; Lcom/airbnb/lottie/LottieComposition; @@ -27233,12 +30561,12 @@ Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation$KeyframesWrapperImpl Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation$SingleKeyframeWrapper; Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/ColorKeyframeAnimation; -Lcom/airbnb/lottie/animation/keyframe/DropShadowKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/FloatKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/IntegerKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/KeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/MaskKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/PathKeyframe; +Lcom/airbnb/lottie/animation/keyframe/PathKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/PointKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/ScaleKeyframeAnimation; Lcom/airbnb/lottie/animation/keyframe/ShapeKeyframeAnimation; @@ -27260,7 +30588,6 @@ Lcom/airbnb/lottie/model/animatable/AnimatableSplitDimensionPathValue; Lcom/airbnb/lottie/model/animatable/AnimatableTransform; Lcom/airbnb/lottie/model/animatable/AnimatableValue; Lcom/airbnb/lottie/model/animatable/BaseAnimatableValue; -Lcom/airbnb/lottie/model/content/BlurEffect; Lcom/airbnb/lottie/model/content/CircleShape; Lcom/airbnb/lottie/model/content/ContentModel; Lcom/airbnb/lottie/model/content/Mask$MaskMode; @@ -27335,6 +30662,9 @@ Lcom/annimon/stream/Collectors$9; Lcom/annimon/stream/Collectors$CollectorsImpl; Lcom/annimon/stream/Collectors; Lcom/annimon/stream/IntPair; +Lcom/annimon/stream/IntStream$1; +Lcom/annimon/stream/IntStream$5; +Lcom/annimon/stream/IntStream; Lcom/annimon/stream/Objects; Lcom/annimon/stream/Optional; Lcom/annimon/stream/Stream$2; @@ -27342,6 +30672,9 @@ Lcom/annimon/stream/Stream$3; Lcom/annimon/stream/Stream; Lcom/annimon/stream/function/BiConsumer; Lcom/annimon/stream/function/BiFunction; +Lcom/annimon/stream/function/BinaryOperator$Util$2; +Lcom/annimon/stream/function/BinaryOperator$Util; +Lcom/annimon/stream/function/BinaryOperator; Lcom/annimon/stream/function/Consumer; Lcom/annimon/stream/function/Function; Lcom/annimon/stream/function/IndexedFunction; @@ -27350,14 +30683,19 @@ Lcom/annimon/stream/function/Predicate$Util$5; Lcom/annimon/stream/function/Predicate$Util; Lcom/annimon/stream/function/Predicate; Lcom/annimon/stream/function/Supplier; +Lcom/annimon/stream/function/ToIntFunction; Lcom/annimon/stream/internal/Operators; Lcom/annimon/stream/internal/Params; Lcom/annimon/stream/iterator/IndexedIterator; Lcom/annimon/stream/iterator/LazyIterator; Lcom/annimon/stream/iterator/LsaExtIterator; Lcom/annimon/stream/iterator/LsaIterator; +Lcom/annimon/stream/iterator/PrimitiveIterator$OfInt; +Lcom/annimon/stream/operator/IntArray; +Lcom/annimon/stream/operator/IntRangeClosed; Lcom/annimon/stream/operator/ObjArray; Lcom/annimon/stream/operator/ObjFilter; +Lcom/annimon/stream/operator/ObjLimit; Lcom/annimon/stream/operator/ObjMap; Lcom/annimon/stream/operator/ObjMapIndexed; Lcom/annimon/stream/operator/ObjSorted; @@ -27674,6 +31012,7 @@ Lcom/bumptech/glide/provider/ResourceEncoderRegistry$Entry; Lcom/bumptech/glide/provider/ResourceEncoderRegistry; Lcom/bumptech/glide/request/BaseRequestOptions; Lcom/bumptech/glide/request/Request; +Lcom/bumptech/glide/request/RequestListener; Lcom/bumptech/glide/request/RequestOptions; Lcom/bumptech/glide/request/ResourceCallback; Lcom/bumptech/glide/request/SingleRequest$Status; @@ -27795,7 +31134,6 @@ Lcom/fasterxml/jackson/core/exc/InputCoercionException; Lcom/fasterxml/jackson/core/exc/StreamReadException; Lcom/fasterxml/jackson/core/io/CharTypes; Lcom/fasterxml/jackson/core/io/IOContext; -Lcom/fasterxml/jackson/core/io/JsonEOFException; Lcom/fasterxml/jackson/core/io/JsonStringEncoder; Lcom/fasterxml/jackson/core/io/NumberInput; Lcom/fasterxml/jackson/core/io/NumberOutput; @@ -27829,7 +31167,6 @@ Lcom/fasterxml/jackson/core/util/JacksonFeature; Lcom/fasterxml/jackson/core/util/JacksonFeatureSet; Lcom/fasterxml/jackson/core/util/Separators; Lcom/fasterxml/jackson/core/util/TextBuffer; -Lcom/fasterxml/jackson/core/util/ThreadLocalBufferManager; Lcom/fasterxml/jackson/core/util/VersionUtil; Lcom/fasterxml/jackson/databind/AbstractTypeResolver; Lcom/fasterxml/jackson/databind/AnnotationIntrospector$ReferenceProperty$Type; @@ -27896,7 +31233,6 @@ Lcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$1; Lcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$ContainerDefaultMappings; Lcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$CreatorCollectionState; Lcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory; -Lcom/fasterxml/jackson/databind/deser/BeanDeserializer$BeanReferring; Lcom/fasterxml/jackson/databind/deser/BeanDeserializer; Lcom/fasterxml/jackson/databind/deser/BeanDeserializerBase; Lcom/fasterxml/jackson/databind/deser/BeanDeserializerBuilder; @@ -27913,7 +31249,6 @@ Lcom/fasterxml/jackson/databind/deser/Deserializers; Lcom/fasterxml/jackson/databind/deser/KeyDeserializers; Lcom/fasterxml/jackson/databind/deser/NullValueProvider; Lcom/fasterxml/jackson/databind/deser/ResolvableDeserializer; -Lcom/fasterxml/jackson/databind/deser/SettableAnyProperty; Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty$Delegating; Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty; Lcom/fasterxml/jackson/databind/deser/UnresolvedForwardReference; @@ -27924,48 +31259,30 @@ Lcom/fasterxml/jackson/databind/deser/impl/BeanPropertyMap; Lcom/fasterxml/jackson/databind/deser/impl/CreatorCandidate$Param; Lcom/fasterxml/jackson/databind/deser/impl/CreatorCandidate; Lcom/fasterxml/jackson/databind/deser/impl/CreatorCollector; -Lcom/fasterxml/jackson/databind/deser/impl/ExternalTypeHandler; Lcom/fasterxml/jackson/databind/deser/impl/FailingDeserializer; Lcom/fasterxml/jackson/databind/deser/impl/FieldProperty; Lcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$ArrayListInstantiator; -Lcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator; Lcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators; Lcom/fasterxml/jackson/databind/deser/impl/ManagedReferenceProperty; Lcom/fasterxml/jackson/databind/deser/impl/NullsConstantProvider; Lcom/fasterxml/jackson/databind/deser/impl/ObjectIdReader; Lcom/fasterxml/jackson/databind/deser/impl/PropertyBasedCreator; Lcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer; -Lcom/fasterxml/jackson/databind/deser/impl/ReadableObjectId$Referring; -Lcom/fasterxml/jackson/databind/deser/impl/UnwrappedPropertyHandler; -Lcom/fasterxml/jackson/databind/deser/impl/ValueInjector; Lcom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer; Lcom/fasterxml/jackson/databind/deser/std/ContainerDeserializerBase; Lcom/fasterxml/jackson/databind/deser/std/DateDeserializers; Lcom/fasterxml/jackson/databind/deser/std/FromStringDeserializer; Lcom/fasterxml/jackson/databind/deser/std/JdkDeserializers; Lcom/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer; -Lcom/fasterxml/jackson/databind/deser/std/MapDeserializer; -Lcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer; -Lcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$DoubleDeserializer; -Lcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$FloatDeserializer; Lcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$IntegerDeserializer; Lcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$LongDeserializer; Lcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$PrimitiveOrWrapperDeserializer; Lcom/fasterxml/jackson/databind/deser/std/NumberDeserializers; Lcom/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer; -Lcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$BooleanDeser; -Lcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$DoubleDeser; -Lcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$FloatDeser; -Lcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$IntDeser; -Lcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$LongDeser; -Lcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers; Lcom/fasterxml/jackson/databind/deser/std/StdDeserializer; -Lcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD; -Lcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer; Lcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializers; Lcom/fasterxml/jackson/databind/deser/std/StdScalarDeserializer; Lcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator; -Lcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer; Lcom/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer; Lcom/fasterxml/jackson/databind/deser/std/StringDeserializer; Lcom/fasterxml/jackson/databind/deser/std/UUIDDeserializer; @@ -27997,7 +31314,6 @@ Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NCollector; Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NoAnnotations; Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneAnnotation; Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneCollector; -Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector$TwoAnnotations; Lcom/fasterxml/jackson/databind/introspect/AnnotationCollector; Lcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair; Lcom/fasterxml/jackson/databind/introspect/AnnotationMap; @@ -28037,7 +31353,6 @@ Lcom/fasterxml/jackson/databind/jsontype/PolymorphicTypeValidator$Base; Lcom/fasterxml/jackson/databind/jsontype/PolymorphicTypeValidator; Lcom/fasterxml/jackson/databind/jsontype/SubtypeResolver; Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer; -Lcom/fasterxml/jackson/databind/jsontype/TypeSerializer; Lcom/fasterxml/jackson/databind/jsontype/impl/LaissezFaireSubTypeValidator; Lcom/fasterxml/jackson/databind/jsontype/impl/StdSubtypeResolver; Lcom/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator; @@ -28071,7 +31386,6 @@ Lcom/fasterxml/jackson/databind/ser/Serializers$Base; Lcom/fasterxml/jackson/databind/ser/Serializers; Lcom/fasterxml/jackson/databind/ser/impl/FailingSerializer; Lcom/fasterxml/jackson/databind/ser/impl/IndexedListSerializer; -Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Double; Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Empty; Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$SerializerAndMapResult; Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Single; @@ -28134,7 +31448,6 @@ Lcom/fasterxml/jackson/databind/type/CollectionType; Lcom/fasterxml/jackson/databind/type/LogicalType; Lcom/fasterxml/jackson/databind/type/MapLikeType; Lcom/fasterxml/jackson/databind/type/MapType; -Lcom/fasterxml/jackson/databind/type/PlaceholderForType; Lcom/fasterxml/jackson/databind/type/ResolvedRecursiveType; Lcom/fasterxml/jackson/databind/type/SimpleType; Lcom/fasterxml/jackson/databind/type/TypeBase; @@ -28435,6 +31748,8 @@ Lcom/google/android/material/shape/ShapePath$PathOperation; Lcom/google/android/material/shape/ShapePath$ShadowCompatOperation; Lcom/google/android/material/shape/ShapePath; Lcom/google/android/material/shape/Shapeable; +Lcom/google/android/material/stateful/ExtendableSavedState$1; +Lcom/google/android/material/stateful/ExtendableSavedState; Lcom/google/android/material/theme/overlay/MaterialThemeOverlay; Lcom/google/common/base/Ascii; Lcom/google/common/base/Charsets; @@ -28473,6 +31788,8 @@ Lcom/google/common/collect/RegularImmutableList; Lcom/google/common/collect/RegularImmutableMap$KeysOrValuesAsList; Lcom/google/common/collect/RegularImmutableMap; Lcom/google/common/collect/RegularImmutableSet; +Lcom/google/common/collect/Sets$2; +Lcom/google/common/collect/Sets$SetView; Lcom/google/common/collect/Sets; Lcom/google/common/collect/UnmodifiableIterator; Lcom/google/common/collect/UnmodifiableListIterator; @@ -28485,6 +31802,7 @@ Lcom/google/common/util/concurrent/AbstractFuture$Failure; Lcom/google/common/util/concurrent/AbstractFuture$Listener; Lcom/google/common/util/concurrent/AbstractFuture$SetFuture; Lcom/google/common/util/concurrent/AbstractFuture$Trusted; +Lcom/google/common/util/concurrent/AbstractFuture$TrustedFuture; Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0; Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper$1; Lcom/google/common/util/concurrent/AbstractFuture$UnsafeAtomicHelper; @@ -28501,6 +31819,7 @@ Lcom/google/common/util/concurrent/ListenableFuture; Lcom/google/common/util/concurrent/ListeningExecutorService; Lcom/google/common/util/concurrent/MoreExecutors$ListeningDecorator; Lcom/google/common/util/concurrent/MoreExecutors; +Lcom/google/common/util/concurrent/SettableFuture; Lcom/google/common/util/concurrent/Uninterruptibles; Lcom/google/common/util/concurrent/internal/InternalFutureFailureAccess; Lcom/google/common/util/concurrent/internal/InternalFutures; @@ -28682,74 +32001,7 @@ Lcom/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSourc Lcom/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider; Lcom/google/i18n/phonenumbers/metadata/source/RegionMetadataSource; Lcom/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl; -Lcom/google/protobuf/AbstractMessageLite$Builder; -Lcom/google/protobuf/AbstractMessageLite; -Lcom/google/protobuf/AbstractParser; -Lcom/google/protobuf/AbstractProtobufList; -Lcom/google/protobuf/Android; -Lcom/google/protobuf/ByteString$2; -Lcom/google/protobuf/ByteString$ByteArrayCopier; -Lcom/google/protobuf/ByteString$LeafByteString; -Lcom/google/protobuf/ByteString$LiteralByteString; -Lcom/google/protobuf/ByteString$SystemByteArrayCopier; -Lcom/google/protobuf/ByteString; -Lcom/google/protobuf/CodedInputStream$ArrayDecoder; -Lcom/google/protobuf/CodedInputStream; -Lcom/google/protobuf/ExtensionSchema; -Lcom/google/protobuf/ExtensionSchemaLite; -Lcom/google/protobuf/ExtensionSchemas; -Lcom/google/protobuf/FieldSet; -Lcom/google/protobuf/GeneratedMessageInfoFactory; -Lcom/google/protobuf/GeneratedMessageLite$Builder; -Lcom/google/protobuf/GeneratedMessageLite$DefaultInstanceBasedParser; -Lcom/google/protobuf/GeneratedMessageLite$ExtendableMessage; -Lcom/google/protobuf/GeneratedMessageLite$MethodToInvoke; -Lcom/google/protobuf/GeneratedMessageLite; -Lcom/google/protobuf/Internal$EnumLite; -Lcom/google/protobuf/Internal$EnumLiteMap; -Lcom/google/protobuf/Internal$EnumVerifier; -Lcom/google/protobuf/Internal$LongList; -Lcom/google/protobuf/Internal$ProtobufList; -Lcom/google/protobuf/Internal; -Lcom/google/protobuf/InvalidProtocolBufferException$InvalidWireTypeException; Lcom/google/protobuf/InvalidProtocolBufferException; -Lcom/google/protobuf/ListFieldSchema$ListFieldSchemaFull; -Lcom/google/protobuf/ListFieldSchema$ListFieldSchemaLite; -Lcom/google/protobuf/ListFieldSchema; -Lcom/google/protobuf/LongArrayList; -Lcom/google/protobuf/ManifestSchemaFactory$1; -Lcom/google/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory; -Lcom/google/protobuf/ManifestSchemaFactory; -Lcom/google/protobuf/MapFieldLite; -Lcom/google/protobuf/MapFieldSchema; -Lcom/google/protobuf/MapFieldSchemaLite; -Lcom/google/protobuf/MapFieldSchemas; -Lcom/google/protobuf/MessageInfo; -Lcom/google/protobuf/MessageInfoFactory; -Lcom/google/protobuf/MessageLite$Builder; -Lcom/google/protobuf/MessageLite; -Lcom/google/protobuf/MessageLiteOrBuilder; -Lcom/google/protobuf/MessageSchema; -Lcom/google/protobuf/NewInstanceSchema; -Lcom/google/protobuf/NewInstanceSchemaLite; -Lcom/google/protobuf/NewInstanceSchemas; -Lcom/google/protobuf/Parser; -Lcom/google/protobuf/PrimitiveNonBoxingCollection; -Lcom/google/protobuf/ProtoSyntax; -Lcom/google/protobuf/Protobuf; -Lcom/google/protobuf/ProtobufArrayList; -Lcom/google/protobuf/RawMessageInfo; -Lcom/google/protobuf/Schema; -Lcom/google/protobuf/SchemaFactory; -Lcom/google/protobuf/SchemaUtil; -Lcom/google/protobuf/UninitializedMessageException; -Lcom/google/protobuf/UnknownFieldSchema; -Lcom/google/protobuf/UnknownFieldSetLite; -Lcom/google/protobuf/UnknownFieldSetLiteSchema; -Lcom/google/protobuf/UnsafeUtil$1; -Lcom/google/protobuf/UnsafeUtil$Android64MemoryAccessor; -Lcom/google/protobuf/UnsafeUtil$MemoryAccessor; -Lcom/google/protobuf/UnsafeUtil; Lcom/klinker/android/send_message/MmsFileProvider; Lcom/makeramen/roundedimageview/RoundedDrawable$1; Lcom/makeramen/roundedimageview/RoundedDrawable; @@ -28757,6 +32009,9 @@ Lcom/mobilecoin/lib/exceptions/BadMnemonicException; Lcom/mobilecoin/lib/exceptions/MobileCoinException; Lcom/mobilecoin/lib/exceptions/SerializationException; Lcom/mobilecoin/lib/util/Hex; +Lcom/pnikosis/materialishprogress/ProgressWheel; +Lcom/pnikosis/materialishprogress/R$styleable; +Lcom/squareup/wire/EnumAdapter; Lcom/squareup/wire/FieldEncoding$Companion; Lcom/squareup/wire/FieldEncoding; Lcom/squareup/wire/Message$Builder; @@ -28764,6 +32019,7 @@ Lcom/squareup/wire/Message$Companion; Lcom/squareup/wire/Message; Lcom/squareup/wire/PackedProtoAdapter; Lcom/squareup/wire/ProtoAdapter$Companion; +Lcom/squareup/wire/ProtoAdapter$EnumConstantNotFoundException; Lcom/squareup/wire/ProtoAdapter; Lcom/squareup/wire/ProtoAdapterKt$commonBool$1; Lcom/squareup/wire/ProtoAdapterKt$commonBytes$1; @@ -28787,9 +32043,11 @@ Lcom/squareup/wire/ProtoAdapterKt$commonUint32$1; Lcom/squareup/wire/ProtoAdapterKt$commonUint64$1; Lcom/squareup/wire/ProtoAdapterKt$commonWrapper$1; Lcom/squareup/wire/ProtoAdapterKt; +Lcom/squareup/wire/ProtoWriter; Lcom/squareup/wire/RepeatedProtoAdapter; Lcom/squareup/wire/Syntax$Companion; Lcom/squareup/wire/Syntax; +Lcom/squareup/wire/WireEnum; Lcom/squareup/wire/internal/ImmutableList; Lcom/squareup/wire/internal/Internal; Lcom/squareup/wire/internal/Internal__InternalKt; @@ -28808,9 +32066,15 @@ Lio/reactivex/rxjava3/core/Flowable; Lio/reactivex/rxjava3/core/FlowableEmitter; Lio/reactivex/rxjava3/core/FlowableOnSubscribe; Lio/reactivex/rxjava3/core/FlowableSubscriber; +Lio/reactivex/rxjava3/core/Maybe; +Lio/reactivex/rxjava3/core/MaybeEmitter; Lio/reactivex/rxjava3/core/MaybeObserver; +Lio/reactivex/rxjava3/core/MaybeOnSubscribe; +Lio/reactivex/rxjava3/core/MaybeSource; Lio/reactivex/rxjava3/core/Observable$1; Lio/reactivex/rxjava3/core/Observable; +Lio/reactivex/rxjava3/core/ObservableEmitter; +Lio/reactivex/rxjava3/core/ObservableOnSubscribe; Lio/reactivex/rxjava3/core/ObservableSource; Lio/reactivex/rxjava3/core/Observer; Lio/reactivex/rxjava3/core/Scheduler$PeriodicDirectTask; @@ -28826,7 +32090,6 @@ Lio/reactivex/rxjava3/disposables/Disposable; Lio/reactivex/rxjava3/disposables/DisposableContainer; Lio/reactivex/rxjava3/disposables/ReferenceDisposable; Lio/reactivex/rxjava3/disposables/RunnableDisposable; -Lio/reactivex/rxjava3/exceptions/Exceptions; Lio/reactivex/rxjava3/exceptions/OnErrorNotImplementedException; Lio/reactivex/rxjava3/flowables/ConnectableFlowable; Lio/reactivex/rxjava3/functions/Action; @@ -28834,6 +32097,7 @@ Lio/reactivex/rxjava3/functions/BiFunction; Lio/reactivex/rxjava3/functions/BiPredicate; Lio/reactivex/rxjava3/functions/Cancellable; Lio/reactivex/rxjava3/functions/Consumer; +Lio/reactivex/rxjava3/functions/Function3; Lio/reactivex/rxjava3/functions/Function; Lio/reactivex/rxjava3/functions/LongConsumer; Lio/reactivex/rxjava3/functions/Predicate; @@ -28843,6 +32107,7 @@ Lio/reactivex/rxjava3/internal/disposables/DisposableHelper; Lio/reactivex/rxjava3/internal/disposables/EmptyDisposable; Lio/reactivex/rxjava3/internal/disposables/SequentialDisposable; Lio/reactivex/rxjava3/internal/functions/Functions$Array2Func; +Lio/reactivex/rxjava3/internal/functions/Functions$Array3Func; Lio/reactivex/rxjava3/internal/functions/Functions$EmptyAction; Lio/reactivex/rxjava3/internal/functions/Functions$EmptyConsumer; Lio/reactivex/rxjava3/internal/functions/Functions$EmptyLongConsumer; @@ -28859,7 +32124,7 @@ Lio/reactivex/rxjava3/internal/functions/Functions; Lio/reactivex/rxjava3/internal/functions/ObjectHelper$BiObjectPredicate; Lio/reactivex/rxjava3/internal/functions/ObjectHelper; Lio/reactivex/rxjava3/internal/fuseable/ConditionalSubscriber; -Lio/reactivex/rxjava3/internal/fuseable/FuseToFlowable; +Lio/reactivex/rxjava3/internal/fuseable/FuseToObservable; Lio/reactivex/rxjava3/internal/fuseable/QueueDisposable; Lio/reactivex/rxjava3/internal/fuseable/QueueFuseable; Lio/reactivex/rxjava3/internal/fuseable/QueueSubscription; @@ -28868,10 +32133,15 @@ Lio/reactivex/rxjava3/internal/fuseable/SimplePlainQueue; Lio/reactivex/rxjava3/internal/fuseable/SimpleQueue; Lio/reactivex/rxjava3/internal/observers/BasicFuseableObserver; Lio/reactivex/rxjava3/internal/observers/BasicIntQueueDisposable; +Lio/reactivex/rxjava3/internal/observers/BasicQueueDisposable; Lio/reactivex/rxjava3/internal/observers/BlockingMultiObserver; +Lio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver; Lio/reactivex/rxjava3/internal/observers/DeferredScalarDisposable; Lio/reactivex/rxjava3/internal/observers/LambdaObserver; -Lio/reactivex/rxjava3/internal/observers/ResumeSingleObserver; +Lio/reactivex/rxjava3/internal/observers/QueueDrainObserver; +Lio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberPad0; +Lio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberPad2; +Lio/reactivex/rxjava3/internal/observers/QueueDrainSubscriberWip; Lio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber; Lio/reactivex/rxjava3/internal/operators/flowable/AbstractFlowableWithUpstream; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableCombineLatest$CombineLatestCoordinator; @@ -28885,7 +32155,8 @@ Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDistinctUntilChanged$D Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDistinctUntilChanged; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach$DoOnEachSubscriber; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableDoOnEach; -Lio/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture; +Lio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber; +Lio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableInternalHelper$RequestMax; @@ -28914,8 +32185,6 @@ Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$ReplaySubscribe Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$SizeBoundReplayBuffer; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableScalarXMap; -Lio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle$SingleElementSubscriber; -Lio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn$SubscribeOnSubscriber$Request; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn$SubscribeOnSubscriber; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn; @@ -28924,36 +32193,108 @@ Lio/reactivex/rxjava3/internal/operators/flowable/FlowableSwitchMap$SwitchMapSub Lio/reactivex/rxjava3/internal/operators/flowable/FlowableSwitchMap; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest$ThrottleLatestSubscriber; Lio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest; +Lio/reactivex/rxjava3/internal/operators/maybe/AbstractMaybeWithUpstream; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver; +Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek; +Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver; +Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber; +Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle; Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver; Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver; Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle; Lio/reactivex/rxjava3/internal/operators/mixed/ScalarXMapZHelper; +Lio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver; +Lio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable; Lio/reactivex/rxjava3/internal/operators/observable/AbstractObservableWithUpstream; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferBoundaryObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableCreate; Lio/reactivex/rxjava3/internal/operators/observable/ObservableDistinctUntilChanged$DistinctUntilChangedObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableDistinctUntilChanged; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFilter; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableJust; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableMap; Lio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BufferSupplier; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBuffer; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBufferSupplier; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplaySource; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$SizeBoundReplayBuffer; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$UnBoundedFactory; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedNoLast; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableScalarXMap; Lio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed$ScanSeedObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSkip; Lio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn$SubscribeOnObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn$SubscribeTask; Lio/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver; +Lio/reactivex/rxjava3/internal/operators/observable/ObservableTake; Lio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed$DebounceTimedObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed; -Lio/reactivex/rxjava3/internal/operators/single/SingleError; -Lio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver; -Lio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback; -Lio/reactivex/rxjava3/internal/operators/single/SingleFlatMap; +Lio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess$DoOnSuccess; +Lio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess; Lio/reactivex/rxjava3/internal/operators/single/SingleFromCallable; +Lio/reactivex/rxjava3/internal/operators/single/SingleJust; Lio/reactivex/rxjava3/internal/operators/single/SingleMap$MapSingleObserver; Lio/reactivex/rxjava3/internal/operators/single/SingleMap; -Lio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn; -Lio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn; -Lio/reactivex/rxjava3/internal/operators/single/SingleResumeNext$ResumeMainSingleObserver; -Lio/reactivex/rxjava3/internal/operators/single/SingleResumeNext; +Lio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver; +Lio/reactivex/rxjava3/internal/operators/single/SingleObserveOn; +Lio/reactivex/rxjava3/internal/operators/single/SingleOnErrorComplete; Lio/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn$SubscribeOnObserver; Lio/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn; Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; @@ -28981,31 +32322,38 @@ Lio/reactivex/rxjava3/internal/subscribers/BasicFuseableConditionalSubscriber; Lio/reactivex/rxjava3/internal/subscribers/BasicFuseableSubscriber; Lio/reactivex/rxjava3/internal/subscribers/LambdaSubscriber; Lio/reactivex/rxjava3/internal/subscriptions/BasicIntQueueSubscription; -Lio/reactivex/rxjava3/internal/subscriptions/DeferredScalarSubscription; Lio/reactivex/rxjava3/internal/subscriptions/SubscriptionHelper; Lio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList$NonThrowingPredicate; -Lio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList; +Lio/reactivex/rxjava3/internal/util/ArrayListSupplier; Lio/reactivex/rxjava3/internal/util/AtomicThrowable; Lio/reactivex/rxjava3/internal/util/BackpressureHelper; Lio/reactivex/rxjava3/internal/util/BlockingHelper; +Lio/reactivex/rxjava3/internal/util/EndConsumerHelper; +Lio/reactivex/rxjava3/internal/util/ErrorMode; Lio/reactivex/rxjava3/internal/util/ExceptionHelper$Termination; Lio/reactivex/rxjava3/internal/util/ExceptionHelper; Lio/reactivex/rxjava3/internal/util/NotificationLite$ErrorNotification; Lio/reactivex/rxjava3/internal/util/NotificationLite; +Lio/reactivex/rxjava3/internal/util/ObservableQueueDrain; Lio/reactivex/rxjava3/internal/util/OpenHashSet; Lio/reactivex/rxjava3/internal/util/Pow2; Lio/reactivex/rxjava3/kotlin/DisposableKt; Lio/reactivex/rxjava3/kotlin/SubscribersKt$onCompleteStub$1; Lio/reactivex/rxjava3/kotlin/SubscribersKt$onErrorStub$1; Lio/reactivex/rxjava3/kotlin/SubscribersKt$onNextStub$1; +Lio/reactivex/rxjava3/kotlin/SubscribersKt$sam$io_reactivex_rxjava3_functions_Action$0; Lio/reactivex/rxjava3/kotlin/SubscribersKt$sam$io_reactivex_rxjava3_functions_Consumer$0; Lio/reactivex/rxjava3/kotlin/SubscribersKt; +Lio/reactivex/rxjava3/observables/ConnectableObservable; +Lio/reactivex/rxjava3/observers/DisposableObserver; Lio/reactivex/rxjava3/observers/LambdaConsumerIntrospection; Lio/reactivex/rxjava3/observers/SerializedObserver; Lio/reactivex/rxjava3/plugins/RxJavaPlugins; Lio/reactivex/rxjava3/processors/BehaviorProcessor$BehaviorSubscription; Lio/reactivex/rxjava3/processors/BehaviorProcessor; Lio/reactivex/rxjava3/processors/FlowableProcessor; +Lio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription; +Lio/reactivex/rxjava3/processors/PublishProcessor; Lio/reactivex/rxjava3/schedulers/Schedulers$ComputationTask; Lio/reactivex/rxjava3/schedulers/Schedulers$IOTask; Lio/reactivex/rxjava3/schedulers/Schedulers$NewThreadHolder; @@ -29028,8 +32376,10 @@ Lj$/time/LocalTime; Lj$/time/OffsetDateTime; Lj$/time/ZoneId; Lj$/time/ZoneOffset; +Lj$/time/ZonedDateTime; Lj$/time/a; Lj$/time/chrono/ChronoLocalDateTime; +Lj$/time/chrono/ChronoZonedDateTime; Lj$/time/chrono/a; Lj$/time/chrono/b; Lj$/time/chrono/e; @@ -29144,11 +32494,13 @@ Lj$/util/function/Function; Lj$/util/function/IntFunction; Lj$/util/function/N; Lj$/util/function/Predicate; +Lj$/util/function/S; Lj$/util/function/Supplier; Lj$/util/function/ToDoubleFunction; Lj$/util/function/ToIntFunction; Lj$/util/function/ToLongFunction; Lj$/util/function/Z; +Lj$/util/function/b; Lj$/util/function/g0; Lj$/util/function/h; Lj$/util/function/j0; @@ -29158,54 +32510,59 @@ Lj$/util/function/p0; Lj$/util/function/t; Lj$/util/g; Lj$/util/m; -Lj$/util/stream/A0; -Lj$/util/stream/A2; +Lj$/util/stream/A1; Lj$/util/stream/B0; Lj$/util/stream/B2; Lj$/util/stream/C0; +Lj$/util/stream/C2; Lj$/util/stream/Collector$Characteristics; Lj$/util/stream/Collector; Lj$/util/stream/Collectors; Lj$/util/stream/D0; Lj$/util/stream/E0; Lj$/util/stream/E1; -Lj$/util/stream/E3; +Lj$/util/stream/F0; Lj$/util/stream/F1; Lj$/util/stream/F3; -Lj$/util/stream/G; -Lj$/util/stream/K0; -Lj$/util/stream/K; -Lj$/util/stream/L; -Lj$/util/stream/O1; +Lj$/util/stream/G1; +Lj$/util/stream/G3; +Lj$/util/stream/H; +Lj$/util/stream/I; +Lj$/util/stream/L0; +Lj$/util/stream/M; +Lj$/util/stream/N; Lj$/util/stream/P1; -Lj$/util/stream/Q; -Lj$/util/stream/R1; -Lj$/util/stream/R2; +Lj$/util/stream/Q1; +Lj$/util/stream/S1; Lj$/util/stream/S2; -Lj$/util/stream/S; Lj$/util/stream/Stream; -Lj$/util/stream/T1; Lj$/util/stream/T2; -Lj$/util/stream/U0; +Lj$/util/stream/T; Lj$/util/stream/U1; Lj$/util/stream/U2; +Lj$/util/stream/U; Lj$/util/stream/V0; Lj$/util/stream/V1; +Lj$/util/stream/V2; Lj$/util/stream/W0; Lj$/util/stream/W1; Lj$/util/stream/X0; Lj$/util/stream/X1; Lj$/util/stream/Y0; -Lj$/util/stream/b2; +Lj$/util/stream/Y1; +Lj$/util/stream/Z0; Lj$/util/stream/b; +Lj$/util/stream/c2; Lj$/util/stream/c; -Lj$/util/stream/f2; +Lj$/util/stream/g2; +Lj$/util/stream/h2; +Lj$/util/stream/i2; Lj$/util/stream/i; Lj$/util/stream/l; -Lj$/util/stream/m; -Lj$/util/stream/t2; -Lj$/util/stream/v0; -Lj$/util/stream/v; +Lj$/util/stream/n; +Lj$/util/stream/u2; +Lj$/util/stream/w0; +Lj$/util/stream/w; Ljavax/inject/Provider; Lkotlin/Function; Lkotlin/InitializedLazyImpl; @@ -29351,6 +32708,8 @@ Lkotlin/jvm/internal/Lambda; Lkotlin/jvm/internal/MutablePropertyReference1; Lkotlin/jvm/internal/MutablePropertyReference1Impl; Lkotlin/jvm/internal/MutablePropertyReference; +Lkotlin/jvm/internal/PropertyReference0; +Lkotlin/jvm/internal/PropertyReference0Impl; Lkotlin/jvm/internal/PropertyReference1; Lkotlin/jvm/internal/PropertyReference1Impl; Lkotlin/jvm/internal/PropertyReference; @@ -29398,6 +32757,7 @@ Lkotlin/reflect/KParameter$Kind; Lkotlin/reflect/KParameter; Lkotlin/reflect/KProperty$Accessor; Lkotlin/reflect/KProperty$Getter; +Lkotlin/reflect/KProperty0; Lkotlin/reflect/KProperty1$Getter; Lkotlin/reflect/KProperty1; Lkotlin/reflect/KProperty; @@ -30047,6 +33407,7 @@ Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite; Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLite; Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap; Lkotlin/reflect/jvm/internal/impl/protobuf/InvalidProtocolBufferException; +Lkotlin/reflect/jvm/internal/impl/protobuf/LazyField$LazyIterator; Lkotlin/reflect/jvm/internal/impl/protobuf/LazyStringArrayList; Lkotlin/reflect/jvm/internal/impl/protobuf/LazyStringList; Lkotlin/reflect/jvm/internal/impl/protobuf/LiteralByteString; @@ -30132,13 +33493,6 @@ Lkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt; Lkotlin/reflect/jvm/internal/impl/resolve/calls/inference/CapturedTypeConstructor; Lkotlin/reflect/jvm/internal/impl/resolve/calls/inference/CapturedTypeConstructorImpl; Lkotlin/reflect/jvm/internal/impl/resolve/calls/inference/CapturedTypeConstructorKt; -Lkotlin/reflect/jvm/internal/impl/resolve/constants/BooleanValue; -Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue; -Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory; -Lkotlin/reflect/jvm/internal/impl/resolve/constants/EnumValue; -Lkotlin/reflect/jvm/internal/impl/resolve/constants/IntValue; -Lkotlin/reflect/jvm/internal/impl/resolve/constants/IntegerValueConstant; -Lkotlin/reflect/jvm/internal/impl/resolve/constants/StringValue; Lkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt$$Lambda$0; Lkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt$declaresOrInheritsDefaultValue$2; Lkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt; @@ -30452,6 +33806,7 @@ Lkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1; Lkotlin/sequences/SequencesKt__SequencesKt$generateSequence$1; Lkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2; Lkotlin/sequences/SequencesKt__SequencesKt; +Lkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1; Lkotlin/sequences/SequencesKt___SequencesJvmKt; Lkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1; Lkotlin/sequences/SequencesKt___SequencesKt$flatMap$1; @@ -30672,6 +34027,7 @@ Lokhttp3/internal/tls/OkHostnameVerifier; Lokhttp3/internal/tls/TrustRootIndex; Lokhttp3/internal/ws/RealWebSocket$1; Lokhttp3/internal/ws/RealWebSocket$2; +Lokhttp3/internal/ws/RealWebSocket$Close; Lokhttp3/internal/ws/RealWebSocket; Lokhttp3/internal/ws/WebSocketProtocol; Lokhttp3/internal/ws/WebSocketReader$FrameCallback; @@ -30725,15 +34081,10 @@ Lorg/conscrypt/AbstractSessionContext$1; Lorg/conscrypt/AbstractSessionContext; Lorg/conscrypt/ActiveSession; Lorg/conscrypt/AddressUtils; -Lorg/conscrypt/AllocatedBuffer; -Lorg/conscrypt/ArrayUtils; -Lorg/conscrypt/BufferAllocator; Lorg/conscrypt/BufferUtils; Lorg/conscrypt/ByteArray; Lorg/conscrypt/ClientSessionContext$HostAndPort; Lorg/conscrypt/ClientSessionContext; -Lorg/conscrypt/Conscrypt$Version; -Lorg/conscrypt/Conscrypt; Lorg/conscrypt/ConscryptEngine$1; Lorg/conscrypt/ConscryptEngine$2; Lorg/conscrypt/ConscryptEngine; @@ -30744,6 +34095,7 @@ Lorg/conscrypt/ConscryptEngineSocket$SSLInputStream; Lorg/conscrypt/ConscryptEngineSocket$SSLOutputStream; Lorg/conscrypt/ConscryptEngineSocket; Lorg/conscrypt/ConscryptSession; +Lorg/conscrypt/ConscryptSignal; Lorg/conscrypt/CryptoUpcalls; Lorg/conscrypt/EmptyArray; Lorg/conscrypt/EvpMdRef$MD5; @@ -30751,7 +34103,6 @@ Lorg/conscrypt/EvpMdRef$SHA1; Lorg/conscrypt/EvpMdRef$SHA256; Lorg/conscrypt/ExternalSession$Provider; Lorg/conscrypt/ExternalSession; -Lorg/conscrypt/GCMParameters; Lorg/conscrypt/HandshakeListener; Lorg/conscrypt/Java7ExtendedSSLSession; Lorg/conscrypt/Java8EngineSocket; @@ -30776,9 +34127,6 @@ Lorg/conscrypt/NativeSsl; Lorg/conscrypt/NativeSslSession$Impl; Lorg/conscrypt/NativeSslSession; Lorg/conscrypt/OidData; -Lorg/conscrypt/OpenSSLAeadCipher; -Lorg/conscrypt/OpenSSLAeadCipherAES$GCM; -Lorg/conscrypt/OpenSSLAeadCipherAES; Lorg/conscrypt/OpenSSLBIOInputStream; Lorg/conscrypt/OpenSSLCipher$Mode; Lorg/conscrypt/OpenSSLCipher$Padding; @@ -30829,7 +34177,6 @@ Lorg/conscrypt/SSLParametersImpl$PSKCallbacks; Lorg/conscrypt/SSLParametersImpl; Lorg/conscrypt/SSLUtils; Lorg/conscrypt/ServerSessionContext; -Lorg/conscrypt/io/IoUtils; Lorg/greenrobot/eventbus/AsyncPoster; Lorg/greenrobot/eventbus/BackgroundPoster; Lorg/greenrobot/eventbus/EventBus$1; @@ -30854,16 +34201,21 @@ Lorg/signal/benchmark/BenchmarkSetupActivity; Lorg/signal/benchmark/DummyAccountManagerFactory; Lorg/signal/benchmark/setup/TestMessages; Lorg/signal/benchmark/setup/TestUsers; +Lorg/signal/core/util/Base64; +Lorg/signal/core/util/Base64Tools; Lorg/signal/core/util/Bitmask; Lorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSyntheticApiModelOutline0; Lorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSyntheticApiModelOutline1; Lorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSyntheticApiModelOutline3; Lorg/signal/core/util/BreakIteratorCompat$AndroidIcuBreakIterator$$ExternalSyntheticApiModelOutline4; +Lorg/signal/core/util/ByteSize; Lorg/signal/core/util/CharacterIterable$AndroidIcuBreakIterator; Lorg/signal/core/util/CharacterIterable$BreakIteratorCompat; Lorg/signal/core/util/CharacterIterable$CharacterIterator; Lorg/signal/core/util/CharacterIterable; +Lorg/signal/core/util/CollectionsExtensionsKt; Lorg/signal/core/util/Conversions; +Lorg/signal/core/util/CryptoUtil; Lorg/signal/core/util/CursorExtensionsKt; Lorg/signal/core/util/CursorUtil; Lorg/signal/core/util/DatabaseId; @@ -30874,11 +34226,14 @@ Lorg/signal/core/util/DimensionUnit$2; Lorg/signal/core/util/DimensionUnit$3; Lorg/signal/core/util/DimensionUnit; Lorg/signal/core/util/DimensionUnitExtensionsKt; +Lorg/signal/core/util/DoubleExtensionsKt; Lorg/signal/core/util/ExistsBuilderPart1; Lorg/signal/core/util/ExistsBuilderPart2; Lorg/signal/core/util/Hex; Lorg/signal/core/util/InsertBuilderPart1; Lorg/signal/core/util/InsertBuilderPart2; +Lorg/signal/core/util/IntSerializer; +Lorg/signal/core/util/ListUtil; Lorg/signal/core/util/LongSerializer; Lorg/signal/core/util/MapUtil; Lorg/signal/core/util/MemoryTracker$$ExternalSyntheticLambda1; @@ -30899,18 +34254,25 @@ Lorg/signal/core/util/ShakeDetector$Listener; Lorg/signal/core/util/ShakeDetector$SamplePool; Lorg/signal/core/util/ShakeDetector$SampleQueue; Lorg/signal/core/util/ShakeDetector; +Lorg/signal/core/util/SqlUtil$$ExternalSyntheticLambda0; +Lorg/signal/core/util/SqlUtil$CollectionOperator; Lorg/signal/core/util/SqlUtil$Query; +Lorg/signal/core/util/SqlUtil$buildCustomCollectionQuery$1; Lorg/signal/core/util/SqlUtil; Lorg/signal/core/util/Stopwatch$Split; +Lorg/signal/core/util/Stopwatch$stopAndGetLogString$splitString$1; Lorg/signal/core/util/Stopwatch; -Lorg/signal/core/util/StreamUtil; Lorg/signal/core/util/StringExtensionsKt; Lorg/signal/core/util/StringSerializer; Lorg/signal/core/util/StringUtil; Lorg/signal/core/util/ThreadUtil; +Lorg/signal/core/util/ToolbarExtensionsKt; Lorg/signal/core/util/UpdateBuilderPart1; Lorg/signal/core/util/UpdateBuilderPart2; Lorg/signal/core/util/UpdateBuilderPart3; +Lorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread$$ExternalSyntheticLambda0; +Lorg/signal/core/util/concurrent/AnrDetector$AnrDetectorThread; +Lorg/signal/core/util/concurrent/AnrDetector; Lorg/signal/core/util/concurrent/DeadlockDetector$$ExternalSyntheticLambda0; Lorg/signal/core/util/concurrent/DeadlockDetector$Companion; Lorg/signal/core/util/concurrent/DeadlockDetector$ExecutorInfo; @@ -30918,6 +34280,11 @@ Lorg/signal/core/util/concurrent/DeadlockDetector; Lorg/signal/core/util/concurrent/LatestPrioritizedSerialExecutor; Lorg/signal/core/util/concurrent/LifecycleDisposable; Lorg/signal/core/util/concurrent/LifecycleDisposableKt; +Lorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0; +Lorg/signal/core/util/concurrent/MaybeCompat; +Lorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1; +Lorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$2; +Lorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$3; Lorg/signal/core/util/concurrent/RxExtensions; Lorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0; Lorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda1; @@ -30939,43 +34306,55 @@ Lorg/signal/core/util/logging/Log$InternalCheck; Lorg/signal/core/util/logging/Log$Logger; Lorg/signal/core/util/logging/Log; Lorg/signal/core/util/logging/NoopLogger; +Lorg/signal/core/util/logging/Scrubber$identifierHmacKeyProvider$1; Lorg/signal/core/util/logging/Scrubber$scrubCallLinkKeys$1; Lorg/signal/core/util/logging/Scrubber$scrubDomains$1; Lorg/signal/core/util/logging/Scrubber$scrubE164$1; +Lorg/signal/core/util/logging/Scrubber$scrubE164Zero$1; Lorg/signal/core/util/logging/Scrubber$scrubEmail$1; Lorg/signal/core/util/logging/Scrubber$scrubGroupsV1$1; Lorg/signal/core/util/logging/Scrubber$scrubGroupsV2$1; Lorg/signal/core/util/logging/Scrubber$scrubIpv4$1; Lorg/signal/core/util/logging/Scrubber$scrubIpv6$1; +Lorg/signal/core/util/logging/Scrubber$scrubPnis$1; Lorg/signal/core/util/logging/Scrubber$scrubUuids$1; Lorg/signal/core/util/logging/Scrubber; -Lorg/signal/core/util/tracing/TraceProtos$1; -Lorg/signal/core/util/tracing/TraceProtos$CounterDescriptor; -Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation$Builder; -Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation$NestedValue; -Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation$NestedValueOrBuilder; -Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotation; -Lorg/signal/core/util/tracing/TraceProtos$DebugAnnotationOrBuilder; -Lorg/signal/core/util/tracing/TraceProtos$ThreadDescriptor; -Lorg/signal/core/util/tracing/TraceProtos$TracePacket$Builder; -Lorg/signal/core/util/tracing/TraceProtos$TracePacket; -Lorg/signal/core/util/tracing/TraceProtos$TracePacketOrBuilder; -Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor$Builder; -Lorg/signal/core/util/tracing/TraceProtos$TrackDescriptor; -Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Builder; -Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type$1; -Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type$TypeVerifier; -Lorg/signal/core/util/tracing/TraceProtos$TrackEvent$Type; -Lorg/signal/core/util/tracing/TraceProtos$TrackEvent; +Lorg/signal/core/util/stream/TruncatingInputStream$$ExternalSyntheticBackport0; +Lorg/signal/core/util/tracing/DebugAnnotation$Builder; +Lorg/signal/core/util/tracing/DebugAnnotation$Companion$ADAPTER$1; +Lorg/signal/core/util/tracing/DebugAnnotation$Companion; +Lorg/signal/core/util/tracing/DebugAnnotation$NestedValue; +Lorg/signal/core/util/tracing/DebugAnnotation; +Lorg/signal/core/util/tracing/TracePacket$Builder; +Lorg/signal/core/util/tracing/TracePacket$Companion$ADAPTER$1; +Lorg/signal/core/util/tracing/TracePacket$Companion; +Lorg/signal/core/util/tracing/TracePacket; Lorg/signal/core/util/tracing/Tracer$$ExternalSyntheticLambda0; Lorg/signal/core/util/tracing/Tracer$Clock; Lorg/signal/core/util/tracing/Tracer; +Lorg/signal/core/util/tracing/TrackDescriptor$Builder; +Lorg/signal/core/util/tracing/TrackDescriptor$Companion$ADAPTER$1; +Lorg/signal/core/util/tracing/TrackDescriptor$Companion; +Lorg/signal/core/util/tracing/TrackDescriptor; +Lorg/signal/core/util/tracing/TrackEvent$Builder; +Lorg/signal/core/util/tracing/TrackEvent$Companion$ADAPTER$1; +Lorg/signal/core/util/tracing/TrackEvent$Companion; +Lorg/signal/core/util/tracing/TrackEvent$Type$Companion$ADAPTER$1; +Lorg/signal/core/util/tracing/TrackEvent$Type$Companion; +Lorg/signal/core/util/tracing/TrackEvent$Type; +Lorg/signal/core/util/tracing/TrackEvent; Lorg/signal/devicetransfer/TransferStatus; +Lorg/signal/donations/StripeApi$PaymentIntentFetcher; +Lorg/signal/donations/StripeApi$SetupIntentHelper; Lorg/signal/glide/Log$Provider$1; Lorg/signal/glide/Log$Provider; Lorg/signal/glide/SignalGlideCodecs; Lorg/signal/glide/apng/decode/APNGDecoder; Lorg/signal/glide/common/decode/FrameSeqDecoder; +Lorg/signal/glide/webp/WebpInputStreamResourceDecoder$Companion; +Lorg/signal/glide/webp/WebpInputStreamResourceDecoder; +Lorg/signal/glide/webp/WebpLibraryGlideModule$Companion; +Lorg/signal/glide/webp/WebpLibraryGlideModule; Lorg/signal/libsignal/internal/Native; Lorg/signal/libsignal/internal/NativeHandleGuard$Owner; Lorg/signal/libsignal/internal/NativeHandleGuard; @@ -31008,7 +34387,6 @@ Lorg/signal/libsignal/protocol/state/SessionStore; Lorg/signal/libsignal/protocol/state/SignalProtocolStore; Lorg/signal/libsignal/protocol/state/SignedPreKeyRecord; Lorg/signal/libsignal/protocol/state/SignedPreKeyStore; -Lorg/signal/libsignal/protocol/util/ByteUtil; Lorg/signal/libsignal/protocol/util/KeyHelper; Lorg/signal/libsignal/protocol/util/Medium; Lorg/signal/libsignal/protocol/util/Pair; @@ -31022,7 +34400,6 @@ Lorg/signal/libsignal/zkgroup/internal/ByteArray; Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations; Lorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential; Lorg/signal/libsignal/zkgroup/profiles/ProfileKey; -Lorg/signal/libsignal/zkgroup/profiles/ProfileKeyVersion; Lorg/signal/libsignal/zkgroup/receipts/ClientZkReceiptOperations; Lorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda1; Lorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda3; @@ -31051,7 +34428,6 @@ Lorg/signal/ringrtc/CallManager; Lorg/signal/ringrtc/Log$Logger; Lorg/signal/ringrtc/Log; Lorg/signal/ringrtc/WebRtcLogger; -Lorg/thoughtcrime/securesms/AppCapabilities; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda10; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda11; @@ -31109,6 +34485,12 @@ Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda58; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60; +Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda61; +Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda62; +Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda63; +Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda64; +Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda65; +Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda66; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda6; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda8; @@ -31116,16 +34498,18 @@ Lorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda9; Lorg/thoughtcrime/securesms/ApplicationContext$1; Lorg/thoughtcrime/securesms/ApplicationContext; Lorg/thoughtcrime/securesms/BaseActivity; +Lorg/thoughtcrime/securesms/BindableConversationItem$EventListener; Lorg/thoughtcrime/securesms/BindableConversationItem; Lorg/thoughtcrime/securesms/BindableConversationListItem; Lorg/thoughtcrime/securesms/BuildConfig; -Lorg/thoughtcrime/securesms/KbsEnclave; Lorg/thoughtcrime/securesms/LoggingFragment; Lorg/thoughtcrime/securesms/MainActivity$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/MainActivity$1; Lorg/thoughtcrime/securesms/MainActivity$2; Lorg/thoughtcrime/securesms/MainActivity; Lorg/thoughtcrime/securesms/MainFragment; +Lorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/MainNavigator; Lorg/thoughtcrime/securesms/MasterSecretListener; Lorg/thoughtcrime/securesms/PassphraseRequiredActivity$1; @@ -31133,31 +34517,45 @@ Lorg/thoughtcrime/securesms/PassphraseRequiredActivity; Lorg/thoughtcrime/securesms/R$styleable; Lorg/thoughtcrime/securesms/Unbindable; Lorg/thoughtcrime/securesms/animation/AnimationCompleteListener; +Lorg/thoughtcrime/securesms/attachments/Attachment$Companion; Lorg/thoughtcrime/securesms/attachments/Attachment; -Lorg/thoughtcrime/securesms/attachments/AttachmentId$1; +Lorg/thoughtcrime/securesms/attachments/AttachmentCreator; +Lorg/thoughtcrime/securesms/attachments/AttachmentId$Creator; Lorg/thoughtcrime/securesms/attachments/AttachmentId; Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment$DisplayOrderComparator; Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; +Lorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion; Lorg/thoughtcrime/securesms/attachments/PointerAttachment; +Lorg/thoughtcrime/securesms/audio/AudioFileInfo; Lorg/thoughtcrime/securesms/audio/AudioHash; +Lorg/thoughtcrime/securesms/audio/AudioRecorder$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/audio/AudioRecorder; +Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion; +Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager26; +Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; +Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler; Lorg/thoughtcrime/securesms/avatar/Avatar$Companion; Lorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId$DoNotPersist; Lorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId; -Lorg/thoughtcrime/securesms/avatar/Avatar$Resource; Lorg/thoughtcrime/securesms/avatar/Avatar$Text; Lorg/thoughtcrime/securesms/avatar/Avatar; Lorg/thoughtcrime/securesms/avatar/AvatarPickerStorage; -Lorg/thoughtcrime/securesms/avatar/AvatarRenderer$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/avatar/AvatarRenderer$renderResource$1; Lorg/thoughtcrime/securesms/avatar/AvatarRenderer; Lorg/thoughtcrime/securesms/avatar/Avatars$ColorPair; Lorg/thoughtcrime/securesms/avatar/Avatars$DefaultAvatar; Lorg/thoughtcrime/securesms/avatar/Avatars$ForegroundColor; Lorg/thoughtcrime/securesms/avatar/Avatars; Lorg/thoughtcrime/securesms/avatar/TextAvatarDrawable; +Lorg/thoughtcrime/securesms/avatar/view/AvatarView$WhenMappings; +Lorg/thoughtcrime/securesms/avatar/view/AvatarView; Lorg/thoughtcrime/securesms/badges/BadgeImageView; Lorg/thoughtcrime/securesms/badges/gifts/GiftMessageView$Callback; Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift; +Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion; +Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2; +Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4; +Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1; +Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration; Lorg/thoughtcrime/securesms/badges/models/Badge; Lorg/thoughtcrime/securesms/blurhash/Base83; Lorg/thoughtcrime/securesms/blurhash/BlurHash$1; @@ -31166,41 +34564,135 @@ Lorg/thoughtcrime/securesms/blurhash/BlurHashModelLoader$Factory; Lorg/thoughtcrime/securesms/blurhash/BlurHashResourceDecoder; Lorg/thoughtcrime/securesms/calls/log/CallLogFragment$Callback; Lorg/thoughtcrime/securesms/color/MaterialColor$UnknownColorException; +Lorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/components/AlbumThumbnailView; Lorg/thoughtcrime/securesms/components/AlertView; +Lorg/thoughtcrime/securesms/components/AnimatingToggle; +Lorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/components/AudioView$Callbacks; +Lorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener; +Lorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener; +Lorg/thoughtcrime/securesms/components/AudioView; Lorg/thoughtcrime/securesms/components/AvatarImageView$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions$Builder; Lorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions; Lorg/thoughtcrime/securesms/components/AvatarImageView$RecipientContactPhoto; +Lorg/thoughtcrime/securesms/components/AvatarImageView$RedownloadRequestListener; Lorg/thoughtcrime/securesms/components/AvatarImageView; +Lorg/thoughtcrime/securesms/components/ComposeText$1; +Lorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener; +Lorg/thoughtcrime/securesms/components/ComposeText$CursorPositionChangedListener; +Lorg/thoughtcrime/securesms/components/ComposeText$QueryStart; +Lorg/thoughtcrime/securesms/components/ComposeText$StylingChangedListener; +Lorg/thoughtcrime/securesms/components/ComposeText; +Lorg/thoughtcrime/securesms/components/ComposeTextStyleWatcher; Lorg/thoughtcrime/securesms/components/ConversationItemFooter$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/components/ConversationItemFooter$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/components/ConversationItemFooter$OnTouchDelegateChangedListener; Lorg/thoughtcrime/securesms/components/ConversationItemFooter; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnail$Companion; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnail; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState$Creator; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$Creator; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState$Creator; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; +Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; +Lorg/thoughtcrime/securesms/components/ConversationScrollToView; +Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar$EventListener; +Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; Lorg/thoughtcrime/securesms/components/CornerMask; Lorg/thoughtcrime/securesms/components/DeliveryStatusView$State; Lorg/thoughtcrime/securesms/components/DeliveryStatusView; Lorg/thoughtcrime/securesms/components/ExpirationTimerView; Lorg/thoughtcrime/securesms/components/FromTextView; +Lorg/thoughtcrime/securesms/components/HidingLinearLayout; +Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout$Listener; +Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; +Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda5; +Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda7; +Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda8; +Lorg/thoughtcrime/securesms/components/InputPanel$Listener; +Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener; +Lorg/thoughtcrime/securesms/components/InputPanel$RecordTime; +Lorg/thoughtcrime/securesms/components/InputPanel$SlideToCancel; +Lorg/thoughtcrime/securesms/components/InputPanel; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$Companion; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardInsetAnimator; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardStateListener; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentStartGuideline$2; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$statusBarGuideline$2; +Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout; +Lorg/thoughtcrime/securesms/components/KeyboardAwareLinearLayout$OnKeyboardShownListener; +Lorg/thoughtcrime/securesms/components/LinkPreviewView$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/components/LinkPreviewView$CloseClickedListener; +Lorg/thoughtcrime/securesms/components/LinkPreviewView; +Lorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState$Creator; +Lorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState; Lorg/thoughtcrime/securesms/components/Material3SearchToolbar$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/components/Material3SearchToolbar$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/components/Material3SearchToolbar$special$$inlined$addTextChangedListener$default$1; Lorg/thoughtcrime/securesms/components/Material3SearchToolbar; +Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView$FloatingRecordButton; +Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView$LockDropTarget; +Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State; +Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView; Lorg/thoughtcrime/securesms/components/Outliner; Lorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView; +Lorg/thoughtcrime/securesms/components/ProgressCardDialogFragment; Lorg/thoughtcrime/securesms/components/QuoteView$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/components/QuoteView$MessageType; Lorg/thoughtcrime/securesms/components/QuoteView; Lorg/thoughtcrime/securesms/components/RatingManager; Lorg/thoughtcrime/securesms/components/RecyclerViewFastScroller$FastScrollAdapter; +Lorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$2; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$4; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$5; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$Companion; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$DefaultScrollStrategy; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollStrategy; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1; +Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate; +Lorg/thoughtcrime/securesms/components/SearchView; +Lorg/thoughtcrime/securesms/components/SendButton$ScheduledSendListener; +Lorg/thoughtcrime/securesms/components/SendButton; Lorg/thoughtcrime/securesms/components/SharedContactView$EventListener; +Lorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport0; +Lorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport1; +Lorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport2; +Lorg/thoughtcrime/securesms/components/ThumbnailView$CancelClickDispatcher; +Lorg/thoughtcrime/securesms/components/ThumbnailView$DownloadClickDispatcher; +Lorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher; +Lorg/thoughtcrime/securesms/components/ThumbnailView; Lorg/thoughtcrime/securesms/components/TypingIndicatorView; Lorg/thoughtcrime/securesms/components/TypingStatusRepository; Lorg/thoughtcrime/securesms/components/ViewBinderDelegate$1; Lorg/thoughtcrime/securesms/components/ViewBinderDelegate; +Lorg/thoughtcrime/securesms/components/WaveFormSeekBarView; Lorg/thoughtcrime/securesms/components/emoji/AnimatingImageSpan; Lorg/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel; Lorg/thoughtcrime/securesms/components/emoji/Emoji; +Lorg/thoughtcrime/securesms/components/emoji/EmojiEditText$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/components/emoji/EmojiEditText; +Lorg/thoughtcrime/securesms/components/emoji/EmojiEventListener; +Lorg/thoughtcrime/securesms/components/emoji/EmojiFilter; Lorg/thoughtcrime/securesms/components/emoji/EmojiImageView; Lorg/thoughtcrime/securesms/components/emoji/EmojiPageModel; Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$$ExternalSyntheticLambda2; @@ -31209,9 +34701,15 @@ Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$1; Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable; Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider; Lorg/thoughtcrime/securesms/components/emoji/EmojiSpan; +Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView; +Lorg/thoughtcrime/securesms/components/emoji/EmojiToggle$1; +Lorg/thoughtcrime/securesms/components/emoji/EmojiToggle; +Lorg/thoughtcrime/securesms/components/emoji/MediaKeyboard$MediaKeyboardListener; +Lorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel; Lorg/thoughtcrime/securesms/components/emoji/SimpleEmojiTextView$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/components/emoji/SimpleEmojiTextView; Lorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel$$ExternalSyntheticLambda0; @@ -31224,14 +34722,21 @@ Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree$EmojiTreeNode; Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree$Matches; Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree; Lorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick; +Lorg/thoughtcrime/securesms/components/mention/MentionAnnotation$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/components/mention/MentionAnnotation; +Lorg/thoughtcrime/securesms/components/mention/MentionDeleter; Lorg/thoughtcrime/securesms/components/mention/MentionRenderer$MultiLineMentionRenderer; Lorg/thoughtcrime/securesms/components/mention/MentionRenderer$SingleLineMentionRenderer; Lorg/thoughtcrime/securesms/components/mention/MentionRenderer; Lorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate; +Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator; +Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher; Lorg/thoughtcrime/securesms/components/menu/ActionItem; Lorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar$enterAnimation$2; Lorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar$exitAnimation$2; Lorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar; +Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme$Companion; +Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme; Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1; Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1; @@ -31251,6 +34756,9 @@ Lorg/thoughtcrime/securesms/components/reminder/UsernameOutOfSyncReminder$Compan Lorg/thoughtcrime/securesms/components/reminder/UsernameOutOfSyncReminder; Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository$getProfiles$1; Lorg/thoughtcrime/securesms/components/settings/app/notifications/profiles/NotificationProfilesRepository; +Lorg/thoughtcrime/securesms/components/settings/app/subscription/DonationPaymentComponent; +Lorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate; +Lorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationRepository; Lorg/thoughtcrime/securesms/components/settings/app/subscription/errors/UnexpectedSubscriptionCancellation$Companion; Lorg/thoughtcrime/securesms/components/settings/app/subscription/errors/UnexpectedSubscriptionCancellation; Lorg/thoughtcrime/securesms/components/spoiler/SpoilerAnnotation$SpoilerClickableSpan; @@ -31261,6 +34769,22 @@ Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$$External Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1; Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1; Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Companion; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress$Companion; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setCancelClickListener$1; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setClickable$1; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setFocusable$1; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setShowSecondaryText$1; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setSlides$2; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setTransferClickListener$1; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setVisible$1; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$Companion; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView$State; +Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView; Lorg/thoughtcrime/securesms/components/voice/RetryableInitAudioSink$Companion; Lorg/thoughtcrime/securesms/components/voice/RetryableInitAudioSink; Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController$1; @@ -31285,6 +34809,7 @@ Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState; Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer; Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback$Companion; Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback; +Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerView$Listener; Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerView; Lorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager$HardwareSensorEventListener; Lorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager$ProximityListener; @@ -31353,6 +34878,7 @@ Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$2; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$3; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$AdapterFactory; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$Callbacks; +Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$Companion; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$SimpleCallbacks; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$StoryContextMenuCallbacks; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$adapter$1; @@ -31370,24 +34896,36 @@ Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel$controller$1; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel$data$1; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel$safetyNumberRepository$2; Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel; -Lorg/thoughtcrime/securesms/contacts/paged/collections/ContactSearchIterator; -Lorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery; Lorg/thoughtcrime/securesms/contactshare/Contact; Lorg/thoughtcrime/securesms/contactshare/ContactUtil; Lorg/thoughtcrime/securesms/conversation/BodyBubbleLayoutTransition; Lorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable; +Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener; +Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge; +Lorg/thoughtcrime/securesms/conversation/ConversationBottomSheetCallback; +Lorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData; +Lorg/thoughtcrime/securesms/conversation/ConversationData; +Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider; +Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView; +Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; +Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; +Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; +Lorg/thoughtcrime/securesms/conversation/ConversationIntents; Lorg/thoughtcrime/securesms/conversation/ConversationItem$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/conversation/ConversationItem$$ExternalSyntheticLambda9; Lorg/thoughtcrime/securesms/conversation/ConversationItem$1; Lorg/thoughtcrime/securesms/conversation/ConversationItem$AttachmentDownloadClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$ClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$GiftMessageViewCallback; Lorg/thoughtcrime/securesms/conversation/ConversationItem$LinkPreviewClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$PassthroughClickListener; +Lorg/thoughtcrime/securesms/conversation/ConversationItem$PlayVideoClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$QuotedIndicatorClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$ScheduledIndicatorClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$SharedContactClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$SharedContactEventListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$SlideClickPassthroughListener; +Lorg/thoughtcrime/securesms/conversation/ConversationItem$ThumbnailClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$TouchDelegateChangedListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$UrlClickListener; Lorg/thoughtcrime/securesms/conversation/ConversationItem$ViewOnceMessageClickListener; @@ -31395,6 +34933,36 @@ Lorg/thoughtcrime/securesms/conversation/ConversationItem; Lorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$ExternalSyntheticBackport0; Lorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble; +Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Condensed; +Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Detailed; +Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$EditHistory; +Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Standard; +Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; +Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$OnSwipeListener; +Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$SwipeAvailabilityProvider; +Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback; +Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener$Callback; +Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener; +Lorg/thoughtcrime/securesms/conversation/ConversationMessage$ComputedProperties; +Lorg/thoughtcrime/securesms/conversation/ConversationMessage$ConversationMessageFactory; +Lorg/thoughtcrime/securesms/conversation/ConversationMessage; +Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback; +Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1; +Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider; +Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot; +Lorg/thoughtcrime/securesms/conversation/ConversationReactionDelegate; +Lorg/thoughtcrime/securesms/conversation/ConversationReactionOverlay$OnActionSelectedListener; +Lorg/thoughtcrime/securesms/conversation/ConversationReactionOverlay$OnHideListener; +Lorg/thoughtcrime/securesms/conversation/ConversationRepository; +Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; +Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter$EventListener; +Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter; +Lorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator; +Lorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator; +Lorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper; +Lorg/thoughtcrime/securesms/conversation/ConversationTitleView$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/conversation/ConversationTitleView; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$GroupDataManager$$ExternalSyntheticLambda1; @@ -31404,9 +34972,37 @@ Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$PresentOnChange; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$RecipientObserverManager; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$UpdateObserver; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem; +Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$1; +Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion; +Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$OnTickListener; +Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick; +Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/conversation/MarkReadHelper; +Lorg/thoughtcrime/securesms/conversation/MessageSendType$Companion; +Lorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType$Creator; +Lorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType; +Lorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType; +Lorg/thoughtcrime/securesms/conversation/MessageSendType; Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result$Companion; Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; Lorg/thoughtcrime/securesms/conversation/MessageStyler; +Lorg/thoughtcrime/securesms/conversation/ScheduleMessageDialogCallback; +Lorg/thoughtcrime/securesms/conversation/ScheduleMessageTimePickerBottomSheet$ScheduleCallback; +Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5; +Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository; +Lorg/thoughtcrime/securesms/conversation/SelectedConversationModel; +Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$Listener; +Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView; +Lorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock; +Lorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener$Companion; +Lorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener; Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; Lorg/thoughtcrime/securesms/conversation/colors/AvatarColorHash$$ExternalSyntheticBackport0; Lorg/thoughtcrime/securesms/conversation/colors/AvatarColorHash; @@ -31419,15 +35015,402 @@ Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$Auto; Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$BuiltIn; Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$Companion$CREATOR$1; Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$Companion; +Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id$NotSet; Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$Id; Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$LinearGradient$Creator; Lorg/thoughtcrime/securesms/conversation/colors/ChatColors$LinearGradient; Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; Lorg/thoughtcrime/securesms/conversation/colors/ChatColorsPalette$Bubbles; Lorg/thoughtcrime/securesms/conversation/colors/Colorizable; +Lorg/thoughtcrime/securesms/conversation/colors/Colorizer$onGroupMembershipChanged$$inlined$sortedBy$1; +Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; +Lorg/thoughtcrime/securesms/conversation/colors/NameColor; +Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$edgeEffectFactory$1; +Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1; +Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1; +Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$ShareOrDraftData; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2; +Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; +Lorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion; +Lorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator; +Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$WhenMappings; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView$Companion; +Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView; Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselectable; +Lorg/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardBottomSheet$Callback; +Lorg/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs; +Lorg/thoughtcrime/securesms/conversation/ui/error/EnableCallNotificationSettingsDialog$Callback; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryChangedListener; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$1; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup$Callback; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$1; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Results; +Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; +Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2; +Lorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract; +Lorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener$TransitionListener$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener$TransitionListener; +Lorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$5; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$6; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$stripeRepository$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Callbacks; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$ContactShareEditor; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$GifSearch; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaCapture; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaGallery; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaSelection; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectContact; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectFile; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectLocation; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$cameraLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$contactShareLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$gifSearchLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$mediaGalleryLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$mediaSelectionLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectContactLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectFileLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectLocationLauncher$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda5; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda7; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$OnScrollStateChangedListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$Listener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda10; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda11; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda12; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda13; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda14; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda15; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda16; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda17; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda18; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda8; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActionModeCallback; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActivityResultCallbacks; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentKeyboardFragmentListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentManagerListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$BackPressedDelegate; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationBannerListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationItemClickListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$queryListener$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DisabledInputListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelMediaListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$KeyboardEvents; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$MotionEventRelayDrain; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SearchEventListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SendButtonListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SwipeAvailabilityProvider; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$VoiceMessageRecordingSessionCallbacks; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$WhenMappings; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationGroupViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$14; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$attachListener$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$1$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$jumpAndPulseScrollStrategy$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$reactionDelegate$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$voiceNotePlayerListener$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$CompleteUnreadState; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$InitialUnreadState; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$TooltipViewModel; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$5; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$State; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$ViewHolder; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$16; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$6; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$8; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; +Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$Listener; +Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$inflater$2; +Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView; +Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; +Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState; +Lorg/thoughtcrime/securesms/conversation/v2/MessageRequestViewModel; +Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay$Drain; +Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay; +Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; +Lorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel; +Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1; +Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; +Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$SessionCallback; +Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate; +Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate; +Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$threadRecipient$2; +Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource; +Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey; +Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement; +Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationUpdate; +Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia; +Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageBackedKey; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda5; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$$ExternalSyntheticLambda7; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$TimedResult; +Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher; +Lorg/thoughtcrime/securesms/conversation/v2/data/OutgoingMedia; +Lorg/thoughtcrime/securesms/conversation/v2/data/OutgoingTextOnly; +Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader; +Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeaderKey; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1$1; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$1; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$2; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$3; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$4; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$Factory; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$duplicates$1; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$1; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$updateGroupStateIfNeeded$2; +Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel; Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsDrawableInvalidator; +Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1; +Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1; +Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration; +Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable; Lorg/thoughtcrime/securesms/conversation/v2/items/InteractiveConversationElement; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnDispatchTouchEventListener; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnMeasureListener; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridgeKt; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$PassthroughClickListener; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$ReactionMeasureListener; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$replyDelegate$1; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$1; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$2; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemViewHolder; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate$DisplayState; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$Companion; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2Payload; Lorg/thoughtcrime/securesms/conversationlist/ClearFilterViewHolder$OnClearFilterClickListener; Lorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior$Callback; Lorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior; @@ -31444,6 +35427,8 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource$Unarchiv Lorg/thoughtcrime/securesms/conversationlist/ConversationListDataSource; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda10; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda26; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda28; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda29; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda32; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda34; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda35; @@ -31486,10 +35471,11 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ArchiveLis Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$Callback; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ContactSearchClickCallbacks; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda12; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda9; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator; Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda0; @@ -31502,6 +35488,7 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$BaseC Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ChatFilterEmptyMappingModel; Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ChatFilterMappingModel; Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ChatFilterRepository; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$Companion; Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks; Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$$ExternalSyntheticLambda0; @@ -31525,6 +35512,7 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$pagedData Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$pinnedCount$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$selectedState$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel; +Lorg/thoughtcrime/securesms/conversationlist/TimestampPayloadSupport; Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest; Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterSource; Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView$$ExternalSyntheticLambda1; @@ -31549,6 +35537,8 @@ Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter; Lorg/thoughtcrime/securesms/conversationlist/model/ConversationReader; Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet$threadIds$2; Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet; +Lorg/thoughtcrime/securesms/crash/CrashConfig$patterns$2; +Lorg/thoughtcrime/securesms/crash/CrashConfig; Lorg/thoughtcrime/securesms/crypto/AsymmetricMasterSecret; Lorg/thoughtcrime/securesms/crypto/AttachmentSecret$ByteArrayDeserializer; Lorg/thoughtcrime/securesms/crypto/AttachmentSecret$ByteArraySerializer; @@ -31574,6 +35564,9 @@ Lorg/thoughtcrime/securesms/crypto/ReentrantSessionLock$$ExternalSyntheticLambda Lorg/thoughtcrime/securesms/crypto/ReentrantSessionLock; Lorg/thoughtcrime/securesms/crypto/SenderKeyUtil; Lorg/thoughtcrime/securesms/crypto/storage/PreKeyMetadataStore; +Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$Cache; Lorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore; @@ -31585,30 +35578,41 @@ Lorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl; Lorg/thoughtcrime/securesms/crypto/storage/SignalServiceDataStoreImpl; Lorg/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore; Lorg/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore; +Lorg/thoughtcrime/securesms/database/AttachmentTable$Companion; Lorg/thoughtcrime/securesms/database/AttachmentTable$DataInfo; +Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties$Companion; +Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties$Creator; Lorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties; +Lorg/thoughtcrime/securesms/database/AttachmentTable$insertAttachment$attachmentId$1; Lorg/thoughtcrime/securesms/database/AttachmentTable; Lorg/thoughtcrime/securesms/database/BodyAdjustment; Lorg/thoughtcrime/securesms/database/BodyRangeUtil; Lorg/thoughtcrime/securesms/database/CallLinkTable$Companion; Lorg/thoughtcrime/securesms/database/CallLinkTable; +Lorg/thoughtcrime/securesms/database/CallTable$Call; Lorg/thoughtcrime/securesms/database/CallTable$Companion; +Lorg/thoughtcrime/securesms/database/CallTable$Event$Serializer; +Lorg/thoughtcrime/securesms/database/CallTable$Event; Lorg/thoughtcrime/securesms/database/CallTable; Lorg/thoughtcrime/securesms/database/CdsTable$Companion; Lorg/thoughtcrime/securesms/database/CdsTable; Lorg/thoughtcrime/securesms/database/ChatColorsTable$Companion; Lorg/thoughtcrime/securesms/database/ChatColorsTable; Lorg/thoughtcrime/securesms/database/DatabaseMonitor; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda20; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda23; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda24; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda29; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda32; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda36; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda37; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda40; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda4; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5; +Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver; Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer; Lorg/thoughtcrime/securesms/database/DatabaseObserver; Lorg/thoughtcrime/securesms/database/DatabaseTable; @@ -31631,7 +35635,6 @@ Lorg/thoughtcrime/securesms/database/GroupReceiptTable; Lorg/thoughtcrime/securesms/database/GroupTable$Companion; Lorg/thoughtcrime/securesms/database/GroupTable$MembershipTable$Companion; Lorg/thoughtcrime/securesms/database/GroupTable$MembershipTable; -Lorg/thoughtcrime/securesms/database/GroupTable$Reader; Lorg/thoughtcrime/securesms/database/GroupTable$ShowAsStoryState$Companion; Lorg/thoughtcrime/securesms/database/GroupTable$ShowAsStoryState; Lorg/thoughtcrime/securesms/database/GroupTable; @@ -31641,13 +35644,9 @@ Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus$WhenMappings; Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus; Lorg/thoughtcrime/securesms/database/IdentityTable; Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda3; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda4; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda5; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda6; -Lorg/thoughtcrime/securesms/database/JobDatabase$$ExternalSyntheticLambda7; +Lorg/thoughtcrime/securesms/database/JobDatabase$Companion; +Lorg/thoughtcrime/securesms/database/JobDatabase$deleteJobs$1; +Lorg/thoughtcrime/securesms/database/JobDatabase$insertJobs$2; Lorg/thoughtcrime/securesms/database/JobDatabase; Lorg/thoughtcrime/securesms/database/KeyValueDatabase$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/database/KeyValueDatabase$1; @@ -31661,13 +35660,21 @@ Lorg/thoughtcrime/securesms/database/LocalMetricsDatabase$EventTotals; Lorg/thoughtcrime/securesms/database/LocalMetricsDatabase$SplitMetrics; Lorg/thoughtcrime/securesms/database/LocalMetricsDatabase; Lorg/thoughtcrime/securesms/database/LogDatabase$Companion; +Lorg/thoughtcrime/securesms/database/LogDatabase$CrashTable$Companion; +Lorg/thoughtcrime/securesms/database/LogDatabase$CrashTable; +Lorg/thoughtcrime/securesms/database/LogDatabase$LogTable$Companion; +Lorg/thoughtcrime/securesms/database/LogDatabase$LogTable$insert$1; +Lorg/thoughtcrime/securesms/database/LogDatabase$LogTable; +Lorg/thoughtcrime/securesms/database/LogDatabase$anrs$2; +Lorg/thoughtcrime/securesms/database/LogDatabase$crashes$2; +Lorg/thoughtcrime/securesms/database/LogDatabase$logs$2; Lorg/thoughtcrime/securesms/database/LogDatabase; Lorg/thoughtcrime/securesms/database/MediaTable$Companion; Lorg/thoughtcrime/securesms/database/MediaTable; Lorg/thoughtcrime/securesms/database/MegaphoneDatabase$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/database/MegaphoneDatabase; Lorg/thoughtcrime/securesms/database/MentionTable; -Lorg/thoughtcrime/securesms/database/MentionUtil$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/database/MentionUtil$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/database/MentionUtil$UpdatedBodyAndMentions; Lorg/thoughtcrime/securesms/database/MentionUtil; Lorg/thoughtcrime/securesms/database/MessageSendLogTables$Companion; @@ -31681,15 +35688,19 @@ Lorg/thoughtcrime/securesms/database/MessageTable$ExpirationInfo; Lorg/thoughtcrime/securesms/database/MessageTable$InsertListener; Lorg/thoughtcrime/securesms/database/MessageTable$InsertResult; Lorg/thoughtcrime/securesms/database/MessageTable$MarkedMessageInfo; +Lorg/thoughtcrime/securesms/database/MessageTable$MessageQualifier; Lorg/thoughtcrime/securesms/database/MessageTable$MmsReader$Companion; Lorg/thoughtcrime/securesms/database/MessageTable$MmsReader$ReaderIterator; Lorg/thoughtcrime/securesms/database/MessageTable$MmsReader; +Lorg/thoughtcrime/securesms/database/MessageTable$QuoteDescriptor; Lorg/thoughtcrime/securesms/database/MessageTable$Reader; Lorg/thoughtcrime/securesms/database/MessageTable$SyncMessageId; +Lorg/thoughtcrime/securesms/database/MessageTable$WhenMappings; Lorg/thoughtcrime/securesms/database/MessageTable$getConversationSnippet$1; Lorg/thoughtcrime/securesms/database/MessageTable$getOldestStorySendTimestamp$1; Lorg/thoughtcrime/securesms/database/MessageTable$insertMediaMessage$3; Lorg/thoughtcrime/securesms/database/MessageTable; +Lorg/thoughtcrime/securesms/database/MessageType; Lorg/thoughtcrime/securesms/database/MessageTypes$-CC; Lorg/thoughtcrime/securesms/database/MessageTypes; Lorg/thoughtcrime/securesms/database/NoExternalStorageException; @@ -31720,17 +35731,13 @@ Lorg/thoughtcrime/securesms/database/QueryMonitor; Lorg/thoughtcrime/securesms/database/ReactionTable$Companion; Lorg/thoughtcrime/securesms/database/ReactionTable; Lorg/thoughtcrime/securesms/database/RecipientIdDatabaseReference; -Lorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda11; Lorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda3; -Lorg/thoughtcrime/securesms/database/RecipientTable$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/database/RecipientTable$Companion; -Lorg/thoughtcrime/securesms/database/RecipientTable$GetOrInsertResult; Lorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting$Companion; Lorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting; Lorg/thoughtcrime/securesms/database/RecipientTable$MissingRecipientException; +Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState$Companion; +Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; Lorg/thoughtcrime/securesms/database/RecipientTable$ProcessPnpTupleResult; Lorg/thoughtcrime/securesms/database/RecipientTable$RecipientReader; Lorg/thoughtcrime/securesms/database/RecipientTable$RecipientType$Companion; @@ -31741,20 +35748,28 @@ Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode$Compa Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode; Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState$Companion; Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState; -Lorg/thoughtcrime/securesms/database/RecipientTable$getRecipientExtras$1; -Lorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$forcedUnread$1; -Lorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$groupMasterKey$1; -Lorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$identityKey$1; -Lorg/thoughtcrime/securesms/database/RecipientTable$getSyncExtras$identityStatus$1; +Lorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3; Lorg/thoughtcrime/securesms/database/RecipientTable; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getRecipientExtras$1; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$groupMasterKey$1; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityKey$1; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityStatus$1; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil; Lorg/thoughtcrime/securesms/database/RemappedRecordTables$Companion; Lorg/thoughtcrime/securesms/database/RemappedRecordTables; -Lorg/thoughtcrime/securesms/database/RemappedRecords; Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable$Companion; Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver; +Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversation$1; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationList$2; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversationListFlowable$1; Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$notificationProfiles$2; @@ -31798,7 +35813,6 @@ Lorg/thoughtcrime/securesms/database/SqlCipherDeletingErrorHandler; Lorg/thoughtcrime/securesms/database/SqlCipherErrorHandler$Companion; Lorg/thoughtcrime/securesms/database/SqlCipherErrorHandler; Lorg/thoughtcrime/securesms/database/SqlCipherLibraryLoader; -Lorg/thoughtcrime/securesms/database/StickerTable$StickerPackRecordReader; Lorg/thoughtcrime/securesms/database/StickerTable; Lorg/thoughtcrime/securesms/database/StorySendTable$Companion; Lorg/thoughtcrime/securesms/database/StorySendTable; @@ -31806,6 +35820,7 @@ Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; Lorg/thoughtcrime/securesms/database/ThreadBodyUtil; Lorg/thoughtcrime/securesms/database/ThreadIdDatabaseReference; Lorg/thoughtcrime/securesms/database/ThreadTable$Companion; +Lorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata; Lorg/thoughtcrime/securesms/database/ThreadTable$Extra$Companion; Lorg/thoughtcrime/securesms/database/ThreadTable$Extra; Lorg/thoughtcrime/securesms/database/ThreadTable$ReadStatus$Companion; @@ -31830,6 +35845,7 @@ Lorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$Ex Lorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline22; Lorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline3; Lorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline6; +Lorg/thoughtcrime/securesms/database/identity/IdentityRecordList; Lorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase$Companion; Lorg/thoughtcrime/securesms/database/model/AvatarPickerDatabase; Lorg/thoughtcrime/securesms/database/model/BodyRangeListSerializerKt; @@ -31839,12 +35855,14 @@ Lorg/thoughtcrime/securesms/database/model/DistributionListId; Lorg/thoughtcrime/securesms/database/model/DistributionListPrivacyMode$Serializer; Lorg/thoughtcrime/securesms/database/model/DistributionListPrivacyMode; Lorg/thoughtcrime/securesms/database/model/EmojiSearchData; +Lorg/thoughtcrime/securesms/database/model/GroupRecord; Lorg/thoughtcrime/securesms/database/model/IdentityRecord; Lorg/thoughtcrime/securesms/database/model/IdentityStoreRecord; +Lorg/thoughtcrime/securesms/database/model/LocalMetricsEvent$WhenMappings; Lorg/thoughtcrime/securesms/database/model/LocalMetricsEvent; +Lorg/thoughtcrime/securesms/database/model/LocalMetricsSplit$WhenMappings; Lorg/thoughtcrime/securesms/database/model/LocalMetricsSplit; Lorg/thoughtcrime/securesms/database/model/LogEntry; -Lorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord; Lorg/thoughtcrime/securesms/database/model/MegaphoneRecord; Lorg/thoughtcrime/securesms/database/model/Mention; Lorg/thoughtcrime/securesms/database/model/MessageId$Companion; @@ -31852,6 +35870,16 @@ Lorg/thoughtcrime/securesms/database/model/MessageId$Creator; Lorg/thoughtcrime/securesms/database/model/MessageId; Lorg/thoughtcrime/securesms/database/model/MessageRecord$InviteAddState; Lorg/thoughtcrime/securesms/database/model/MessageRecord; +Lorg/thoughtcrime/securesms/database/model/MessageRecordExtensionsKt; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda5; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda7; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda8; +Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheticLambda9; Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord; Lorg/thoughtcrime/securesms/database/model/ParentStoryId$Companion; Lorg/thoughtcrime/securesms/database/model/ParentStoryId; @@ -31866,26 +35894,36 @@ Lorg/thoughtcrime/securesms/database/model/RecipientRecord; Lorg/thoughtcrime/securesms/database/model/RemoteMegaphoneRecord$ActionId$Companion; Lorg/thoughtcrime/securesms/database/model/RemoteMegaphoneRecord$ActionId; Lorg/thoughtcrime/securesms/database/model/RemoteMegaphoneRecord; +Lorg/thoughtcrime/securesms/database/model/StickerRecord; Lorg/thoughtcrime/securesms/database/model/StoryType$Companion; Lorg/thoughtcrime/securesms/database/model/StoryType; +Lorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda3; +Lorg/thoughtcrime/securesms/database/model/StoryViewState$Companion; +Lorg/thoughtcrime/securesms/database/model/StoryViewState; Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder; Lorg/thoughtcrime/securesms/database/model/ThreadRecord; Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList$Builder; Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; -Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeListOrBuilder; Lorg/thoughtcrime/securesms/database/model/databaseprotos/ChatColor; -Lorg/thoughtcrime/securesms/database/model/databaseprotos/ChatColorOrBuilder; Lorg/thoughtcrime/securesms/database/model/databaseprotos/ExpiringProfileKeyCredentialColumnData; -Lorg/thoughtcrime/securesms/database/model/databaseprotos/ExpiringProfileKeyCredentialColumnDataOrBuilder; Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge; -Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadgeOrBuilder; +Lorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion$ADAPTER$1; +Lorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion; +Lorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation; Lorg/thoughtcrime/securesms/database/model/databaseprotos/RecipientExtras; -Lorg/thoughtcrime/securesms/database/model/databaseprotos/RecipientExtrasOrBuilder; Lorg/thoughtcrime/securesms/database/model/databaseprotos/Wallpaper; -Lorg/thoughtcrime/securesms/database/model/databaseprotos/WallpaperOrBuilder; +Lorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding; +Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding; Lorg/thoughtcrime/securesms/databinding/ConversationListFilterPullViewBinding; Lorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding; +Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding; +Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding; Lorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding; +Lorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding; +Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; +Lorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding; Lorg/thoughtcrime/securesms/dependencies/ApplicationDependencies$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/dependencies/ApplicationDependencies$Provider; Lorg/thoughtcrime/securesms/dependencies/ApplicationDependencies; @@ -31924,7 +35962,6 @@ Lorg/thoughtcrime/securesms/emoji/EmojiJsonParserKt; Lorg/thoughtcrime/securesms/emoji/EmojiJsonRequest; Lorg/thoughtcrime/securesms/emoji/EmojiMetrics; Lorg/thoughtcrime/securesms/emoji/EmojiPage$Asset; -Lorg/thoughtcrime/securesms/emoji/EmojiPage$Disk; Lorg/thoughtcrime/securesms/emoji/EmojiPage; Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$$ExternalSyntheticLambda1; @@ -31938,7 +35975,6 @@ Lorg/thoughtcrime/securesms/emoji/EmojiRemote; Lorg/thoughtcrime/securesms/emoji/EmojiRequest; Lorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$1; Lorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadAssetBasedEmojis$1$parsedData$1; -Lorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1; Lorg/thoughtcrime/securesms/emoji/EmojiSource$Companion; Lorg/thoughtcrime/securesms/emoji/EmojiSource$canonicalToVariations$2; Lorg/thoughtcrime/securesms/emoji/EmojiSource$emojiTree$2; @@ -31946,10 +35982,12 @@ Lorg/thoughtcrime/securesms/emoji/EmojiSource$maxEmojiLength$2; Lorg/thoughtcrime/securesms/emoji/EmojiSource$variationsToCanonical$2; Lorg/thoughtcrime/securesms/emoji/EmojiSource; Lorg/thoughtcrime/securesms/emoji/EmojiSourceKt; -Lorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/emoji/JumboEmoji; +Lorg/thoughtcrime/securesms/emoji/ObsoleteEmoji; Lorg/thoughtcrime/securesms/emoji/ParsedEmojiData; +Lorg/thoughtcrime/securesms/events/GroupCallPeekEvent; +Lorg/thoughtcrime/securesms/events/PartProgressEvent; Lorg/thoughtcrime/securesms/events/ReminderUpdateEvent; Lorg/thoughtcrime/securesms/events/WebRtcViewModel; Lorg/thoughtcrime/securesms/fonts/FontFileMap$Companion; @@ -31975,7 +36013,17 @@ Lorg/thoughtcrime/securesms/fonts/TextFont$Companion; Lorg/thoughtcrime/securesms/fonts/TextFont; Lorg/thoughtcrime/securesms/gcm/FcmFetchManager; Lorg/thoughtcrime/securesms/giph/model/ChunkedImageUrl; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration; Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4Playable; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackPolicy; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler; +Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer; Lorg/thoughtcrime/securesms/glide/BadgeLoader$Factory; Lorg/thoughtcrime/securesms/glide/BadgeLoader; Lorg/thoughtcrime/securesms/glide/ChunkedImageUrlLoader$Factory; @@ -31998,11 +36046,16 @@ Lorg/thoughtcrime/securesms/glide/cache/EncryptedCacheEncoder; Lorg/thoughtcrime/securesms/glide/cache/EncryptedCoder; Lorg/thoughtcrime/securesms/glide/cache/EncryptedGifDrawableResourceEncoder; Lorg/thoughtcrime/securesms/groups/BadGroupIdException; +Lorg/thoughtcrime/securesms/groups/GroupChangeBusyException; Lorg/thoughtcrime/securesms/groups/GroupChangeException; +Lorg/thoughtcrime/securesms/groups/GroupChangeFailedException; Lorg/thoughtcrime/securesms/groups/GroupId; Lorg/thoughtcrime/securesms/groups/GroupNotAMemberException; Lorg/thoughtcrime/securesms/groups/SelectionLimits$1; Lorg/thoughtcrime/securesms/groups/SelectionLimits; +Lorg/thoughtcrime/securesms/groups/v2/GroupInviteLinkUrl$InvalidGroupLinkException; +Lorg/thoughtcrime/securesms/groups/v2/GroupInviteLinkUrl$UnknownGroupLinkVersionException; +Lorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository; Lorg/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobmanager/CompositeScheduler; Lorg/thoughtcrime/securesms/jobmanager/Constraint$-CC; @@ -32012,7 +36065,6 @@ Lorg/thoughtcrime/securesms/jobmanager/ConstraintInstantiator; Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver$Notifier; Lorg/thoughtcrime/securesms/jobmanager/ConstraintObserver; Lorg/thoughtcrime/securesms/jobmanager/ExecutorFactory; -Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler; Lorg/thoughtcrime/securesms/jobmanager/Job$1; Lorg/thoughtcrime/securesms/jobmanager/Job$Factory; @@ -32021,15 +36073,11 @@ Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters; Lorg/thoughtcrime/securesms/jobmanager/Job$Result$ResultType; Lorg/thoughtcrime/securesms/jobmanager/Job$Result; Lorg/thoughtcrime/securesms/jobmanager/Job; -Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13; -Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda14; -Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda16; -Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda17; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda19; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda20; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda22; +Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda23; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda6; @@ -32041,6 +36089,7 @@ Lorg/thoughtcrime/securesms/jobmanager/JobInstantiator; Lorg/thoughtcrime/securesms/jobmanager/JobLogger; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda10; +Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda14; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda15; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda17; Lorg/thoughtcrime/securesms/jobmanager/JobManager$$ExternalSyntheticLambda5; @@ -32105,6 +36154,7 @@ Lorg/thoughtcrime/securesms/jobmanager/impl/NotInCallConstraintObserver; Lorg/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraint$Factory; Lorg/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver$SqlCipherNeedsMigrationEvent; Lorg/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver; +Lorg/thoughtcrime/securesms/jobmanager/migrations/DonationReceiptRedemptionJobMigration; Lorg/thoughtcrime/securesms/jobmanager/migrations/PushDecryptMessageJobEnvelopeMigration; Lorg/thoughtcrime/securesms/jobmanager/migrations/PushProcessMessageJobMigration$Companion; Lorg/thoughtcrime/securesms/jobmanager/migrations/PushProcessMessageJobMigration; @@ -32123,11 +36173,10 @@ Lorg/thoughtcrime/securesms/jobmanager/persistence/JobStorage; Lorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Companion; Lorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Factory; Lorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob; +Lorg/thoughtcrime/securesms/jobs/ApkUpdateJob$Factory; Lorg/thoughtcrime/securesms/jobs/AttachmentCompressionJob$Factory; Lorg/thoughtcrime/securesms/jobs/AttachmentCopyJob$Factory; Lorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob$Factory; -Lorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob$InvalidPartException; -Lorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob; Lorg/thoughtcrime/securesms/jobs/AttachmentMarkUploadedJob$Factory; Lorg/thoughtcrime/securesms/jobs/AttachmentUploadJob$Factory; Lorg/thoughtcrime/securesms/jobs/AutomaticSessionResetJob$Factory; @@ -32147,17 +36196,11 @@ Lorg/thoughtcrime/securesms/jobs/ConversationShortcutRankingUpdateJob$Factory; Lorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob$Factory; Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Companion; Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory; -Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1; -Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$2; Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob; Lorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory; Lorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob; Lorg/thoughtcrime/securesms/jobs/DonationReceiptRedemptionJob$Factory; -Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda10; -Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda6; @@ -32170,10 +36213,16 @@ Lorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob; Lorg/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob$Factory; Lorg/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob$Manifest; Lorg/thoughtcrime/securesms/jobs/EmojiSearchIndexDownloadJob; +Lorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Companion; +Lorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory$Companion; +Lorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob$Factory; +Lorg/thoughtcrime/securesms/jobs/ExternalLaunchDonationJob; Lorg/thoughtcrime/securesms/jobs/FailingJob$Factory; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$deleteJobs$1; Lorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$$inlined$sortedBy$1; +Lorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$$inlined$sortedByDescending$1; +Lorg/thoughtcrime/securesms/jobs/FastJobStorage$getPendingJobsWithNoDependenciesInCreatedOrder$lambda$8$$inlined$sortedBy$1; Lorg/thoughtcrime/securesms/jobs/FastJobStorage; Lorg/thoughtcrime/securesms/jobs/FcmRefreshJob$Factory; Lorg/thoughtcrime/securesms/jobs/FetchRemoteMegaphoneImageJob$Factory; @@ -32188,7 +36237,9 @@ Lorg/thoughtcrime/securesms/jobs/GiftSendJob$Factory; Lorg/thoughtcrime/securesms/jobs/GroupCallPeekJob$Factory; Lorg/thoughtcrime/securesms/jobs/GroupCallPeekWorkerJob$Factory; Lorg/thoughtcrime/securesms/jobs/GroupCallUpdateSendJob$Factory; -Lorg/thoughtcrime/securesms/jobs/GroupV1MigrationJob$Factory; +Lorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Companion; +Lorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Factory; +Lorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob; Lorg/thoughtcrime/securesms/jobs/GroupV2UpdateSelfProfileKeyJob$Factory; Lorg/thoughtcrime/securesms/jobs/GroupV2UpdateSelfProfileKeyJob; Lorg/thoughtcrime/securesms/jobs/IndividualSendJob$Factory; @@ -32197,12 +36248,11 @@ Lorg/thoughtcrime/securesms/jobs/JobManagerFactories$2; Lorg/thoughtcrime/securesms/jobs/JobManagerFactories; Lorg/thoughtcrime/securesms/jobs/LeaveGroupV2Job$Factory; Lorg/thoughtcrime/securesms/jobs/LeaveGroupV2WorkerJob$Factory; +Lorg/thoughtcrime/securesms/jobs/LegacyAttachmentUploadJob$Factory; Lorg/thoughtcrime/securesms/jobs/LocalBackupJob$Factory; Lorg/thoughtcrime/securesms/jobs/LocalBackupJobApi29$Factory; Lorg/thoughtcrime/securesms/jobs/MarkerJob$Factory; Lorg/thoughtcrime/securesms/jobs/MessageFetchJob$Factory; -Lorg/thoughtcrime/securesms/jobs/MmsDownloadJob$Factory; -Lorg/thoughtcrime/securesms/jobs/MmsReceiveJob$Factory; Lorg/thoughtcrime/securesms/jobs/MmsSendJob$Factory; Lorg/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob$Factory; Lorg/thoughtcrime/securesms/jobs/MultiDeviceCallLinkSyncJob$Factory; @@ -32224,7 +36274,6 @@ Lorg/thoughtcrime/securesms/jobs/MultiDeviceSubscriptionSyncRequestJob$Factory; Lorg/thoughtcrime/securesms/jobs/MultiDeviceVerifiedUpdateJob$Factory; Lorg/thoughtcrime/securesms/jobs/MultiDeviceViewOnceOpenJob$Factory; Lorg/thoughtcrime/securesms/jobs/MultiDeviceViewedUpdateJob$Factory; -Lorg/thoughtcrime/securesms/jobs/NewRegistrationUsernameSyncJob$Factory; Lorg/thoughtcrime/securesms/jobs/NullMessageSendJob$Factory; Lorg/thoughtcrime/securesms/jobs/OptimizeMessageSearchIndexJob$Factory; Lorg/thoughtcrime/securesms/jobs/PaymentLedgerUpdateJob$Factory; @@ -32249,6 +36298,7 @@ Lorg/thoughtcrime/securesms/jobs/PushProcessMessageErrorJob$Factory; Lorg/thoughtcrime/securesms/jobs/PushProcessMessageJob$Factory; Lorg/thoughtcrime/securesms/jobs/ReactionSendJob$Factory; Lorg/thoughtcrime/securesms/jobs/RebuildMessageSearchIndexJob$Factory; +Lorg/thoughtcrime/securesms/jobs/ReclaimUsernameAndLinkJob$Factory; Lorg/thoughtcrime/securesms/jobs/RefreshAttributesJob$Factory; Lorg/thoughtcrime/securesms/jobs/RefreshAttributesJob; Lorg/thoughtcrime/securesms/jobs/RefreshCallLinkDetailsJob$Factory; @@ -32266,12 +36316,12 @@ Lorg/thoughtcrime/securesms/jobs/ResendMessageJob$Factory; Lorg/thoughtcrime/securesms/jobs/ResetSvrGuessCountJob$Factory; Lorg/thoughtcrime/securesms/jobs/ResumableUploadSpecJob$Factory; Lorg/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob$Factory; +Lorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Companion; Lorg/thoughtcrime/securesms/jobs/RetrieveProfileJob$Factory; Lorg/thoughtcrime/securesms/jobs/RetrieveProfileJob; Lorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob$Companion; Lorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob$Factory; Lorg/thoughtcrime/securesms/jobs/RetrieveRemoteAnnouncementsJob; -Lorg/thoughtcrime/securesms/jobs/RotateCertificateJob$1; Lorg/thoughtcrime/securesms/jobs/RotateCertificateJob$Factory; Lorg/thoughtcrime/securesms/jobs/RotateCertificateJob; Lorg/thoughtcrime/securesms/jobs/RotateProfileKeyJob$Factory; @@ -32283,12 +36333,10 @@ Lorg/thoughtcrime/securesms/jobs/SendRetryReceiptJob$Factory; Lorg/thoughtcrime/securesms/jobs/SendViewedReceiptJob$Factory; Lorg/thoughtcrime/securesms/jobs/SenderKeyDistributionSendJob$Factory; Lorg/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob$Factory; -Lorg/thoughtcrime/securesms/jobs/SmsReceiveJob$Factory; Lorg/thoughtcrime/securesms/jobs/SmsSendJob$Factory; Lorg/thoughtcrime/securesms/jobs/SmsSentJob$Factory; Lorg/thoughtcrime/securesms/jobs/StickerDownloadJob$Factory; Lorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob$Factory; -Lorg/thoughtcrime/securesms/jobs/StickerPackDownloadJob; Lorg/thoughtcrime/securesms/jobs/StorageAccountRestoreJob$Factory; Lorg/thoughtcrime/securesms/jobs/StorageAccountRestoreJob; Lorg/thoughtcrime/securesms/jobs/StorageForcePushJob$Factory; @@ -32308,11 +36356,22 @@ Lorg/thoughtcrime/securesms/jobs/ThreadUpdateJob; Lorg/thoughtcrime/securesms/jobs/TrimThreadJob$Factory; Lorg/thoughtcrime/securesms/jobs/TypingSendJob$Factory; Lorg/thoughtcrime/securesms/jobs/UnableToStartException; -Lorg/thoughtcrime/securesms/jobs/UpdateApkJob$Factory; +Lorg/thoughtcrime/securesms/keyboard/KeyboardPage; +Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel; +Lorg/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageFragment$Callback; +Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchFragment$Callback; +Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository; +Lorg/thoughtcrime/securesms/keyboard/gif/GifKeyboardPageFragment$Host; +Lorg/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardPageFragment$Callback; Lorg/thoughtcrime/securesms/keyvalue/AccountValues$Companion; Lorg/thoughtcrime/securesms/keyvalue/AccountValues$aciPreKeys$1; Lorg/thoughtcrime/securesms/keyvalue/AccountValues$pniPreKeys$1; Lorg/thoughtcrime/securesms/keyvalue/AccountValues; +Lorg/thoughtcrime/securesms/keyvalue/ApkUpdateValues$Companion; +Lorg/thoughtcrime/securesms/keyvalue/ApkUpdateValues; +Lorg/thoughtcrime/securesms/keyvalue/BackupValues$Companion; +Lorg/thoughtcrime/securesms/keyvalue/BackupValues; Lorg/thoughtcrime/securesms/keyvalue/BlobValue; Lorg/thoughtcrime/securesms/keyvalue/BooleanValue; Lorg/thoughtcrime/securesms/keyvalue/CertificateType; @@ -32321,8 +36380,10 @@ Lorg/thoughtcrime/securesms/keyvalue/ChatColorsValues$Companion; Lorg/thoughtcrime/securesms/keyvalue/ChatColorsValues; Lorg/thoughtcrime/securesms/keyvalue/DonationsValues$Companion; Lorg/thoughtcrime/securesms/keyvalue/DonationsValues$observableOneTimeCurrency$2; +Lorg/thoughtcrime/securesms/keyvalue/DonationsValues$observablePendingOneTimeDonation$2; Lorg/thoughtcrime/securesms/keyvalue/DonationsValues$observableSubscriptionCurrency$2; Lorg/thoughtcrime/securesms/keyvalue/DonationsValues$oneTimeCurrencyPublisher$2; +Lorg/thoughtcrime/securesms/keyvalue/DonationsValues$pendingOneTimeDonationPublisher$2; Lorg/thoughtcrime/securesms/keyvalue/DonationsValues$subscriptionCurrencyPublisher$2; Lorg/thoughtcrime/securesms/keyvalue/DonationsValues; Lorg/thoughtcrime/securesms/keyvalue/EmojiValues; @@ -32333,6 +36394,7 @@ Lorg/thoughtcrime/securesms/keyvalue/InternalValues; Lorg/thoughtcrime/securesms/keyvalue/KeepMessagesDuration; Lorg/thoughtcrime/securesms/keyvalue/KeyValueDataSet; Lorg/thoughtcrime/securesms/keyvalue/KeyValuePersistentStorage; +Lorg/thoughtcrime/securesms/keyvalue/KeyValueProtoValue; Lorg/thoughtcrime/securesms/keyvalue/KeyValueReader; Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/keyvalue/KeyValueStore$Writer; @@ -32376,12 +36438,21 @@ Lorg/thoughtcrime/securesms/keyvalue/TooltipValues; Lorg/thoughtcrime/securesms/keyvalue/UiHints; Lorg/thoughtcrime/securesms/keyvalue/WallpaperValues; Lorg/thoughtcrime/securesms/linkpreview/LinkPreview; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Creator; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1; +Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; Lorg/thoughtcrime/securesms/logging/CustomSignalProtocolLogger; Lorg/thoughtcrime/securesms/logging/PersistentLogger$Companion; Lorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest; Lorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequests; Lorg/thoughtcrime/securesms/logging/PersistentLogger$WriteThread; Lorg/thoughtcrime/securesms/logging/PersistentLogger; +Lorg/thoughtcrime/securesms/logsubmit/LogSectionNotifications$$ExternalSyntheticApiModelOutline2; Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment$$ExternalSyntheticLambda2; @@ -32399,8 +36470,6 @@ Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment$special$$inlined$v Lorg/thoughtcrime/securesms/main/MainActivityListHostFragment; Lorg/thoughtcrime/securesms/main/Material3OnScrollHelperBinder; Lorg/thoughtcrime/securesms/main/SearchBinder; -Lorg/thoughtcrime/securesms/mediasend/Media$1; -Lorg/thoughtcrime/securesms/mediasend/Media; Lorg/thoughtcrime/securesms/megaphone/ForeverSchedule; Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder; Lorg/thoughtcrime/securesms/megaphone/Megaphone$Style; @@ -32419,15 +36488,15 @@ Lorg/thoughtcrime/securesms/megaphone/MegaphoneRepository; Lorg/thoughtcrime/securesms/megaphone/MegaphoneSchedule; Lorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder$1; Lorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder; -Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda22; -Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda23; -Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda24; -Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda25; +Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18; +Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda19; +Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda20; +Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda21; +Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda2; +Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda6; -Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda7; -Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda8; Lorg/thoughtcrime/securesms/megaphone/Megaphones$1; Lorg/thoughtcrime/securesms/megaphone/Megaphones$3; Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event; @@ -32445,6 +36514,7 @@ Lorg/thoughtcrime/securesms/megaphone/PinsForAllSchedule; Lorg/thoughtcrime/securesms/megaphone/RecurringSchedule; Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$Action; Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$donate$1; +Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$donateForFriend$1; Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$finish$1; Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$getRemoteMegaphoneToShow$1; Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$getRemoteMegaphoneToShow$2; @@ -32456,8 +36526,11 @@ Lorg/thoughtcrime/securesms/megaphone/SignalPinReminderSchedule; Lorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule$Companion; Lorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule; Lorg/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver; +Lorg/thoughtcrime/securesms/messagerequests/GroupInfo; +Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; +Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; +Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$2; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$BackgroundService$Companion; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$BackgroundService; @@ -32465,7 +36538,6 @@ Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$Companion; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$MessageRetrievalThread$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$MessageRetrievalThread$run$webSocketDisposable$1; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$MessageRetrievalThread; -Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$isConnectionNecessary$1$removedKeepAliveToken$1; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$networkConnectionListener$1; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver; Lorg/thoughtcrime/securesms/messages/MessageContentProcessor$Companion; @@ -32489,6 +36561,7 @@ Lorg/thoughtcrime/securesms/migrations/BackupNotificationMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/BlobStorageLocationMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/CachedAttachmentsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/ClearGlideCacheMigrationJob$Factory; +Lorg/thoughtcrime/securesms/migrations/CopyUsernameToSignalStoreMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/DatabaseMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/DeleteDeprecatedLogsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/DirectoryRefreshMigrationJob$Factory; @@ -32507,24 +36580,30 @@ Lorg/thoughtcrime/securesms/migrations/PreKeysSyncMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/ProfileMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/ProfileSharingUpdateMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/RebuildMessageSearchIndexMigrationJob$Factory; +Lorg/thoughtcrime/securesms/migrations/RecheckPaymentsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/RecipientSearchMigrationJob$Factory; +Lorg/thoughtcrime/securesms/migrations/SelfRegisteredStateMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StickerAdditionMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StickerDayByDayMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StickerLaunchMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StickerMyDailyLifeMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StorageCapabilityMigrationJob$Factory; +Lorg/thoughtcrime/securesms/migrations/StorageFixLocalUnknownMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StorageServiceMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob$Factory; -Lorg/thoughtcrime/securesms/migrations/StoryReadStateMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/StoryViewedReceiptsStateMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/Svr2MirrorMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/SyncDistributionListsMigrationJob$Factory; +Lorg/thoughtcrime/securesms/migrations/SyncKeysMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/TrimByLengthSettingsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/UpdateSmsJobsMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/UserNotificationMigrationJob$Factory; Lorg/thoughtcrime/securesms/migrations/UuidMigrationJob$Factory; +Lorg/thoughtcrime/securesms/mms/AttachmentManager$AttachmentListener; +Lorg/thoughtcrime/securesms/mms/AttachmentManager; Lorg/thoughtcrime/securesms/mms/AttachmentStreamUriLoader$AttachmentModel; Lorg/thoughtcrime/securesms/mms/AttachmentStreamUriLoader$Factory; +Lorg/thoughtcrime/securesms/mms/AudioSlide; Lorg/thoughtcrime/securesms/mms/DecryptableStreamUriLoader$DecryptableUri; Lorg/thoughtcrime/securesms/mms/DecryptableStreamUriLoader$Factory; Lorg/thoughtcrime/securesms/mms/GifSlide; @@ -32533,7 +36612,9 @@ Lorg/thoughtcrime/securesms/mms/GlideOptions; Lorg/thoughtcrime/securesms/mms/GlideRequest; Lorg/thoughtcrime/securesms/mms/GlideRequests; Lorg/thoughtcrime/securesms/mms/ImageSlide; -Lorg/thoughtcrime/securesms/mms/IncomingMediaMessage; +Lorg/thoughtcrime/securesms/mms/IncomingMessage$Companion; +Lorg/thoughtcrime/securesms/mms/IncomingMessage; +Lorg/thoughtcrime/securesms/mms/MessageGroupContext; Lorg/thoughtcrime/securesms/mms/MmsException; Lorg/thoughtcrime/securesms/mms/PartAuthority; Lorg/thoughtcrime/securesms/mms/QuoteModel$Type$Companion; @@ -32546,9 +36627,12 @@ Lorg/thoughtcrime/securesms/mms/SignalGlideModule$Companion; Lorg/thoughtcrime/securesms/mms/SignalGlideModule; Lorg/thoughtcrime/securesms/mms/Slide; Lorg/thoughtcrime/securesms/mms/SlideClickListener; +Lorg/thoughtcrime/securesms/mms/SlideDeck$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/mms/SlideDeck; +Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; Lorg/thoughtcrime/securesms/mms/SlidesClickedListener; Lorg/thoughtcrime/securesms/mms/StickerSlide; +Lorg/thoughtcrime/securesms/mms/TextSlide; Lorg/thoughtcrime/securesms/net/ContentProxySafetyInterceptor; Lorg/thoughtcrime/securesms/net/ContentProxySelector$1; Lorg/thoughtcrime/securesms/net/ContentProxySelector; @@ -32569,6 +36653,7 @@ Lorg/thoughtcrime/securesms/net/StandardUserAgentInterceptor; Lorg/thoughtcrime/securesms/net/StaticDns; Lorg/thoughtcrime/securesms/net/UserAgentInterceptor; Lorg/thoughtcrime/securesms/notifications/Configuration; +Lorg/thoughtcrime/securesms/notifications/MessageNotifier; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline0; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline1; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline2; @@ -32579,16 +36664,31 @@ Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheti Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticLambda11; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticLambda17; Lorg/thoughtcrime/securesms/notifications/NotificationChannels; +Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier; Lorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics; -Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$1; -Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel$State; -Lorg/thoughtcrime/securesms/notifications/SlowNotificationsViewModel; +Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$1; +Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$State; +Lorg/thoughtcrime/securesms/notifications/VitalsViewModel; Lorg/thoughtcrime/securesms/notifications/profiles/NotificationProfile; Lorg/thoughtcrime/securesms/notifications/profiles/NotificationProfiles; -Lorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/permissions/Permissions; +Lorg/thoughtcrime/securesms/notifications/v2/CancelableExecutor; +Lorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion; +Lorg/thoughtcrime/securesms/notifications/v2/ConversationId$Creator; +Lorg/thoughtcrime/securesms/notifications/v2/ConversationId; +Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion; +Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier; +Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion; +Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$messageCount$2; +Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationIds$2; +Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationItems$2; +Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; +Lorg/thoughtcrime/securesms/payments/Payment; +Lorg/thoughtcrime/securesms/payments/PaymentsAddressException; +Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber; +Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter; Lorg/thoughtcrime/securesms/pin/SvrRepository; +Lorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference; Lorg/thoughtcrime/securesms/profiles/AvatarHelper; Lorg/thoughtcrime/securesms/profiles/ProfileName$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/profiles/ProfileName$$ExternalSyntheticLambda1; @@ -32598,33 +36698,30 @@ Lorg/thoughtcrime/securesms/providers/AvatarProvider$Companion; Lorg/thoughtcrime/securesms/providers/AvatarProvider; Lorg/thoughtcrime/securesms/providers/BaseContentProvider; Lorg/thoughtcrime/securesms/providers/BlobContentProvider; -Lorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda10; Lorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda11; -Lorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda9; Lorg/thoughtcrime/securesms/providers/BlobProvider$1; -Lorg/thoughtcrime/securesms/providers/BlobProvider$2; -Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder; -Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec; -Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; Lorg/thoughtcrime/securesms/providers/BlobProvider; Lorg/thoughtcrime/securesms/providers/MmsBodyProvider; Lorg/thoughtcrime/securesms/providers/PartProvider; Lorg/thoughtcrime/securesms/push/AccountManagerFactory; Lorg/thoughtcrime/securesms/push/DomainFrontingDigicertTrustStore; Lorg/thoughtcrime/securesms/push/DomainFrontingTrustStore; -Lorg/thoughtcrime/securesms/push/IasTrustStore; Lorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess$Companion; Lorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess$HostConfig; Lorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess$WhenMappings; Lorg/thoughtcrime/securesms/push/SignalServiceNetworkAccess; Lorg/thoughtcrime/securesms/push/SignalServiceTrustStore; Lorg/thoughtcrime/securesms/ratelimit/RateLimitUtil; +Lorg/thoughtcrime/securesms/ratelimit/RecaptchaRequiredEvent; +Lorg/thoughtcrime/securesms/reactions/ReactionsBottomSheetDialogFragment$Callback; Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView; +Lorg/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiBottomSheetDialogFragment$Callback; +Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9; Lorg/thoughtcrime/securesms/recipients/LiveRecipient; Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLambda2; @@ -32632,7 +36729,6 @@ Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLamb Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache; -Lorg/thoughtcrime/securesms/recipients/Recipient$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/recipients/Recipient$Capability; Lorg/thoughtcrime/securesms/recipients/Recipient$Extras; Lorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider; @@ -32657,11 +36753,10 @@ Lorg/thoughtcrime/securesms/registration/RegistrationRepository; Lorg/thoughtcrime/securesms/registration/RegistrationUtil; Lorg/thoughtcrime/securesms/registration/VerifyResponse$Companion; Lorg/thoughtcrime/securesms/registration/VerifyResponse; -Lorg/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel$$ExternalSyntheticLambda3; -Lorg/thoughtcrime/securesms/releasechannel/ReleaseChannel; Lorg/thoughtcrime/securesms/revealable/ViewOnceMessageManager; Lorg/thoughtcrime/securesms/ringrtc/RingRtcLogger; Lorg/thoughtcrime/securesms/s3/S3; +Lorg/thoughtcrime/securesms/safety/SafetyNumberBottomSheet$Callbacks; Lorg/thoughtcrime/securesms/search/MessageResult; Lorg/thoughtcrime/securesms/search/SearchRepository; Lorg/thoughtcrime/securesms/service/DeletedCallEventManager$Companion; @@ -32674,7 +36769,6 @@ Lorg/thoughtcrime/securesms/service/ExpiringMessageManager; Lorg/thoughtcrime/securesms/service/ExpiringStoriesManager$Companion; Lorg/thoughtcrime/securesms/service/ExpiringStoriesManager; Lorg/thoughtcrime/securesms/service/KeyCachingService; -Lorg/thoughtcrime/securesms/service/LocalBackupListener$$ExternalSyntheticBackport0; Lorg/thoughtcrime/securesms/service/LocalBackupListener; Lorg/thoughtcrime/securesms/service/PendingRetryReceiptManager; Lorg/thoughtcrime/securesms/service/PersistentAlarmManagerListener; @@ -32697,16 +36791,20 @@ Lorg/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil; Lorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId$DatabaseSerializer; Lorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId; Lorg/thoughtcrime/securesms/shakereport/ShakeToReport; +Lorg/thoughtcrime/securesms/sms/GroupV2UpdateMessageUtil; Lorg/thoughtcrime/securesms/sms/MessageSender$MessageSentEvent; -Lorg/thoughtcrime/securesms/stickers/BlessedPacks$1; -Lorg/thoughtcrime/securesms/stickers/BlessedPacks$Pack; -Lorg/thoughtcrime/securesms/stickers/BlessedPacks; +Lorg/thoughtcrime/securesms/stickers/StickerEventListener; Lorg/thoughtcrime/securesms/stickers/StickerLocator; +Lorg/thoughtcrime/securesms/stickers/StickerPackInstallEvent; Lorg/thoughtcrime/securesms/stickers/StickerRemoteUri; Lorg/thoughtcrime/securesms/stickers/StickerRemoteUriLoader$Factory; +Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback; +Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository; Lorg/thoughtcrime/securesms/storage/StorageKeyGenerator; Lorg/thoughtcrime/securesms/storage/StorageSyncHelper$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/storage/StorageSyncHelper; +Lorg/thoughtcrime/securesms/stories/Stories$MediaTransform$SendRequirements; Lorg/thoughtcrime/securesms/stories/Stories; Lorg/thoughtcrime/securesms/stories/StoryTextPostModel$Decoder$Companion; Lorg/thoughtcrime/securesms/stories/StoryTextPostModel$Decoder; @@ -32754,8 +36852,12 @@ Lorg/thoughtcrime/securesms/util/AppStartup$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/util/AppStartup$Task; Lorg/thoughtcrime/securesms/util/AppStartup; Lorg/thoughtcrime/securesms/util/AvatarUtil; -Lorg/thoughtcrime/securesms/util/Base64; Lorg/thoughtcrime/securesms/util/BitmapDecodingException; +Lorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline0; +Lorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline1; +Lorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline2; +Lorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline3; +Lorg/thoughtcrime/securesms/util/BubbleUtil; Lorg/thoughtcrime/securesms/util/ByteUnit$1; Lorg/thoughtcrime/securesms/util/ByteUnit$2; Lorg/thoughtcrime/securesms/util/ByteUnit$3; @@ -32765,12 +36867,18 @@ Lorg/thoughtcrime/securesms/util/CachedInflater$ViewCache$$ExternalSyntheticLamb Lorg/thoughtcrime/securesms/util/CachedInflater$ViewCache$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/util/CachedInflater$ViewCache; Lorg/thoughtcrime/securesms/util/CachedInflater; +Lorg/thoughtcrime/securesms/util/CenteredImageSpan; +Lorg/thoughtcrime/securesms/util/CharacterCalculator; Lorg/thoughtcrime/securesms/util/ConfigurationUtil; Lorg/thoughtcrime/securesms/util/ContextUtil; Lorg/thoughtcrime/securesms/util/ConversationShortcutPhoto$Loader$Factory; Lorg/thoughtcrime/securesms/util/ConversationShortcutPhoto; +Lorg/thoughtcrime/securesms/util/ConversationUtil; +Lorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2; Lorg/thoughtcrime/securesms/util/DateUtils; Lorg/thoughtcrime/securesms/util/Debouncer; +Lorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2; +Lorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate; Lorg/thoughtcrime/securesms/util/DefaultValueLiveData; Lorg/thoughtcrime/securesms/util/Deferred; Lorg/thoughtcrime/securesms/util/DeviceProperties; @@ -32786,13 +36894,14 @@ Lorg/thoughtcrime/securesms/util/FeatureFlags$OnFlagChange; Lorg/thoughtcrime/securesms/util/FeatureFlags; Lorg/thoughtcrime/securesms/util/FrameRateTracker$1; Lorg/thoughtcrime/securesms/util/FrameRateTracker; +Lorg/thoughtcrime/securesms/util/FullscreenHelper$$ExternalSyntheticApiModelOutline0; +Lorg/thoughtcrime/securesms/util/FullscreenHelper; Lorg/thoughtcrime/securesms/util/FutureTaskListener; -Lorg/thoughtcrime/securesms/util/IOFunction; -Lorg/thoughtcrime/securesms/util/IasKeyStore; Lorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt; Lorg/thoughtcrime/securesms/util/JsonUtils$SaneJSONObject; Lorg/thoughtcrime/securesms/util/JsonUtils; Lorg/thoughtcrime/securesms/util/LRUCache; +Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter; Lorg/thoughtcrime/securesms/util/ListenableFutureTask$2; Lorg/thoughtcrime/securesms/util/ListenableFutureTask; Lorg/thoughtcrime/securesms/util/LocalMetrics$$ExternalSyntheticLambda0; @@ -32802,6 +36911,9 @@ Lorg/thoughtcrime/securesms/util/LocalMetrics$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/util/LocalMetrics$db$2; Lorg/thoughtcrime/securesms/util/LocalMetrics; Lorg/thoughtcrime/securesms/util/LocaleUtil; +Lorg/thoughtcrime/securesms/util/LongClickMovementMethod$1; +Lorg/thoughtcrime/securesms/util/LongClickMovementMethod; +Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1; Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$2; Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3; @@ -32814,20 +36926,28 @@ Lorg/thoughtcrime/securesms/util/MediaUtil; Lorg/thoughtcrime/securesms/util/MessageRecordUtil; Lorg/thoughtcrime/securesms/util/NameUtil; Lorg/thoughtcrime/securesms/util/NetworkUtil; -Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator; +Lorg/thoughtcrime/securesms/util/NullableSavedStateHandleDelegate; Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda3; -Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda4; -Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/util/ProfileUtil; +Lorg/thoughtcrime/securesms/util/Projection$Corners; Lorg/thoughtcrime/securesms/util/Projection; Lorg/thoughtcrime/securesms/util/ProjectionList; +Lorg/thoughtcrime/securesms/util/PushCharacterCalculator$1; +Lorg/thoughtcrime/securesms/util/PushCharacterCalculator; Lorg/thoughtcrime/securesms/util/RemoteDeprecation; +Lorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt$delegate$1; +Lorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt; +Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1; +Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion; +Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory; Lorg/thoughtcrime/securesms/util/ScreenDensity$1; Lorg/thoughtcrime/securesms/util/ScreenDensity; Lorg/thoughtcrime/securesms/util/SearchUtil$StyleFactory; +Lorg/thoughtcrime/securesms/util/SearchUtil; Lorg/thoughtcrime/securesms/util/ServiceUtil; Lorg/thoughtcrime/securesms/util/SignalLocalMetrics$ColdStart; +Lorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen; Lorg/thoughtcrime/securesms/util/SignalProxyUtil; Lorg/thoughtcrime/securesms/util/SignalTrace$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/SignalTrace$$ExternalSyntheticLambda1; @@ -32840,14 +36960,33 @@ Lorg/thoughtcrime/securesms/util/SnapToTopDataObserver$ScrollToTop; Lorg/thoughtcrime/securesms/util/SnapToTopDataObserver; Lorg/thoughtcrime/securesms/util/SoftHashMap$SoftValue; Lorg/thoughtcrime/securesms/util/SoftHashMap; +Lorg/thoughtcrime/securesms/util/SpanUtil; +Lorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline0; +Lorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline1; +Lorg/thoughtcrime/securesms/util/SplashScreenUtil$1; +Lorg/thoughtcrime/securesms/util/SplashScreenUtil; Lorg/thoughtcrime/securesms/util/StorageUtil; +Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; Lorg/thoughtcrime/securesms/util/TextSecurePreferences; +Lorg/thoughtcrime/securesms/util/ThemeUtil; Lorg/thoughtcrime/securesms/util/ThrottledDebouncer$OverflowHandler; Lorg/thoughtcrime/securesms/util/ThrottledDebouncer; Lorg/thoughtcrime/securesms/util/UrlClickHandler; Lorg/thoughtcrime/securesms/util/Util; Lorg/thoughtcrime/securesms/util/VersionTracker; Lorg/thoughtcrime/securesms/util/ViewExtensionsKt; +Lorg/thoughtcrime/securesms/util/ViewModelFactory$Companion$factoryProducer$1; +Lorg/thoughtcrime/securesms/util/ViewModelFactory$Companion; +Lorg/thoughtcrime/securesms/util/ViewModelFactory; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4; Lorg/thoughtcrime/securesms/util/ViewUtil; Lorg/thoughtcrime/securesms/util/WakeLockUtil; Lorg/thoughtcrime/securesms/util/WindowUtil; @@ -32857,15 +36996,20 @@ Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter; Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback; Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel; Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModelList; +Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter$Placeholder; Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter; Lorg/thoughtcrime/securesms/util/cjkv/CJKVUtil; Lorg/thoughtcrime/securesms/util/concurrent/FilteredExecutor$Filter; Lorg/thoughtcrime/securesms/util/concurrent/FilteredExecutor; +Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; Lorg/thoughtcrime/securesms/util/concurrent/SerialExecutor$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/concurrent/SerialExecutor; +Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor; +Lorg/thoughtcrime/securesms/util/concurrent/SettableFuture; +Lorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat; Lorg/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper; Lorg/thoughtcrime/securesms/util/dynamiclanguage/LanguageString; Lorg/thoughtcrime/securesms/util/dynamiclanguage/LocaleParser; @@ -32922,19 +37066,11 @@ Lorg/webrtc/PeerConnectionFactory$InitializationOptions$Builder; Lorg/webrtc/PeerConnectionFactory$InitializationOptions; Lorg/webrtc/PeerConnectionFactory; Lorg/webrtc/WebRtcClassLoader; -Lorg/webrtc/voiceengine/BuildInfo; -Lorg/webrtc/voiceengine/WebRtcAudioManager; -Lorg/webrtc/voiceengine/WebRtcAudioRecord; -Lorg/webrtc/voiceengine/WebRtcAudioTrack; Lorg/whispersystems/signalservice/api/InvalidMessageStructureException; -Lorg/whispersystems/signalservice/api/KeyBackupService; -Lorg/whispersystems/signalservice/api/KeyBackupServicePinException; Lorg/whispersystems/signalservice/api/SignalServiceAccountDataStore; Lorg/whispersystems/signalservice/api/SignalServiceAccountManager; Lorg/whispersystems/signalservice/api/SignalServiceDataStore; Lorg/whispersystems/signalservice/api/SignalServiceKyberPreKeyStore; -Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver$$ExternalSyntheticLambda0; -Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver; Lorg/whispersystems/signalservice/api/SignalServicePreKeyStore; Lorg/whispersystems/signalservice/api/SignalServiceSenderKeyStore; Lorg/whispersystems/signalservice/api/SignalServiceSessionStore; @@ -32943,14 +37079,10 @@ Lorg/whispersystems/signalservice/api/SignalSessionLock; Lorg/whispersystems/signalservice/api/SignalWebSocket$$ExternalSyntheticLambda0; Lorg/whispersystems/signalservice/api/SignalWebSocket$MessageReceivedCallback; Lorg/whispersystems/signalservice/api/SignalWebSocket; -Lorg/whispersystems/signalservice/api/SvrNoDataException; -Lorg/whispersystems/signalservice/api/TokenException; -Lorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities; -Lorg/whispersystems/signalservice/api/account/AccountAttributes; Lorg/whispersystems/signalservice/api/account/PreKeyCollection; Lorg/whispersystems/signalservice/api/crypto/InvalidCiphertextException; -Lorg/whispersystems/signalservice/api/crypto/UnidentifiedAccess; Lorg/whispersystems/signalservice/api/groupsv2/ClientZkOperations; +Lorg/whispersystems/signalservice/api/groupsv2/GroupLinkNotActiveException; Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations; Lorg/whispersystems/signalservice/api/kbs/MasterKey; Lorg/whispersystems/signalservice/api/messages/SignalServiceAttachment; @@ -32963,38 +37095,25 @@ Lorg/whispersystems/signalservice/api/payments/Money$MobileCoin$$ExternalSynthet Lorg/whispersystems/signalservice/api/payments/Money$MobileCoin; Lorg/whispersystems/signalservice/api/payments/Money$ParseException; Lorg/whispersystems/signalservice/api/payments/Money; -Lorg/whispersystems/signalservice/api/profiles/ProfileAndCredential; Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$Capabilities; -Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType; Lorg/whispersystems/signalservice/api/push/ServiceId$ACI$Companion; Lorg/whispersystems/signalservice/api/push/ServiceId$ACI; Lorg/whispersystems/signalservice/api/push/ServiceId$Companion; Lorg/whispersystems/signalservice/api/push/ServiceId$PNI$Companion; Lorg/whispersystems/signalservice/api/push/ServiceId$PNI; Lorg/whispersystems/signalservice/api/push/ServiceId; -Lorg/whispersystems/signalservice/api/push/ServiceIdType; Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; Lorg/whispersystems/signalservice/api/push/TrustStore; Lorg/whispersystems/signalservice/api/push/exceptions/ConflictException; Lorg/whispersystems/signalservice/api/push/exceptions/ContactManifestMismatchException; Lorg/whispersystems/signalservice/api/push/exceptions/MalformedResponseException; Lorg/whispersystems/signalservice/api/push/exceptions/MissingConfigurationException; -Lorg/whispersystems/signalservice/api/push/exceptions/NetworkFailureException; Lorg/whispersystems/signalservice/api/push/exceptions/NoContentException; Lorg/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException; Lorg/whispersystems/signalservice/api/push/exceptions/NotFoundException; Lorg/whispersystems/signalservice/api/push/exceptions/PushNetworkException; -Lorg/whispersystems/signalservice/api/push/exceptions/RangeException; -Lorg/whispersystems/signalservice/api/services/MessagingService$$ExternalSyntheticLambda4; -Lorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda1; -Lorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda2; -Lorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda3; -Lorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseMapper; -Lorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseProcessor; -Lorg/whispersystems/signalservice/api/services/ProfileService; +Lorg/whispersystems/signalservice/api/services/DonationsService; Lorg/whispersystems/signalservice/api/svr/SecureValueRecovery; -Lorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV1$Companion; -Lorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV1; Lorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV2$Companion; Lorg/whispersystems/signalservice/api/svr/SecureValueRecoveryV2; Lorg/whispersystems/signalservice/api/util/CredentialsProvider; @@ -33020,12 +37139,9 @@ Lorg/whispersystems/signalservice/internal/configuration/SignalServiceUrl; Lorg/whispersystems/signalservice/internal/configuration/SignalStorageUrl; Lorg/whispersystems/signalservice/internal/configuration/SignalSvr2Url; Lorg/whispersystems/signalservice/internal/configuration/SignalUrl; -Lorg/whispersystems/signalservice/internal/contacts/crypto/UnauthenticatedResponseException; +Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda10; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda11; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda12; -Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda13; -Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda15; -Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$1; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$2; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$EmptyResponseCodeHandler; @@ -33033,30 +37149,18 @@ Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ResponseCodeHa Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ServiceConnectionHolder; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket; Lorg/whispersystems/signalservice/internal/push/VerifyAccountResponse; -Lorg/whispersystems/signalservice/internal/push/http/AcceptLanguagesUtil; +Lorg/whispersystems/signalservice/internal/push/exceptions/GroupPatchNotAcceptedException; Lorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager$1; Lorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager; -Lorg/whispersystems/signalservice/internal/util/Hex; Lorg/whispersystems/signalservice/internal/util/JsonUtil; Lorg/whispersystems/signalservice/internal/util/Util; -Lorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer; -Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer; -Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers; -Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; -Lorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture; -Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder; -Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper; -Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder; -Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$CustomResponseMapper; -Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper; -Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper; -Lorg/whispersystems/signalservice/internal/websocket/ResponseMapper; Lorg/whispersystems/signalservice/internal/websocket/WebSocketConnection; -Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; -Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion$ADAPTER$1; -Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion; -Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage; -Lorg/whispersystems/util/Base64; +Lorg/whispersystems/util/StringUtil; +Lrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda0; +Lrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda1; +Lrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda4; +Lrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda5; +Lrxdogtag2/DogTagMaybeObserver; Lrxdogtag2/DogTagObserver$$ExternalSyntheticLambda2; Lrxdogtag2/DogTagObserver$$ExternalSyntheticLambda3; Lrxdogtag2/DogTagObserver$$ExternalSyntheticLambda4; @@ -33064,6 +37168,11 @@ Lrxdogtag2/DogTagObserver$$ExternalSyntheticLambda5; Lrxdogtag2/DogTagObserver$$ExternalSyntheticLambda6; Lrxdogtag2/DogTagObserver$$ExternalSyntheticLambda7; Lrxdogtag2/DogTagObserver; +Lrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda0; +Lrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda1; +Lrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda4; +Lrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda5; +Lrxdogtag2/DogTagSingleObserver; Lrxdogtag2/DogTagSubscriber$$ExternalSyntheticLambda2; Lrxdogtag2/DogTagSubscriber$$ExternalSyntheticLambda3; Lrxdogtag2/DogTagSubscriber$$ExternalSyntheticLambda4; @@ -33083,177 +37192,18 @@ Lrxdogtag2/RxDogTag$Configuration; Lrxdogtag2/RxDogTag$NonCheckingConsumer; Lrxdogtag2/RxDogTag; Lrxdogtag2/RxDogTagErrorReceiver; -PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->saveState()Landroid/os/Bundle; -PLandroidx/activity/ComponentActivity;->$r8$lambda$OnwlVMZzrLePIRy-6IUDTtLLUV0(Landroidx/activity/ComponentActivity;)Landroid/os/Bundle; -PLandroidx/activity/ComponentActivity;->lambda$new$1()Landroid/os/Bundle; -PLandroidx/activity/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V -PLandroidx/activity/ComponentActivity;->startActivityForResult(Landroid/content/Intent;I)V -PLandroidx/activity/ComponentActivity;->startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V PLandroidx/activity/result/ActivityResultRegistry$LifecycleContainer;->clearObservers()V -PLandroidx/activity/result/ActivityResultRegistry;->onSaveInstanceState(Landroid/os/Bundle;)V -PLandroidx/appcompat/app/AppCompatActivity$1;->saveState()Landroid/os/Bundle; -PLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -PLandroidx/appcompat/app/AppCompatDelegateImpl;->onSaveInstanceState(Landroid/os/Bundle;)V -PLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I -PLandroidx/appcompat/app/AppCompatViewInflater;->createImageButton(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatImageButton; PLandroidx/appcompat/app/ToolbarActionBar;->onDestroy()V -PLandroidx/appcompat/view/SupportMenuInflater$MenuState;->addSubMenuItem()Landroid/view/SubMenu; -PLandroidx/appcompat/view/SupportMenuInflater$MenuState;->newInstance(Ljava/lang/String;[Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object; -PLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z -PLandroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;->()V -PLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->getAccessibilityClassName()Ljava/lang/CharSequence; -PLandroidx/appcompat/view/menu/ActionMenuItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; -PLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z -PLandroidx/appcompat/view/menu/ActionMenuItemView;->prefersCondensedTitle()Z -PLandroidx/appcompat/view/menu/ActionMenuItemView;->setPopupCallback(Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;)V -PLandroidx/appcompat/view/menu/BaseMenuPresenter;->addItemView(Landroid/view/View;I)V -PLandroidx/appcompat/view/menu/BaseMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z -PLandroidx/appcompat/view/menu/MenuBuilder;->addSubMenu(IIILjava/lang/CharSequence;)Landroid/view/SubMenu; -PLandroidx/appcompat/view/menu/MenuBuilder;->clearHeader()V -PLandroidx/appcompat/view/menu/MenuBuilder;->findItemIndex(I)I -PLandroidx/appcompat/view/menu/MenuBuilder;->getContext()Landroid/content/Context; -PLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem; -PLandroidx/appcompat/view/menu/MenuBuilder;->getResources()Landroid/content/res/Resources; -PLandroidx/appcompat/view/menu/MenuBuilder;->onItemActionRequestChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V -PLandroidx/appcompat/view/menu/MenuBuilder;->removeItem(I)V -PLandroidx/appcompat/view/menu/MenuBuilder;->removeItemAtInt(IZ)V -PLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderInternal(ILjava/lang/CharSequence;ILandroid/graphics/drawable/Drawable;Landroid/view/View;)V -PLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderTitleInt(Ljava/lang/CharSequence;)Landroidx/appcompat/view/menu/MenuBuilder; -PLandroidx/appcompat/view/menu/MenuItemImpl;->getContentDescription()Ljava/lang/CharSequence; -PLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I -PLandroidx/appcompat/view/menu/MenuItemImpl;->getSubMenu()Landroid/view/SubMenu; -PLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleCondensed()Ljava/lang/CharSequence; -PLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleForItemView(Landroidx/appcompat/view/menu/MenuView$ItemView;)Ljava/lang/CharSequence; -PLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z -PLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroid/view/MenuItem; -PLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroidx/core/internal/view/SupportMenuItem; -PLandroidx/appcompat/view/menu/MenuItemImpl;->setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem; -PLandroidx/appcompat/view/menu/MenuItemImpl;->setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem; -PLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V -PLandroidx/appcompat/view/menu/MenuItemImpl;->setSubMenu(Landroidx/appcompat/view/menu/SubMenuBuilder;)V -PLandroidx/appcompat/view/menu/MenuItemImpl;->setTitle(Ljava/lang/CharSequence;)Landroid/view/MenuItem; -PLandroidx/appcompat/view/menu/SubMenuBuilder;->(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;Landroidx/appcompat/view/menu/MenuItemImpl;)V -PLandroidx/appcompat/view/menu/SubMenuBuilder;->getItem()Landroid/view/MenuItem; -PLandroidx/appcompat/view/menu/SubMenuBuilder;->setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/SubMenu; -PLandroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V PLandroidx/appcompat/widget/ActionMenuPresenter;->dismissPopupMenus()Z -PLandroidx/appcompat/widget/ActionMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z PLandroidx/appcompat/widget/ActionMenuPresenter;->hideOverflowMenu()Z PLandroidx/appcompat/widget/ActionMenuPresenter;->hideSubMenus()Z -PLandroidx/appcompat/widget/ActionMenuPresenter;->isOverflowMenuShowing()Z -PLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ActionMenuView;->dismissPopupMenus()V -PLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; -PLandroidx/appcompat/widget/ActionMenuView;->isOverflowMenuShowing()Z PLandroidx/appcompat/widget/ActionMenuView;->onDetachedFromWindow()V -PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->()V -PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->initEmojiKeyListener(Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper;)V -PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V -PLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundResource(I)V -PLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V -PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintModeForDrawableRes(I)Landroid/graphics/PorterDuff$Mode; -PLandroidx/appcompat/widget/AppCompatDrawableManager;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; -PLandroidx/appcompat/widget/AppCompatEditText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; -PLandroidx/appcompat/widget/AppCompatEditText;->setCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;)V -PLandroidx/appcompat/widget/AppCompatEditText;->setEmojiCompatEnabled(Z)V -PLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; -PLandroidx/appcompat/widget/AppCompatHintHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroid/view/View;)Landroid/view/inputmethod/InputConnection; -PLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLandroidx/appcompat/widget/AppCompatImageButton;->drawableStateChanged()V -PLandroidx/appcompat/widget/AppCompatImageButton;->hasOverlappingRendering()Z -PLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundResource(I)V -PLandroidx/appcompat/widget/AppCompatImageButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V -PLandroidx/appcompat/widget/AppCompatImageButton;->setImageResource(I)V -PLandroidx/appcompat/widget/AppCompatProgressBarHelper;->()V -PLandroidx/appcompat/widget/AppCompatProgressBarHelper;->(Landroid/widget/ProgressBar;)V -PLandroidx/appcompat/widget/AppCompatProgressBarHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V -PLandroidx/appcompat/widget/AppCompatSeekBar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLandroidx/appcompat/widget/AppCompatSeekBar;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLandroidx/appcompat/widget/AppCompatSeekBar;->drawableStateChanged()V -PLandroidx/appcompat/widget/AppCompatSeekBar;->jumpDrawablesToCurrentState()V -PLandroidx/appcompat/widget/AppCompatSeekBarHelper;->(Landroid/widget/SeekBar;)V -PLandroidx/appcompat/widget/AppCompatSeekBarHelper;->applyTickMarkTint()V -PLandroidx/appcompat/widget/AppCompatSeekBarHelper;->drawableStateChanged()V -PLandroidx/appcompat/widget/AppCompatSeekBarHelper;->jumpDrawablesToCurrentState()V -PLandroidx/appcompat/widget/AppCompatSeekBarHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V -PLandroidx/appcompat/widget/AppCompatSeekBarHelper;->setTickMark(Landroid/graphics/drawable/Drawable;)V -PLandroidx/appcompat/widget/AppCompatTextHelper$Api17Impl;->getCompoundDrawablesRelative(Landroid/widget/TextView;)[Landroid/graphics/drawable/Drawable; -PLandroidx/appcompat/widget/AppCompatTextHelper$Api17Impl;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V -PLandroidx/appcompat/widget/AppCompatTextHelper;->createTintInfo(Landroid/content/Context;Landroidx/appcompat/widget/AppCompatDrawableManager;I)Landroidx/appcompat/widget/TintInfo; -PLandroidx/appcompat/widget/AppCompatTextHelper;->populateSurroundingTextIfNeeded(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V -PLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundResource(I)V -PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I -PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline1;->m(Landroid/graphics/Insets;)I -PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline2;->m(Landroid/graphics/Insets;)I -PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline3;->m(Landroid/graphics/Insets;)I -PLandroidx/appcompat/widget/FitWindowsFrameLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z -PLandroidx/appcompat/widget/ForwardingListener;->onViewDetachedFromWindow(Landroid/view/View;)V -PLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLandroidx/appcompat/widget/LinearLayoutCompat;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z -PLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; -PLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/LinearLayoutCompat$LayoutParams; -PLandroidx/appcompat/widget/LinearLayoutCompat;->layoutVertical(IIII)V -PLandroidx/appcompat/widget/LinearLayoutCompat;->measureVertical(II)V -PLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V -PLandroidx/appcompat/widget/LinearLayoutCompat;->setOrientation(I)V -PLandroidx/appcompat/widget/ResourceManagerInternal;->addTintListToCache(Landroid/content/Context;ILandroid/content/res/ColorStateList;)V -PLandroidx/appcompat/widget/ResourceManagerInternal;->getTintMode(I)Landroid/graphics/PorterDuff$Mode; -PLandroidx/appcompat/widget/SearchView$10;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$1;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$2;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$3;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$4;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$5;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$6;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$7;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$8;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$9;->(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView$SearchAutoComplete$1;->(Landroidx/appcompat/widget/SearchView$SearchAutoComplete;)V -PLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->enoughToFilter()Z -PLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->getSearchViewTextMinWidthDp()I -PLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->onFinishInflate()V -PLandroidx/appcompat/widget/SearchView$SearchAutoComplete;->setSearchView(Landroidx/appcompat/widget/SearchView;)V -PLandroidx/appcompat/widget/SearchView;->()V -PLandroidx/appcompat/widget/SearchView;->getDecoratedHint(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -PLandroidx/appcompat/widget/SearchView;->getQueryHint()Ljava/lang/CharSequence; -PLandroidx/appcompat/widget/SearchView;->isSubmitAreaEnabled()Z -PLandroidx/appcompat/widget/SearchView;->setIconifiedByDefault(Z)V -PLandroidx/appcompat/widget/SearchView;->setMaxWidth(I)V -PLandroidx/appcompat/widget/SearchView;->updateCloseButton()V -PLandroidx/appcompat/widget/SearchView;->updateQueryHint()V -PLandroidx/appcompat/widget/SearchView;->updateSubmitArea()V -PLandroidx/appcompat/widget/SearchView;->updateSubmitButton(Z)V -PLandroidx/appcompat/widget/SearchView;->updateViewsVisibility(Z)V -PLandroidx/appcompat/widget/SearchView;->updateVoiceButton(Z)V -PLandroidx/appcompat/widget/Toolbar$$ExternalSyntheticLambda0;->run()V -PLandroidx/appcompat/widget/Toolbar$SavedState$1;->()V -PLandroidx/appcompat/widget/Toolbar$SavedState;->()V -PLandroidx/appcompat/widget/Toolbar$SavedState;->(Landroid/os/Parcelable;)V PLandroidx/appcompat/widget/Toolbar$SavedState;->writeToParcel(Landroid/os/Parcel;I)V -PLandroidx/appcompat/widget/Toolbar;->addMenuProvider(Landroidx/core/view/MenuProvider;)V -PLandroidx/appcompat/widget/Toolbar;->getCurrentMenuItems()Ljava/util/ArrayList; -PLandroidx/appcompat/widget/Toolbar;->getMenuInflater()Landroid/view/MenuInflater; -PLandroidx/appcompat/widget/Toolbar;->invalidateMenu()V -PLandroidx/appcompat/widget/Toolbar;->isOverflowMenuShowing()Z -PLandroidx/appcompat/widget/Toolbar;->onCreateMenu()V PLandroidx/appcompat/widget/Toolbar;->onDetachedFromWindow()V -PLandroidx/appcompat/widget/Toolbar;->onSaveInstanceState()Landroid/os/Parcelable; -PLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(I)V -PLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(Ljava/lang/CharSequence;)V -PLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(I)V -PLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(Landroid/graphics/drawable/Drawable;)V -PLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(I)V -PLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(Landroid/content/res/ColorStateList;)V -PLandroidx/collection/ArraySet;->indexOf(Ljava/lang/Object;)I -PLandroidx/collection/ArraySet;->remove(Ljava/lang/Object;)Z PLandroidx/collection/SimpleArrayMap;->equals(Ljava/lang/Object;)Z -PLandroidx/collection/SparseArrayCompat;->append(ILjava/lang/Object;)V PLandroidx/collection/SparseArrayCompat;->clear()V -PLandroidx/compose/ui/platform/coreshims/SoftwareKeyboardControllerCompat$Impl30$$ExternalSyntheticApiModelOutline1;->m()I PLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;->()V PLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;->(Landroidx/concurrent/futures/AbstractResolvableFuture$1;)V PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;->()V @@ -33274,337 +37224,55 @@ PLandroidx/concurrent/futures/AbstractResolvableFuture;->set(Ljava/lang/Object;) PLandroidx/concurrent/futures/ResolvableFuture;->()V PLandroidx/concurrent/futures/ResolvableFuture;->create()Landroidx/concurrent/futures/ResolvableFuture; PLandroidx/concurrent/futures/ResolvableFuture;->set(Ljava/lang/Object;)Z -PLandroidx/constraintlayout/core/ArrayRow;->createRowEquals(Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; -PLandroidx/constraintlayout/core/LinearSystem;->addGreaterBarrier(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IZ)V -PLandroidx/constraintlayout/core/LinearSystem;->addLowerBarrier(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IZ)V -PLandroidx/constraintlayout/core/widgets/ConstraintAnchor$1;->()V -PLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getOpposite()Landroidx/constraintlayout/core/widgets/ConstraintAnchor; -PLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasCenteredDependents()Z -PLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalMargin()I -PLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalLeft(I)V -PLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalDimension(II)V -PLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMinVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V -PLandroidx/constraintlayout/core/widgets/Guideline$1;->()V -PLandroidx/constraintlayout/core/widgets/Guideline;->()V -PLandroidx/constraintlayout/core/widgets/Guideline;->getOrientation()I -PLandroidx/constraintlayout/core/widgets/Guideline;->getRelativeBegin()I -PLandroidx/constraintlayout/core/widgets/Guideline;->getRelativeEnd()I -PLandroidx/constraintlayout/core/widgets/Guideline;->isResolvedVertically()Z -PLandroidx/constraintlayout/core/widgets/Guideline;->setFinalValue(I)V -PLandroidx/constraintlayout/core/widgets/Guideline;->setGuideBegin(I)V -PLandroidx/constraintlayout/core/widgets/Guideline;->setGuideEnd(I)V -PLandroidx/constraintlayout/core/widgets/Guideline;->setOrientation(I)V -PLandroidx/constraintlayout/widget/ConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLandroidx/constraintlayout/widget/ConstraintLayout;->setId(I)V -PLandroidx/constraintlayout/widget/Guideline;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLandroidx/constraintlayout/widget/Guideline;->setGuidelineBegin(I)V -PLandroidx/constraintlayout/widget/Guideline;->setGuidelineEnd(I)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->blocksInteractionBelow(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onNestedScrollAccepted(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;I)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onNestedScrollAccepted(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;I)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->didBlockInteraction()Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->isBlockingInteractionBelow(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->isNestedScrollAccepted(I)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->resetChangedAfterNestedScroll()V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->resetNestedScroll(I)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->setNestedScrollAccepted(IZ)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState$1;->()V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->()V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->(Landroid/os/Parcelable;)V +PLandroidx/constraintlayout/widget/ConstraintHelper;->setTag(ILjava/lang/Object;)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->writeToParcel(Landroid/os/Parcel;I)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;->compare(Landroid/view/View;Landroid/view/View;)I -PLandroidx/coordinatorlayout/widget/CoordinatorLayout$ViewElevationComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getTopSortedChildren(Ljava/util/List;)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->isPointInChildBounds(Landroid/view/View;II)Z PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onDetachedFromWindow()V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;II)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onSaveInstanceState()Landroid/os/Parcelable; -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;II)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onStopNestedScroll(Landroid/view/View;I)V -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onTouchEvent(Landroid/view/MotionEvent;)Z -PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->performIntercept(Landroid/view/MotionEvent;I)Z -PLandroidx/core/app/ActivityCompat$Api21Impl;->postponeEnterTransition(Landroid/app/Activity;)V -PLandroidx/core/app/ActivityCompat$Api21Impl;->startPostponedEnterTransition(Landroid/app/Activity;)V -PLandroidx/core/app/ActivityCompat;->postponeEnterTransition(Landroid/app/Activity;)V -PLandroidx/core/app/ActivityCompat;->startPostponedEnterTransition(Landroid/app/Activity;)V -PLandroidx/core/app/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V -PLandroidx/core/graphics/Insets;->()V -PLandroidx/core/graphics/Insets;->(IIII)V -PLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; -PLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; -PLandroidx/core/os/BuildCompat;->isAtLeastR()Z -PLandroidx/core/os/BundleKt;->bundleOf([Lkotlin/Pair;)Landroid/os/Bundle; PLandroidx/core/os/HandlerCompat$Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z PLandroidx/core/os/HandlerCompat$Api28Impl;->postDelayed(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z PLandroidx/core/os/HandlerCompat;->postDelayed(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z -PLandroidx/core/text/util/LinkifyCompat$$ExternalSyntheticLambda0;->()V -PLandroidx/core/text/util/LinkifyCompat;->()V -PLandroidx/core/text/util/LinkifyCompat;->addLinks(Landroid/text/Spannable;I)Z -PLandroidx/core/text/util/LinkifyCompat;->shouldAddLinksFallbackToFramework()Z -PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z -PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V -PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEvent(Landroid/view/View;I)V -PLandroidx/core/view/AccessibilityDelegateCompat$Api16Impl;->getAccessibilityNodeProvider(Landroid/view/View$AccessibilityDelegate;Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; -PLandroidx/core/view/AccessibilityDelegateCompat;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z -PLandroidx/core/view/AccessibilityDelegateCompat;->getActionList(Landroid/view/View;)Ljava/util/List; -PLandroidx/core/view/AccessibilityDelegateCompat;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V -PLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEvent(Landroid/view/View;I)V -PLandroidx/core/view/GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2;->onTouchEvent(Landroid/view/MotionEvent;)Z -PLandroidx/core/view/GestureDetectorCompat;->onTouchEvent(Landroid/view/MotionEvent;)Z -PLandroidx/core/view/MenuItemCompat;->setIconTintList(Landroid/view/MenuItem;Landroid/content/res/ColorStateList;)V -PLandroidx/core/view/NestedScrollingChildHelper;->getNestedScrollingParentForType(I)Landroid/view/ViewParent; -PLandroidx/core/view/NestedScrollingChildHelper;->hasNestedScrollingParent(I)Z -PLandroidx/core/view/NestedScrollingChildHelper;->isNestedScrollingEnabled()Z -PLandroidx/core/view/NestedScrollingChildHelper;->setNestedScrollingParentForType(ILandroid/view/ViewParent;)V -PLandroidx/core/view/NestedScrollingChildHelper;->startNestedScroll(II)Z PLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll()V -PLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll(I)V -PLandroidx/core/view/NestedScrollingParentHelper;->onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;II)V -PLandroidx/core/view/NestedScrollingParentHelper;->onStopNestedScroll(Landroid/view/View;I)V -PLandroidx/core/view/ViewCompat$1;->(ILjava/lang/Class;I)V -PLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; -PLandroidx/core/view/ViewCompat$1;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; -PLandroidx/core/view/ViewCompat$3;->(ILjava/lang/Class;II)V -PLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/CharSequence; -PLandroidx/core/view/ViewCompat$3;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; -PLandroidx/core/view/ViewCompat$4;->(ILjava/lang/Class;I)V -PLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean; -PLandroidx/core/view/ViewCompat$4;->frameworkGet(Landroid/view/View;)Ljava/lang/Object; -PLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->(ILjava/lang/Class;I)V PLandroidx/core/view/ViewCompat$Api16Impl;->hasTransientState(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat$Api20Impl;->dispatchApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -PLandroidx/core/view/ViewCompat$Api20Impl;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -PLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -PLandroidx/core/view/ViewCompat$Api21Impl;->getZ(Landroid/view/View;)F -PLandroidx/core/view/ViewCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/View;)Landroid/view/WindowInsets; -PLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat$Api28Impl$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat$Api28Impl;->isAccessibilityHeading(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat$Api28Impl;->isScreenReaderFocusable(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/View;)Ljava/lang/CharSequence; -PLandroidx/core/view/ViewCompat$Api30Impl;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence; -PLandroidx/core/view/ViewCompat;->accessibilityHeadingProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; -PLandroidx/core/view/ViewCompat;->dispatchApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/ViewCompat;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/ViewCompat;->getZ(Landroid/view/View;)F PLandroidx/core/view/ViewCompat;->hasTransientState(Landroid/view/View;)Z -PLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/ViewCompat;->screenReaderFocusableProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty; -PLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V PLandroidx/core/view/ViewGroupKt$descendants$1;->(Landroid/view/ViewGroup;Lkotlin/coroutines/Continuation;)V -PLandroidx/core/view/ViewGroupKt;->getDescendants(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; +PLandroidx/core/view/ViewGroupKt$descendants$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/core/view/ViewKt$allViews$1;->(Landroid/view/View;Lkotlin/coroutines/Continuation;)V PLandroidx/core/view/ViewKt$allViews$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/core/view/ViewKt$allViews$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/core/view/ViewKt;->getAllViews(Landroid/view/View;)Lkotlin/sequences/Sequence; -PLandroidx/core/view/ViewParentCompat;->onNestedScrollAccepted(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;II)V -PLandroidx/core/view/ViewParentCompat;->onStartNestedScroll(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;II)Z -PLandroidx/core/view/ViewParentCompat;->onStopNestedScroll(Landroid/view/ViewParent;Landroid/view/View;I)V -PLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->(I)V -PLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->getDispatchMode()I -PLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/View;Landroid/view/WindowInsetsAnimation$Callback;)V -PLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V -PLandroidx/core/view/WindowInsetsAnimationCompat$Impl30;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V -PLandroidx/core/view/WindowInsetsAnimationCompat;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V -PLandroidx/core/view/WindowInsetsCompat$Builder;->()V -PLandroidx/core/view/WindowInsetsCompat$Builder;->build()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets; -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline6;->m()Landroid/view/WindowInsets$Builder; -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline8;->m()V -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V -PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V -PLandroidx/core/view/WindowInsetsCompat$Impl20;->()V -PLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V -PLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets; -PLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V -PLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V -PLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V -PLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat$Impl21;->isConsumed()Z -PLandroidx/core/view/WindowInsetsCompat$Impl28$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -PLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V -PLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V -PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline1;->m()Landroid/view/WindowInsets; -PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; -PLandroidx/core/view/WindowInsetsCompat$Impl30;->()V -PLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V -PLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V -PLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsets(I)Landroidx/core/graphics/Insets; -PLandroidx/core/view/WindowInsetsCompat$Impl;->()V -PLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V -PLandroidx/core/view/WindowInsetsCompat$Type;->displayCutout()I -PLandroidx/core/view/WindowInsetsCompat$Type;->ime()I -PLandroidx/core/view/WindowInsetsCompat$Type;->systemBars()I -PLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline0;->m()I -PLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline1;->m()I -PLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline2;->m()I -PLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline6;->m()I -PLandroidx/core/view/WindowInsetsCompat$TypeImpl30;->toPlatformType(I)I -PLandroidx/core/view/WindowInsetsCompat;->()V -PLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V -PLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInsetsCompat;)V -PLandroidx/core/view/WindowInsetsCompat;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat;->copyRootViewBounds(Landroid/view/View;)V -PLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets; -PLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I -PLandroidx/core/view/WindowInsetsCompat;->isConsumed()Z -PLandroidx/core/view/WindowInsetsCompat;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V -PLandroidx/core/view/WindowInsetsCompat;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V -PLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; -PLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; -PLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/accessibility/AccessibilityEventCompat$Api19Impl;->getContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;)I PLandroidx/core/view/accessibility/AccessibilityEventCompat$Api19Impl;->setContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;I)V PLandroidx/core/view/accessibility/AccessibilityEventCompat;->getContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;)I PLandroidx/core/view/accessibility/AccessibilityEventCompat;->setContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline10;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline2;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline7;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->(Ljava/lang/Object;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat; -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->()V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(I)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addSpansToExtras(Ljava/lang/CharSequence;Landroid/view/View;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setHeading(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScreenReaderFocusable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScrollable(Z)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landroid/view/accessibility/AccessibilityNodeInfo; -PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->wrap(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; -PLandroidx/core/view/inputmethod/EditorInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V -PLandroidx/core/view/inputmethod/EditorInfoCompat;->()V -PLandroidx/core/view/inputmethod/EditorInfoCompat;->setContentMimeTypes(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V -PLandroidx/core/view/inputmethod/InputConnectionCompat$1;->(Landroid/view/inputmethod/InputConnection;ZLandroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)V -PLandroidx/core/view/inputmethod/InputConnectionCompat;->createWrapper(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)Landroid/view/inputmethod/InputConnection; -PLandroidx/core/widget/TextViewCompat$Api17Impl;->setCompoundDrawablesRelative(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V -PLandroidx/core/widget/TextViewCompat$Api23Impl$$ExternalSyntheticApiModelOutline5;->m(Landroid/widget/TextView;Landroid/content/res/ColorStateList;)V -PLandroidx/core/widget/TextViewCompat$Api23Impl;->setCompoundDrawableTintList(Landroid/widget/TextView;Landroid/content/res/ColorStateList;)V -PLandroidx/core/widget/TextViewCompat;->setCompoundDrawableTintList(Landroid/widget/TextView;Landroid/content/res/ColorStateList;)V -PLandroidx/core/widget/TextViewCompat;->setCompoundDrawablesRelative(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V -PLandroidx/core/widget/TextViewCompat;->wrapCustomSelectionActionModeCallback(Landroid/widget/TextView;Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode$Callback; PLandroidx/customview/poolingcontainer/PoolingContainer;->callPoolingContainerOnReleaseForChildren(Landroid/view/ViewGroup;)V -PLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V -PLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->onRelease()V -PLandroidx/customview/view/AbsSavedState$1;->()V -PLandroidx/customview/view/AbsSavedState$2;->()V -PLandroidx/customview/view/AbsSavedState;->()V -PLandroidx/customview/view/AbsSavedState;->()V -PLandroidx/customview/view/AbsSavedState;->(Landroid/os/Parcelable;)V -PLandroidx/customview/view/AbsSavedState;->(Landroidx/customview/view/AbsSavedState$1;)V PLandroidx/customview/view/AbsSavedState;->writeToParcel(Landroid/os/Parcel;I)V -PLandroidx/emoji2/text/EmojiCompat;->updateEditorInfo(Landroid/view/inputmethod/EditorInfo;)V -PLandroidx/emoji2/text/SpannableBuilder;->getSpanEnd(Ljava/lang/Object;)I -PLandroidx/emoji2/text/SpannableBuilder;->getWatcherFor(Ljava/lang/Object;)Landroidx/emoji2/text/SpannableBuilder$WatcherWrapper; -PLandroidx/emoji2/text/SpannableBuilder;->nextSpanTransition(IILjava/lang/Class;)I -PLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; -PLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; -PLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->()V -PLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->updateEditorInfoAttrs(Landroid/view/inputmethod/EditorInfo;)V -PLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V -PLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;)V -PLandroidx/fragment/app/Fragment$Api19Impl;->cancelPendingInputEvents(Landroid/view/View;)V -PLandroidx/fragment/app/Fragment;->getHost()Ljava/lang/Object; PLandroidx/fragment/app/Fragment;->initState()V PLandroidx/fragment/app/Fragment;->onDestroy()V PLandroidx/fragment/app/Fragment;->onDestroyView()V PLandroidx/fragment/app/Fragment;->onDetach()V -PLandroidx/fragment/app/Fragment;->onPause()V -PLandroidx/fragment/app/Fragment;->onSaveInstanceState(Landroid/os/Bundle;)V -PLandroidx/fragment/app/Fragment;->onStop()V PLandroidx/fragment/app/Fragment;->performDestroy()V PLandroidx/fragment/app/Fragment;->performDestroyView()V PLandroidx/fragment/app/Fragment;->performDetach()V -PLandroidx/fragment/app/Fragment;->performPause()V -PLandroidx/fragment/app/Fragment;->performSaveInstanceState(Landroid/os/Bundle;)V -PLandroidx/fragment/app/Fragment;->performStop()V -PLandroidx/fragment/app/Fragment;->requireArguments()Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentActivity$$ExternalSyntheticLambda0;->saveState()Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onFindViewById(I)Landroid/view/View; -PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onGetHost()Landroidx/fragment/app/FragmentActivity; -PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onGetHost()Ljava/lang/Object; -PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onHasView()Z -PLandroidx/fragment/app/FragmentActivity;->$r8$lambda$t3WwJ1XbNlapyNW0l552nMkkXdo(Landroidx/fragment/app/FragmentActivity;)Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentActivity;->lambda$init$0()Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentActivity;->supportPostponeEnterTransition()V -PLandroidx/fragment/app/FragmentActivity;->supportStartPostponedEnterTransition()V PLandroidx/fragment/app/FragmentContainerView;->addDisappearingFragmentView(Landroid/view/View;)V -PLandroidx/fragment/app/FragmentContainerView;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -PLandroidx/fragment/app/FragmentContainerView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/fragment/app/FragmentContainerView;->removeView(Landroid/view/View;)V PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentDestroyed(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentDetached(Landroidx/fragment/app/Fragment;Z)V -PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentPaused(Landroidx/fragment/app/Fragment;Z)V -PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentSaveInstanceState(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V -PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentStopped(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentViewDestroyed(Landroidx/fragment/app/Fragment;Z)V -PLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda4;->saveState()Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentManager$6;->(Landroidx/fragment/app/FragmentManager;Ljava/lang/String;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/Lifecycle;)V -PLandroidx/fragment/app/FragmentManager$6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V -PLandroidx/fragment/app/FragmentManager$LifecycleAwareResultListener;->(Landroidx/lifecycle/Lifecycle;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/LifecycleEventObserver;)V -PLandroidx/fragment/app/FragmentManager;->$r8$lambda$sido8p6zuWx0PQxIkv4qM-BRiGM(Landroidx/fragment/app/FragmentManager;)Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentManager;->access$000(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; PLandroidx/fragment/app/FragmentManager;->access$100(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; PLandroidx/fragment/app/FragmentManager;->dispatchDestroyView()V -PLandroidx/fragment/app/FragmentManager;->forcePostponedTransactions()V PLandroidx/fragment/app/FragmentManager;->isDestroyed()Z -PLandroidx/fragment/app/FragmentManager;->lambda$attachController$4()Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentManager;->setFragmentResultListener(Ljava/lang/String;Landroidx/lifecycle/LifecycleOwner;Landroidx/fragment/app/FragmentResultListener;)V -PLandroidx/fragment/app/FragmentManagerState$1;->()V -PLandroidx/fragment/app/FragmentManagerState;->()V -PLandroidx/fragment/app/FragmentManagerState;->()V PLandroidx/fragment/app/FragmentManagerState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigState(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigStateInternal(Ljava/lang/String;)V PLandroidx/fragment/app/FragmentManagerViewModel;->shouldDestroy(Landroidx/fragment/app/Fragment;)Z -PLandroidx/fragment/app/FragmentState$1;->()V -PLandroidx/fragment/app/FragmentState;->()V -PLandroidx/fragment/app/FragmentState;->(Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/fragment/app/FragmentStateManager;->destroy()V PLandroidx/fragment/app/FragmentStateManager;->destroyFragmentView()V PLandroidx/fragment/app/FragmentStateManager;->detach()V -PLandroidx/fragment/app/FragmentStateManager;->isFragmentViewChild(Landroid/view/View;)Z -PLandroidx/fragment/app/FragmentStateManager;->pause()V -PLandroidx/fragment/app/FragmentStateManager;->saveState()Landroid/os/Bundle; -PLandroidx/fragment/app/FragmentStateManager;->saveViewState()V -PLandroidx/fragment/app/FragmentStateManager;->stop()V -PLandroidx/fragment/app/FragmentStore;->getAllSavedState()Ljava/util/HashMap; PLandroidx/fragment/app/FragmentStore;->makeInactive(Landroidx/fragment/app/FragmentStateManager;)V -PLandroidx/fragment/app/FragmentStore;->saveActiveFragments()Ljava/util/ArrayList; -PLandroidx/fragment/app/FragmentStore;->saveAddedFragments()Ljava/util/ArrayList; -PLandroidx/fragment/app/FragmentTransaction;->replace(ILandroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentTransaction; -PLandroidx/fragment/app/FragmentViewLifecycleOwner;->performSave(Landroid/os/Bundle;)V -PLandroidx/fragment/app/FragmentViewLifecycleOwner;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V PLandroidx/fragment/app/SpecialEffectsController;->enqueueRemove(Landroidx/fragment/app/FragmentStateManager;)V -PLandroidx/fragment/app/SpecialEffectsController;->forcePostponedExecutePendingOperations()V PLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onDestroy(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V -PLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onPause(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V -PLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onStop(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V -PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V -PLandroidx/lifecycle/LifecycleRegistry;->markState(Landroidx/lifecycle/Lifecycle$State;)V PLandroidx/lifecycle/LiveData$LifecycleBoundObserver;->detachObserver()V -PLandroidx/lifecycle/MediatorLiveData;->onInactive()V -PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V -PLandroidx/lifecycle/SavedStateHandlesProvider;->saveState()Landroid/os/Bundle; -PLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/Map; +PLandroidx/lifecycle/ViewModel;->closeWithRuntimeException(Ljava/lang/Object;)V PLandroidx/loader/app/LoaderManager;->()V PLandroidx/loader/app/LoaderManager;->getInstance(Landroidx/lifecycle/LifecycleOwner;)Landroidx/loader/app/LoaderManager; PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel$1;->()V @@ -33618,131 +37286,18 @@ PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;->onCleared()V PLandroidx/loader/app/LoaderManagerImpl;->()V PLandroidx/loader/app/LoaderManagerImpl;->(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/ViewModelStore;)V PLandroidx/loader/app/LoaderManagerImpl;->markForRedelivery()V -PLandroidx/media3/common/util/ListenerSet$ListenerHolder;->release(Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V -PLandroidx/media3/common/util/ListenerSet;->release()V -PLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper()Landroid/os/Handler; -PLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper(Landroid/os/Handler$Callback;)Landroid/os/Handler; -PLandroidx/media3/common/util/Util;->getStreamTypeForAudioUsage(I)I -PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline1;->m(I)Landroid/media/AudioFocusRequest$Builder; -PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline2;->m()V -PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline3;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder; -PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline5;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder; -PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline6;->m(Landroid/media/AudioFocusRequest$Builder;)Landroid/media/AudioFocusRequest; -PLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$CodecKey;->equals(Ljava/lang/Object;)Z -PLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V -PLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->run()V -PLandroidx/media3/session/ConnectedControllersManager;->$r8$lambda$Vom81RksdvuIVXyQfAu6pd1M7BY(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V -PLandroidx/media3/session/ConnectedControllersManager;->isSessionCommandAvailable(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;)Z -PLandroidx/media3/session/ConnectedControllersManager;->lambda$removeController$0(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V -PLandroidx/media3/session/ConnectedControllersManager;->removeController(Landroidx/media3/session/MediaSession$ControllerInfo;)V -PLandroidx/media3/session/ConnectedControllersManager;->removeController(Ljava/lang/Object;)V -PLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaController;)V -PLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V -PLandroidx/media3/session/MediaController$Builder$1;->onDisconnected(Landroidx/media3/session/MediaController;)V -PLandroidx/media3/session/MediaController$Listener$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaController$Listener;Landroidx/media3/session/MediaController;)V -PLandroidx/media3/session/MediaController;->$r8$lambda$7Poy_IVrU20FjlOzoqG4RzKma48(Landroidx/media3/session/MediaController;Landroidx/media3/session/MediaController$Listener;)V PLandroidx/media3/session/MediaController;->createDisconnectedFuture()Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaController;->lambda$release$0(Landroidx/media3/session/MediaController$Listener;)V -PLandroidx/media3/session/MediaController;->release()V -PLandroidx/media3/session/MediaController;->runOnApplicationLooper(Ljava/lang/Runnable;)V -PLandroidx/media3/session/MediaController;->sendCustomCommand(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda41;->(Landroidx/media3/session/MediaControllerImplBase;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)V -PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda41;->run(Landroidx/media3/session/IMediaSession;I)V -PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda81;->(Landroidx/media3/session/MediaControllerImplBase;)V PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda81;->run()V -PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda82;->(Landroidx/media3/session/MediaControllerImplBase;I)V -PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda82;->run()V -PLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;->release()V -PLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$8ePI85Zvn-Y2ZOUzRdQ90F2A8_A(Landroidx/media3/session/MediaControllerImplBase;I)V -PLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$mXQX_Ogg1Zjg5n58ylw_9v5Iv2Y(Landroidx/media3/session/MediaControllerImplBase;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/IMediaSession;I)V PLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$tIEgcrLv3SECRV9I_ggVsbUKXeY(Landroidx/media3/session/MediaControllerImplBase;)V -PLandroidx/media3/session/MediaControllerImplBase;->dispatchRemoteSessionTask(Landroidx/media3/session/IMediaSession;Landroidx/media3/session/MediaControllerImplBase$RemoteSessionTask;Z)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaControllerImplBase;->dispatchRemoteSessionTaskWithSessionCommand(Landroidx/media3/session/SessionCommand;Landroidx/media3/session/MediaControllerImplBase$RemoteSessionTask;)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaControllerImplBase;->dispatchRemoteSessionTaskWithSessionCommandInternal(ILandroidx/media3/session/SessionCommand;Landroidx/media3/session/MediaControllerImplBase$RemoteSessionTask;)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaControllerImplBase;->getSessionInterfaceWithSessionCommandIfAble(Landroidx/media3/session/SessionCommand;)Landroidx/media3/session/IMediaSession; PLandroidx/media3/session/MediaControllerImplBase;->lambda$release$4()V -PLandroidx/media3/session/MediaControllerImplBase;->lambda$sendCustomCommand$21(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/IMediaSession;I)V -PLandroidx/media3/session/MediaControllerImplBase;->lambda$setFutureResult$83(I)V -PLandroidx/media3/session/MediaControllerImplBase;->release()V -PLandroidx/media3/session/MediaControllerImplBase;->sendCustomCommand(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaControllerImplBase;->setFutureResult(ILjava/lang/Object;)V PLandroidx/media3/session/MediaControllerStub;->destroy()V -PLandroidx/media3/session/MediaControllerStub;->onSessionResult(ILandroid/os/Bundle;)V -PLandroidx/media3/session/MediaControllerStub;->setControllerFutureResult(ILjava/lang/Object;)V -PLandroidx/media3/session/MediaSession$Callback$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaSession$Callback;Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V -PLandroidx/media3/session/MediaSessionImpl;->onCustomCommandOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaSessionImpl;->onDisconnectedOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->run()V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda25;->(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda25;->run(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Ljava/lang/Object; -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda68;->(Landroidx/media3/session/MediaSessionStub$SessionTask;)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda68;->run(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Ljava/lang/Object; -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda72;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;IILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda72;->run()V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda76;->(Landroidx/media3/session/MediaSession$ControllerInfo;I)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda76;->accept(Ljava/lang/Object;)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda81;->(Landroidx/media3/session/MediaSessionImpl;Lcom/google/common/util/concurrent/SettableFuture;Landroidx/media3/common/util/Consumer;Lcom/google/common/util/concurrent/ListenableFuture;)V -PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda81;->run()V -PLandroidx/media3/session/MediaSessionStub$Controller2Cb;->onSessionResult(ILandroidx/media3/session/SessionResult;)V -PLandroidx/media3/session/MediaSessionStub;->$r8$lambda$RagmTrsP9kOCYea3J9OJn28bc5c(Landroidx/media3/session/MediaSession$ControllerInfo;ILcom/google/common/util/concurrent/ListenableFuture;)V -PLandroidx/media3/session/MediaSessionStub;->$r8$lambda$Uz2_vcr_OU9Iuz1uNRDrsZj31fE(Landroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaSessionStub;->$r8$lambda$VrGmk0e1imzW80ACT-qbuXd3aCA(Landroidx/media3/session/MediaSessionImpl;Lcom/google/common/util/concurrent/SettableFuture;Landroidx/media3/common/util/Consumer;Lcom/google/common/util/concurrent/ListenableFuture;)V -PLandroidx/media3/session/MediaSessionStub;->$r8$lambda$g1w8aI30ygWD3xJmF-4pacDXEWs(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaSessionStub;->$r8$lambda$p6L8lBmsKUAaiq4jQwn1KSWoNSE(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V -PLandroidx/media3/session/MediaSessionStub;->$r8$lambda$r3ns0uu-mjbAk0TkMAI7ay4cBrI(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;IILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;)V -PLandroidx/media3/session/MediaSessionStub;->dispatchSessionTaskWithSessionCommand(Landroidx/media3/session/IMediaController;ILandroidx/media3/session/SessionCommand;ILandroidx/media3/session/MediaSessionStub$SessionTask;)V -PLandroidx/media3/session/MediaSessionStub;->dispatchSessionTaskWithSessionCommand(Landroidx/media3/session/IMediaController;ILandroidx/media3/session/SessionCommand;Landroidx/media3/session/MediaSessionStub$SessionTask;)V -PLandroidx/media3/session/MediaSessionStub;->handleSessionTaskWhenReady(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;ILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/common/util/Consumer;)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaSessionStub;->lambda$dispatchSessionTaskWithSessionCommand$15(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;IILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;)V -PLandroidx/media3/session/MediaSessionStub;->lambda$handleSessionTaskWhenReady$16(Landroidx/media3/session/MediaSessionImpl;Lcom/google/common/util/concurrent/SettableFuture;Landroidx/media3/common/util/Consumer;Lcom/google/common/util/concurrent/ListenableFuture;)V -PLandroidx/media3/session/MediaSessionStub;->lambda$onCustomCommand$25(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaSessionStub;->lambda$release$19(Landroidx/media3/session/IMediaController;)V -PLandroidx/media3/session/MediaSessionStub;->lambda$sendSessionResultWhenReady$2(Landroidx/media3/session/MediaSession$ControllerInfo;ILcom/google/common/util/concurrent/ListenableFuture;)V -PLandroidx/media3/session/MediaSessionStub;->lambda$sendSessionResultWhenReady$3(Landroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; -PLandroidx/media3/session/MediaSessionStub;->onCustomCommand(Landroidx/media3/session/IMediaController;ILandroid/os/Bundle;Landroid/os/Bundle;)V -PLandroidx/media3/session/MediaSessionStub;->release(Landroidx/media3/session/IMediaController;I)V -PLandroidx/media3/session/MediaSessionStub;->sendSessionResult(Landroidx/media3/session/MediaSession$ControllerInfo;ILandroidx/media3/session/SessionResult;)V -PLandroidx/media3/session/MediaSessionStub;->sendSessionResultWhenReady(Landroidx/media3/session/MediaSessionStub$SessionTask;)Landroidx/media3/session/MediaSessionStub$SessionTask; -PLandroidx/media3/session/SequencedFutureManager;->lazyRelease(JLjava/lang/Runnable;)V -PLandroidx/media3/session/SequencedFutureManager;->release()V -PLandroidx/media3/session/SessionCommand;->equals(Ljava/lang/Object;)Z -PLandroidx/media3/session/SessionCommands;->contains(Landroidx/media3/session/SessionCommand;)Z -PLandroidx/media3/ui/AspectRatioFrameLayout$AspectRatioUpdateDispatcher;->(Landroidx/media3/ui/AspectRatioFrameLayout;)V -PLandroidx/media3/ui/AspectRatioFrameLayout$AspectRatioUpdateDispatcher;->(Landroidx/media3/ui/AspectRatioFrameLayout;Landroidx/media3/ui/AspectRatioFrameLayout$1;)V -PLandroidx/media3/ui/AspectRatioFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLandroidx/media3/ui/AspectRatioFrameLayout;->onMeasure(II)V -PLandroidx/media3/ui/AspectRatioFrameLayout;->setResizeMode(I)V -PLandroidx/media3/ui/PlayerView$ComponentListener;->(Landroidx/media3/ui/PlayerView;)V -PLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLandroidx/media3/ui/PlayerView;->setResizeMode(I)V -PLandroidx/media3/ui/PlayerView;->setResizeModeRaw(Landroidx/media3/ui/AspectRatioFrameLayout;I)V -PLandroidx/media3/ui/PlayerView;->updateContentDescription()V -PLandroidx/media3/ui/R$styleable;->()V -PLandroidx/navigation/NavBackStackEntry;->saveState(Landroid/os/Bundle;)V -PLandroidx/navigation/NavBackStackEntryState$Companion$CREATOR$1;->()V -PLandroidx/navigation/NavBackStackEntryState$Companion;->()V -PLandroidx/navigation/NavBackStackEntryState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLandroidx/navigation/NavBackStackEntryState;->()V -PLandroidx/navigation/NavBackStackEntryState;->(Landroidx/navigation/NavBackStackEntry;)V PLandroidx/navigation/NavBackStackEntryState;->writeToParcel(Landroid/os/Parcel;I)V -PLandroidx/navigation/NavController;->removeOnDestinationChangedListener(Landroidx/navigation/NavController$OnDestinationChangedListener;)V -PLandroidx/navigation/NavController;->saveState()Landroid/os/Bundle; PLandroidx/navigation/NavControllerViewModel;->onCleared()V -PLandroidx/navigation/Navigator;->onSaveState()Landroid/os/Bundle; PLandroidx/navigation/fragment/FragmentNavigator$ClearEntryStateViewModel;->getCompleteTransition()Ljava/lang/ref/WeakReference; PLandroidx/navigation/fragment/FragmentNavigator$ClearEntryStateViewModel;->onCleared()V PLandroidx/navigation/fragment/FragmentNavigator$sam$androidx_lifecycle_Observer$0;->equals(Ljava/lang/Object;)Z PLandroidx/navigation/fragment/FragmentNavigator$sam$androidx_lifecycle_Observer$0;->getFunctionDelegate()Lkotlin/Function; -PLandroidx/navigation/fragment/FragmentNavigator;->onSaveState()Landroid/os/Bundle; -PLandroidx/navigation/fragment/NavHostFragment$navHostController$2$$ExternalSyntheticLambda0;->saveState()Landroid/os/Bundle; -PLandroidx/navigation/fragment/NavHostFragment$navHostController$2$$ExternalSyntheticLambda1;->saveState()Landroid/os/Bundle; -PLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->$r8$lambda$S8rYz5PdxQ_qmpQw5Wg04g8YyYI(Landroidx/navigation/fragment/NavHostFragment;)Landroid/os/Bundle; -PLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->$r8$lambda$yvpdz-7lzmuHOSkQDGqC7TUxHHI(Landroidx/navigation/NavHostController;)Landroid/os/Bundle; -PLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->invoke$lambda$5$lambda$2(Landroidx/navigation/NavHostController;)Landroid/os/Bundle; -PLandroidx/navigation/fragment/NavHostFragment$navHostController$2;->invoke$lambda$5$lambda$4(Landroidx/navigation/fragment/NavHostFragment;)Landroid/os/Bundle; PLandroidx/navigation/fragment/NavHostFragment;->onDestroyView()V -PLandroidx/navigation/fragment/NavHostFragment;->onSaveInstanceState(Landroid/os/Bundle;)V PLandroidx/profileinstaller/ProfileInstallReceiver$$ExternalSyntheticLambda0;->()V PLandroidx/profileinstaller/ProfileInstaller$1;->()V PLandroidx/profileinstaller/ProfileInstaller$1;->onResultReceived(ILjava/lang/Object;)V @@ -33771,15 +37326,15 @@ PLandroidx/recyclerview/widget/AdapterListUpdateCallback;->onChanged(IILjava/lan PLandroidx/recyclerview/widget/AsyncDifferConfig;->getDiffCallback()Landroidx/recyclerview/widget/DiffUtil$ItemCallback; PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areContentsTheSame(II)Z PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areItemsTheSame(II)Z -PLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z +PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getChangePayload(II)Ljava/lang/Object; +PLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onChanged(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/ChildHelper;->removeViewAt(I)V -PLandroidx/recyclerview/widget/ConversationLayoutManager$Companion;->()V -PLandroidx/recyclerview/widget/ConversationLayoutManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLandroidx/recyclerview/widget/ConversationLayoutManager;->()V -PLandroidx/recyclerview/widget/ConversationLayoutManager;->(Landroid/content/Context;)V -PLandroidx/recyclerview/widget/ConversationLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V -PLandroidx/recyclerview/widget/ConversationLayoutManager;->scrollToPositionWithOffset(IILkotlin/jvm/functions/Function0;)V -PLandroidx/recyclerview/widget/ConversationLayoutManager;->supportsPredictiveItemAnimations()Z +PLandroidx/recyclerview/widget/ConcatAdapter;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +PLandroidx/recyclerview/widget/ConcatAdapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/recyclerview/widget/ConcatAdapter;->onViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/recyclerview/widget/ConcatAdapterController;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +PLandroidx/recyclerview/widget/ConcatAdapterController;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/recyclerview/widget/ConcatAdapterController;->onViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->get(I)I PLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->set(II)V PLandroidx/recyclerview/widget/DiffUtil$Range;->()V @@ -33788,77 +37343,34 @@ PLandroidx/recyclerview/widget/DiffUtil$Snake;->()V PLandroidx/recyclerview/widget/DiffUtil$Snake;->diagonalSize()I PLandroidx/recyclerview/widget/DiffUtil$Snake;->hasAdditionOrRemoval()Z PLandroidx/recyclerview/widget/DiffUtil$Snake;->toDiagonal()Landroidx/recyclerview/widget/DiffUtil$Diagonal; +PLandroidx/recyclerview/widget/DiffUtil;->backward(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;I)Landroidx/recyclerview/widget/DiffUtil$Snake; PLandroidx/recyclerview/widget/DiffUtil;->forward(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;I)Landroidx/recyclerview/widget/DiffUtil$Snake; PLandroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;->lastPrefetchIncludedPosition(I)Z PLandroidx/recyclerview/widget/GapWorker;->remove(Landroidx/recyclerview/widget/RecyclerView;)V -PLandroidx/recyclerview/widget/ItemTouchHelper$2;->onInterceptTouchEvent(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/MotionEvent;)Z -PLandroidx/recyclerview/widget/ItemTouchHelper$ItemTouchHelperGestureListener;->onDown(Landroid/view/MotionEvent;)Z PLandroidx/recyclerview/widget/ItemTouchHelper;->endRecoverAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Z)V -PLandroidx/recyclerview/widget/ItemTouchHelper;->findAnimation(Landroid/view/MotionEvent;)Landroidx/recyclerview/widget/ItemTouchHelper$RecoverAnimation; -PLandroidx/recyclerview/widget/ItemTouchHelper;->obtainVelocityTracker()V PLandroidx/recyclerview/widget/ItemTouchHelper;->onChildViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/recyclerview/widget/ItemTouchHelper;->removeChildDrawingOrderCallbackIfNecessary(Landroid/view/View;)V -PLandroidx/recyclerview/widget/ItemTouchHelper;->select(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V -PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState$1;->()V -PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->()V -PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->()V PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->invalidateAnchor()V PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->writeToParcel(Landroid/os/Parcel;I)V -PLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I PLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToEnd()Landroid/view/View; -PLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToStart()Landroid/view/View; PLandroidx/recyclerview/widget/LinearLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V -PLandroidx/recyclerview/widget/LinearLayoutManager;->onSaveInstanceState()Landroid/os/Parcelable; -PLandroidx/recyclerview/widget/LinearLayoutManager;->scrollToPositionWithOffset(II)V -PLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedEnd(Landroid/view/View;)I -PLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedStart(Landroid/view/View;)I -PLandroidx/recyclerview/widget/OrientationHelper;->getTotalSpaceChange()I PLandroidx/recyclerview/widget/RecyclerView$5;->removeViewAt(I)V PLandroidx/recyclerview/widget/RecyclerView$6;->markViewHoldersUpdated(IILjava/lang/Object;)V -PLandroidx/recyclerview/widget/RecyclerView$Adapter;->findRelativeAdapterPositionIn(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)I -PLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyDataSetChanged()V +PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -PLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyChanged()V PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->buildAdapterChangeFlagsForAnimations(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->canReuseUpdatedViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->canReuseUpdatedViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Ljava/util/List;)Z PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->recordPreLayoutInformation(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;ILjava/util/List;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; -PLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildAt(I)Landroid/view/View; -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildEnd(Landroid/view/View;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildStart(Landroid/view/View;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentEnd()I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentStart()I PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedRight(Landroid/view/View;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getItemCount()I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLeftDecorationWidth(Landroid/view/View;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRightDecorationWidth(Landroid/view/View;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getSelectionModeForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isLayoutHierarchical(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Z -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAddFocusables(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/ArrayList;II)Z PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;II)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;IILjava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleViewAt(ILandroidx/recyclerview/widget/RecyclerView$Recycler;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeViewAt(I)V -PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->stopSmoothScroller()V -PLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->(Landroid/view/ViewGroup$MarginLayoutParams;)V -PLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->detach()V -PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->detachForPoolingContainer(Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->putRecycledView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->setMaxRecycledViews(II)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->addViewHolderToRecycledViewPool(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Z)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->dispatchViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->onDetachedFromWindow()V @@ -33867,12 +37379,7 @@ PLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleCachedViewAt(I)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleView(Landroid/view/View;)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleViewHolderInternal(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->viewRangeUpdate(II)V -PLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onChanged()V -PLandroidx/recyclerview/widget/RecyclerView$SavedState$1;->()V -PLandroidx/recyclerview/widget/RecyclerView$SavedState;->()V -PLandroidx/recyclerview/widget/RecyclerView$SavedState;->(Landroid/os/Parcelable;)V PLandroidx/recyclerview/widget/RecyclerView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V -PLandroidx/recyclerview/widget/RecyclerView$SimpleOnItemTouchListener;->()V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addChangePayload(Ljava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->doesTransientStatePreventRecycling()Z PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getOldPosition()I @@ -33880,91 +37387,24 @@ PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRecyclable()Z PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->resetInternal()V PLandroidx/recyclerview/widget/RecyclerView;->access$300(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V PLandroidx/recyclerview/widget/RecyclerView;->access$400(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)V -PLandroidx/recyclerview/widget/RecyclerView;->addFocusables(Ljava/util/ArrayList;II)V PLandroidx/recyclerview/widget/RecyclerView;->animateChange(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;ZZ)V PLandroidx/recyclerview/widget/RecyclerView;->canReuseUpdatedViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/RecyclerView;->clearNestedRecyclerViewIfNotNested(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I -PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I -PLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I PLandroidx/recyclerview/widget/RecyclerView;->dispatchChildDetached(Landroid/view/View;)V -PLandroidx/recyclerview/widget/RecyclerView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V -PLandroidx/recyclerview/widget/RecyclerView;->findInterceptingOnItemTouchListener(Landroid/view/MotionEvent;)Z -PLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams; -PLandroidx/recyclerview/widget/RecyclerView;->getItemAnimator()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; -PLandroidx/recyclerview/widget/RecyclerView;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; -PLandroidx/recyclerview/widget/RecyclerView;->invalidateItemDecorations()V PLandroidx/recyclerview/widget/RecyclerView;->onChildDetachedFromWindow(Landroid/view/View;)V PLandroidx/recyclerview/widget/RecyclerView;->onDetachedFromWindow()V -PLandroidx/recyclerview/widget/RecyclerView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z -PLandroidx/recyclerview/widget/RecyclerView;->onSaveInstanceState()Landroid/os/Parcelable; PLandroidx/recyclerview/widget/RecyclerView;->removeOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V -PLandroidx/recyclerview/widget/RecyclerView;->setEdgeEffectFactory(Landroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory;)V -PLandroidx/recyclerview/widget/RecyclerView;->setHasFixedSize(Z)V -PLandroidx/recyclerview/widget/RecyclerView;->startNestedScroll(II)Z -PLandroidx/recyclerview/widget/RecyclerView;->stopGlowAnimations(Landroid/view/MotionEvent;)Z PLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll()V -PLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll(I)V -PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +PLandroidx/recyclerview/widget/RecyclerView;->viewRangeUpdate(IILjava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAndRemoveOriginalDelegateForItem(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat; -PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V -PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V -PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->sendAccessibilityEvent(Landroid/view/View;I)V -PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V -PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V PLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->drainCache()V PLandroidx/recyclerview/widget/ViewInfoStore;->addToOldChangeHolders(JLandroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/recyclerview/widget/ViewInfoStore;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/ViewInfoStore;->onDetach()V PLandroidx/recyclerview/widget/ViewInfoStore;->popFromPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; PLandroidx/recyclerview/widget/ViewInfoStore;->popFromPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; PLandroidx/recyclerview/widget/ViewInfoStore;->removeViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -PLandroidx/savedstate/SavedStateRegistry;->performSave(Landroid/os/Bundle;)V -PLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V -PLcom/airbnb/lottie/LottieAnimationView$SavedState$1;->()V -PLcom/airbnb/lottie/LottieAnimationView$SavedState;->()V -PLcom/airbnb/lottie/LottieAnimationView$SavedState;->(Landroid/os/Parcelable;)V PLcom/airbnb/lottie/LottieAnimationView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V -PLcom/airbnb/lottie/LottieAnimationView;->addValueCallback(Lcom/airbnb/lottie/model/KeyPath;Ljava/lang/Object;Lcom/airbnb/lottie/value/LottieValueCallback;)V -PLcom/airbnb/lottie/LottieAnimationView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V -PLcom/airbnb/lottie/LottieAnimationView;->onSaveInstanceState()Landroid/os/Parcelable; -PLcom/airbnb/lottie/LottieDrawable;->getImageAssetsFolder()Ljava/lang/String; -PLcom/airbnb/lottie/LottieDrawable;->getProgress()F -PLcom/airbnb/lottie/LottieDrawable;->getRepeatCount()I -PLcom/airbnb/lottie/LottieDrawable;->getRepeatMode()I -PLcom/airbnb/lottie/LottieDrawable;->isAnimatingOrWillAnimateOnVisible()Z -PLcom/airbnb/lottie/animation/keyframe/PathKeyframeAnimation;->(Ljava/util/List;)V -PLcom/airbnb/lottie/model/layer/BaseLayer;->removeAnimation(Lcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation;)V -PLcom/airbnb/lottie/parser/JsonUtils;->jsonArrayToPoint(Lcom/airbnb/lottie/parser/moshi/JsonReader;F)Landroid/graphics/PointF; -PLcom/airbnb/lottie/utils/Utils;->createPath(Landroid/graphics/PointF;Landroid/graphics/PointF;Landroid/graphics/PointF;Landroid/graphics/PointF;)Landroid/graphics/Path; -PLcom/airbnb/lottie/value/LottieValueCallback;->(Ljava/lang/Object;)V -PLcom/annimon/stream/IntStream$1;->()V -PLcom/annimon/stream/IntStream$5;->()V -PLcom/annimon/stream/IntStream;->()V -PLcom/annimon/stream/IntStream;->(Lcom/annimon/stream/internal/Params;Lcom/annimon/stream/iterator/PrimitiveIterator$OfInt;)V -PLcom/annimon/stream/IntStream;->(Lcom/annimon/stream/iterator/PrimitiveIterator$OfInt;)V -PLcom/annimon/stream/IntStream;->boxed()Lcom/annimon/stream/Stream; -PLcom/annimon/stream/IntStream;->of(I)Lcom/annimon/stream/IntStream; -PLcom/annimon/stream/IntStream;->rangeClosed(II)Lcom/annimon/stream/IntStream; -PLcom/annimon/stream/Optional;->empty()Lcom/annimon/stream/Optional; -PLcom/annimon/stream/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object; -PLcom/annimon/stream/Stream;->empty()Lcom/annimon/stream/Stream; -PLcom/annimon/stream/Stream;->limit(J)Lcom/annimon/stream/Stream; -PLcom/annimon/stream/Stream;->max(Ljava/util/Comparator;)Lcom/annimon/stream/Optional; -PLcom/annimon/stream/Stream;->rangeClosed(II)Lcom/annimon/stream/Stream; -PLcom/annimon/stream/Stream;->reduce(Lcom/annimon/stream/function/BiFunction;)Lcom/annimon/stream/Optional; -PLcom/annimon/stream/function/BinaryOperator$Util$2;->(Ljava/util/Comparator;)V -PLcom/annimon/stream/function/BinaryOperator$Util;->maxBy(Ljava/util/Comparator;)Lcom/annimon/stream/function/BinaryOperator; -PLcom/annimon/stream/iterator/PrimitiveIterator$OfInt;->()V -PLcom/annimon/stream/iterator/PrimitiveIterator$OfInt;->next()Ljava/lang/Integer; -PLcom/annimon/stream/iterator/PrimitiveIterator$OfInt;->next()Ljava/lang/Object; -PLcom/annimon/stream/operator/IntArray;->([I)V -PLcom/annimon/stream/operator/IntArray;->hasNext()Z -PLcom/annimon/stream/operator/IntArray;->nextInt()I -PLcom/annimon/stream/operator/IntRangeClosed;->(II)V -PLcom/annimon/stream/operator/IntRangeClosed;->hasNext()Z -PLcom/annimon/stream/operator/IntRangeClosed;->nextInt()I -PLcom/annimon/stream/operator/ObjLimit;->(Ljava/util/Iterator;J)V -PLcom/annimon/stream/operator/ObjLimit;->hasNext()Z PLcom/bumptech/glide/Glide;->unregisterRequestManager(Lcom/bumptech/glide/RequestManager;)V PLcom/bumptech/glide/RequestManager;->onDestroy()V PLcom/bumptech/glide/load/Options;->equals(Ljava/lang/Object;)Z @@ -33975,7 +37415,6 @@ PLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->equals(Ljava/ PLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onDestroy()V PLcom/bumptech/glide/manager/LifecycleLifecycle;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -PLcom/bumptech/glide/manager/LifecycleLifecycle;->onStop(Landroidx/lifecycle/LifecycleOwner;)V PLcom/bumptech/glide/manager/LifecycleLifecycle;->removeListener(Lcom/bumptech/glide/manager/LifecycleListener;)V PLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->onDestroy()V PLcom/bumptech/glide/manager/RequestTracker;->clearAndRemove(Lcom/bumptech/glide/request/Request;)Z @@ -33987,11 +37426,9 @@ PLcom/bumptech/glide/manager/TargetTracker;->untrack(Lcom/bumptech/glide/request PLcom/bumptech/glide/request/SingleRequest;->canNotifyCleared()Z PLcom/bumptech/glide/request/SingleRequest;->cancel()V PLcom/bumptech/glide/request/SingleRequest;->clear()V -PLcom/bumptech/glide/request/SingleRequest;->isRunning()Z PLcom/bumptech/glide/request/target/BaseTarget;->onDestroy()V PLcom/bumptech/glide/request/target/BaseTarget;->onLoadCleared(Landroid/graphics/drawable/Drawable;)V PLcom/bumptech/glide/request/target/ImageViewTarget;->onLoadCleared(Landroid/graphics/drawable/Drawable;)V -PLcom/bumptech/glide/request/target/ImageViewTarget;->onStop()V PLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->clearCallbacksAndListener()V PLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->removeCallback(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V PLcom/bumptech/glide/request/target/ViewTarget;->maybeRemoveAttachStateListener()V @@ -34000,523 +37437,324 @@ PLcom/bumptech/glide/request/target/ViewTarget;->removeCallback(Lcom/bumptech/gl PLcom/bumptech/glide/util/MultiClassKey;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/util/Util;->bothNullOrEqual(Ljava/lang/Object;Ljava/lang/Object;)Z PLcom/bumptech/glide/util/Util;->removeCallbacksOnUiThread(Ljava/lang/Runnable;)V -PLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeEndArray()V -PLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeStartArray(Ljava/lang/Object;I)V -PLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->getArrayDelegateCreator()Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams; -PLcom/fasterxml/jackson/databind/deser/std/StdValueInstantiator;->getDelegateCreator()Lcom/fasterxml/jackson/databind/introspect/AnnotatedWithParams; -PLcom/fasterxml/jackson/databind/introspect/CollectorBase;->_emptyAnnotationMap()Lcom/fasterxml/jackson/databind/introspect/AnnotationMap; -PLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V -PLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->serialize([Ljava/lang/String;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V -PLcom/fasterxml/jackson/databind/ser/impl/StringArraySerializer;->serializeContents([Ljava/lang/String;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V -PLcom/fasterxml/jackson/databind/type/CollectionType;->toString()Ljava/lang/String; -PLcom/fasterxml/jackson/databind/type/TypeBindings;->createIfNeeded(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/TypeBindings; -PLcom/fasterxml/jackson/databind/type/TypeFactory;->constructCollectionType(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/CollectionType; -PLcom/fasterxml/jackson/databind/type/TypeFactory;->constructCollectionType(Ljava/lang/Class;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/type/CollectionType; -PLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior$2;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->access$000(Lcom/google/android/material/appbar/AppBarLayout$BaseBehavior;)Z -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->animateOffsetTo(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IF)V -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->animateOffsetWithDuration(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;II)V -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->canDragView(Landroid/view/View;)Z -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->canDragView(Lcom/google/android/material/appbar/AppBarLayout;)Z -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->canScrollChildren(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;)Z -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->checkFlag(II)Z -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->getChildIndexOnOffset(Lcom/google/android/material/appbar/AppBarLayout;I)I -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;Landroid/view/View;II)Z -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;I)V -PLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->snapToChildIfNeeded(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;)V -PLcom/google/android/material/appbar/AppBarLayout$Behavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z -PLcom/google/android/material/appbar/AppBarLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;Landroid/view/View;II)Z -PLcom/google/android/material/appbar/AppBarLayout$Behavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;I)V +PLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->_asSet([Ljava/lang/String;)Ljava/util/Set; +PLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->_empty(Ljava/util/Set;ZZZZ)Z +PLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->construct(Ljava/util/Set;ZZZZ)Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value; +PLcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value;->from(Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties;)Lcom/fasterxml/jackson/annotation/JsonIgnoreProperties$Value; +PLcom/fasterxml/jackson/core/Base64Variant;->encodeBase64Chunk(I[CI)I +PLcom/fasterxml/jackson/core/Base64Variant;->encodeBase64Partial(II[CI)I +PLcom/fasterxml/jackson/core/Base64Variant;->getMaxLineLength()I +PLcom/fasterxml/jackson/core/Base64Variant;->usesPadding()Z +PLcom/fasterxml/jackson/core/JacksonException;->(Ljava/lang/String;Ljava/lang/Throwable;)V +PLcom/fasterxml/jackson/core/JsonParseException;->(Lcom/fasterxml/jackson/core/JsonParser;Ljava/lang/String;)V +PLcom/fasterxml/jackson/core/JsonParseException;->withRequestPayload(Lcom/fasterxml/jackson/core/util/RequestPayload;)Lcom/fasterxml/jackson/core/JsonParseException; +PLcom/fasterxml/jackson/core/JsonParser;->_constructError(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParseException; +PLcom/fasterxml/jackson/core/JsonProcessingException;->(Ljava/lang/String;Lcom/fasterxml/jackson/core/JsonLocation;)V +PLcom/fasterxml/jackson/core/JsonProcessingException;->(Ljava/lang/String;Lcom/fasterxml/jackson/core/JsonLocation;Ljava/lang/Throwable;)V +PLcom/fasterxml/jackson/core/base/ParserBase;->_getSourceReference()Ljava/lang/Object; +PLcom/fasterxml/jackson/core/base/ParserBase;->_validJsonValueList()Ljava/lang/String; +PLcom/fasterxml/jackson/core/base/ParserMinimalBase;->_getCharDesc(I)Ljava/lang/String; +PLcom/fasterxml/jackson/core/base/ParserMinimalBase;->_reportError(Ljava/lang/String;)V +PLcom/fasterxml/jackson/core/base/ParserMinimalBase;->_reportUnexpectedChar(ILjava/lang/String;)V +PLcom/fasterxml/jackson/core/exc/StreamReadException;->(Lcom/fasterxml/jackson/core/JsonParser;Ljava/lang/String;)V +PLcom/fasterxml/jackson/core/io/IOContext;->getSourceReference()Ljava/lang/Object; +PLcom/fasterxml/jackson/core/io/NumberOutput;->_full3(I[CI)I +PLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_matchFalse()V +PLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_matchTrue()V +PLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeFieldName(Ljava/lang/String;)V +PLcom/fasterxml/jackson/core/json/UTF8JsonGenerator;->writeNumber(I)V +PLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_handleUnexpectedValue(I)Lcom/fasterxml/jackson/core/JsonToken; +PLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getCurrentLocation()Lcom/fasterxml/jackson/core/JsonLocation; +PLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeBinary(Lcom/fasterxml/jackson/core/Base64Variant;[BII)V +PLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeBinary(Lcom/fasterxml/jackson/core/Base64Variant;[BII)V +PLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->writeNumber(I)V +PLcom/fasterxml/jackson/databind/AnnotationIntrospector;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/DeserializationContext;->constructType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType; +PLcom/fasterxml/jackson/databind/DeserializationContext;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/KeyDeserializer; +PLcom/fasterxml/jackson/databind/KeyDeserializer;->()V +PLcom/fasterxml/jackson/databind/cfg/BaseSettings;->getBase64Variant()Lcom/fasterxml/jackson/core/Base64Variant; +PLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->hasKeyDeserializers()Z +PLcom/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig;->keyDeserializers()Ljava/lang/Iterable; +PLcom/fasterxml/jackson/databind/cfg/MapperConfig;->getBase64Variant()Lcom/fasterxml/jackson/core/Base64Variant; +PLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory$ContainerDefaultMappings;->findMapFallback(Lcom/fasterxml/jackson/databind/JavaType;)Ljava/lang/Class; +PLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_findCustomMapDeserializer(Lcom/fasterxml/jackson/databind/type/MapType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; +PLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->_mapAbstractMapType(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/DeserializationConfig;)Lcom/fasterxml/jackson/databind/type/MapType; +PLcom/fasterxml/jackson/databind/deser/BasicDeserializerFactory;->createKeyDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/KeyDeserializer; +PLcom/fasterxml/jackson/databind/deser/BeanDeserializerFactory;->_isSetterlessType(Ljava/lang/Class;)Z +PLcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext;->keyDeserializerInstance(Lcom/fasterxml/jackson/databind/introspect/Annotated;Ljava/lang/Object;)Lcom/fasterxml/jackson/databind/KeyDeserializer; +PLcom/fasterxml/jackson/databind/deser/DeserializerCache;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/deser/DeserializerFactory;Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/KeyDeserializer; +PLcom/fasterxml/jackson/databind/deser/Deserializers$Base;->findMapDeserializer(Lcom/fasterxml/jackson/databind/type/MapType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/JsonDeserializer; +PLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->canCreateFromObjectWith()Z +PLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->canCreateUsingArrayDelegate()Z +PLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->canCreateUsingDelegate()Z +PLcom/fasterxml/jackson/databind/deser/ValueInstantiator;->createFromObjectWith(Lcom/fasterxml/jackson/databind/DeserializationContext;[Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;Lcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;)Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->()V +PLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->()V +PLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->canCreateUsingDefault()Z +PLcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapInstantiator;->createUsingDefault(Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer;->getParameters([Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty;)[Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/deser/ValueInstantiator;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;)V +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->(Lcom/fasterxml/jackson/databind/deser/std/MapDeserializer;Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/util/Set;Ljava/util/Set;)V +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->_isStdKeyDeser(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/KeyDeserializer;)Z +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->_readAndBindStringKeyMap(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/util/Map;)V +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->isCachable()Z +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->resolve(Lcom/fasterxml/jackson/databind/DeserializationContext;)V +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->setIgnorableProperties(Ljava/util/Set;)V +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->setIncludableProperties(Ljava/util/Set;)V +PLcom/fasterxml/jackson/databind/deser/std/MapDeserializer;->withResolved(Lcom/fasterxml/jackson/databind/KeyDeserializer;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/util/Set;Ljava/util/Set;)Lcom/fasterxml/jackson/databind/deser/std/MapDeserializer; +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->()V +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->(Ljava/lang/Class;Ljava/lang/Boolean;)V +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Boolean; +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$BooleanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$DoubleDeserializer;->()V +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$DoubleDeserializer;->(Ljava/lang/Class;Ljava/lang/Double;)V +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$FloatDeserializer;->()V +PLcom/fasterxml/jackson/databind/deser/std/NumberDeserializers$FloatDeserializer;->(Ljava/lang/Class;Ljava/lang/Float;)V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$BooleanDeser;->()V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$DoubleDeser;->()V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$FloatDeser;->()V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$IntDeser;->()V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$IntDeser;->()V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$LongDeser;->()V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers$LongDeser;->()V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers;->(Ljava/lang/Class;)V +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; +PLcom/fasterxml/jackson/databind/deser/std/PrimitiveArrayDeserializers;->forType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JsonDeserializer; +PLcom/fasterxml/jackson/databind/deser/std/StdDeserializer;->isDefaultKeyDeserializer(Lcom/fasterxml/jackson/databind/KeyDeserializer;)Z +PLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD;->()V +PLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD;->(Ljava/lang/Class;)V +PLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD;->forType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer$StringKD; +PLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer;->(ILjava/lang/Class;)V +PLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer;->(ILjava/lang/Class;Lcom/fasterxml/jackson/databind/deser/std/FromStringDeserializer;)V +PLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer;->forType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializer; +PLcom/fasterxml/jackson/databind/deser/std/StdKeyDeserializers;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/DeserializationConfig;Lcom/fasterxml/jackson/databind/BeanDescription;)Lcom/fasterxml/jackson/databind/KeyDeserializer; +PLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->()V +PLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->()V +PLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->(Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;Ljava/lang/Boolean;)V +PLcom/fasterxml/jackson/databind/deser/std/StringArrayDeserializer;->createContextual(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;)Lcom/fasterxml/jackson/databind/JsonDeserializer; +PLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$NCollector;->asAnnotations()Lcom/fasterxml/jackson/databind/util/Annotations; +PLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$OneCollector;->isPresent(Ljava/lang/annotation/Annotation;)Z +PLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$TwoAnnotations;->(Ljava/lang/Class;Ljava/lang/annotation/Annotation;Ljava/lang/Class;Ljava/lang/annotation/Annotation;)V +PLcom/fasterxml/jackson/databind/introspect/AnnotationCollector$TwoAnnotations;->get(Ljava/lang/Class;)Ljava/lang/annotation/Annotation; +PLcom/fasterxml/jackson/databind/introspect/AnnotationIntrospectorPair;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/introspect/JacksonAnnotationIntrospector;->findKeyDeserializer(Lcom/fasterxml/jackson/databind/introspect/Annotated;)Ljava/lang/Object; +PLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Double;->(Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap;Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;)V +PLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Double;->serializerFor(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JsonSerializer; +PLcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap$Single;->newWith(Ljava/lang/Class;Lcom/fasterxml/jackson/databind/JsonSerializer;)Lcom/fasterxml/jackson/databind/ser/impl/PropertySerializerMap; +PLcom/fasterxml/jackson/databind/ser/std/ByteArraySerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V +PLcom/fasterxml/jackson/databind/ser/std/ByteArraySerializer;->serialize([BLcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V +PLcom/fasterxml/jackson/databind/ser/std/NumberSerializers$IntegerSerializer;->serialize(Ljava/lang/Object;Lcom/fasterxml/jackson/core/JsonGenerator;Lcom/fasterxml/jackson/databind/SerializerProvider;)V +PLcom/fasterxml/jackson/databind/type/MapLikeType;->equals(Ljava/lang/Object;)Z +PLcom/fasterxml/jackson/databind/type/PlaceholderForType;->(I)V +PLcom/fasterxml/jackson/databind/type/PlaceholderForType;->actualType()Lcom/fasterxml/jackson/databind/JavaType; +PLcom/fasterxml/jackson/databind/type/PlaceholderForType;->actualType(Lcom/fasterxml/jackson/databind/JavaType;)V +PLcom/fasterxml/jackson/databind/type/PlaceholderForType;->equals(Ljava/lang/Object;)Z +PLcom/fasterxml/jackson/databind/type/TypeBase;->findSuperType(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType; +PLcom/fasterxml/jackson/databind/type/TypeFactory;->_bindingsForSubtype(Lcom/fasterxml/jackson/databind/JavaType;ILjava/lang/Class;Z)Lcom/fasterxml/jackson/databind/type/TypeBindings; +PLcom/fasterxml/jackson/databind/type/TypeFactory;->_resolveTypePlaceholders(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;)Ljava/lang/String; +PLcom/fasterxml/jackson/databind/type/TypeFactory;->_verifyAndResolvePlaceholders(Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/JavaType;)Z PLcom/google/android/material/appbar/AppBarLayout;->clearLiftOnScrollTargetView()V -PLcom/google/android/material/appbar/AppBarLayout;->hasScrollableChildren()Z PLcom/google/android/material/appbar/AppBarLayout;->onDetachedFromWindow()V PLcom/google/android/material/appbar/AppBarLayout;->removeOnOffsetChangedListener(Lcom/google/android/material/appbar/AppBarLayout$BaseOnOffsetChangedListener;)V PLcom/google/android/material/appbar/AppBarLayout;->removeOnOffsetChangedListener(Lcom/google/android/material/appbar/AppBarLayout$OnOffsetChangedListener;)V -PLcom/google/android/material/appbar/AppBarLayout;->setExpanded(ZZ)V -PLcom/google/android/material/appbar/AppBarLayout;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z PLcom/google/android/material/appbar/CollapsingToolbarLayout;->onDetachedFromWindow()V -PLcom/google/android/material/appbar/HeaderBehavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z PLcom/google/android/material/button/MaterialButton$SavedState$1;->()V PLcom/google/android/material/button/MaterialButton$SavedState;->()V PLcom/google/android/material/button/MaterialButton$SavedState;->(Landroid/os/Parcelable;)V -PLcom/google/android/material/button/MaterialButton;->onAttachedToWindow()V PLcom/google/android/material/button/MaterialButton;->onSaveInstanceState()Landroid/os/Parcelable; -PLcom/google/android/material/button/MaterialButton;->refreshDrawableState()V -PLcom/google/android/material/button/MaterialButton;->resetIconDrawable()V -PLcom/google/android/material/button/MaterialButton;->setElevation(F)V -PLcom/google/android/material/button/MaterialButtonHelper;->isBackgroundOverwritten()Z -PLcom/google/android/material/button/MaterialButtonHelper;->isCheckable()Z -PLcom/google/android/material/card/MaterialCardView;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V -PLcom/google/android/material/expandable/ExpandableWidgetHelper;->onSaveInstanceState()Landroid/os/Bundle; PLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onDetachedFromWindow()V -PLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onSaveInstanceState()Landroid/os/Parcelable; PLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->onDetachedFromWindow()V -PLcom/google/android/material/imageview/ShapeableImageView$OutlineProvider;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V -PLcom/google/android/material/imageview/ShapeableImageView;->access$000(Lcom/google/android/material/imageview/ShapeableImageView;)Lcom/google/android/material/shape/ShapeAppearanceModel; -PLcom/google/android/material/imageview/ShapeableImageView;->access$100(Lcom/google/android/material/imageview/ShapeableImageView;)Lcom/google/android/material/shape/MaterialShapeDrawable; -PLcom/google/android/material/imageview/ShapeableImageView;->access$102(Lcom/google/android/material/imageview/ShapeableImageView;Lcom/google/android/material/shape/MaterialShapeDrawable;)Lcom/google/android/material/shape/MaterialShapeDrawable; -PLcom/google/android/material/imageview/ShapeableImageView;->access$200(Lcom/google/android/material/imageview/ShapeableImageView;)Landroid/graphics/RectF; -PLcom/google/android/material/stateful/ExtendableSavedState$1;->()V -PLcom/google/android/material/stateful/ExtendableSavedState;->()V -PLcom/google/android/material/stateful/ExtendableSavedState;->(Landroid/os/Parcelable;)V PLcom/google/android/material/stateful/ExtendableSavedState;->writeToParcel(Landroid/os/Parcel;I)V -PLcom/google/common/collect/Sets$SetView;->()V -PLcom/google/common/collect/Sets$SetView;->(Lcom/google/common/collect/Sets$1;)V -PLcom/google/common/util/concurrent/AbstractFuture$TrustedFuture;->()V -PLcom/google/common/util/concurrent/SettableFuture;->()V -PLcom/google/common/util/concurrent/SettableFuture;->create()Lcom/google/common/util/concurrent/SettableFuture; -PLcom/google/common/util/concurrent/SettableFuture;->set(Ljava/lang/Object;)Z -PLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsnUsingPattern(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNationalSignificantNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->hasValidCountryCallingCode(I)Z -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeAppendFormattedExtension(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V -PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->prefixNumberWithCountryCallingCode(ILcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V -PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getFormat()Ljava/lang/String; -PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPattern(I)Ljava/lang/String; -PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPatternCount()I -PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getNationalPrefixFormattingRule()Ljava/lang/String; -PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getPattern()Ljava/lang/String; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getFixedLine()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getIntlNumberFormatList()Ljava/util/List; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getLeadingDigits()Ljava/lang/String; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNumberFormatList()Ljava/util/List; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPager()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPersonalNumber()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPremiumRate()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSameMobileAndFixedLinePattern()Z -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSharedCost()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getTollFree()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getUan()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoicemail()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoip()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->hasLeadingDigits()Z -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setLeadingDigits(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixTransformRule(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; -PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getNationalNumberPattern()Ljava/lang/String; -PLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->getNationalNumber()J -PLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasExtension()Z -PLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->isItalianLeadingZero()Z -PLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z -PLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->matchNationalNumber(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Z)Z PLcom/pnikosis/materialishprogress/ProgressWheel$WheelSavedState$1;->()V PLcom/pnikosis/materialishprogress/ProgressWheel$WheelSavedState;->()V PLcom/pnikosis/materialishprogress/ProgressWheel$WheelSavedState;->(Landroid/os/Parcelable;)V -PLcom/pnikosis/materialishprogress/ProgressWheel;->()V PLcom/pnikosis/materialishprogress/ProgressWheel;->onSaveInstanceState()Landroid/os/Parcelable; -PLcom/pnikosis/materialishprogress/ProgressWheel;->onVisibilityChanged(Landroid/view/View;I)V -PLcom/pnikosis/materialishprogress/ProgressWheel;->setBarColor(I)V -PLcom/pnikosis/materialishprogress/ProgressWheel;->setupPaints()V -PLcom/pnikosis/materialishprogress/ProgressWheel;->spin()V -PLcom/pnikosis/materialishprogress/R$styleable;->()V -PLio/reactivex/rxjava3/android/schedulers/HandlerScheduler;->scheduleDirect(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Flowable; -PLio/reactivex/rxjava3/core/Flowable;->filter(Lio/reactivex/rxjava3/functions/Predicate;)Lio/reactivex/rxjava3/core/Flowable; -PLio/reactivex/rxjava3/core/Flowable;->switchMapSingle(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; -PLio/reactivex/rxjava3/core/Flowable;->toObservable()Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Maybe;->()V -PLio/reactivex/rxjava3/core/Maybe;->create(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)Lio/reactivex/rxjava3/core/Maybe; -PLio/reactivex/rxjava3/core/Maybe;->doOnSuccess(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Maybe; -PLio/reactivex/rxjava3/core/Maybe;->empty()Lio/reactivex/rxjava3/core/Maybe; -PLio/reactivex/rxjava3/core/Maybe;->flatMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Maybe; -PLio/reactivex/rxjava3/core/Maybe;->fromCallable(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Maybe; -PLio/reactivex/rxjava3/core/Maybe;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Maybe; -PLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/core/Maybe;->subscribeWith(Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; -PLio/reactivex/rxjava3/core/Observable;->combineLatest(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function3;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->combineLatest(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/BiFunction;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->combineLatestArray([Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->concatArray([Lio/reactivex/rxjava3/core/ObservableSource;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->create(Lio/reactivex/rxjava3/core/ObservableOnSubscribe;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->doOnEach(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->doOnNext(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->elementAtOrError(J)Lio/reactivex/rxjava3/core/Single; -PLio/reactivex/rxjava3/core/Observable;->firstOrError()Lio/reactivex/rxjava3/core/Single; -PLio/reactivex/rxjava3/core/Observable;->flatMapMaybe(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->flatMapMaybe(Lio/reactivex/rxjava3/functions/Function;Z)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->flatMapSingle(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->flatMapSingle(Lio/reactivex/rxjava3/functions/Function;Z)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->fromArray([Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->just(Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->map(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->replay(I)Lio/reactivex/rxjava3/observables/ConnectableObservable; -PLio/reactivex/rxjava3/core/Observable;->skip(J)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->startWithItem(Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->subscribe()Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/core/Observable;->switchMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->switchMap(Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Observable;->take(J)Lio/reactivex/rxjava3/core/Observable; +PLio/reactivex/rxjava3/core/Flowable;->fromFuture(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Flowable; PLio/reactivex/rxjava3/core/Scheduler$PeriodicDirectTask;->dispose()V -PLio/reactivex/rxjava3/core/Scheduler;->scheduleDirect(Ljava/lang/Runnable;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/core/Single;->doOnSuccess(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Single; -PLio/reactivex/rxjava3/core/Single;->flatMapObservable(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; -PLio/reactivex/rxjava3/core/Single;->just(Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Single; -PLio/reactivex/rxjava3/core/Single;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Single; -PLio/reactivex/rxjava3/core/Single;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/core/Single;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/disposables/Disposable; +PLio/reactivex/rxjava3/core/Single;->error(Lio/reactivex/rxjava3/functions/Supplier;)Lio/reactivex/rxjava3/core/Single; +PLio/reactivex/rxjava3/core/Single;->error(Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/Single; +PLio/reactivex/rxjava3/core/Single;->flatMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Single; +PLio/reactivex/rxjava3/core/Single;->fromFuture(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Single; +PLio/reactivex/rxjava3/core/Single;->onErrorResumeNext(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Single; +PLio/reactivex/rxjava3/core/Single;->onErrorReturn(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Single; +PLio/reactivex/rxjava3/core/Single;->toSingle(Lio/reactivex/rxjava3/core/Flowable;)Lio/reactivex/rxjava3/core/Single; PLio/reactivex/rxjava3/disposables/CompositeDisposable;->clear()V -PLio/reactivex/rxjava3/disposables/Disposable$-CC;->disposed()Lio/reactivex/rxjava3/disposables/Disposable; +PLio/reactivex/rxjava3/exceptions/Exceptions;->throwIfFatal(Ljava/lang/Throwable;)V PLio/reactivex/rxjava3/internal/disposables/CancellableDisposable;->dispose()V -PLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->complete(Lio/reactivex/rxjava3/core/MaybeObserver;)V PLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->dispose()V +PLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->error(Ljava/lang/Throwable;Lio/reactivex/rxjava3/core/SingleObserver;)V PLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->dispose()V -PLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->(Lio/reactivex/rxjava3/functions/Function3;)V -PLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/functions/Functions$Array3Func;->apply([Ljava/lang/Object;)Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/functions/Functions;->toFunction(Lio/reactivex/rxjava3/functions/Function3;)Lio/reactivex/rxjava3/functions/Function; -PLio/reactivex/rxjava3/internal/observers/BasicFuseableObserver;->dispose()V -PLio/reactivex/rxjava3/internal/observers/BasicQueueDisposable;->()V -PLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;)V PLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->dispose()V -PLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->hasCustomOnError()Z -PLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/observers/QueueDrainObserver;->cancelled()Z +PLio/reactivex/rxjava3/internal/observers/QueueDrainObserver;->done()Z +PLio/reactivex/rxjava3/internal/observers/QueueDrainObserver;->enter()Z +PLio/reactivex/rxjava3/internal/observers/QueueDrainObserver;->error()Ljava/lang/Throwable; +PLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->(Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->onError(Ljava/lang/Throwable;)V +PLio/reactivex/rxjava3/internal/observers/ResumeSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V PLio/reactivex/rxjava3/internal/operators/flowable/AbstractBackpressureThrottlingSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCombineLatest$CombineLatestCoordinator;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCombineLatest$CombineLatestCoordinator;->cancelAll()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCombineLatest$CombineLatestInnerSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$BaseEmitter;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableCreate$LatestAsyncEmitter;->onUnsubscribed()V -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->(Lio/reactivex/rxjava3/internal/fuseable/ConditionalSubscriber;Lio/reactivex/rxjava3/functions/Predicate;)V -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter$FilterConditionalSubscriber;->tryOnNext(Ljava/lang/Object;)Z -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Predicate;)V -PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFilter;->subscribeActual(Lorg/reactivestreams/Subscriber;)V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture;->(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture;->subscribeActual(Lorg/reactivestreams/Subscriber;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$SubscriberObserver;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableInterval$IntervalSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->cancel()V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->clear()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount$RefCountSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount;->cancel(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount$RefConnection;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount;->timeout(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount$RefConnection;)V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->removeFirst()V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$BoundedReplayBuffer;->setFirst(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$Node;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;->dispose()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$ReplaySubscriber;->dispose()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$ReplaySubscriber;->remove(Lio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay$InnerSubscription;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableReplay;->reset()V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle$SingleElementSubscriber;->(Lio/reactivex/rxjava3/core/SingleObserver;Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle$SingleElementSubscriber;->onError(Ljava/lang/Throwable;)V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle$SingleElementSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle;->(Lio/reactivex/rxjava3/core/Flowable;Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSingleSingle;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn$SubscribeOnSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSwitchMap$SwitchMapSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSwitchMap$SwitchMapSubscriber;->disposeInner()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest$ThrottleLatestSubscriber;->cancel()V -PLio/reactivex/rxjava3/internal/operators/maybe/AbstractMaybeWithUpstream;->(Lio/reactivex/rxjava3/core/MaybeSource;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;)V PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->hasCustomOnError()Z -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->onComplete()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->isDisposed()Z -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onComplete()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Function;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->isDisposed()Z -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Function;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->(Ljava/util/concurrent/Callable;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/core/Scheduler;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onComplete()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->run()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/core/Scheduler;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onAfterTerminate()V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V -PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->(Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->()V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/functions/Function;Z)V PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->disposeInner()V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->drain()V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->request(J)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Function;Z)V -PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->subscribeActual(Lorg/reactivestreams/Subscriber;)V PLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver;->dispose()V PLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver;->disposeInner()V -PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;)V PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->isDisposed()Z -PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;)V -PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;I)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferBoundaryObserver;->onComplete()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver;->accept(Lio/reactivex/rxjava3/core/Observer;Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver;->accept(Lio/reactivex/rxjava3/core/Observer;Ljava/util/Collection;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver;->dispose()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableBufferExactBoundary$BufferExactBoundaryObserver;->onComplete()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;IIZ)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->cancelSources()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->clear(Lio/reactivex/rxjava3/internal/queue/SpscLinkedArrayQueue;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->subscribe([Lio/reactivex/rxjava3/core/ObservableSource;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest;->([Lio/reactivex/rxjava3/core/ObservableSource;Ljava/lang/Iterable;Lio/reactivex/rxjava3/functions/Function;IZ)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;IZ)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->drain()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;ILio/reactivex/rxjava3/internal/util/ErrorMode;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->(Lio/reactivex/rxjava3/core/Observer;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->isDisposed()Z -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->setCancellable(Lio/reactivex/rxjava3/functions/Cancellable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate$CreateEmitter;->setDisposable(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate;->(Lio/reactivex/rxjava3/core/ObservableOnSubscribe;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableCreate;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;JLjava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$ElementAtObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle;->(Lio/reactivex/rxjava3/core/ObservableSource;JLjava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Z)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;Z)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Z)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->drainLoop()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->getOrCreateQueue()Lio/reactivex/rxjava3/internal/queue/SpscLinkedArrayQueue; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;Z)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->(Lio/reactivex/rxjava3/core/Observer;[Ljava/lang/Object;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->poll()Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->requestFusion(I)I -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray;->([Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->(Lio/reactivex/rxjava3/core/Observer;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher;->(Lorg/reactivestreams/Publisher;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableJust;->(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableJust;->get()Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->requestFusion(I)I -PLio/reactivex/rxjava3/internal/operators/observable/ObservableMap;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableMap;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->clear()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->isEmpty()Z -PLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->poll()Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->requestFusion(I)I -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;->accept(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;->accept(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefCountObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->(Lio/reactivex/rxjava3/observables/ConnectableObservable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->(Lio/reactivex/rxjava3/observables/ConnectableObservable;IJLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->cancel(Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->timeout(Lio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount$RefConnection;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->(Z)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->addLast(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->enterTransform(Ljava/lang/Object;)Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->getHead()Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->leaveTransform(Ljava/lang/Object;)Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->next(Ljava/lang/Object;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->removeFirst()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->setFirst(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->index()Ljava/lang/Object; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$Node;->(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBufferSupplier;->(IZ)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBufferSupplier;->call()Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBuffer; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayBuffer;Ljava/util/concurrent/atomic/AtomicReference;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->isDisposed()Z -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->remove(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->replay()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplaySource;->(Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BufferSupplier;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$SizeBoundReplayBuffer;->(IZ)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$SizeBoundReplayBuffer;->truncate()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$UnBoundedFactory;->()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/ObservableSource;Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BufferSupplier;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->connect(Lio/reactivex/rxjava3/functions/Consumer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->create(Lio/reactivex/rxjava3/core/ObservableSource;IZ)Lio/reactivex/rxjava3/observables/ConnectableObservable; -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->create(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BufferSupplier;)Lio/reactivex/rxjava3/observables/ConnectableObservable; PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->reset()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableScalarXMap;->tryScalarXMapSubscribe(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;)Z +PLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedNoLast;->complete()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedNoLast;->run()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedObserver;->cancelTimer()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedObserver;->dispose()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedObserver;->emit()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableSampleTimed$SampleTimedObserver;->onComplete()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableScanSeed$ScanSeedObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver;->(Lio/reactivex/rxjava3/core/Observer;J)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip;->(Lio/reactivex/rxjava3/core/ObservableSource;J)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;JI)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->cancel()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapInnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;IZ)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->dispose()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->disposeInner()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;IZ)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->(Lio/reactivex/rxjava3/core/Observer;J)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->onComplete()V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableTake$TakeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableTake;->(Lio/reactivex/rxjava3/core/ObservableSource;J)V -PLio/reactivex/rxjava3/internal/operators/observable/ObservableTake;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed$DebounceTimedObserver;->dispose()V -PLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess$DoOnSuccess;->(Lio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess;Lio/reactivex/rxjava3/core/SingleObserver;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess$DoOnSuccess;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess$DoOnSuccess;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Consumer;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleDoOnSuccess;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleJust;->(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleJust;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/core/Scheduler;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->onSuccess(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn$ObserveOnSingleObserver;->run()V -PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/core/Scheduler;)V -PLio/reactivex/rxjava3/internal/operators/single/SingleObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleError;->(Lio/reactivex/rxjava3/functions/Supplier;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleError;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver;->(Ljava/util/concurrent/atomic/AtomicReference;Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/functions/Function;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->isDisposed()Z +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap$SingleFlatMapCallback;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleFlatMap;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleMap$MapSingleObserver;->onError(Ljava/lang/Throwable;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->(Lio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn;Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->onError(Ljava/lang/Throwable;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn$OnErrorReturn;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleOnErrorReturn;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext$ResumeMainSingleObserver;->(Lio/reactivex/rxjava3/core/SingleObserver;Lio/reactivex/rxjava3/functions/Function;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext$ResumeMainSingleObserver;->onError(Ljava/lang/Throwable;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext$ResumeMainSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext;->(Lio/reactivex/rxjava3/core/SingleSource;Lio/reactivex/rxjava3/functions/Function;)V +PLio/reactivex/rxjava3/internal/operators/single/SingleResumeNext;->subscribeActual(Lio/reactivex/rxjava3/core/SingleObserver;)V +PLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->isEmpty()Z +PLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lvConsumerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; PLio/reactivex/rxjava3/internal/queue/SpscArrayQueue;->clear()V PLio/reactivex/rxjava3/internal/queue/SpscArrayQueue;->isEmpty()Z PLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->cancelFuture(Ljava/util/concurrent/Future;)V PLio/reactivex/rxjava3/internal/schedulers/DisposeOnCancel;->cancel(Z)Z -PLio/reactivex/rxjava3/internal/schedulers/ExecutorScheduler$ExecutorWorker$InterruptibleRunnable;->dispose()V PLio/reactivex/rxjava3/internal/schedulers/ScheduledRunnable;->dispose()V PLio/reactivex/rxjava3/internal/subscribers/BasicFuseableConditionalSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/subscribers/BasicFuseableSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/subscribers/LambdaSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/subscribers/LambdaSubscriber;->dispose()V +PLio/reactivex/rxjava3/internal/subscriptions/DeferredScalarSubscription;->(Lorg/reactivestreams/Subscriber;)V +PLio/reactivex/rxjava3/internal/subscriptions/DeferredScalarSubscription;->isCancelled()Z +PLio/reactivex/rxjava3/internal/subscriptions/DeferredScalarSubscription;->request(J)V +PLio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList;->(I)V +PLio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList;->add(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList;->forEachWhile(Lio/reactivex/rxjava3/internal/util/AppendOnlyLinkedArrayList$NonThrowingPredicate;)V PLio/reactivex/rxjava3/internal/util/AtomicThrowable;->terminate()Ljava/lang/Throwable; PLio/reactivex/rxjava3/internal/util/AtomicThrowable;->tryTerminateAndReport()V -PLio/reactivex/rxjava3/internal/util/ErrorMode;->()V -PLio/reactivex/rxjava3/internal/util/ErrorMode;->(Ljava/lang/String;I)V PLio/reactivex/rxjava3/internal/util/ExceptionHelper;->terminate(Ljava/util/concurrent/atomic/AtomicReference;)Ljava/lang/Throwable; -PLio/reactivex/rxjava3/internal/util/NotificationLite;->acceptFull(Ljava/lang/Object;Lio/reactivex/rxjava3/core/Observer;)Z -PLio/reactivex/rxjava3/internal/util/OpenHashSet;->rehash()V -PLio/reactivex/rxjava3/kotlin/SubscribersKt$sam$io_reactivex_rxjava3_functions_Action$0;->(Lkotlin/jvm/functions/Function0;)V -PLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Observable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Single;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Single;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; -PLio/reactivex/rxjava3/observables/ConnectableObservable;->()V -PLio/reactivex/rxjava3/observables/ConnectableObservable;->refCount()Lio/reactivex/rxjava3/core/Observable; +PLio/reactivex/rxjava3/internal/util/NotificationLite;->complete()Ljava/lang/Object; +PLio/reactivex/rxjava3/internal/util/QueueDrainHelper;->checkTerminated(ZZLio/reactivex/rxjava3/core/Observer;ZLio/reactivex/rxjava3/internal/fuseable/SimpleQueue;Lio/reactivex/rxjava3/disposables/Disposable;Lio/reactivex/rxjava3/internal/util/ObservableQueueDrain;)Z +PLio/reactivex/rxjava3/internal/util/QueueDrainHelper;->drainLoop(Lio/reactivex/rxjava3/internal/fuseable/SimplePlainQueue;Lio/reactivex/rxjava3/core/Observer;ZLio/reactivex/rxjava3/disposables/Disposable;Lio/reactivex/rxjava3/internal/util/ObservableQueueDrain;)V +PLio/reactivex/rxjava3/observers/DisposableObserver;->dispose()V PLio/reactivex/rxjava3/observers/SerializedObserver;->dispose()V -PLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/core/Maybe;)Lio/reactivex/rxjava3/core/Maybe; -PLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/rxjava3/observables/ConnectableObservable;)Lio/reactivex/rxjava3/observables/ConnectableObservable; -PLio/reactivex/rxjava3/plugins/RxJavaPlugins;->onSubscribe(Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; +PLio/reactivex/rxjava3/observers/SerializedObserver;->onComplete()V PLio/reactivex/rxjava3/processors/BehaviorProcessor$BehaviorSubscription;->cancel()V PLio/reactivex/rxjava3/processors/BehaviorProcessor;->remove(Lio/reactivex/rxjava3/processors/BehaviorProcessor$BehaviorSubscription;)V -PLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/processors/PublishProcessor;)V PLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->cancel()V -PLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->isCancelled()Z -PLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->onNext(Ljava/lang/Object;)V -PLio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;->request(J)V -PLio/reactivex/rxjava3/processors/PublishProcessor;->()V -PLio/reactivex/rxjava3/processors/PublishProcessor;->()V -PLio/reactivex/rxjava3/processors/PublishProcessor;->add(Lio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;)Z -PLio/reactivex/rxjava3/processors/PublishProcessor;->create()Lio/reactivex/rxjava3/processors/PublishProcessor; -PLio/reactivex/rxjava3/processors/PublishProcessor;->onNext(Ljava/lang/Object;)V PLio/reactivex/rxjava3/processors/PublishProcessor;->remove(Lio/reactivex/rxjava3/processors/PublishProcessor$PublishSubscription;)V -PLio/reactivex/rxjava3/processors/PublishProcessor;->subscribeActual(Lorg/reactivestreams/Subscriber;)V +PLio/reactivex/rxjava3/subjects/BehaviorSubject;->onComplete()V +PLio/reactivex/rxjava3/subjects/BehaviorSubject;->terminate(Ljava/lang/Object;)[Lio/reactivex/rxjava3/subjects/BehaviorSubject$BehaviorDisposable; PLio/reactivex/rxjava3/subjects/PublishSubject$PublishDisposable;->dispose()V PLio/reactivex/rxjava3/subjects/PublishSubject;->remove(Lio/reactivex/rxjava3/subjects/PublishSubject$PublishDisposable;)V -PLio/reactivex/rxjava3/subjects/SerializedSubject;->test(Ljava/lang/Object;)Z -PLj$/time/chrono/f;->f(J)Z -PLj$/util/DesugarCollections;->a()Ljava/lang/reflect/Constructor; -PLj$/util/Optional;->ifPresent(Lj$/util/function/Consumer;)V -PLj$/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; -PLj$/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLj$/util/concurrent/q;->a(Ljava/lang/Object;I)Lj$/util/concurrent/l; -PLj$/util/concurrent/q;->e()V -PLj$/util/concurrent/q;->f(ILjava/lang/Object;Ljava/lang/Object;)Lj$/util/concurrent/r; -PLj$/util/concurrent/r;->b(ILjava/lang/Object;Ljava/lang/Class;)Lj$/util/concurrent/r; -PLj$/util/concurrent/v;->a(Lsun/misc/Unsafe;Ljava/lang/Object;J)I -PLj$/util/d;->a(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; -PLj$/util/d;->keySet()Ljava/util/Set; -PLj$/util/function/b;->(Ljava/util/Comparator;I)V -PLj$/util/stream/D1;->(Lj$/util/function/BinaryOperator;)V -PLj$/util/stream/D1;->accept(Ljava/lang/Object;)V -PLj$/util/stream/D1;->get()Ljava/lang/Object; -PLj$/util/stream/D1;->m()V -PLj$/util/stream/D1;->n(J)V -PLj$/util/stream/D1;->q()Z -PLj$/util/stream/X1;->limit(J)Lj$/util/stream/Stream; -PLj$/util/stream/X1;->max(Ljava/util/Comparator;)Lj$/util/Optional; -PLj$/util/stream/g2;->accept(Ljava/lang/Object;)V -PLj$/util/stream/g2;->q()Z -PLj$/util/stream/h2;->(Lj$/util/stream/c;IJJ)V -PLj$/util/stream/h2;->B1(ILj$/util/stream/f2;)Lj$/util/stream/f2; -PLj$/util/stream/v0;->C0(JJJ)J -PLj$/util/stream/v0;->S0(J)I -PLj$/util/stream/v0;->k1(Lj$/util/stream/c;JJ)Lj$/util/stream/Stream; -PLj$/util/stream/v0;->p()I -PLj$/util/stream/z1;->(Lj$/util/stream/U2;Ljava/lang/Object;I)V -PLj$/util/stream/z1;->l1()Lj$/util/stream/O1; -PLkotlin/collections/ArraysKt;->toMutableSet([Ljava/lang/Object;)Ljava/util/Set; -PLkotlin/collections/ArraysKt___ArraysKt;->toMutableSet([Ljava/lang/Object;)Ljava/util/Set; +PLj$/util/d;->remove(Ljava/lang/Object;)Ljava/lang/Object; +PLkotlin/Result;->(Ljava/lang/Object;)V +PLkotlin/Result;->box-impl(Ljava/lang/Object;)Lkotlin/Result; +PLkotlin/Result;->unbox-impl()Ljava/lang/Object; PLkotlin/collections/CollectionsKt;->retainAll(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Z PLkotlin/collections/CollectionsKt__MutableCollectionsKt;->filterInPlace$CollectionsKt__MutableCollectionsKt(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;Z)Z PLkotlin/collections/CollectionsKt__MutableCollectionsKt;->retainAll(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Z -PLkotlin/jvm/internal/PropertyReference0;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V -PLkotlin/jvm/internal/PropertyReference0;->invoke()Ljava/lang/Object; -PLkotlin/jvm/internal/PropertyReference0Impl;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V -PLkotlin/sequences/SequenceScope;->yieldAll(Lkotlin/sequences/Sequence;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -PLkotlin/sequences/SequencesKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; +PLkotlin/collections/MapsKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; +PLkotlin/collections/MapsKt;->plus(Ljava/util/Map;Lkotlin/Pair;)Ljava/util/Map; +PLkotlin/collections/MapsKt__MapsJVMKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; +PLkotlin/collections/MapsKt__MapsKt;->plus(Ljava/util/Map;Lkotlin/Pair;)Ljava/util/Map; +PLkotlin/reflect/jvm/internal/UtilKt;->createArrayType(Ljava/lang/Class;)Ljava/lang/Class; +PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/SignatureSerializer;->fieldDesc(Ljava/lang/reflect/Field;)Ljava/lang/String; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$AnnotationVisitorForMethod;->visitParameterAnnotation(ILkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationArgumentVisitor; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$MemberAnnotationVisitor;->getSignature()Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1;->visitField(Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/String;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationVisitor; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$AbstractAnnotationArgumentVisitor;->visit(Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/Object;)V +PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$AbstractAnnotationArgumentVisitor;->visitEnum(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/Name;)V +PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$loadAnnotation$1;->visitConstantValue(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue;)V +PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->access$createConstant(Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->createConstant(Lkotlin/reflect/jvm/internal/impl/name/Name;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->fromFieldNameAndDesc(Ljava/lang/String;Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion;->fromMethodSignatureAndParameterIndex(Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;I)Lkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature; +PLkotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature;->getSignature()Ljava/lang/String; +PLkotlin/reflect/jvm/internal/impl/resolve/constants/BooleanValue;->(Z)V +PLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue;->(Ljava/lang/Object;)V +PLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory;->()V +PLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory;->()V +PLkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory;->createConstantValue(Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue; +PLkotlin/reflect/jvm/internal/impl/resolve/constants/EnumValue;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/Name;)V +PLkotlin/reflect/jvm/internal/impl/resolve/constants/IntValue;->(I)V +PLkotlin/reflect/jvm/internal/impl/resolve/constants/IntegerValueConstant;->(Ljava/lang/Object;)V +PLkotlin/reflect/jvm/internal/impl/resolve/constants/StringValue;->(Ljava/lang/String;)V PLkotlin/sequences/SequencesKt;->sequence(Lkotlin/jvm/functions/Function2;)Lkotlin/sequences/Sequence; PLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->(Lkotlin/jvm/functions/Function2;)V PLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; @@ -34561,73 +37799,67 @@ PLme/leolin/shortcutbadger/impl/ZukHomeBadger;->getSupportLaunchers()Ljava/util/ PLme/leolin/shortcutbadger/util/BroadcastHelper;->resolveBroadcast(Landroid/content/Context;Landroid/content/Intent;)Ljava/util/List; PLme/leolin/shortcutbadger/util/BroadcastHelper;->sendDefaultIntentExplicitly(Landroid/content/Context;Landroid/content/Intent;)V PLme/leolin/shortcutbadger/util/BroadcastHelper;->sendIntentExplicitly(Landroid/content/Context;Landroid/content/Intent;)V -PLorg/greenrobot/eventbus/EventBus;->isRegistered(Ljava/lang/Object;)Z -PLorg/greenrobot/eventbus/EventBus;->unregister(Ljava/lang/Object;)V -PLorg/greenrobot/eventbus/EventBus;->unsubscribeByEventType(Ljava/lang/Object;Ljava/lang/Class;)V -PLorg/greenrobot/eventbus/Subscription;->equals(Ljava/lang/Object;)Z -PLorg/signal/core/util/ByteSize;->(J)V +PLokhttp3/MediaType;->charset()Ljava/nio/charset/Charset; +PLokhttp3/MediaType;->toString()Ljava/lang/String; +PLokhttp3/OkHttpClient$Builder;->retryOnConnectionFailure(Z)Lokhttp3/OkHttpClient$Builder; +PLokhttp3/RequestBody;->create(Lokhttp3/MediaType;Ljava/lang/String;)Lokhttp3/RequestBody; +PLokio/AsyncTimeout;->access$getIDLE_TIMEOUT_NANOS$cp()J +PLorg/conscrypt/ArrayUtils;->checkOffsetAndCount(III)V +PLorg/conscrypt/GCMParameters;->(I[B)V +PLorg/conscrypt/GCMParameters;->getIV()[B +PLorg/conscrypt/GCMParameters;->getTLen()I +PLorg/conscrypt/NativeRef$SSL_SESSION;->doFree(J)V +PLorg/conscrypt/OpenSSLAeadCipher;->()V +PLorg/conscrypt/OpenSSLAeadCipher;->(Lorg/conscrypt/OpenSSLCipher$Mode;)V +PLorg/conscrypt/OpenSSLAeadCipher;->allowsNonceReuse()Z +PLorg/conscrypt/OpenSSLAeadCipher;->checkInitialization()V +PLorg/conscrypt/OpenSSLAeadCipher;->checkSupportedTagLength(I)V +PLorg/conscrypt/OpenSSLAeadCipher;->doFinalInternal([BII)I +PLorg/conscrypt/OpenSSLAeadCipher;->engineInitInternal([BLjava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V +PLorg/conscrypt/OpenSSLAeadCipher;->expand(I)V +PLorg/conscrypt/OpenSSLAeadCipher;->reset()V +PLorg/conscrypt/OpenSSLAeadCipher;->updateInternal([BII[BII)I +PLorg/conscrypt/OpenSSLAeadCipherAES$GCM;->()V +PLorg/conscrypt/OpenSSLAeadCipherAES$GCM;->getEVP_AEAD(I)J +PLorg/conscrypt/OpenSSLAeadCipherAES;->(Lorg/conscrypt/OpenSSLCipher$Mode;)V +PLorg/conscrypt/OpenSSLAeadCipherAES;->checkSupportedKeySize(I)V +PLorg/conscrypt/OpenSSLAeadCipherAES;->getCipherBlockSize()I +PLorg/conscrypt/OpenSSLAeadCipherAES;->getOutputSizeForFinal(I)I +PLorg/conscrypt/Platform;->fromGCMParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Lorg/conscrypt/GCMParameters; PLorg/signal/core/util/ByteSize;->getInKibiBytes()F PLorg/signal/core/util/ByteSize;->getInMebiBytes()F PLorg/signal/core/util/FloatExtensionsKt;->roundedString(FI)Ljava/lang/String; -PLorg/signal/core/util/ListUtil;->chunk(Ljava/util/List;I)Ljava/util/List; PLorg/signal/core/util/MemoryTracker$$ExternalSyntheticLambda1;->run()V PLorg/signal/core/util/MemoryTracker$AppHeapUsage;->getCurrentTotalBytes()J PLorg/signal/core/util/MemoryTracker$AppHeapUsage;->getUsedBytes()J PLorg/signal/core/util/MemoryTracker;->byteDisplay(J)Ljava/lang/String; PLorg/signal/core/util/MemoryTracker;->poll()V PLorg/signal/core/util/PendingIntentFlags;->cancelCurrent()I -PLorg/signal/core/util/SelectBuilderPart2;->where(Ljava/lang/String;[Ljava/lang/String;)Lorg/signal/core/util/SelectBuilderPart3; -PLorg/signal/core/util/SelectBuilderPart4a;->limit(Ljava/lang/String;)Lorg/signal/core/util/SelectBuilderPart5; -PLorg/signal/core/util/SqlUtil$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V -PLorg/signal/core/util/SqlUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/signal/core/util/SqlUtil$CollectionOperator;->$values()[Lorg/signal/core/util/SqlUtil$CollectionOperator; -PLorg/signal/core/util/SqlUtil$CollectionOperator;->()V -PLorg/signal/core/util/SqlUtil$CollectionOperator;->(Ljava/lang/String;ILjava/lang/String;)V -PLorg/signal/core/util/SqlUtil$CollectionOperator;->getSql()Ljava/lang/String; -PLorg/signal/core/util/SqlUtil$buildCustomCollectionQuery$1;->(Ljava/lang/String;)V -PLorg/signal/core/util/SqlUtil$buildCustomCollectionQuery$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/signal/core/util/SqlUtil$buildCustomCollectionQuery$1;->invoke(Ljava/util/List;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/SqlUtil;->$r8$lambda$zW4YXJaIlJT3vPgMCfyiQ3eZdqc(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/SqlUtil;->access$buildSingleCustomCollectionQuery(Lorg/signal/core/util/SqlUtil;Ljava/lang/String;Ljava/util/List;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/SqlUtil;->appendArg([Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String; -PLorg/signal/core/util/SqlUtil;->buildCustomCollectionQuery$lambda$11(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/SqlUtil;->buildCustomCollectionQuery(Ljava/lang/String;Ljava/util/List;)Ljava/util/List; -PLorg/signal/core/util/SqlUtil;->buildCustomCollectionQuery(Ljava/lang/String;Ljava/util/List;I)Ljava/util/List; -PLorg/signal/core/util/SqlUtil;->buildSingleCollectionQuery$default(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;Lorg/signal/core/util/SqlUtil$CollectionOperator;ILjava/lang/Object;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/SqlUtil;->buildSingleCollectionQuery(Ljava/lang/String;Ljava/util/Collection;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/SqlUtil;->buildSingleCollectionQuery(Ljava/lang/String;Ljava/util/Collection;Ljava/lang/String;Lorg/signal/core/util/SqlUtil$CollectionOperator;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/SqlUtil;->buildSingleCustomCollectionQuery(Ljava/lang/String;Ljava/util/List;)Lorg/signal/core/util/SqlUtil$Query; -PLorg/signal/core/util/StringUtil;->forceLtr(Ljava/lang/CharSequence;)Ljava/lang/String; -PLorg/signal/core/util/StringUtil;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +PLorg/signal/core/util/StreamUtil;->()V +PLorg/signal/core/util/StreamUtil;->close(Ljava/io/Closeable;)V +PLorg/signal/core/util/StreamUtil;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;)J PLorg/signal/core/util/concurrent/DeadlockDetector$$ExternalSyntheticLambda0;->run()V PLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->access$isExecutorFull(Lorg/signal/core/util/concurrent/DeadlockDetector$Companion;Ljava/util/concurrent/ExecutorService;)Z PLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->isExecutorFull(Ljava/util/concurrent/ExecutorService;)Z PLorg/signal/core/util/concurrent/DeadlockDetector$ExecutorInfo;->getExecutor()Ljava/util/concurrent/ExecutorService; PLorg/signal/core/util/concurrent/DeadlockDetector;->$r8$lambda$cvCzVPqdRG5CuUCNRezQN9z8MDY(Lorg/signal/core/util/concurrent/DeadlockDetector;)V +PLorg/signal/core/util/concurrent/DeadlockDetector;->hasPotentialLock([Ljava/lang/StackTraceElement;)Z PLorg/signal/core/util/concurrent/DeadlockDetector;->isWaiting(Ljava/lang/Thread$State;)Z PLorg/signal/core/util/concurrent/DeadlockDetector;->poll()V PLorg/signal/core/util/concurrent/LifecycleDisposable;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/signal/core/util/concurrent/LifecycleDisposable;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/signal/core/util/concurrent/LifecycleDisposable;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V -PLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->subscribe(Lio/reactivex/rxjava3/core/MaybeEmitter;)V -PLorg/signal/core/util/concurrent/MaybeCompat;->$r8$lambda$aPKBr0JUhvb1CVWSMT6CNAHU584(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V -PLorg/signal/core/util/concurrent/MaybeCompat;->()V -PLorg/signal/core/util/concurrent/MaybeCompat;->()V -PLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable$lambda$0(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V -PLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable(Lkotlin/jvm/functions/Function0;)Lio/reactivex/rxjava3/core/Maybe; -PLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->(Ljava/lang/Object;)V -PLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->invoke(Ljava/lang/Object;)V -PLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$2;->(Ljava/lang/Object;)V -PLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$3;->(Ljava/lang/Object;)V -PLorg/signal/core/util/concurrent/RxExtensions;->subscribeWithSubject(Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/subjects/Subject;Lio/reactivex/rxjava3/disposables/CompositeDisposable;)Lio/reactivex/rxjava3/subjects/Subject; PLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0;->rejectedExecution(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V +PLorg/signal/core/util/concurrent/SignalExecutors;->$r8$lambda$0Q0afsv1raKIrq3aP-SuMcT2Ad0(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V PLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;)V +PLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V PLorg/signal/core/util/logging/Log;->internal()Lorg/signal/core/util/logging/Log$Logger; -PLorg/signal/core/util/logging/NoopLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V PLorg/signal/libsignal/protocol/IdentityKey;->equals(Ljava/lang/Object;)Z PLorg/signal/libsignal/protocol/IdentityKey;->getPublicKey()Lorg/signal/libsignal/protocol/ecc/ECPublicKey; +PLorg/signal/libsignal/protocol/ServiceId;->toServiceIdFixedWidthBinary()[B +PLorg/signal/libsignal/protocol/ecc/ECPublicKey;->equals(Ljava/lang/Object;)Z +PLorg/signal/libsignal/protocol/util/ByteUtil;->trim([BI)[B +PLorg/signal/libsignal/zkgroup/profiles/ProfileKey;->getProfileKeyVersion(Lorg/signal/libsignal/protocol/ServiceId$Aci;)Lorg/signal/libsignal/zkgroup/profiles/ProfileKeyVersion; +PLorg/signal/libsignal/zkgroup/profiles/ProfileKeyVersion;->([B)V +PLorg/signal/libsignal/zkgroup/profiles/ProfileKeyVersion;->serialize()Ljava/lang/String; PLorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda2;->(Lorg/signal/paging/BufferedPagingController;Ljava/lang/Object;)V PLorg/signal/paging/BufferedPagingController$$ExternalSyntheticLambda2;->run()V PLorg/signal/paging/BufferedPagingController;->$r8$lambda$GxlLAxjfERBgyqmyvxteAPWaQkA(Lorg/signal/paging/BufferedPagingController;Ljava/lang/Object;)V @@ -34637,2200 +37869,499 @@ PLorg/signal/paging/DataStatus;->mark(I)V PLorg/signal/paging/FixedSizePagingController$$ExternalSyntheticLambda0;->(Lorg/signal/paging/FixedSizePagingController;Ljava/lang/Object;)V PLorg/signal/paging/FixedSizePagingController$$ExternalSyntheticLambda0;->run()V PLorg/signal/paging/FixedSizePagingController;->$r8$lambda$2jZFFAhs3dG0IThMmzJQSvWvcd0(Lorg/signal/paging/FixedSizePagingController;Ljava/lang/Object;)V +PLorg/signal/paging/FixedSizePagingController;->lambda$onDataItemChanged$2(Ljava/lang/Object;)V PLorg/signal/paging/FixedSizePagingController;->onDataItemChanged(Ljava/lang/Object;)V PLorg/signal/paging/ProxyPagingController;->onDataItemChanged(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda55;->isInternal()Z -PLorg/thoughtcrime/securesms/LoggingFragment;->(I)V +PLorg/thoughtcrime/securesms/AppCapabilities;->()V +PLorg/thoughtcrime/securesms/AppCapabilities;->()V +PLorg/thoughtcrime/securesms/AppCapabilities;->getCapabilities(Z)Lorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities; +PLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->isInternal()Z PLorg/thoughtcrime/securesms/LoggingFragment;->onDestroy()V -PLorg/thoughtcrime/securesms/LoggingFragment;->onStop()V -PLorg/thoughtcrime/securesms/MainActivity;->getNavigator()Lorg/thoughtcrime/securesms/MainNavigator; -PLorg/thoughtcrime/securesms/MainActivity;->onStop()V -PLorg/thoughtcrime/securesms/MainFragment;->getNavigator()Lorg/thoughtcrime/securesms/MainNavigator; -PLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda0;->(II)V -PLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/MainNavigator;)V -PLorg/thoughtcrime/securesms/MainNavigator$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/MainNavigator;->$r8$lambda$BsmRZ7TbLMbFLO4HbBAA_UZA_dc(IILorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;)Landroid/content/Intent; -PLorg/thoughtcrime/securesms/MainNavigator;->$r8$lambda$QRR_-StramqxZCQdyuE0wK2mbHA(Lorg/thoughtcrime/securesms/MainNavigator;Landroid/content/Intent;)V -PLorg/thoughtcrime/securesms/MainNavigator;->get(Landroid/app/Activity;)Lorg/thoughtcrime/securesms/MainNavigator; -PLorg/thoughtcrime/securesms/MainNavigator;->goToConversation(Lorg/thoughtcrime/securesms/recipients/RecipientId;JII)V -PLorg/thoughtcrime/securesms/MainNavigator;->lambda$goToConversation$0(IILorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;)Landroid/content/Intent; -PLorg/thoughtcrime/securesms/MainNavigator;->lambda$goToConversation$1(Landroid/content/Intent;)V PLorg/thoughtcrime/securesms/PassphraseRequiredActivity;->onDestroy()V PLorg/thoughtcrime/securesms/PassphraseRequiredActivity;->removeClearKeyReceiver(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/animation/AnimationStartListener;->()V PLorg/thoughtcrime/securesms/animation/AnimationStartListener;->()V PLorg/thoughtcrime/securesms/animation/AnimationStartListener;->onAnimationEnd(Landroid/animation/Animator;)V -PLorg/thoughtcrime/securesms/attachments/Attachment;->isPermanentlyFailed()Z -PLorg/thoughtcrime/securesms/attachments/AttachmentId;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->getMmsId()J -PLorg/thoughtcrime/securesms/attachments/DatabaseAttachment;->hashCode()I -PLorg/thoughtcrime/securesms/audio/AudioRecorder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/audio/AudioRecorder;)V -PLorg/thoughtcrime/securesms/audio/AudioRecorder;->()V -PLorg/thoughtcrime/securesms/audio/AudioRecorder;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V -PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->()V -PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; -PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager26;->(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)V -PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->()V -PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; -PLorg/thoughtcrime/securesms/avatar/view/AvatarView$WhenMappings;->()V -PLorg/thoughtcrime/securesms/avatar/view/AvatarView;->()V -PLorg/thoughtcrime/securesms/avatar/view/AvatarView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/avatar/view/AvatarView;->displayChatAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V -PLorg/thoughtcrime/securesms/avatar/view/AvatarView;->hideStoryRing()V -PLorg/thoughtcrime/securesms/avatar/view/AvatarView;->setStoryRingFromState(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V -PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->()V -PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->()V -PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getMessageIdsOpenedThisSession$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Set; -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;Ljava/util/List;)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->inflateLayout(I)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->initialize()V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setDownloadClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->showSlides(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;)V -PLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->sizeClass(I)I -PLorg/thoughtcrime/securesms/components/AnimatingToggle;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/AnimatingToggle;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/AnimatingToggle;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V -PLorg/thoughtcrime/securesms/components/AnimatingToggle;->display(Landroid/view/View;)V -PLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AudioView;)V -PLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0;->onChanged(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/AudioView;)V -PLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/components/AudioView;I)V -PLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda4;->run()V -PLorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;)V -PLorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener-IA;)V -PLorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;)V -PLorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener-IA;)V -PLorg/thoughtcrime/securesms/components/AudioView;->$r8$lambda$70S_ChWvvHg6uKYhRw5m0jX0OG0(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V -PLorg/thoughtcrime/securesms/components/AudioView;->$r8$lambda$ttH02xbblnAnQbQdy9cXzPNafwQ(Lorg/thoughtcrime/securesms/components/AudioView;I)V -PLorg/thoughtcrime/securesms/components/AudioView;->()V -PLorg/thoughtcrime/securesms/components/AudioView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/AudioView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/AudioView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; -PLorg/thoughtcrime/securesms/components/AudioView;->hasAudioUri()Z -PLorg/thoughtcrime/securesms/components/AudioView;->isTarget(Landroid/net/Uri;)Z -PLorg/thoughtcrime/securesms/components/AudioView;->lambda$setTint$3(I)V -PLorg/thoughtcrime/securesms/components/AudioView;->onAttachedToWindow()V +PLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->()V +PLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->(ILorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;)V +PLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->getColor()Lorg/thoughtcrime/securesms/avatar/Avatars$ColorPair; +PLorg/thoughtcrime/securesms/avatar/Avatar$Resource;->getResourceId()I +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer$$ExternalSyntheticLambda0;->run()V +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer$renderResource$1;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/avatar/Avatar$Resource;)V +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer$renderResource$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer$renderResource$1;->invoke-IoAF18A(Landroid/graphics/Canvas;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->$r8$lambda$LMRb5EH7u5JsF-ZatOYl7HXPvGU(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->createMedia(Landroid/net/Uri;J)Lorg/thoughtcrime/securesms/mediasend/Media; +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->getDIMENSIONS()I +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/avatar/Avatar;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderInBackground$lambda$1(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderInBackground(Landroid/content/Context;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/avatar/AvatarRenderer;->renderResource(Landroid/content/Context;Lorg/thoughtcrime/securesms/avatar/Avatar$Resource;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/avatar/Avatars$ColorPair;->getBackgroundColor()I PLorg/thoughtcrime/securesms/components/AudioView;->onDetachedFromWindow()V -PLorg/thoughtcrime/securesms/components/AudioView;->onDuration(Landroid/net/Uri;J)V -PLorg/thoughtcrime/securesms/components/AudioView;->onPlaybackState(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V -PLorg/thoughtcrime/securesms/components/AudioView;->onProgress(Landroid/net/Uri;DJ)V -PLorg/thoughtcrime/securesms/components/AudioView;->onSpeedChanged(Landroid/net/Uri;F)V -PLorg/thoughtcrime/securesms/components/AudioView;->onStart(Landroid/net/Uri;ZZ)V -PLorg/thoughtcrime/securesms/components/AudioView;->setProgressAndPlayBackgroundTint(I)V -PLorg/thoughtcrime/securesms/components/AudioView;->setTint(I)V -PLorg/thoughtcrime/securesms/components/AvatarImageView;->setFallbackPhotoProvider(Lorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;)V -PLorg/thoughtcrime/securesms/components/AvatarImageView;->setOnClickListener(Landroid/view/View$OnClickListener;)V -PLorg/thoughtcrime/securesms/components/ComposeText$1;->(Lorg/thoughtcrime/securesms/components/ComposeText;)V -PLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->()V -PLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V -PLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;Lorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener-IA;)V -PLorg/thoughtcrime/securesms/components/ComposeText$QueryStart;->(IZ)V -PLorg/thoughtcrime/securesms/components/ComposeText;->()V -PLorg/thoughtcrime/securesms/components/ComposeText;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->changeSelectionForPartialMentions(Landroid/text/Spanned;II)Z -PLorg/thoughtcrime/securesms/components/ComposeText;->clearInlineQuery()V -PLorg/thoughtcrime/securesms/components/ComposeText;->doAfterCursorChange(Landroid/text/Editable;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->ellipsizeToWidth(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -PLorg/thoughtcrime/securesms/components/ComposeText;->enoughToFilter(Landroid/text/Editable;Z)Z -PLorg/thoughtcrime/securesms/components/ComposeText;->findQueryStart(Ljava/lang/CharSequence;IC)I -PLorg/thoughtcrime/securesms/components/ComposeText;->findQueryStart(Ljava/lang/CharSequence;IZ)Lorg/thoughtcrime/securesms/components/ComposeText$QueryStart; -PLorg/thoughtcrime/securesms/components/ComposeText;->initialize()V -PLorg/thoughtcrime/securesms/components/ComposeText;->isLandscape()Z -PLorg/thoughtcrime/securesms/components/ComposeText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; -PLorg/thoughtcrime/securesms/components/ComposeText;->onMeasure(II)V -PLorg/thoughtcrime/securesms/components/ComposeText;->onSelectionChanged(II)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setCursorPositionChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$CursorPositionChangedListener;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setHint(Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setHintWithChecks(Ljava/lang/CharSequence;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setInlineQueryChangedListener(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryChangedListener;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setMediaListener(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setMessageSendType(Lorg/thoughtcrime/securesms/conversation/MessageSendType;)V -PLorg/thoughtcrime/securesms/components/ComposeText;->setStylingChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$StylingChangedListener;)V -PLorg/thoughtcrime/securesms/components/ComposeTextStyleWatcher;->()V -PLorg/thoughtcrime/securesms/components/ComposeTextStyleWatcher;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter$$ExternalSyntheticLambda2;->onLayoutChange(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->$r8$lambda$rILpFw6OPAVn7dsgVBus6R0qlZk(Lorg/thoughtcrime/securesms/components/ConversationItemFooter;Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->buildMessageId(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)J -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->disableBubbleBackground()V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->getDateView()Landroid/view/View; -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->getPlaybackSpeedToggleTouchDelegateRect()Landroid/graphics/Rect; -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->hideAudioDurationViews()V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->lambda$init$0(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->notifyTouchDelegateChanged(Landroid/graphics/Rect;Landroid/view/View;)V PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->onDetachedFromWindow()V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentAudioDuration(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentInsecureIndicator(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentSimInfo(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentTimer(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setMessageRecord(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/Locale;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setOnlyShowSendingStatus(ZLorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->setPlaybackSpeedListener(Lorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView$PlaybackSpeedListener;)V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnail$Companion;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnail$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->getFooter()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setBorderless(Z)V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showShade(Z)V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState$Creator;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->(ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$Creator;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState$Creator;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Landroid/view/View$OnLongClickListener;IIIIIIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->()V -PLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->formatUnreadCount(I)Ljava/lang/CharSequence; -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setOnClickListener(Landroid/view/View$OnClickListener;)V -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setShown(Z)V -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setUnreadCount(I)V -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setUnreadCountBackgroundTint(I)V -PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setWallpaperEnabled(Z)V -PLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->onFinishInflate()V -PLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->setEventListener(Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar$EventListener;)V -PLorg/thoughtcrime/securesms/components/CornerMask;->setRadius(I)V -PLorg/thoughtcrime/securesms/components/CornerMask;->setTopLeftRadius(I)V -PLorg/thoughtcrime/securesms/components/CornerMask;->setTopRightRadius(I)V -PLorg/thoughtcrime/securesms/components/DeliveryStatusView;->isPending()Z -PLorg/thoughtcrime/securesms/components/ExpirationTimerView;->stopAnimation()V -PLorg/thoughtcrime/securesms/components/HidingLinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/HidingLinearLayout;->hide()V -PLorg/thoughtcrime/securesms/components/HidingLinearLayout;->show()V -PLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->()V -PLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->setFragmentManager(Landroidx/fragment/app/FragmentManager;)V -PLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->setListener(Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout$Listener;)V -PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V -PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V -PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V -PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V -PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V -PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V -PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V PLorg/thoughtcrime/securesms/components/InputPanel$3;->(Lorg/thoughtcrime/securesms/components/InputPanel;Landroid/view/View;)V PLorg/thoughtcrime/securesms/components/InputPanel$3;->onAnimationStart(Landroid/animation/Animator;)V -PLorg/thoughtcrime/securesms/components/InputPanel$RecordTime;->(Landroid/widget/TextView;Landroid/view/View;JLjava/lang/Runnable;)V -PLorg/thoughtcrime/securesms/components/InputPanel$RecordTime;->(Landroid/widget/TextView;Landroid/view/View;JLjava/lang/Runnable;Lorg/thoughtcrime/securesms/components/InputPanel$RecordTime-IA;)V -PLorg/thoughtcrime/securesms/components/InputPanel$SlideToCancel;->(Landroid/view/View;)V -PLorg/thoughtcrime/securesms/components/InputPanel;->()V -PLorg/thoughtcrime/securesms/components/InputPanel;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLorg/thoughtcrime/securesms/components/InputPanel;->fadeIn(Landroid/view/View;)V PLorg/thoughtcrime/securesms/components/InputPanel;->fadeInNormalComposeViews()V -PLorg/thoughtcrime/securesms/components/InputPanel;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; PLorg/thoughtcrime/securesms/components/InputPanel;->inEditMessageMode()Z PLorg/thoughtcrime/securesms/components/InputPanel;->isRecordingInLockedMode()Z -PLorg/thoughtcrime/securesms/components/InputPanel;->onFinishInflate()V PLorg/thoughtcrime/securesms/components/InputPanel;->onPause()V PLorg/thoughtcrime/securesms/components/InputPanel;->readDimen(I)I -PLorg/thoughtcrime/securesms/components/InputPanel;->setHideForMessageRequestState(Z)V PLorg/thoughtcrime/securesms/components/InputPanel;->setLinkPreview(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lj$/util/Optional;)V -PLorg/thoughtcrime/securesms/components/InputPanel;->setListener(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V -PLorg/thoughtcrime/securesms/components/InputPanel;->setMediaKeyboardToggleMode(Lorg/thoughtcrime/securesms/keyboard/KeyboardPage;)V -PLorg/thoughtcrime/securesms/components/InputPanel;->setMediaListener(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V -PLorg/thoughtcrime/securesms/components/InputPanel;->setStickerSuggestions(Ljava/util/List;)V PLorg/thoughtcrime/securesms/components/InputPanel;->setVoiceNoteDraft(Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V -PLorg/thoughtcrime/securesms/components/InputPanel;->setWallpaperEnabled(Z)V -PLorg/thoughtcrime/securesms/components/InputPanel;->showMediaKeyboardToggle(Z)V -PLorg/thoughtcrime/securesms/components/InputPanel;->updateVisibility()V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$$ExternalSyntheticLambda1;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$Companion;->()V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardInsetAnimator;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardInsetAnimator;->getAnimating()Z -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentStartGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentStartGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentStartGuideline$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$statusBarGuideline$2;->(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$statusBarGuideline$2;->invoke()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$statusBarGuideline$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->$r8$lambda$wNlRlegYRZAGLCv-uS3_baE_8zg(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->()V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->_init_$lambda$0(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->addKeyboardStateListener(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardStateListener;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->applyInsets(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)V -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getKeyboardGuideline()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getNavigationBarGuideline()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getParentEndGuideline()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getParentStartGuideline()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getStatusBarGuideline()Landroidx/constraintlayout/widget/Guideline; -PLorg/thoughtcrime/securesms/components/LinkPreviewView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/LinkPreviewView;)V -PLorg/thoughtcrime/securesms/components/LinkPreviewView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/LinkPreviewView;->init(Landroid/util/AttributeSet;)V PLorg/thoughtcrime/securesms/components/LinkPreviewView;->onSaveInstanceState()Landroid/os/Parcelable; -PLorg/thoughtcrime/securesms/components/LinkPreviewView;->setCloseClickedListener(Lorg/thoughtcrime/securesms/components/LinkPreviewView$CloseClickedListener;)V PLorg/thoughtcrime/securesms/components/LinkPreviewView;->setCorners(II)V -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState$Creator;->()V -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->()V -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->()V -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->(IIIILorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->(IIIILorg/thoughtcrime/securesms/mms/SlidesClickedListener;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->copy(IIIILorg/thoughtcrime/securesms/mms/SlidesClickedListener;)Lorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState; -PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->getDownloadListener()Lorg/thoughtcrime/securesms/mms/SlidesClickedListener; -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$FloatingRecordButton;->(Landroid/content/Context;Landroid/widget/ImageView;)V -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$LockDropTarget;->(Landroid/content/Context;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State;->$values()[Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State; -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State;->()V -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView$State;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->cancelAction(Z)V -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->isRecordingLocked()Z -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->onFinishInflate()V -PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->setHandler(Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V -PLorg/thoughtcrime/securesms/components/Outliner;->setRadii(IIII)V -PLorg/thoughtcrime/securesms/components/Outliner;->setStrokeWidth(F)V -PLorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView;->setPlaybackSpeedListener(Lorg/thoughtcrime/securesms/components/PlaybackSpeedToggleTextView$PlaybackSpeedListener;)V PLorg/thoughtcrime/securesms/components/QuoteView;->onDetachedFromWindow()V -PLorg/thoughtcrime/securesms/components/QuoteView;->setWallpaperEnabled(Z)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$2;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$2;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->(Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;)Z -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$4;->(Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$5;->(Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$Companion;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$DefaultScrollStrategy;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$DefaultScrollStrategy;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;->(IZLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollStrategy;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;->getPosition()I -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->apply(JLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;)Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest; -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->()V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Landroidx/recyclerview/widget/RecyclerView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lio/reactivex/rxjava3/disposables/CompositeDisposable;)V +PLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->onViewDetachedFromWindow(Landroid/view/View;)V PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->isListCommitted()Z -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->notifyListCommitted()V -PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/SearchView;->appendEmojiFilter(Landroid/widget/TextView;)[Landroid/text/InputFilter; -PLorg/thoughtcrime/securesms/components/SearchView;->initEmojiFilter()V -PLorg/thoughtcrime/securesms/components/SendButton;->()V -PLorg/thoughtcrime/securesms/components/SendButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/SendButton;->setPopupContainer(Landroid/view/ViewGroup;)V -PLorg/thoughtcrime/securesms/components/SendButton;->setScheduledSendListener(Lorg/thoughtcrime/securesms/components/SendButton$ScheduledSendListener;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView$DownloadClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView$DownloadClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;Lorg/thoughtcrime/securesms/components/ThumbnailView$DownloadClickDispatcher-IA;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher;->(Lorg/thoughtcrime/securesms/components/ThumbnailView;Lorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher-IA;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->()V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->dispatchDraw(Landroid/graphics/Canvas;)V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->fillTargetDimensions([I[I[I)V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->getNonZeroCount([I)I -PLorg/thoughtcrime/securesms/components/ThumbnailView;->onSizeChanged(IIII)V -PLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;ZZ)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->()V -PLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->()V -PLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->(ZZLorg/thoughtcrime/securesms/mms/Slide;Landroid/view/View$OnClickListener;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->withDownloadClickListener(Landroid/view/View$OnClickListener;)Lorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState; -PLorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState;->withSlide(Lorg/thoughtcrime/securesms/mms/Slide;)Lorg/thoughtcrime/securesms/components/ThumbnailViewTransferControlsState; -PLorg/thoughtcrime/securesms/components/TransferControlView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/TransferControlView;)V -PLorg/thoughtcrime/securesms/components/TransferControlView$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/components/TransferControlView;->$r8$lambda$16GqKV2IXrswgivbI_FW3vRdo1I(Lorg/thoughtcrime/securesms/components/TransferControlView;Lorg/thoughtcrime/securesms/mms/Slide;)V -PLorg/thoughtcrime/securesms/components/TransferControlView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/TransferControlView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/TransferControlView;->display(Landroid/view/View;)V -PLorg/thoughtcrime/securesms/components/TransferControlView;->isUpdateToExistingSet(Ljava/util/List;)Z -PLorg/thoughtcrime/securesms/components/TransferControlView;->lambda$setSlides$0(Lorg/thoughtcrime/securesms/mms/Slide;)V -PLorg/thoughtcrime/securesms/components/TransferControlView;->onAttachedToWindow()V -PLorg/thoughtcrime/securesms/components/TransferControlView;->onDetachedFromWindow()V -PLorg/thoughtcrime/securesms/components/TransferControlView;->setDownloadClickListener(Landroid/view/View$OnClickListener;)V -PLorg/thoughtcrime/securesms/components/TransferControlView;->setShowDownloadText(Z)V -PLorg/thoughtcrime/securesms/components/TypingStatusRepository;->getTypists(J)Landroidx/lifecycle/LiveData; PLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->invoke(Landroidx/viewbinding/ViewBinding;)V PLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->getProgressDrawable()Landroid/graphics/drawable/Drawable; -PLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->init()V -PLorg/thoughtcrime/securesms/components/WaveFormSeekBarView;->setProgressDrawable(Landroid/graphics/drawable/Drawable;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiEditText;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText$$ExternalSyntheticLambda0;->onFocusChange(Landroid/view/View;Z)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->$r8$lambda$8pyXdt50o8im33POXP_o4TKoD6U(Lorg/thoughtcrime/securesms/components/emoji/EmojiEditText;Landroid/view/View;Z)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->addOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->appendEmojiFilter([Landroid/text/InputFilter;Z)[Landroid/text/InputFilter; -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->lambda$new$0(Landroid/view/View;Z)V PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->removeOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiFilter;->(Landroid/widget/TextView;Z)V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult;)V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider$$ExternalSyntheticLambda0;->run()V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider;->$r8$lambda$yWqSXcpiMY6E3k4l81kOhV5ANk4(Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult;)V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider;->lambda$getEmojiDrawable$0(Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda1;->()V -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->$r8$lambda$5IPAQraRDnd37oqJyWeDCIArE8A(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Ljava/lang/String;)Ljava/lang/Float; -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->ellipsizeAnyTextForMaxLength()V -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isSingleLine()Z -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$getLongestLineWidth$0(Ljava/lang/String;)Ljava/lang/Float; -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setMentionBackgroundTint(I)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiToggle$1;->()V -PLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->initialize()V -PLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->setStickerMode(Lorg/thoughtcrime/securesms/keyboard/KeyboardPage;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiToggle;->setToMedia()V -PLorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;->()V -PLorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;->(Landroid/content/Context;Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;->getPersistedCache()Ljava/util/LinkedHashSet; -PLorg/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel;->getEmoji()Ljava/util/List; -PLorg/thoughtcrime/securesms/components/mention/MentionAnnotation$$ExternalSyntheticLambda1;->()V -PLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;)Ljava/util/List; -PLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;II)Ljava/util/List; -PLorg/thoughtcrime/securesms/components/mention/MentionDeleter;->()V -PLorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate;->setTint(I)V -PLorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher;->()V -PLorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme$Companion;->()V -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme$Companion;->resolveTheme(ZZZ)Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme; -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->$values()[Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme; -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->()V -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->(Ljava/lang/String;IIII)V -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->getBackgroundColor(Landroid/content/Context;)I -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->getBarColor(Landroid/content/Context;)I -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->getForegroundColor(Landroid/content/Context;)I -PLorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme;->resolveTheme(ZZZ)Lorg/thoughtcrime/securesms/components/quotes/QuoteViewColorTheme; PLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1$$ExternalSyntheticLambda0;->run()V PLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;->$r8$lambda$7zbeUa9i765Aa2G9x9qw8f4qjOo(Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;J)V PLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;->lambda$onAnimationEnd$0(J)V PLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton;->-$$Nest$mpulse(Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton;J)V +PLorg/thoughtcrime/securesms/components/settings/app/subscription/completed/TerminalDonationDelegate;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1$onViewAttachedToWindow$1;->onStop(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1;->onViewDetachedFromWindow(Landroid/view/View;)V -PLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->access$stopAnimating(Lorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->clearProgressEventHandler()V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->getVoiceNotePlaybackState()Landroidx/lifecycle/MutableLiveData; +PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress;->equals(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->onDetachedFromWindow()V +PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->getCompressionProgress()Ljava/util/Map; PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getPlayheadPositionMillis()J -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getSpeed()F -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getTrackDuration()J -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getUri()Landroid/net/Uri; -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isAutoReset()Z -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isPlaying()Z -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onCustomCommand(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onDisconnected(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->setAudioStream(Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->cleanUpWakeLock()V PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->sendNewStreamTypeToPlayer(I)V -PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->unregisterCallbacksAndRelease()V PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->unregisterFromLifecycle()V -PLorg/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto;->asSmallDrawable(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Z)Landroid/graphics/drawable/Drawable; PLorg/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$sam$androidx_lifecycle_Observer$0;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$sam$androidx_lifecycle_Observer$0;->getFunctionDelegate()Lkotlin/Function; PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel;->onCleared()V -PLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->draw(Landroid/graphics/Canvas;)V -PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZ)V -PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZZZ)V -PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->includeWarningUpdateMessage()Z -PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->isHidden()Z -PLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->isMessageRequestAccepted()Z -PLorg/thoughtcrime/securesms/conversation/ConversationData;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationData;->(Lorg/thoughtcrime/securesms/recipients/Recipient;JJIIIILorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;ZILjava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/ConversationData;->getGroupMemberAcis()Ljava/util/List; -PLorg/thoughtcrime/securesms/conversation/ConversationData;->getMessageRequestData()Lorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData; -PLorg/thoughtcrime/securesms/conversation/ConversationData;->getStartPosition()I -PLorg/thoughtcrime/securesms/conversation/ConversationData;->getThreadSize()I -PLorg/thoughtcrime/securesms/conversation/ConversationData;->getUnreadCount()I -PLorg/thoughtcrime/securesms/conversation/ConversationData;->shouldJumpToMessage()Z -PLorg/thoughtcrime/securesms/conversation/ConversationData;->shouldScrollToLastSeen()Z -PLorg/thoughtcrime/securesms/conversation/ConversationData;->showUniversalExpireTimerMessage()Z -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->(Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider-IA;)V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->hideDescription()V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAbout(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setLinkifyDescription(Z)V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setSubtitle(Ljava/lang/CharSequence;)V -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->showBackgroundBubble(Z)V -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;JLjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Ljava/util/ArrayList;Lorg/thoughtcrime/securesms/stickers/StickerLocator;ZIIZZLorg/thoughtcrime/securesms/badges/models/Badge;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)V -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->canInitializeFromDatabase()Z -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->from(Landroid/os/Bundle;)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getConversationScreenType()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDistributionType()I -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftContentType()Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMedia()Landroid/net/Uri; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMediaType()Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftText()Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getMedia()Ljava/util/ArrayList; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getShareDataTimestamp()J -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getStartingPosition()I -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getStickerLocator()Lorg/thoughtcrime/securesms/stickers/StickerLocator; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getThreadId()J -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getWallpaper()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isBorderless()Z -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isFirstTimeInSelfCreatedGroup()Z -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isWithSearchOpen()Z -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->(Landroid/content/Context;Ljava/lang/Class;Lorg/thoughtcrime/securesms/recipients/RecipientId;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)V -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->(Landroid/content/Context;Ljava/lang/Class;Lorg/thoughtcrime/securesms/recipients/RecipientId;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder-IA;)V -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->build()Landroid/content/Intent; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->withDistributionType(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->withStartingPosition(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->$values()[Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->-$$Nest$fgetcode(Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)I -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->-$$Nest$smfrom(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->(Ljava/lang/String;II)V -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->from(I)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->isInBubble()Z -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->isInPopup()Z -PLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;->values()[Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->-$$Nest$smcheckThreadId(J)J -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->checkThreadId(J)J -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->createBuilder(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lio/reactivex/rxjava3/core/Single; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->createBuilderSync(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->createParentFragmentArguments(Landroid/content/Intent;)Landroid/os/Bundle; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->getIntentData(Landroid/os/Bundle;)Landroid/net/Uri; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->getIntentType(Landroid/os/Bundle;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/ConversationIntents;->isBubbleIntentUri(Landroid/net/Uri;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem$ThumbnailClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem$ThumbnailClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$ThumbnailClickListener-IA;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->canPlayContent()Z +PLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->()V +PLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->()V +PLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->hasContactsPermissions(Landroid/content/Context;)Z +PLorg/thoughtcrime/securesms/contacts/sync/ContactDiscovery;->refreshAll(Landroid/content/Context;Z)V PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBadgeImageView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBubbleViews()Ljava/util/List; -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getContactPhotoHolderView()Landroid/view/View; -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getDefaultBubbleColor(Z)I -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getDefaultTopMarginForRecord(Lorg/thoughtcrime/securesms/database/model/MessageRecord;II)I PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getQuotedIndicatorView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getReactionsView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getReactionsView()Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getReplyView()Landroid/view/View; -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getRoot()Landroid/view/ViewGroup; -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasDocument(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasLinkPreview(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasOnlyThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasSticker(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isBorderless(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isCondensedMode()Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isContentCondensed()Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isGiftMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isSingularMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isStoryReaction(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isViewOnceMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->linkifyMessageBody(Landroid/text/Spannable;Z)V PLorg/thoughtcrime/securesms/conversation/ConversationItem;->onDetachedFromWindow()V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->onRecipientChanged(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->readDimen(Landroid/content/Context;I)I -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->setEventListener(Lorg/thoughtcrime/securesms/BindableConversationItem$EventListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGroupMessageStatus(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->setHasBeenScheduled(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->setOutlinerRadii(Lorg/thoughtcrime/securesms/components/Outliner;IIII)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->setStoryReactionLabel(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItem;->shouldDrawBodyBubbleOutline(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)Z -PLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onSizeChanged(IIII)V -PLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setOnSizeChangedListener(Lorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$OnSizeChangedListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setOutliners(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->$values()[Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; -PLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$SwipeAvailabilityProvider;Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$OnSwipeListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->attachToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener$Callback;)V -PLorg/thoughtcrime/securesms/conversation/ConversationMessage$ConversationMessageFactory;->createWithUnresolvedData(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/CharSequence;Ljava/util/List;ZLorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/CharSequence;Ljava/util/List;ZLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/CharSequence;Ljava/util/List;ZLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/String;Lorg/thoughtcrime/securesms/conversation/ConversationMessage-IA;)V -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getBottomButton()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList$BodyRange$Button; -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getMultiselectCollection()Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getThreadRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hasBeenQuoted()Z -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hasStyleLinks()Z -PLorg/thoughtcrime/securesms/conversation/ConversationMessage;->isTextOnly(Landroid/content/Context;)Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->(Landroid/view/Menu;Z)V PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->invoke(Z)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->(Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback;Lorg/signal/core/util/concurrent/LifecycleDisposable;Z)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->(Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback;Lorg/signal/core/util/concurrent/LifecycleDisposable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->applyTitleSpan(Landroid/view/MenuItem;Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->hideMenuItem(Landroid/view/Menu;I)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->setAfterFirstRenderMode(Z)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->(Lorg/thoughtcrime/securesms/recipients/Recipient;ZLio/reactivex/rxjava3/core/Observable;ZZZZIJZZ)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component1()Lorg/thoughtcrime/securesms/recipients/Recipient; -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component10()Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component11()Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component2()Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component3()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component4()Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component5()Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component6()Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component7()Z -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component8()I -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component9()J -PLorg/thoughtcrime/securesms/conversation/ConversationReactionDelegate;->(Lorg/thoughtcrime/securesms/util/views/Stub;)V -PLorg/thoughtcrime/securesms/conversation/ConversationReactionDelegate;->setOnReactionSelectedListener(Lorg/thoughtcrime/securesms/conversation/ConversationReactionOverlay$OnReactionSelectedListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationRepository;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationRepository;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationRepository;->getConversationData(JLorg/thoughtcrime/securesms/recipients/Recipient;I)Lorg/thoughtcrime/securesms/conversation/ConversationData; -PLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->(Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->getSearchResults()Landroidx/lifecycle/LiveData; -PLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter$EventListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->setStickers(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFF)V -PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFFLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator-IA;)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->getInterpolation(F)F -PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FF)V -PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FFF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->getInterpolation(F)F -PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->dpToPx(I)I PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->update(Lorg/thoughtcrime/securesms/conversation/v2/items/InteractiveConversationElement;FF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateBodyBubbleTransition(Ljava/util/List;FF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateContactPhotoHolderTransition(Landroid/view/View;FF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateQuotedIndicatorTransition(Landroid/view/View;FFF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateReactionsTransition(Landroid/view/View;FF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateReplyIconTransition(Landroid/view/View;FFF)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Landroid/view/View$OnClickListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->clearExpiring()V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->onFinishInflate()V PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->onSaveInstanceState()Landroid/os/Parcelable; -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setIndividualRecipientTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setOnStoryRingClickListener(Landroid/view/View$OnClickListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setRecipientTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setStoryRingFromState(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setTitle(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setVerified(Z)V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->updateSubtitleVisibility()V -PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->updateVerifiedSubtitleVisibility()V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$1;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$1;->onTick()V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$OnTickListener;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onTick()V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda0;->()V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda1;->()V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2;->run()V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->run()V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->$r8$lambda$gcFI10LhFCaBEmJzQp8t_xBcU8U(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->$r8$lambda$h27hRrs_Rwv2sGlsmjqcW0dGIZI(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->()V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;Landroid/content/Context;Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->ignoreViewReveals()V PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->lambda$onViewsRevealed$0(J)V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->lambda$onViewsRevealed$1(J)V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->onViewsRevealed(J)V -PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->stopIgnoringViewReveals(Ljava/lang/Long;)V -PLorg/thoughtcrime/securesms/conversation/MessageSendType$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/MessageSendType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType$Creator;->()V -PLorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType;->()V -PLorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType;->()V -PLorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;->$values()[Lorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType; -PLorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;->()V -PLorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/conversation/MessageSendType;->()V -PLorg/thoughtcrime/securesms/conversation/MessageSendType;->(IIIIILorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;Lorg/thoughtcrime/securesms/util/CharacterCalculator;Ljava/lang/CharSequence;Ljava/lang/Integer;)V -PLorg/thoughtcrime/securesms/conversation/MessageSendType;->(IIIIILorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;Lorg/thoughtcrime/securesms/util/CharacterCalculator;Ljava/lang/CharSequence;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/MessageSendType;->(IIIIILorg/thoughtcrime/securesms/conversation/MessageSendType$TransportType;Lorg/thoughtcrime/securesms/util/CharacterCalculator;Ljava/lang/CharSequence;Ljava/lang/Integer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/MessageSendType;->getButtonDrawableRes()I -PLorg/thoughtcrime/securesms/conversation/MessageSendType;->getComposeHintRes()I -PLorg/thoughtcrime/securesms/conversation/MessageSendType;->getTitleRes()I -PLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->getBottomButton()Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList$BodyRange$Button; -PLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->getHasStyleLinks()Z -PLorg/thoughtcrime/securesms/conversation/MessageStyler$Result;->none()Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; -PLorg/thoughtcrime/securesms/conversation/MessageStyler;->boldStyle()Landroid/text/style/CharacterStyle; -PLorg/thoughtcrime/securesms/conversation/MessageStyler;->italicStyle()Landroid/text/style/CharacterStyle; -PLorg/thoughtcrime/securesms/conversation/MessageStyler;->monoStyle()Landroid/text/style/CharacterStyle; -PLorg/thoughtcrime/securesms/conversation/MessageStyler;->strikethroughStyle()Landroid/text/style/CharacterStyle; -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda3;->(Lio/reactivex/rxjava3/core/ObservableEmitter;J)V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4;->cancel()V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->(J)V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->$r8$lambda$2XiX_Dh66c_pIVZzuRFfoiDjp1A(JLio/reactivex/rxjava3/core/ObservableEmitter;)V PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->$r8$lambda$ej8HJIkF2PUVMbFRXSAuhVdCWz4(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->()V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->()V PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount$lambda$6$lambda$5(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount$lambda$6(JLio/reactivex/rxjava3/core/ObservableEmitter;)V -PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount(J)Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;)V -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->()V -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->clearDraft()V -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; -PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->setListener(Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$Listener;)V -PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->()V -PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->(Landroidx/activity/ComponentActivity;)V -PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onStop(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->release()V -PLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->isGradient()Z -PLorg/thoughtcrime/securesms/conversation/colors/Colorizer$onGroupMembershipChanged$$inlined$sortedBy$1;->()V -PLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->()V -PLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->()V -PLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->onGroupMembershipChanged(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$edgeEffectFactory$1;->(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1;->(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->()V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getChatColors$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayerXfermode$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroid/graphics/PorterDuffXfermode; -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayoutManager(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroidx/recyclerview/widget/LinearLayoutManager; -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getNoLayerXfermode$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroid/graphics/PorterDuffXfermode; -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getUseLayer$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Z -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$setUseLayer$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;Z)V -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->getLayoutManager()Landroidx/recyclerview/widget/LinearLayoutManager; -PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->setChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +PLorg/thoughtcrime/securesms/conversation/colors/AvatarColor;->random()Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$$ExternalSyntheticLambda0;->run()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Ljava/lang/CharSequence;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component1()Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component2()Ljava/lang/CharSequence; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Lkotlin/Pair; PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->$r8$lambda$SLYPkhFM2MVtyCpgHajSG6aOkdY(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->access$getShareOrDraftDataInternal(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)Lkotlin/Pair; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftDataInternal(J)Lkotlin/Pair; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->loadDraftsInternal(J)Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft; PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->saveDrafts$lambda$9(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->saveDrafts(JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copy(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copyAndSetDrafts$default(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copyAndSetDrafts(JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->getThreadId()J -PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->getVoiceNoteDraft()Lorg/thoughtcrime/securesms/database/DraftTable$Draft; PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->toDrafts()Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;)V PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->invoke(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Lkotlin/Pair;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/MaybeSource; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->()V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->(JLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;)V -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->access$saveDrafts(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->getVoiceNoteDraft()Lorg/thoughtcrime/securesms/database/DraftTable$Draft; -PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->loadShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->onCleared()V PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->saveDrafts(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->run()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->$r8$lambda$IJ0Uk3eauzGuBkd_D1PotCUrlIQ(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->endAnimations()V PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->endSlideAnimations()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished$lambda$4(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Companion;->fromSet(Ljava/util/Set;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection; -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->(Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->$values()[Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;->values()[Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference; -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$WhenMappings;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->(Landroid/content/Context;Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->consumePulseRequest(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawFocusShadeOverIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawFocusShadeUnderIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->drawPulseShadeOverIfNecessary(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->invalidateIfPulseRequestAnimatorsAreRunning(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Text;->hashCode()I -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;->()V -PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog$$ExternalSyntheticLambda5;->()V -PLorg/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeDialog$$ExternalSyntheticLambda5;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1;->onFocusChange(Landroid/view/View;Z)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->$r8$lambda$GRwMc6fkPK5Q2WrXsl-thUTyAds(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;Landroid/view/View;Z)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->()V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;Landroid/view/View;Landroid/view/ViewGroup;Lorg/thoughtcrime/securesms/components/ComposeText;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->_init_$lambda$0(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;Landroid/view/View;Z)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->access$dismiss(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->access$getEmojiPopup$p(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup; -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->dismiss()V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->onOrientationChange(Z)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->updateList(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Results;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->()V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;Lorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;Lorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getResults()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getSelection()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->()V -PLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->(Lorg/thoughtcrime/securesms/database/RecipientTable;)V -PLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->(Lorg/thoughtcrime/securesms/database/RecipientTable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract;->()V -PLorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract;->()V -PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener$TransitionListener$$ExternalSyntheticLambda0;->(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener$TransitionListener;->(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->()V -PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0;->run()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$1;->(Landroidx/activity/ComponentActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$2;->(Landroidx/activity/ComponentActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$3;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$4;->(Landroidx/activity/ComponentActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$5;->(Landroidx/activity/ComponentActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$stripeRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->$r8$lambda$rJaCnn2xrQlJTPwnM83GXFMdMzE(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onCreate$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onCreate(Landroid/os/Bundle;Z)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onDestroy()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onPreCreate()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onResume()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->replaceFragment()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$ContactShareEditor;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$ContactShareEditor;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$GifSearch;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$GifSearch;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaCapture;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaCapture;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaGallery;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaGallery;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaSelection;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$MediaSelection;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectContact;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectContact;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectFile;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectFile;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectLocation;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$SelectLocation;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$cameraLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$contactShareLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$gifSearchLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$mediaGalleryLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$mediaSelectionLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectContactLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectFileLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$selectLocationLauncher$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Callbacks;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda3;->createViewHolder(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda7;->createViewHolder(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->canPlayContent()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->showProjectionArea()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingTextOnlyViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingTextOnlyViewHolder;->bind(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$1;->invoke(Ljava/lang/String;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->$r8$lambda$IF2igntoyr54qg7R4qDyHaeULCk(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind$lambda$0(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->$r8$lambda$0GW66dll143qhTHiVUdlBHolclI(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->$r8$lambda$GCL80uTaHzn1J8HuFNMwcXA7X1A(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->_init_$lambda$2(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->_init_$lambda$6(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getColorizer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getCondensedMode$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getHasWallpaper$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getInlineContent$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getLifecycleOwner$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Landroidx/lifecycle/LifecycleOwner; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$get_selected$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Ljava/util/HashSet; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->consumePulseRequest()Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge$PulseRequest; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getClickListener()Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getGlideRequests()Lorg/thoughtcrime/securesms/mms/GlideRequests; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSearchQuery()Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->hasNoConversationMessages()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->isMessageRequestAccepted()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onHasWallpaperChanged(Z)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onViewRecycled(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setMessageRequestAccepted(Z)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setMessageRequestIsAccepted(Z)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setSearchQuery(Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->updateSearchQuery(Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearReminder()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearRequestReview()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearUnverifiedBanner()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearVoiceNotePlayer()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getReminderStub()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getReviewBannerStub()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getUnverifiedBannerStub()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getVoiceNotePlayerStub()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->hide(Lorg/thoughtcrime/securesms/util/views/Stub;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$Listener;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda13;->(Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda14;->(Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda15;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActionModeCallback;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActivityResultCallbacks;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentKeyboardFragmentListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentManagerListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$BackPressedDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener;->onFocusChange(Landroid/view/View;Z)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationBannerListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationItemClickListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$1;->(Landroidx/appcompat/widget/SearchView;Landroidx/appcompat/widget/SearchView$OnQueryTextListener;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroid/view/Menu;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$queryListener$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->clearExpiring()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->getSnapshot()Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->onOptionsMenuCreated(Landroid/view/Menu;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver;->onItemRangeChanged(II)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DisabledInputListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelMediaListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$KeyboardEvents;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroidx/recyclerview/widget/LinearLayoutManager;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$MotionEventRelayDrain;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$OnReactionsSelectedListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper;->bind(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->$r8$lambda$SqiWUifYWEV36mNfvnPsrkHWoAw(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled$lambda$0(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->presentComposeDivider()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SearchEventListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SendButtonListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SwipeAvailabilityProvider;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->setToolbarMargin(I)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroidx/appcompat/widget/Toolbar;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener;->onGlobalLayout()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$VoiceMessageRecordingSessionCallbacks;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$WhenMappings;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->invoke(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3;->invoke(Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationGroupViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->invoke(Lj$/util/Optional;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->test(Ljava/lang/Object;Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->test(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->accept(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->invoke(I)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Lj$/util/Optional;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->test(Ljava/lang/Object;Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->test(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$attachListener$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1;->invoke()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$1;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$3;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->invoke(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$jumpAndPulseScrollStrategy$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->invoke()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->accept(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2;->accept(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->apply(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)Lio/reactivex/rxjava3/core/ObservableSource; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0;->run()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->run()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1;->(Landroid/view/View;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->$r8$lambda$oOR6vln5-HH0T67uKvvWOaEanvw(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->invoke$lambda$1(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->invoke(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1;->invoke()Landroidx/lifecycle/ViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1;->invoke()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1;->(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1;->get()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->invoke(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->getFunctionDelegate()Lkotlin/Function; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->onChanged(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelStore; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$2;->(Lkotlin/jvm/functions/Function0;Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$2;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Landroidx/lifecycle/ViewModelStore; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->(Lkotlin/jvm/functions/Function0;Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->(Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Landroidx/lifecycle/ViewModelStore; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->(Landroidx/fragment/app/Fragment;Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$voiceNotePlayerListener$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$doAfterFirstRender(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAdapter$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getArgs(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getColorizer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeText(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ComposeText; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeTextEventsListener$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getConversationItemDecorations$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getConversationRecipientRepository(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getDataObserver$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getGroupCallViewModel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInlineQueryViewModel$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInputPanel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/InputPanel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getLayoutManager$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Landroidx/recyclerview/widget/ConversationLayoutManager; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getMarkReadHelper$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/MarkReadHelper; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getMessageRequestRepository(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getScrollListener$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getScrollToPositionDelegate$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getSearchMenuItem$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Landroid/view/MenuItem; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getTextDraftSaveDebouncer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/util/Debouncer; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getThreadHeaderMarginDecoration$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getViewModel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$handleScheduledMessagesCountChange(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;I)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$invalidateOptionsMenu(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$isScrolledToBottom(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$isSearchRequested$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$moveToStartPosition(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/ConversationData;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$onRecipientChanged(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentIdentityRecordsState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentInputReadyState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentRequestReviewState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentScrollButtons(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Z)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setScrollListener$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setSearchMenuItem$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroid/view/MenuItem;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$updateMessageRequestAcceptedState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Z)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$updateToggleButtonState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getArgs()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getComposeText()Lorg/thoughtcrime/securesms/components/ComposeText; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getContainer()Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getConversationRecipientRepository()Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getDraftViewModel()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getGroupCallViewModel()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getInlineQueryController()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getInputPanel()Lorg/thoughtcrime/securesms/components/InputPanel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getKeyboardPagerViewModel()Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getLinkPreviewViewModel()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getMessageRequestRepository()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getMotionEventRelay()Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getScheduledMessagesStub()Lorg/thoughtcrime/securesms/util/views/Stub; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchNav()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchViewModel()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendButton()Lorg/thoughtcrime/securesms/components/SendButton; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendEditButton()Landroid/widget/ImageButton; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getShareDataTimestampViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getStickerViewModel()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->handleScheduledMessagesCountChange(I)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeGiphyMp4()Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeInlineSearch()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeLinkPreviews()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeMediaKeyboard()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeSearch()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeStickerSuggestions()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->invalidateOptionsMenu()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->isScrolledToBottom()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->moveToStartPosition(Lorg/thoughtcrime/securesms/conversation/ConversationData;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->observeConversationThread()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onCreate(Landroid/os/Bundle;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onDestroyView()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onPause()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onRecipientChanged(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onResume()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onViewStateRestored(Landroid/os/Bundle;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentActionBarMenu()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentConversationTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentGroupCallJoinButton()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentIdentityRecordsState(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentInputReadyState(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentNavigationIconForNormal()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentRequestReviewState(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentScrollButtons(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentStoryRing()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentTypingIndicator()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentWallpaper(Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->registerForResults()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->updateMessageRequestAcceptedState(Z)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->updateToggleButtonState()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getHeight()I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->updateForWallpaper()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->(ZZ)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->(ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->access$timestamp(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHasWallpaper()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->setCurrentItems(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->setFirstUnreadCount(I)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->setHasWallpaper(Z)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->updateUnreadState(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$$ExternalSyntheticLambda0;->(J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$$ExternalSyntheticLambda0;->call()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2$1;->apply(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/ObservableSource; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->$r8$lambda$C1ukP4YSsuxMkwIfGNrqsHmBxh0(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->(J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->invoke$lambda$0(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->invoke()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$conversationRecipient$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1$$ExternalSyntheticLambda0;->call()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->$r8$lambda$NvFETYLxPBjE2XjrolSGmoCr9vc(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lj$/util/Optional; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->apply$lambda$0(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lj$/util/Optional; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lio/reactivex/rxjava3/core/SingleSource; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2;->invoke()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->(J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->getConversationRecipient()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->getGroupRecord()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11;->call()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda12;->(JJ)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda12;->run()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->call()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->call()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7;->(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7;->call()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda9;->(J)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda9;->run()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->(II)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->getMentions()I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;->getUnread()I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$1;->apply(Lkotlin/Unit;)Ljava/lang/Integer; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->apply(I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$-gMXe-w-Xm5jHJapWlyQ6eOUlEE(JJ)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$98QfcuQyzMi7mf2qZrmWDK7X98k(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$ATtSNJzojyDhPrLSHCNff4Xrn4s(J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$KdCOHPNqejWN1AhOnsjSsYWIQ1E(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$SEmY6z8BVO3vpDRoIUBmm8tqjes(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$jYghkNuRsI_xLxRgZRxsCeMcFTc(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->(Landroid/content/Context;Z)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->access$getUnreadCount(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->access$getUnreadMentionsCount(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getConversationThreadState$lambda$0(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getConversationThreadState(JI)Lio/reactivex/rxjava3/core/Single; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getMessageCounts(J)Lio/reactivex/rxjava3/core/Flowable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder(Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Maybe; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState$lambda$15(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadCount(J)I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadMentionsCount(J)I PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->markLastSeen$lambda$28(J)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->markLastSeen(J)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->setLastVisibleMessageTimestamp$lambda$5(JJ)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->setLastVisibleMessageTimestamp(JJ)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->(ZZZIZ)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->(ZZZIZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->copy$default(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;ZZZIZILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->copy(ZZZIZ)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->startExpirationTimeout(Ljava/util/List;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getHasMentions()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getShowScrollButtons()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getUnreadCount()I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->toString()Ljava/lang/String; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->(Lorg/signal/paging/ObservablePagedData;Lorg/thoughtcrime/securesms/conversation/ConversationData;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->getItems()Lorg/signal/paging/ObservablePagedData; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;->getMeta()Lorg/thoughtcrime/securesms/conversation/ConversationData; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->(Landroid/app/Activity;Landroid/view/View;Lkotlin/jvm/functions/Function0;Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getActiveColorSet()Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getActiveToolbarColor(Z)I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getInactiveColorSet()Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper;->getInactiveToolbarColor(Z)I -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips$special$$inlined$viewModels$default$5;->(Landroidx/fragment/app/Fragment;Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationTooltips;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->apply(Lkotlin/Unit;Lj$/util/Optional;)Lj$/util/Optional; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Lj$/util/Optional;)Lio/reactivex/rxjava3/core/MaybeSource; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15$1;->(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$1;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda0;->(Lorg/signal/paging/PagingController;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda1;->(Lorg/signal/paging/PagingController;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda2;->(Lorg/signal/paging/PagingController;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$16;->onComplete()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$16;->onNext(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$16;->onNext(Ljava/util/List;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda3;->cancel()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3$$ExternalSyntheticLambda4;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->$r8$lambda$6vD-MGLKaMLR-d3fYoBu824GBvs(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;Lio/reactivex/rxjava3/core/ObservableEmitter;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->$r8$lambda$V11cxEHo-PxLzOR7edRE3YltJBk(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->apply$lambda$4$lambda$3(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->apply$lambda$4(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;Lio/reactivex/rxjava3/core/ObservableEmitter;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$3;->apply(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)Lio/reactivex/rxjava3/core/ObservableSource; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->test(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$5;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$6;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$6;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$7;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts;Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$8;->(Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$8;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9;->accept(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Lj$/util/Optional;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->(ZZ)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Lio/reactivex/rxjava3/core/ObservableSource; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$getHasMessageRequestStateSubject$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lio/reactivex/rxjava3/subjects/BehaviorSubject; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$getIdentityRecordsStore$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$getRepository$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$get_conversationThreadState$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lio/reactivex/rxjava3/subjects/Subject; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$setRecipientSnapshot$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->canShowAsBubble(Landroid/content/Context;)Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getConversationThreadState()Lio/reactivex/rxjava3/core/Single; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getGroupMemberServiceIds()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getHasMessageRequestState()Z -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getIdentityRecordsObservable()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getInputReadyState()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getPagingController()Lorg/signal/paging/ProxyPagingController; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRecipient()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRecipientSnapshot()Lorg/thoughtcrime/securesms/recipients/Recipient; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getReminder()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRequestReviewState()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScheduledMessagesCount()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScrollButtonState()Lio/reactivex/rxjava3/core/Flowable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getSearchQuery()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getStoryRingState()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getThreadId()J -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getWallpaperSnapshot()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->isPushAvailable()Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->markLastSeen()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->onCleared()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->setLastScrolled(J)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->setShowScrollButtonsForScrollPosition(ZZ)V -PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->updateIdentityRecordsInBackground()V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$inflater$2;->(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->()V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->clear()V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$Listener;)V -PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->setWallpaperEnabled(Z)V -PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isGroup()Z -PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isUnverified()Z -PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isVerified()Z -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getConversationRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getGroupRecord()Lorg/thoughtcrime/securesms/database/model/GroupRecord; -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getMessageRequestState()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isActiveGroup()Ljava/lang/Boolean; -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isAnnouncementGroup()Ljava/lang/Boolean; -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isClientExpired()Z -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isRequestingMember()Ljava/lang/Boolean; -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isUnauthorized()Z -PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->shouldShowInviteToSignal()Z -PLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V -PLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V -PLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->setDrain(Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay$Drain;)V -PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;)V -PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->shouldShowReviewBanner()Z -PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V -PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->getTimestamp()J -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/String;)Lio/reactivex/rxjava3/core/SingleSource; -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->()V -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;)V -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->access$getStickerSearchRepository$p(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository; -PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->getStickers()Lio/reactivex/rxjava3/core/Flowable; -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;)V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration$$ExternalSyntheticLambda1;->onLayoutChange(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration$typingView$2;->(Lorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;)V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;->$r8$lambda$Pe7tm9Mj9InPgQGmMX_qbky2MUY(Lorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;->()V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;->(Landroid/content/Context;Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;->_init_$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/TypingIndicatorDecoration;Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->()V -PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/audio/AudioRecorder;Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$SessionCallback;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;->$r8$lambda$8gKc74PDnws6K1Z8Qv5fkOax3Xk(Lorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;->add(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;->buildUpdatedModels(Landroid/content/Context;Ljava/util/List;)Ljava/util/List; -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;->fetchAttachments()V -PLorg/thoughtcrime/securesms/conversation/v2/data/AttachmentHelper;->lambda$buildUpdatedModels$0(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;->$r8$lambda$Ezeamumsyj9tsnfFeNRMCCh_cPM(Lorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;->add(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;->buildUpdatedModels(Ljava/util/List;)Ljava/util/List; -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;->fetchCalls()V -PLorg/thoughtcrime/securesms/conversation/v2/data/CallHelper;->lambda$buildUpdatedModels$0(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$threadRecipient$2;->(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$threadRecipient$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$threadRecipient$2;->invoke()Lorg/thoughtcrime/securesms/recipients/Recipient; -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->(Landroid/content/Context;JLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;ZILorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->(Landroid/content/Context;JLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;ZILorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->access$getThreadId$p(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;)J -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getKey(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getKey(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey; -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getSizeInternal()I -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->getThreadRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->load(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->load(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel; -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->loadThreadHeader()Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader; -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->size()I -PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->toMappingModel(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel; PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey$Companion;->()V PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey$Companion;->()V PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey$Companion;->getThreadHeader()Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey; PLorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getChangePayload(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areContentsTheSame(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areItemsTheSame(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->getChangePayload(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/MentionHelper;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/MentionHelper;->add(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/MentionHelper;->fetchMentions(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/MentionHelper;->getMentions(J)Ljava/util/List; -PLorg/thoughtcrime/securesms/conversation/v2/data/MessageBackedKey;->(J)V -PLorg/thoughtcrime/securesms/conversation/v2/data/MessageBackedKey;->hashCode()I -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;->$r8$lambda$RtuHxQbcXxf8gfMTWpgl-r1BGmE(Lorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;->add(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;->buildUpdatedModels(Ljava/util/List;)Ljava/util/List; -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;->fetchPayments()V -PLorg/thoughtcrime/securesms/conversation/v2/data/PaymentHelper;->lambda$buildUpdatedModels$0(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/QuotedHelper;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/QuotedHelper;->add(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/QuotedHelper;->fetchQuotedState()V -PLorg/thoughtcrime/securesms/conversation/v2/data/QuotedHelper;->isQuoted(J)Z -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;->$r8$lambda$C1_Xdw3pDbqyenzv6LkoHy17DCM(Lorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;->add(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;->buildUpdatedModels(Ljava/util/List;)Ljava/util/List; -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;->fetchReactions()V -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;->lambda$buildUpdatedModels$0(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/ReactionHelper;->recordWithReactions(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->(Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;)V PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areContentsTheSame(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areItemsTheSame(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->getChangePayload(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->getRecipientInfo()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; -PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeaderKey;->()V -PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeaderKey;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZZ)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->copy(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZZ)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState; PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getActiveV2Group()Z -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getHasCapacity()Z -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getOngoingCall()Z -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1$1;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1;->(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$1;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$2;->apply(Lkotlin/Unit;Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$3;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$1;->test(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Z -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel$filteredState$2;->apply(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)Ljava/lang/Boolean; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;)V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->getHasOngoingGroupCallSnapshot()Z -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->onCleared()V -PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->peekGroupCall()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion$$ExternalSyntheticLambda0;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion$$ExternalSyntheticLambda0;->onLayoutChange(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->$r8$lambda$-arOo52soPOPIS27YgHWzsDQIu8(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->applyBounds(Landroid/graphics/Rect;)V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->attach$lambda$0(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$Companion;->attach(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->access$getMaskDrawable$cp()Landroid/graphics/drawable/Drawable; -PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->access$setMaskDrawable$cp(Landroid/graphics/drawable/Drawable;)V -PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationBodyUtil;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationBodyUtil;->()V -PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationBodyUtil;->linkifyUrlLinks(Landroid/text/Spannable;ZLorg/thoughtcrime/securesms/util/UrlClickHandler;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z -PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;Landroid/view/View;II)Z -PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;I)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationFilterBehavior;->onStopNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;Landroid/view/View;I)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$$ExternalSyntheticLambda1;->onClick(Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->$r8$lambda$2QDH4q4xSHpazU1KhZ4uhNUhhdI(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->lambda$onCreateViewHolder$1(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda28;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda28;->run()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda29;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;JI)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$$ExternalSyntheticLambda29;->run(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->canStartNestedScroll()Z -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$1;->onStopNestedScroll()V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$SjqQGnCYg0hI4HkBpa5riMMrMQ4(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->$r8$lambda$iJUotN70H_1yimzrBAvjzwLI6XI(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;JILjava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$fgetpullView(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView; -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->-$$Nest$misSearchOpen(Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;)Z -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->handleCreateConversation(JLorg/thoughtcrime/securesms/recipients/Recipient;I)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$handleCreateConversation$46(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->lambda$handleCreateConversation$47(Lorg/thoughtcrime/securesms/recipients/Recipient;JILjava/lang/Object;)V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onConversationClick(Lorg/thoughtcrime/securesms/conversationlist/model/Conversation;)V +PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;->onCleared()V PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onDestroyView()V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onPause()V -PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onStop()V PLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onCleared()V -PLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->onSaveInstanceState()Landroid/os/Parcelable; -PLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->onUserDragFinished()V -PLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda1;->()V -PLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda2;->()V -PLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda3;->()V -PLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->getIdentityRecords(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/identity/IdentityRecordList; -PLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachmentsForMessages(Ljava/util/Collection;)Ljava/util/Map; -PLorg/thoughtcrime/securesms/database/AttachmentTable;->hasStickerAttachments()Z -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->equals(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->getSelfProfileKey()Lorg/signal/libsignal/zkgroup/profiles/ProfileKey; +PLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->profileKeyOptional([B)Lj$/util/Optional; +PLorg/thoughtcrime/securesms/crypto/ProfileKeyUtil;->profileKeyOrNull([B)Lorg/signal/libsignal/zkgroup/profiles/ProfileKey; +PLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachment(Lorg/thoughtcrime/securesms/attachments/AttachmentId;)Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; +PLorg/thoughtcrime/securesms/database/CallTable;->getLatestRingingCalls()Ljava/util/List; +PLorg/thoughtcrime/securesms/database/CallTable;->markRingingCallsAsMissed()V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->run()V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda1;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda24;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda24;->run()V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda26;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda26;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda28;->run()V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda30;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5;->run()V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->run()V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$2v1Sb-6JCd9xjyyzfbH5tKTRWy8(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$6H_TtixOHSa7Tr30medlqcHry2c(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$6mdIgDDCV4XFVFnyxH8Vj4a6MqU(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$8PzBCQMLi_6Y7FOR98cRbpXw-Xk(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$P-H8JPj8WgBa8EorlTkjTC0yG1E(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$XpAe1b_YlxfSEkV3hD_v20iDkHw(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$XcpL0fyOGdTr1sc4d0z4i8eoe14(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$ZjxWKgbWA1SSTmnWoVneQana_Lk(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$oXFDlhvhHFY1OBIQHYp3Oanmq-k(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$wnm9BEANNc03FZmWKcqOLSgrT_U(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyStoryObservers$35(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyVerboseConversationListeners$20(J)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerConversationObserver$1(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageInsertObserver$11(JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageUpdateObserver$10(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerScheduledMessageObserver$14(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerStoryObserver$13(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerVerboseConversationObserver$2(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$18(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyStoryObservers(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyVerboseConversationListeners(Ljava/util/Set;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerConversationObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMapped(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMessageInsertObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMessageUpdateObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerScheduledMessageObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerStoryObserver(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerVerboseConversationObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->unregisterMapped(Ljava/util/Map;Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->unregisterObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->unregisterObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyVerboseConversationListeners(Ljava/util/Set;)V PLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->(Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->addIfNotNull(Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V -PLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->getDraftOfType(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/DraftTable$Draft; PLorg/thoughtcrime/securesms/database/DraftTable;->clearDrafts(J)V -PLorg/thoughtcrime/securesms/database/GroupTable;->getGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/util/List; -PLorg/thoughtcrime/securesms/database/GroupTable;->getPushGroupNamesContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/util/List; -PLorg/thoughtcrime/securesms/database/GroupTable;->getPushGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/util/List; -PLorg/thoughtcrime/securesms/database/MentionTable;->getMentionsForMessages(Ljava/util/Collection;)Ljava/util/Map; -PLorg/thoughtcrime/securesms/database/MentionTable;->readMentions(Landroid/database/Cursor;)Ljava/util/Map; -PLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$ReaderIterator;->next()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/database/MessageTable$MmsReader$ReaderIterator;->next()Lorg/thoughtcrime/securesms/database/model/MessageRecord; -PLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->buildSlideDeck(Landroid/content/Context;Ljava/util/List;)Lorg/thoughtcrime/securesms/mms/SlideDeck; -PLorg/thoughtcrime/securesms/database/MessageTable$QuoteDescriptor;->(JLorg/thoughtcrime/securesms/recipients/RecipientId;)V -PLorg/thoughtcrime/securesms/database/MessageTable$QuoteDescriptor;->hashCode()I -PLorg/thoughtcrime/securesms/database/MessageTable;->getConversation(JJJ)Landroid/database/Cursor; -PLorg/thoughtcrime/securesms/database/MessageTable;->getMessageCountForThread(J)I +PLorg/thoughtcrime/securesms/database/JobDatabase;->updateJobAfterRetry(Ljava/lang/String;JIJ[B)V +PLorg/thoughtcrime/securesms/database/MessageTable$markExpireStarted$1;->(Ljava/util/Collection;)V +PLorg/thoughtcrime/securesms/database/MessageTable$markExpireStarted$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/database/MessageTable$markExpireStarted$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V +PLorg/thoughtcrime/securesms/database/MessageTable;->getAllStoriesFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;I)Lorg/thoughtcrime/securesms/database/MessageTable$Reader; PLorg/thoughtcrime/securesms/database/MessageTable;->getMessagePositionOnOrAfterTimestamp(JJ)I PLorg/thoughtcrime/securesms/database/MessageTable;->getMessagesForNotificationState(Ljava/util/Collection;)Landroid/database/Cursor; -PLorg/thoughtcrime/securesms/database/MessageTable;->getScheduledMessageCountForThread(J)I -PLorg/thoughtcrime/securesms/database/MessageTable;->getStoryViewState(J)Lorg/thoughtcrime/securesms/database/model/StoryViewState; -PLorg/thoughtcrime/securesms/database/MessageTable;->getStoryViewState(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/StoryViewState; -PLorg/thoughtcrime/securesms/database/MessageTable;->isQuoted(Ljava/util/Collection;)Ljava/util/Set; +PLorg/thoughtcrime/securesms/database/MessageTable;->markExpireStarted(Ljava/util/Collection;)V PLorg/thoughtcrime/securesms/database/MessageTable;->setMessagesReadSince(JJ)Ljava/util/List; PLorg/thoughtcrime/securesms/database/MessageTable;->setReactionsSeen(JJ)V -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isBundleKeyExchange(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isDuplicateMessageType(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isFailedMessageType(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isGroupV1MigrationEvent(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPendingInsecureSmsFallbackType(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPendingMessageType(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPendingSecureSmsFallbackType(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isRateLimited(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSecureType(J)Z -PLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSmsExport(J)Z -PLorg/thoughtcrime/securesms/database/PaymentTable;->getPayments(Ljava/util/Collection;)Ljava/util/List; -PLorg/thoughtcrime/securesms/database/ReactionTable;->getReactionsForMessages(Ljava/util/Collection;)Ljava/util/Map; +PLorg/thoughtcrime/securesms/database/RecipientTable$GetOrInsertResult;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)V +PLorg/thoughtcrime/securesms/database/RecipientTable$GetOrInsertResult;->getRecipientId()Lorg/thoughtcrime/securesms/recipients/RecipientId; +PLorg/thoughtcrime/securesms/database/RecipientTable;->insertReleaseChannelRecipient()Lorg/thoughtcrime/securesms/recipients/RecipientId; +PLorg/thoughtcrime/securesms/database/RecipientTable;->setMuted(Lorg/thoughtcrime/securesms/recipients/RecipientId;J)V +PLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileAvatar(Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/lang/String;)V PLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda1;->cancel()V -PLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversation$1;->(J)V -PLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversation$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/database/RxDatabaseObserver$conversation$1;->invoke(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V +PLorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;->onChanged()V PLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->$r8$lambda$6u1bbd117Cl1h38MfeI7BgZPo1A(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V -PLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->conversation(J)Lio/reactivex/rxjava3/core/Flowable; PLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->databaseFlowable$lambda$1$lambda$0(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V -PLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->payments()Lorg/thoughtcrime/securesms/database/PaymentTable; -PLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->reactions()Lorg/thoughtcrime/securesms/database/ReactionTable; -PLorg/thoughtcrime/securesms/database/SignalDatabase;->getPaymentTable()Lorg/thoughtcrime/securesms/database/PaymentTable; -PLorg/thoughtcrime/securesms/database/SignalDatabase;->getReactionTable()Lorg/thoughtcrime/securesms/database/ReactionTable; -PLorg/thoughtcrime/securesms/database/SignalDatabase;->payments()Lorg/thoughtcrime/securesms/database/PaymentTable; -PLorg/thoughtcrime/securesms/database/SignalDatabase;->reactions()Lorg/thoughtcrime/securesms/database/ReactionTable; -PLorg/thoughtcrime/securesms/database/StickerTable;->getAllStickerPacks(Ljava/lang/String;)Landroid/database/Cursor; -PLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->()V -PLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->(JZJI)V -PLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->getLastScrolled()J -PLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->getLastSeen()J -PLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->getUnreadCount()I PLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->(Ljava/util/Map;Lorg/thoughtcrime/securesms/database/ThreadTable;Ljava/util/List;ZLkotlin/jvm/internal/Ref$BooleanRef;)V PLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V PLorg/thoughtcrime/securesms/database/ThreadTable;->createQuery(Ljava/lang/String;J)Ljava/lang/String; -PLorg/thoughtcrime/securesms/database/ThreadTable;->getConversationMetadata(J)Lorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata; PLorg/thoughtcrime/securesms/database/ThreadTable;->getThreadRecord(Ljava/lang/Long;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord; PLorg/thoughtcrime/securesms/database/ThreadTable;->setLastSeen(J)V PLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(JZJ)Ljava/util/List; PLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(Ljava/util/Map;Z)Ljava/util/List; PLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;ZJ)Ljava/util/List; PLorg/thoughtcrime/securesms/database/ThreadTable;->update(JZZ)Z -PLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->()V PLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isUnverified()Z -PLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isUnverified(Ljava/util/Collection;)Z -PLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isVerified()Z -PLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->isVerified(Ljava/util/Collection;)Z -PLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getToRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; -PLorg/thoughtcrime/securesms/database/model/DisplayRecord;->getViewedReceiptCount()I -PLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isKeyExchange()Z -PLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPending()Z -PLorg/thoughtcrime/securesms/database/model/IdentityRecord;->getVerifiedStatus()Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus; -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda0;->()V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda1;->()V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda2;->()V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda3;->()V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda4;->()V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda5;->(Ljava/util/Set;)V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda5;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda6;->(Ljava/util/Set;)V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda6;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda8;->(Ljava/util/Map;)V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord$$ExternalSyntheticLambda9;->(Ljava/util/Map;)V -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->$r8$lambda$cBkbuMSmzz3TuVkB3EmeJL0n8_E(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->$r8$lambda$up8PZ00yIipxNCBebesipIcJWhE(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->getCall()Lorg/thoughtcrime/securesms/database/CallTable$Call; -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->getLatestRevisionId()Lorg/thoughtcrime/securesms/database/model/MessageId; -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->getPayment()Lorg/thoughtcrime/securesms/payments/Payment; -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->lambda$withAttachments$0(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->lambda$withAttachments$1(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->updateContacts(Ljava/util/List;Ljava/util/Map;)Ljava/util/List; -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->updateLinkPreviews(Ljava/util/List;Ljava/util/Map;)Ljava/util/List; -PLorg/thoughtcrime/securesms/database/model/MediaMmsMessageRecord;->updateQuote(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/Quote;Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/Quote; -PLorg/thoughtcrime/securesms/database/model/MessageId;->getId()J -PLorg/thoughtcrime/securesms/database/model/MessageId;->hashCode()I -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Landroid/text/SpannableString; -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getExpireStarted()J -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getFromDeviceId()I -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getIdentityKeyMismatches()Ljava/util/Set; -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getNetworkFailures()Ljava/util/Set; -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getNotifiedTimestamp()J -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getOriginalMessageId()Lorg/thoughtcrime/securesms/database/model/MessageId; -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getReceiptTimestamp()J -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getRevisionNumber()I -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getServerTimestamp()J -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->getSubscriptionId()I -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->hashCode()I -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->isBundleKeyExchange()Z -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->isEditMessage()Z -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->isJumbomoji(Landroid/content/Context;)Z -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->isLegacyMessage()Z -PLorg/thoughtcrime/securesms/database/model/MessageRecord;->isUnidentified()Z -PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getParentStoryId()Lorg/thoughtcrime/securesms/database/model/ParentStoryId; -PLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getStoryType()Lorg/thoughtcrime/securesms/database/model/StoryType; PLorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda1;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda2;->(Lio/reactivex/rxjava3/core/ObservableEmitter;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion$$ExternalSyntheticLambda3;->cancel()V PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->$r8$lambda$_YM1i9V93JIKhbRirbAeb_98VJw(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->$r8$lambda$qlVsO3gJogFXwiR82wyUg4D6NdU(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lio/reactivex/rxjava3/core/ObservableEmitter;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->()V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getForRecipientId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/Observable; PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getState$lambda$3$lambda$2(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getState$lambda$3$refresh(Lio/reactivex/rxjava3/core/ObservableEmitter;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getState$lambda$3(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lio/reactivex/rxjava3/core/ObservableEmitter;)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState$Companion;->getState(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/database/model/StoryViewState;->$values()[Lorg/thoughtcrime/securesms/database/model/StoryViewState; -PLorg/thoughtcrime/securesms/database/model/StoryViewState;->()V -PLorg/thoughtcrime/securesms/database/model/StoryViewState;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/database/model/StoryViewState;->values()[Lorg/thoughtcrime/securesms/database/model/StoryViewState; -PLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getDistributionType()I PLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isForcedUnread()Z -PLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->(Lorg/thoughtcrime/securesms/components/InputPanel;Landroid/widget/ImageButton;Landroidx/constraintlayout/widget/Barrier;Lorg/thoughtcrime/securesms/components/InputPanel;Lorg/thoughtcrime/securesms/components/AnimatingToggle;Landroid/view/View;Landroidx/constraintlayout/widget/Barrier;Lcom/google/android/material/imageview/ShapeableImageView;Landroidx/appcompat/widget/AppCompatTextView;Lorg/thoughtcrime/securesms/components/ComposeText;Lorg/thoughtcrime/securesms/components/emoji/EmojiToggle;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/components/HidingLinearLayout;Landroidx/appcompat/widget/AppCompatImageButton;Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/components/LinkPreviewView;Lorg/thoughtcrime/securesms/components/HidingLinearLayout;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/components/QuoteView;Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView;Lorg/thoughtcrime/securesms/components/SendButton;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;)V -PLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding; -PLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->getRoot()Lorg/thoughtcrime/securesms/components/InputPanel; -PLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->(Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;Landroidx/appcompat/widget/AppCompatImageView;Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;Landroid/widget/TextView;Lcom/pnikosis/materialishprogress/ProgressWheel;Landroidx/appcompat/widget/AppCompatImageView;)V -PLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding; -PLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->getRoot()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; -PLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->(Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/avatar/view/AvatarView;Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/components/FromTextView;Landroidx/appcompat/widget/AppCompatImageView;Landroid/widget/TextView;)V -PLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding; -PLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->getRoot()Lorg/thoughtcrime/securesms/conversation/ConversationTitleView; -PLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->(Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;Landroid/view/ViewStub;Landroid/view/View;Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar;Landroidx/constraintlayout/widget/Barrier;Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;Lcom/google/android/material/button/MaterialButton;Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;Landroidx/constraintlayout/widget/Barrier;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;Landroid/widget/FrameLayout;Landroid/view/ViewStub;Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;Landroid/widget/FrameLayout;Landroid/widget/ImageView;Landroid/view/View;Landroidx/fragment/app/FragmentContainerView;Landroidx/fragment/app/FragmentContainerView;Landroidx/fragment/app/FragmentContainerView;Landroid/widget/FrameLayout;Landroid/view/ViewStub;Landroid/view/ViewStub;Landroid/view/ViewStub;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/ConversationScrollToView;Lorg/thoughtcrime/securesms/components/ConversationScrollToView;Lorg/thoughtcrime/securesms/util/views/DarkOverflowToolbar;Landroid/view/View;Landroid/view/ViewStub;Landroid/view/ViewStub;)V -PLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; -PLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->getRoot()Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; -PLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getMessageNotifier()Lorg/thoughtcrime/securesms/notifications/MessageNotifier; -PLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideMessageNotifier()Lorg/thoughtcrime/securesms/notifications/MessageNotifier; +PLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getProfileService()Lorg/whispersystems/signalservice/api/services/ProfileService; +PLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies;->getSignalServiceMessageReceiver()Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver; +PLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideProfileService(Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;Lorg/whispersystems/signalservice/api/SignalWebSocket;)Lorg/whispersystems/signalservice/api/services/ProfileService; +PLorg/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider;->provideSignalServiceMessageReceiver(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;)Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver; +PLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version$Companion;->writeVersion(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V +PLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->access$getObjectMapper$cp()Lcom/fasterxml/jackson/databind/ObjectMapper; +PLorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;->writeVersion(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V +PLorg/thoughtcrime/securesms/emoji/EmojiFiles;->getBaseDirectory(Landroid/content/Context;)Ljava/io/File; +PLorg/thoughtcrime/securesms/emoji/EmojiFiles;->openForReading(Landroid/content/Context;Ljava/lang/String;)Ljava/io/InputStream; +PLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->()V +PLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->(Landroid/net/Uri;)V +PLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->equals(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->getUri()Landroid/net/Uri; +PLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->hashCode()I +PLorg/thoughtcrime/securesms/emoji/EmojiPage$Disk;->toString()Ljava/lang/String; PLorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult$Immediate;->()V PLorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult$Immediate;->(Landroid/graphics/Bitmap;)V PLorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult$Immediate;->getBitmap()Landroid/graphics/Bitmap; -PLorg/thoughtcrime/securesms/emoji/EmojiSource$maxEmojiLength$2;->invoke()Ljava/lang/Integer; -PLorg/thoughtcrime/securesms/emoji/EmojiSource$maxEmojiLength$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/emoji/EmojiSource;->getMaxEmojiLength()I -PLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$maxOrZero(Ljava/util/List;)I -PLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->maxOrZero(Ljava/util/List;)I -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->()V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->(Ljava/util/Set;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->(II)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->attach(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->findFirstVisibleItemPositions(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)[I -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->findLastVisibleItemPositions(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)[I -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSetForMaximumDistance(Ljava/util/Set;[I[I)Ljava/util/Set; -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->onLayoutChange(Landroid/view/View;IIIIIIII)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackPolicy;->maxSimultaneousPlaybackInConversation()I -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->()V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->(Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/emoji/EmojiPageCache;->clear()V +PLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->()V +PLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->()V +PLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->invoke(Landroid/net/Uri;)Lorg/thoughtcrime/securesms/emoji/EmojiPage; +PLorg/thoughtcrime/securesms/emoji/EmojiSource$Companion$loadRemoteBasedEmojis$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V +PLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4;->run()V +PLorg/thoughtcrime/securesms/emoji/JumboEmoji;->$r8$lambda$1MZfAT8L5tWrN2t8lIV1c9aeWgA(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V +PLorg/thoughtcrime/securesms/emoji/JumboEmoji;->updateCurrentVersion$lambda$1$lambda$0(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V +PLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->put(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;Ljava/lang/String;Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/fonts/FontFileMap$Companion;->setMap(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;Lorg/thoughtcrime/securesms/fonts/FontFileMap;)V +PLorg/thoughtcrime/securesms/fonts/FontFileMap;->(Ljava/util/Map;)V +PLorg/thoughtcrime/securesms/fonts/FontFileMap;->access$getObjectMapper$cp()Lcom/fasterxml/jackson/databind/ObjectMapper; +PLorg/thoughtcrime/securesms/fonts/FontFileMap;->copy(Ljava/util/Map;)Lorg/thoughtcrime/securesms/fonts/FontFileMap; +PLorg/thoughtcrime/securesms/fonts/FontFileMap;->getMap()Ljava/util/Map; +PLorg/thoughtcrime/securesms/fonts/Fonts;->loadFontIntoTypeface(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/FontVersion;Ljava/lang/String;)Landroid/graphics/Typeface; PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->(Ljava/util/List;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->()V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->getExoPlayer()Landroidx/media3/exoplayer/ExoPlayer; -PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->setResizeMode(I)V -PLorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder;->putStringListAsArray(Ljava/lang/String;Ljava/util/List;)Lorg/thoughtcrime/securesms/jobmanager/JsonJobData$Builder; +PLorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler;)V +PLorg/thoughtcrime/securesms/jobmanager/InAppScheduler$$ExternalSyntheticLambda0;->run()V +PLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->$r8$lambda$hBEn_48T9NK-BhOmjEIwF4k281g(Lorg/thoughtcrime/securesms/jobmanager/InAppScheduler;)V +PLorg/thoughtcrime/securesms/jobmanager/InAppScheduler;->lambda$schedule$0()V +PLorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder;->setPriority(I)Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters$Builder; +PLorg/thoughtcrime/securesms/jobmanager/Job$Result;->failure()Lorg/thoughtcrime/securesms/jobmanager/Job$Result; +PLorg/thoughtcrime/securesms/jobmanager/Job$Result;->getBackoffInterval()J +PLorg/thoughtcrime/securesms/jobmanager/Job$Result;->retry(J)Lorg/thoughtcrime/securesms/jobmanager/Job$Result; +PLorg/thoughtcrime/securesms/jobmanager/Job;->onRetry()V +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda0;->()V +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13;->()V +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda13;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobStorage;)V +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda14;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda16;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/jobmanager/JobController;)V +PLorg/thoughtcrime/securesms/jobmanager/JobController$$ExternalSyntheticLambda17;->accept(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$AFTJhIYz2IJLxa5cdEvspxyDnpk(Lorg/thoughtcrime/securesms/jobmanager/JobController;Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobmanager/JobController;->$r8$lambda$_WG2KEwBlGL1eFDhBUpj1kHB45I(Lorg/thoughtcrime/securesms/jobmanager/JobController;Lorg/thoughtcrime/securesms/jobmanager/Job;)V +PLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$onFailure$3(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobmanager/JobController;->lambda$onFailure$4(Lorg/thoughtcrime/securesms/jobmanager/Job;)V +PLorg/thoughtcrime/securesms/jobmanager/JobController;->onFailure(Lorg/thoughtcrime/securesms/jobmanager/Job;)Ljava/util/List; +PLorg/thoughtcrime/securesms/jobmanager/JobController;->onRetry(Lorg/thoughtcrime/securesms/jobmanager/Job;J)V +PLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getBoolean(Ljava/lang/String;)Z +PLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getBooleanOrDefault(Ljava/lang/String;Z)Z +PLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getLong(Ljava/lang/String;)J +PLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->getString(Ljava/lang/String;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->hasBoolean(Ljava/lang/String;)Z +PLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->hasString(Ljava/lang/String;)Z +PLorg/thoughtcrime/securesms/jobmanager/JsonJobData;->throwIfAbsent(Ljava/util/Map;Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob; +PLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->onRun()V +PLorg/thoughtcrime/securesms/jobs/AccountConsistencyWorkerJob;->onShouldRetry(Ljava/lang/Exception;)Z +PLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->()V +PLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->(JLorg/thoughtcrime/securesms/attachments/AttachmentId;Z)V +PLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;JLorg/thoughtcrime/securesms/attachments/AttachmentId;Z)V +PLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->constructQueueString(Lorg/thoughtcrime/securesms/attachments/AttachmentId;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->getFactoryKey()Ljava/lang/String; +PLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->onAdded()V +PLorg/thoughtcrime/securesms/jobs/AttachmentDownloadJob;->serialize()[B +PLorg/thoughtcrime/securesms/jobs/BaseJob;->getNextRunAttemptBackoff(ILjava/lang/Exception;)J PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->()V PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->()V PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;)V PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->enqueue()V PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->getFactoryKey()Ljava/lang/String; PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->serialize()[B -PLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->(Ljava/util/Set;)V -PLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Ljava/util/Set;)V -PLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->enqueue(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -PLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->forRecipient(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/jobmanager/Job; -PLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->getFactoryKey()Ljava/lang/String; -PLorg/thoughtcrime/securesms/jobs/RetrieveProfileJob;->serialize()[B -PLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->$values()[Lorg/thoughtcrime/securesms/keyboard/KeyboardPage; -PLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->()V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPage;->values()[Lorg/thoughtcrime/securesms/keyboard/KeyboardPage; -PLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;)V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->$r8$lambda$XJkrNaIPPzC8wWYTIkWhYRIl3fM(Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;Ljava/lang/Boolean;)V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->()V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->()V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->_init_$lambda$1(Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;Ljava/lang/Boolean;)V -PLorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel;->switchToPage(Lorg/thoughtcrime/securesms/keyboard/KeyboardPage;)V -PLorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;->()V -PLorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;->(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->values()[Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme; -PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getUniversalExpireTimer()I -PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isEnterKeySends()Z -PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isLinkPreviewsEnabled()Z -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->(Ljava/lang/String;ZZLj$/util/Optional;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository$Error;)V -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->forNoLinks()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->getLinkPreview()Lj$/util/Optional; -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->hasContent()Z -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->hasLinks()Z -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->isLoading()Z -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->()V -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;Z)V -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->getLinkPreviewState()Lio/reactivex/rxjava3/core/Flowable; +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob; +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1;->(Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/util/concurrent/CountDownLatch;)V +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$1;->invoke(Lorg/thoughtcrime/securesms/mediasend/Media;)V +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob$setAvatar$2;->(Ljava/util/concurrent/CountDownLatch;)V +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->access$getContext$p$s1046862181(Lorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;)Landroid/content/Context; +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->onRun()V +PLorg/thoughtcrime/securesms/jobs/CreateReleaseChannelJob;->setAvatar(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +PLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob; +PLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/recipients/Recipient;ZLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob-IA;)V +PLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->onRun()V +PLorg/thoughtcrime/securesms/jobs/DirectoryRefreshJob;->shouldTrace()Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda0;->()V +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda1;->(Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda2;->(Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob$$ExternalSyntheticLambda3;->()V +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->$r8$lambda$QoH7dcHnoANVuwa796Z9UVq8P10(Ljava/lang/String;Ljava/io/File;)Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->$r8$lambda$svSYKFZ54wbzF4p08Dr861zOX4Y(Ljava/lang/String;Ljava/io/File;)Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->clearOldEmojiData(Landroid/content/Context;Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->lambda$clearOldEmojiData$2(Ljava/lang/String;Ljava/io/File;)Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->lambda$clearOldEmojiData$3(Ljava/lang/String;Ljava/io/File;)Z +PLorg/thoughtcrime/securesms/jobs/DownloadLatestEmojiDataJob;->markComplete(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V +PLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getDependencySpecsThatDependOnJob(Ljava/lang/String;)Ljava/util/List; +PLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getSingleLayerOfDependencySpecsThatDependOnJob(Ljava/lang/String;)Ljava/util/List; +PLorg/thoughtcrime/securesms/jobs/FastJobStorage;->updateJobAfterRetry(Ljava/lang/String;JIJ[B)V +PLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$onRun$listener$1;->onSuccess(Landroid/graphics/Typeface;)V +PLorg/thoughtcrime/securesms/jobs/FontDownloaderJob$onRun$listener$1;->onSuccess(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob; +PLorg/thoughtcrime/securesms/jobs/GroupRingCleanupJob;->onRun()V +PLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob; +PLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob-IA;)V +PLorg/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob;->onFailure()V +PLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->onFailure()V +PLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->onShouldRetry(Ljava/lang/Exception;)Z +PLorg/thoughtcrime/securesms/jobs/PreKeysSyncJob;->syncPreKeys(Lorg/whispersystems/signalservice/api/push/ServiceIdType;Lorg/whispersystems/signalservice/api/push/ServiceId;Lorg/whispersystems/signalservice/api/SignalServiceAccountDataStore;Lorg/thoughtcrime/securesms/crypto/storage/PreKeyMetadataStore;)V +PLorg/thoughtcrime/securesms/jobs/ProfileUploadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/ProfileUploadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/ProfileUploadJob; +PLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;Lorg/thoughtcrime/securesms/jobs/ProfileUploadJob-IA;)V +PLorg/thoughtcrime/securesms/jobs/ProfileUploadJob;->onFailure()V +PLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/RefreshAttributesJob; +PLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;ZLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob-IA;)V +PLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->onFailure()V +PLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->onRun()V +PLorg/thoughtcrime/securesms/jobs/RefreshAttributesJob;->onShouldRetry(Ljava/lang/Exception;)Z +PLorg/thoughtcrime/securesms/jobs/RotateCertificateJob$1;->()V +PLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->onFailure()V +PLorg/thoughtcrime/securesms/jobs/RotateCertificateJob;->onShouldRetry(Ljava/lang/Exception;)Z +PLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob; +PLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->getLocaleCodes()Ljava/util/List; +PLorg/thoughtcrime/securesms/jobs/StoryOnboardingDownloadJob;->onRun()V +PLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobmanager/Job; +PLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob$Factory;->create(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;[B)Lorg/thoughtcrime/securesms/jobs/ThreadUpdateJob; +PLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->(Lorg/thoughtcrime/securesms/jobmanager/Job$Parameters;JLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob-IA;)V +PLorg/thoughtcrime/securesms/jobs/ThreadUpdateJob;->onRun()V +PLorg/thoughtcrime/securesms/keyvalue/AccountValues;->getDeviceName()Ljava/lang/String; +PLorg/thoughtcrime/securesms/keyvalue/CertificateType;->values()[Lorg/thoughtcrime/securesms/keyvalue/CertificateType; +PLorg/thoughtcrime/securesms/keyvalue/EmojiValues;->getJumboEmojiSheets(I)Ljava/util/HashSet; +PLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues$PhoneNumberListingMode;->isDiscoverable()Z +PLorg/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues;->getAllCertificateTypes()Ljava/util/Collection; +PLorg/thoughtcrime/securesms/keyvalue/ReleaseChannelValues;->setReleaseChannelRecipientId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V +PLorg/thoughtcrime/securesms/keyvalue/StoryValues;->setHasDownloadedOnboardingStory(Z)V +PLorg/thoughtcrime/securesms/keyvalue/SvrValues;->getMasterKey()Lorg/whispersystems/signalservice/api/kbs/MasterKey; +PLorg/thoughtcrime/securesms/keyvalue/SvrValues;->getRecoveryPassword()Ljava/lang/String; +PLorg/thoughtcrime/securesms/keyvalue/SvrValues;->isRegistrationLockEnabled()Z PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->onCleared()V -PLorg/thoughtcrime/securesms/logsubmit/LogSectionNotifications$$ExternalSyntheticApiModelOutline2;->m(Landroid/app/NotificationChannel;)Z PLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->onDestroyView()V -PLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->onPause()V -PLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->()V -PLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->(IILjava/lang/String;)V -PLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->getDescription()Ljava/lang/String; -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->()V -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/GroupInfo;Ljava/util/List;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)V -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component1()Lorg/thoughtcrime/securesms/recipients/Recipient; -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component2()Lorg/thoughtcrime/securesms/messagerequests/GroupInfo; -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component3()Ljava/util/List; -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component4()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->()V -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getRecipientInfo(Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->$values()[Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->()V -PLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/mms/AttachmentManager;->()V -PLorg/thoughtcrime/securesms/mms/AttachmentManager;->(Landroid/content/Context;Landroid/view/View;Lorg/thoughtcrime/securesms/mms/AttachmentManager$AttachmentListener;)V -PLorg/thoughtcrime/securesms/mms/AttachmentManager;->isAttachmentPresent()Z -PLorg/thoughtcrime/securesms/mms/ImageSlide;->hasPlaceholder()Z -PLorg/thoughtcrime/securesms/mms/Slide;->asAttachment()Lorg/thoughtcrime/securesms/attachments/Attachment; -PLorg/thoughtcrime/securesms/mms/Slide;->getBody()Lj$/util/Optional; -PLorg/thoughtcrime/securesms/mms/Slide;->getCaption()Lj$/util/Optional; -PLorg/thoughtcrime/securesms/mms/Slide;->getPlaceholderBlur()Lorg/thoughtcrime/securesms/blurhash/BlurHash; -PLorg/thoughtcrime/securesms/mms/Slide;->getTransferState()I -PLorg/thoughtcrime/securesms/mms/SlideDeck$$ExternalSyntheticLambda0;->()V -PLorg/thoughtcrime/securesms/mms/SlideDeck$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/mms/SlideDeck;->getBody()Ljava/lang/String; -PLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->$values()[Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; -PLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->()V -PLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->(Ljava/lang/String;ILjava/lang/String;)V -PLorg/thoughtcrime/securesms/mms/SlideFactory$MediaType;->from(Ljava/lang/String;)Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; +PLorg/thoughtcrime/securesms/mediasend/Media$1;->()V +PLorg/thoughtcrime/securesms/mediasend/Media;->()V +PLorg/thoughtcrime/securesms/mediasend/Media;->(Landroid/net/Uri;Ljava/lang/String;JIIJJZZLj$/util/Optional;Lj$/util/Optional;Lj$/util/Optional;)V +PLorg/thoughtcrime/securesms/mediasend/Media;->getUri()Landroid/net/Uri; +PLorg/thoughtcrime/securesms/messages/IncomingMessageObserver;->getDecryptionDrained()Z +PLorg/thoughtcrime/securesms/mms/PartAuthority;->getEmojiFilename(Landroid/net/Uri;)Ljava/lang/String; PLorg/thoughtcrime/securesms/notifications/MarkReadReceiver;->()V PLorg/thoughtcrime/securesms/notifications/MarkReadReceiver;->process(Ljava/util/List;)V PLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;)[Landroid/service/notification/StatusBarNotification; PLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->()V PLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->cancelAllMessageNotifications(Landroid/content/Context;Ljava/util/Set;)V PLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->cancelLegacy(Landroid/content/Context;I)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda17;->(Ljava/lang/Runnable;Ljava/lang/Throwable;)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda17;->run()V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda3;->run()V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda9;->run()V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$98B6rel4XDu4lm2pCI-DVofE9WY(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$ImmKEyV9mnT3aXASBPTNtbwseFY(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda11;->(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda11;->run()V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda6;->run()V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda7;->run()V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$0MHafWJB8CwezqWVbncoEq_a3Xg(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$dClU2s1olLC6PkCR84cT7C2dqfA(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$mDf5wVelzwBtc0Vgo342P1gCo0c(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->(Landroid/app/Application;)V PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->clearVisibleThread()V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->getNotifier()Lorg/thoughtcrime/securesms/notifications/MessageNotifier; -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$runOnLimiter$17(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$runOnLimiter$11(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$updateNotification$3(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$updateNotification$4(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$updateNotification$5(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->runOnLimiter(Ljava/lang/Runnable;)V -PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->setVisibleThread(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;)V PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->updateNotification(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/notifications/v2/CancelableExecutor;->()V -PLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion;->()V -PLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion;->forConversation(J)Lorg/thoughtcrime/securesms/notifications/v2/ConversationId; -PLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Creator;->()V -PLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->()V -PLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->(JLjava/lang/Long;)V PLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->getGroupStoryId()Ljava/lang/Long; PLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->getThreadId()J -PLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->hashCode()I -PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->()V -PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->access$updateBadge(Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;Landroid/content/Context;I)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->updateBadge(Landroid/content/Context;I)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$updateNotification$7;->(Ljava/util/Set;)V -PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->()V -PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->(Landroid/app/Application;)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->clearReminderInternal(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->clearVisibleThread()V -PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->setVisibleThread(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->updateNotification(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->updateNotification(Landroid/content/Context;Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;ZILorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;)V +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->updateNotification(Landroid/content/Context;Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;Lorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifierKt;->access$getDisplayedNotificationIds(Landroid/app/NotificationManager;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifierKt;->getDisplayedNotificationIds(Landroid/app/NotificationManager;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->()V PLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->()V PLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent; -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->()V -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->getEMPTY()Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState$messageCount$2;->(Lorg/thoughtcrime/securesms/notifications/v2/NotificationState;)V -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationIds$2;->(Lorg/thoughtcrime/securesms/notifications/v2/NotificationState;)V -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationItems$2;->(Lorg/thoughtcrime/securesms/notifications/v2/NotificationState;)V -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->()V -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V -PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->access$getEMPTY$cp()Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getConversations()Ljava/util/List; PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getMuteFilteredMessages()Ljava/util/List; PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getProfileFilteredMessages()Ljava/util/List; @@ -36840,185 +38371,126 @@ PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->toString()Ljav PLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->()V PLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->()V PLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->constructNotificationState(Ljava/util/Map;Lorg/thoughtcrime/securesms/notifications/profiles/NotificationProfile;)Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->-$$Nest$fgetcountryCode(Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;)I -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->(Ljava/lang/String;ILjava/lang/String;)V -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->getCountryCode()I -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->()V -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->(Ljava/lang/String;)V -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->get(Landroid/content/Context;)Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter; -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->parseAreaCode(Ljava/lang/String;I)Ljava/lang/String; -PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrint(Ljava/lang/String;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->(Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/permissions/Permissions;->$r8$lambda$Q0AcdMcPXUgr1QQ_HDTcoSx0sHo(Landroid/content/Context;Ljava/lang/String;)Z +PLorg/thoughtcrime/securesms/permissions/Permissions;->()V +PLorg/thoughtcrime/securesms/permissions/Permissions;->hasAll(Landroid/content/Context;[Ljava/lang/String;)Z +PLorg/thoughtcrime/securesms/permissions/Permissions;->isRuntimePermissionsRequired()Z +PLorg/thoughtcrime/securesms/permissions/Permissions;->lambda$hasAll$2(Landroid/content/Context;Ljava/lang/String;)Z PLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->equals(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->isDisplayContact()Z -PLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->toString()Ljava/lang/String; -PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0;->run()V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3;->onChanged(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getOutputStream(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/io/OutputStream; +PLorg/thoughtcrime/securesms/profiles/AvatarHelper;->setAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/io/InputStream;)V +PLorg/thoughtcrime/securesms/profiles/ProfileName;->asGiven(Ljava/lang/String;)Lorg/thoughtcrime/securesms/profiles/ProfileName; +PLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;J)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda10;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;Ljava/io/OutputStream;Landroid/net/Uri;Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda1;->call()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/providers/BlobProvider$$ExternalSyntheticLambda9;->(JLandroid/net/Uri;)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$2;->()V +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Ljava/io/InputStream;J)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->(Lorg/thoughtcrime/securesms/providers/BlobProvider;Ljava/io/InputStream;JLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder-IA;)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->buildBlobSpec(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder;->createForSingleSessionOnDisk(Landroid/content/Context;)Landroid/net/Uri; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$fgetid(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetData(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/io/InputStream; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetFileName(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetFileSize(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)J +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetId(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetMimeType(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->-$$Nest$mgetStorageType(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->(Ljava/io/InputStream;Ljava/lang/String;Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;Ljava/lang/String;Ljava/lang/String;J)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->(Ljava/io/InputStream;Ljava/lang/String;Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;Ljava/lang/String;Ljava/lang/String;JLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec-IA;)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getData()Ljava/io/InputStream; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getFileName()Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getFileSize()J +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getId()Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getMimeType()Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;->getStorageType()Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->$values()[Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->-$$Nest$mencode(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->-$$Nest$misMemory(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Z +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->-$$Nest$smdecode(Ljava/lang/String;)Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->()V +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->(Ljava/lang/String;ILjava/lang/String;Z)V +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->decode(Ljava/lang/String;)Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->encode()Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->isMemory()Z +PLorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;->values()[Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->$r8$lambda$hszeKLE-J5rLAuyYe0jTaWcOLg4(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;JLjava/io/File;)Ljava/io/InputStream; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->$r8$lambda$vEFatZFK1evY8Xp8zObuRkcU_8Q(Lorg/thoughtcrime/securesms/providers/BlobProvider;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;Ljava/io/OutputStream;Landroid/net/Uri;Landroid/content/Context;)Landroid/net/Uri; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->-$$Nest$mwriteBlobSpecToDisk(Lorg/thoughtcrime/securesms/providers/BlobProvider;Landroid/content/Context;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Landroid/net/Uri; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->buildFileName(Ljava/lang/String;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->buildUri(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Landroid/net/Uri; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->forData(Ljava/io/InputStream;J)Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobBuilder; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->getAttachmentSecret(Landroid/content/Context;)Lorg/thoughtcrime/securesms/crypto/AttachmentSecret; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->getBlobRepresentation(Landroid/content/Context;Landroid/net/Uri;Lorg/thoughtcrime/securesms/util/IOFunction;Lorg/thoughtcrime/securesms/util/IOFunction;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->getDirectory(Lorg/thoughtcrime/securesms/providers/BlobProvider$StorageType;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->getStream(Landroid/content/Context;Landroid/net/Uri;)Ljava/io/InputStream; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->getStream(Landroid/content/Context;Landroid/net/Uri;J)Ljava/io/InputStream; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->isAuthority(Landroid/net/Uri;)Z +PLorg/thoughtcrime/securesms/providers/BlobProvider;->lambda$getStream$1(Landroid/content/Context;JLjava/io/File;)Ljava/io/InputStream; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->lambda$writeBlobSpecToDiskAsync$4(Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;Ljava/io/OutputStream;Landroid/net/Uri;Landroid/content/Context;)Landroid/net/Uri; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->waitUntilInitialized()V +PLorg/thoughtcrime/securesms/providers/BlobProvider;->writeBlobSpecToDisk(Landroid/content/Context;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Landroid/net/Uri; +PLorg/thoughtcrime/securesms/providers/BlobProvider;->writeBlobSpecToDiskAsync(Landroid/content/Context;Lorg/thoughtcrime/securesms/providers/BlobProvider$BlobSpec;)Ljava/util/concurrent/Future; +PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda4;->contentsMatch(Ljava/lang/Object;Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda7;->run()V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9;->run()V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$4o-q--s8xb4fbde9teliyQxlyww(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$CYcq6dHxZW6RfEGMe0s6kvofKaE(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$pGM0bNiB06y_fkMUloVDwF8BcLs(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$snuajGLvOLM6I1QDJohSseUuY1E(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$0(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$1(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$observeForever$6(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$removeForeverObserver$7(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V -PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->observable()Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/recipients/Recipient;->getCombinedAboutAndEmoji()Ljava/lang/String; -PLorg/thoughtcrime/securesms/recipients/Recipient;->getContactUri()Landroid/net/Uri; -PLorg/thoughtcrime/securesms/recipients/Recipient;->getExpiresInSeconds()I -PLorg/thoughtcrime/securesms/recipients/Recipient;->getNotificationChannel()Ljava/lang/String; -PLorg/thoughtcrime/securesms/recipients/Recipient;->getSmallFallbackContactPhotoDrawable(Landroid/content/Context;ZLorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;I)Landroid/graphics/drawable/Drawable; -PLorg/thoughtcrime/securesms/recipients/Recipient;->isActiveGroup()Z -PLorg/thoughtcrime/securesms/recipients/Recipient;->isPushV1Group()Z -PLorg/thoughtcrime/securesms/recipients/Recipient;->isPushV2Group()Z -PLorg/thoughtcrime/securesms/recipients/Recipient;->isSystemContact()Z -PLorg/thoughtcrime/securesms/recipients/Recipient;->observable(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lio/reactivex/rxjava3/core/Observable; -PLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isLegacyProfileSharingAccepted(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z -PLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isRecipientHidden(J)Z -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository$$ExternalSyntheticLambda0;->run()V -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->$r8$lambda$WI32balUk_XG4AC9j0YR1mfsJE0(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->()V -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->getStickerFeatureAvailability(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->getStickerFeatureAvailabilitySync()Ljava/lang/Boolean; -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->lambda$getStickerFeatureAvailability$2(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V -PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->searchByEmoji(Ljava/lang/String;)Lio/reactivex/rxjava3/core/Single; +PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->removeForeverObserver(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V +PLorg/thoughtcrime/securesms/recipients/Recipient$$ExternalSyntheticLambda3;->()V +PLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileKey()[B +PLorg/thoughtcrime/securesms/recipients/Recipient;->shouldHideStory()Z +PLorg/thoughtcrime/securesms/recipients/RecipientUtil;->toSignalServiceAddress(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; +PLorg/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel$$ExternalSyntheticLambda3;->()V +PLorg/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->()V +PLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->()V +PLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->insertReleaseChannelMessage$default(Lorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/lang/String;JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/database/MessageTable$InsertResult; +PLorg/thoughtcrime/securesms/releasechannel/ReleaseChannel;->insertReleaseChannelMessage(Lorg/thoughtcrime/securesms/recipients/RecipientId;Ljava/lang/String;JLjava/lang/String;IILjava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;)Lorg/thoughtcrime/securesms/database/MessageTable$InsertResult; +PLorg/thoughtcrime/securesms/service/ExpiringMessageManager$$ExternalSyntheticLambda0;->()V +PLorg/thoughtcrime/securesms/service/ExpiringMessageManager;->scheduleDeletion(Ljava/util/List;)V PLorg/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel;->onCleared()V -PLorg/thoughtcrime/securesms/util/AppForegroundObserver;->removeListener(Lorg/thoughtcrime/securesms/util/AppForegroundObserver$Listener;)V -PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel; -PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationManager;)Z -PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline2;->m(Landroid/app/NotificationManager;)I -PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline3;->m(Landroid/app/NotificationManager;)Z PLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->$values()[Lorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState; PLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->()V PLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/util/BubbleUtil;->()V -PLorg/thoughtcrime/securesms/util/CharacterCalculator;->()V -PLorg/thoughtcrime/securesms/util/ConversationUtil;->()V -PLorg/thoughtcrime/securesms/util/ConversationUtil;->getChannelId(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/util/ConversationUtil;->getShortcutId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/lang/String; PLorg/thoughtcrime/securesms/util/ConversationUtil;->refreshRecipientShortcuts()V -PLorg/thoughtcrime/securesms/util/DateUtils;->getConversationDateHeaderString(Landroid/content/Context;Ljava/util/Locale;J)Ljava/lang/String; -PLorg/thoughtcrime/securesms/util/DateUtils;->getSimpleRelativeTimeSpanString(Landroid/content/Context;Ljava/util/Locale;J)Ljava/lang/String; -PLorg/thoughtcrime/securesms/util/DateUtils;->isSameExtendedRelativeTimestamp(JJ)Z PLorg/thoughtcrime/securesms/util/Debouncer;->clear()V -PLorg/thoughtcrime/securesms/util/Debouncer;->publish(Ljava/lang/Runnable;)V -PLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->getValue()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->postValue(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->setValue(Ljava/lang/Object;)V -PLorg/thoughtcrime/securesms/util/FullscreenHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowManager$LayoutParams;I)V -PLorg/thoughtcrime/securesms/util/FullscreenHelper;->(Landroid/app/Activity;)V -PLorg/thoughtcrime/securesms/util/FullscreenHelper;->(Landroid/app/Activity;Z)V -PLorg/thoughtcrime/securesms/util/FullscreenHelper;->showSystemUI()V -PLorg/thoughtcrime/securesms/util/FullscreenHelper;->showSystemUI(Landroid/view/Window;)V -PLorg/thoughtcrime/securesms/util/JsonUtils;->getMapper()Lcom/fasterxml/jackson/databind/ObjectMapper; +PLorg/thoughtcrime/securesms/util/FeatureFlags;->getDefaultMaxBackoff()J +PLorg/thoughtcrime/securesms/util/JsonUtils;->fromJson([BLjava/lang/Class;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter;)V PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter$$ExternalSyntheticLambda0;->run()V PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->$r8$lambda$1L8FIPWGmHakh7u9Krsm8K4DSjQ(Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter;)V -PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->()V -PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->(IJLandroid/os/Handler;)V PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->drip()V PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->run(Ljava/lang/Runnable;)V -PLorg/thoughtcrime/securesms/util/LongClickMovementMethod$1;->(Lorg/thoughtcrime/securesms/util/LongClickMovementMethod;)V -PLorg/thoughtcrime/securesms/util/LongClickMovementMethod;->(Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/util/LongClickMovementMethod;->getInstance(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/LongClickMovementMethod; -PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIII)V -PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onPause(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onStop(Landroidx/lifecycle/LifecycleOwner;)V -PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->$r8$lambda$T0JnL_tDtAWK4RNMpbrK8xUunio(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V -PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->(Landroid/app/Activity;Ljava/util/List;Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->access$getAnimator$p(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)Landroid/animation/ValueAnimator; PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->access$getSetStatusBarColor$p(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)Lkotlin/jvm/functions/Function1; PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->getPreviousStatusBarColor()I -PLorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator;->()V -PLorg/thoughtcrime/securesms/util/Projection$Corners;->()V -PLorg/thoughtcrime/securesms/util/Projection$Corners;->(F)V -PLorg/thoughtcrime/securesms/util/ProjectionList;->close()V -PLorg/thoughtcrime/securesms/util/ProjectionList;->getSize()I -PLorg/thoughtcrime/securesms/util/ProjectionList;->size()I -PLorg/thoughtcrime/securesms/util/PushCharacterCalculator$1;->()V -PLorg/thoughtcrime/securesms/util/PushCharacterCalculator;->()V -PLorg/thoughtcrime/securesms/util/PushCharacterCalculator;->()V -PLorg/thoughtcrime/securesms/util/SearchUtil;->getHighlightedSpan(Ljava/util/Locale;Lorg/thoughtcrime/securesms/util/SearchUtil$StyleFactory;Landroid/text/Spannable;Ljava/lang/String;I)Landroid/text/Spannable; -PLorg/thoughtcrime/securesms/util/ServiceUtil;->getAudioManager(Landroid/content/Context;)Landroid/media/AudioManager; -PLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onDataLoaded()V -PLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onDataPostedToMain()V -PLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onMetadataLoadStarted()V -PLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onMetadataLoaded()V -PLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onRenderFinished()V -PLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->start()V -PLorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;)Landroid/window/SplashScreen; -PLorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline1;->m(Landroid/window/SplashScreen;I)V -PLorg/thoughtcrime/securesms/util/SplashScreenUtil$1;->()V -PLorg/thoughtcrime/securesms/util/SplashScreenUtil;->setSplashScreenThemeIfNecessary(Landroid/app/Activity;Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;)V -PLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->$values()[Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; -PLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->()V -PLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->(Ljava/lang/String;I)V -PLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->valueOf(Ljava/lang/String;)Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; -PLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->values()[Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; -PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getMediaKeyboardMode(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; -PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getNotificationPrivacy(Landroid/content/Context;)Lorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference; -PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->hasSeenStickerIntroTooltip(Landroid/content/Context;)Z -PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isEnterSendsEnabled(Landroid/content/Context;)Z -PLorg/thoughtcrime/securesms/util/ThemeUtil;->getAttribute(Landroid/content/Context;ILjava/lang/String;)Ljava/lang/String; -PLorg/thoughtcrime/securesms/util/ThemeUtil;->getThemedBoolean(Landroid/content/Context;I)Z -PLorg/thoughtcrime/securesms/util/ThemeUtil;->isDarkTheme(Landroid/content/Context;)Z +PLorg/thoughtcrime/securesms/util/MediaUtil;->isVideo(Ljava/lang/String;)Z +PLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda3;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda3;->call()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda4;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda4;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/util/ProfileUtil;->$r8$lambda$64DRPwLhDKidiYVBrJ1oGsaeSVY(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/internal/ServiceResponse;)Lorg/signal/libsignal/protocol/util/Pair; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->$r8$lambda$cqO5Ws54dRBOxkD_sPlVLlSYwIg(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->$r8$lambda$dDuBqdOM1yCYB_18NZWtjJd7BlA(Lorg/whispersystems/signalservice/api/services/ProfileService;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;)Lio/reactivex/rxjava3/core/SingleSource; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->lambda$retrieveProfile$0(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->lambda$retrieveProfile$1(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/internal/ServiceResponse;)Lorg/signal/libsignal/protocol/util/Pair; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->lambda$retrieveProfile$2(Lorg/whispersystems/signalservice/api/services/ProfileService;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;)Lio/reactivex/rxjava3/core/SingleSource; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->retrieveProfile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Z)Lio/reactivex/rxjava3/core/Single; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->retrieveProfileSync(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Z)Lorg/whispersystems/signalservice/api/profiles/ProfileAndCredential; +PLorg/thoughtcrime/securesms/util/ProfileUtil;->toSignalServiceAddress(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/whispersystems/signalservice/api/push/SignalServiceAddress; +PLorg/thoughtcrime/securesms/util/SoftHashMap;->clear()V +PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isUniversalUnidentifiedAccess(Landroid/content/Context;)Z PLorg/thoughtcrime/securesms/util/Util;->clamp(FFF)F -PLorg/thoughtcrime/securesms/util/Util;->hashCode([Ljava/lang/Object;)I -PLorg/thoughtcrime/securesms/util/Util;->isEmpty(Ljava/util/Collection;)Z -PLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion$factoryProducer$1;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion$factoryProducer$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion$factoryProducer$1;->invoke()Lorg/thoughtcrime/securesms/util/ViewModelFactory; -PLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion;->()V -PLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -PLorg/thoughtcrime/securesms/util/ViewModelFactory$Companion;->factoryProducer(Lkotlin/jvm/functions/Function0;)Lkotlin/jvm/functions/Function0; -PLorg/thoughtcrime/securesms/util/ViewModelFactory;->()V -PLorg/thoughtcrime/securesms/util/ViewModelFactory;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/util/ViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; -PLorg/thoughtcrime/securesms/util/ViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelStore; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; -PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/ViewUtil;->animateOut(Landroid/view/View;Landroid/view/animation/Animation;I)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;I)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;II)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/util/ViewUtil;->getAlphaAnimation(FFI)Landroid/view/animation/Animation; -PLorg/thoughtcrime/securesms/util/ViewUtil;->mirrorIfRtl(Landroid/view/View;Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/util/ViewUtil;->setTextViewGravityStart(Landroid/widget/TextView;Landroid/content/Context;)V -PLorg/thoughtcrime/securesms/util/ViewUtil;->setVisibilityIfNonNull(Landroid/view/View;I)V -PLorg/thoughtcrime/securesms/util/ViewUtil;->updateLayoutParamsIfNonNull(Landroid/view/View;II)V -PLorg/thoughtcrime/securesms/util/WindowUtil;->setLightNavigationBar(Landroid/view/Window;)V -PLorg/thoughtcrime/securesms/util/WindowUtil;->setLightNavigationBarFromTheme(Landroid/app/Activity;)V -PLorg/thoughtcrime/securesms/util/WindowUtil;->setLightStatusBar(Landroid/view/Window;)V -PLorg/thoughtcrime/securesms/util/WindowUtil;->setLightStatusBarFromTheme(Landroid/app/Activity;)V -PLorg/thoughtcrime/securesms/util/WindowUtil;->setSystemUiFlags(Landroid/view/Window;I)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/LayoutFactory;->createViewHolder(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->getItemTypes()Ljava/util/Map; -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;ILjava/util/List;)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;I)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onBindViewHolder(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;ILjava/util/List;)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewAttachedToWindow(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;)V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewDetachedFromWindow(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->registerFactory(Ljava/lang/Class;Lj$/util/function/Function;I)V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areContentsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areContentsTheSame(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Z PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areItemsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z @@ -37026,51 +38498,134 @@ PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areItems PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->getChangePayload(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->getChangePayload(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel$-CC;->$default$getChangePayload(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Ljava/lang/Object;)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->(Landroid/view/View;)V -PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->onAttachedToWindow()V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->onDetachedFromWindow()V -PLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItem(I)Ljava/lang/Object; -PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;Ljava/lang/Runnable;)V PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0;->run()V PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->$r8$lambda$axI96jKiGgASw-5DyS1pXfSexxk(Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;Ljava/lang/Runnable;)V -PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->enqueue(Ljava/lang/Runnable;)Z -PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->execute(Ljava/lang/Runnable;)V PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->lambda$enqueue$0(Ljava/lang/Runnable;)V -PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->scheduleNext()V -PLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->()V -PLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->notifyAllListeners()V -PLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->set(Ljava/lang/Object;)Z -PLorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat;->()V -PLorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat;->(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/util/rx/RxStore;->dispose()V -PLorg/thoughtcrime/securesms/util/views/NullableStub;->isResolvable()Z -PLorg/thoughtcrime/securesms/util/views/Stub;->getVisibility()I -PLorg/thoughtcrime/securesms/util/views/Stub;->isVisible()Z -PLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda0;->(Lrxdogtag2/DogTagMaybeObserver;)V -PLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda1;->(Lrxdogtag2/DogTagMaybeObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda1;->run()V -PLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda4;->(Lrxdogtag2/DogTagMaybeObserver;)V -PLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda5;->(Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLrxdogtag2/DogTagMaybeObserver$$ExternalSyntheticLambda5;->run()V -PLrxdogtag2/DogTagMaybeObserver;->$r8$lambda$oZbZwTXdH3PbkXhPwGJJZ5hucwc(Lrxdogtag2/DogTagMaybeObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagMaybeObserver;->(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/MaybeObserver;)V -PLrxdogtag2/DogTagMaybeObserver;->lambda$onSubscribe$1(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagMaybeObserver;->onComplete()V -PLrxdogtag2/DogTagMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda0;->(Lrxdogtag2/DogTagSingleObserver;)V -PLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda1;->(Lrxdogtag2/DogTagSingleObserver;Ljava/lang/Object;)V -PLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda1;->run()V -PLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda4;->(Lrxdogtag2/DogTagSingleObserver;)V -PLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda5;->(Lrxdogtag2/DogTagSingleObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagSingleObserver$$ExternalSyntheticLambda5;->run()V -PLrxdogtag2/DogTagSingleObserver;->$r8$lambda$XHPr6lQHRHXcw_CKIYStMAqfnNo(Lrxdogtag2/DogTagSingleObserver;Ljava/lang/Object;)V -PLrxdogtag2/DogTagSingleObserver;->$r8$lambda$bu5rZib8qIaCqFy3X5GHmz5VHo0(Lrxdogtag2/DogTagSingleObserver;Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagSingleObserver;->(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/SingleObserver;)V -PLrxdogtag2/DogTagSingleObserver;->lambda$onSubscribe$1(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagSingleObserver;->lambda$onSuccess$3(Ljava/lang/Object;)V -PLrxdogtag2/DogTagSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -PLrxdogtag2/DogTagSingleObserver;->onSuccess(Ljava/lang/Object;)V -PLrxdogtag2/ObserverHandler$-CC;->$default$handle(Lrxdogtag2/ObserverHandler;Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; -PLrxdogtag2/RxDogTag$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -PLrxdogtag2/RxDogTag$Configuration$1;->handle(Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; -PLrxdogtag2/RxDogTag;->$r8$lambda$G5J9svI7_WWihw7QCY8ugVE_Jmo(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver; +PLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->getPreKeyCounts(Lorg/whispersystems/signalservice/api/push/ServiceIdType;)Lorg/whispersystems/signalservice/internal/push/OneTimePreKeyCounts; +PLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->getSenderCertificate()[B +PLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->setAccountAttributes(Lorg/whispersystems/signalservice/api/account/AccountAttributes;)V +PLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver$$ExternalSyntheticLambda0;->()V +PLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/util/CredentialsProvider;Ljava/lang/String;Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Z)V +PLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->retrieveProfile(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; +PLorg/whispersystems/signalservice/api/SignalWebSocket;->request(Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;)Lio/reactivex/rxjava3/core/Single; +PLorg/whispersystems/signalservice/api/SignalWebSocket;->request(Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;Lj$/util/Optional;)Lio/reactivex/rxjava3/core/Single; +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->(ZZZZZZZZ)V +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getAnnouncementGroup()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getChangeNumber()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getGiftBadges()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getPaymentActivation()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getPni()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getSenderKey()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getStorage()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->getStories()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;->toString()Ljava/lang/String; +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->(Ljava/lang/String;IZLjava/lang/String;[BZLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;ZLjava/lang/String;ILjava/lang/String;)V +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->(Ljava/lang/String;IZZZLjava/lang/String;[BZZLorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities;Ljava/lang/String;ILjava/lang/String;)V +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getCapabilities()Lorg/whispersystems/signalservice/api/account/AccountAttributes$Capabilities; +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getDiscoverableByPhoneNumber()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getFetchesMessages()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getName()Ljava/lang/String; +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getPniRegistrationId()I +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getRecoveryPassword()Ljava/lang/String; +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getRegistrationId()I +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getRegistrationLock()Ljava/lang/String; +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getSignalingKey()Ljava/lang/String; +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getUnidentifiedAccessKey()[B +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getUnrestrictedUnidentifiedAccess()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getVideo()Z +PLorg/whispersystems/signalservice/api/account/AccountAttributes;->getVoice()Z +PLorg/whispersystems/signalservice/api/crypto/UnidentifiedAccess;->createEmptyByteArray(I)[B +PLorg/whispersystems/signalservice/api/crypto/UnidentifiedAccess;->deriveAccessKeyFrom(Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;)[B +PLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->$values()[Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType; +PLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->()V +PLorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;->(Ljava/lang/String;I)V +PLorg/whispersystems/signalservice/api/push/ServiceId$ACI;->getLibSignalAci()Lorg/signal/libsignal/protocol/ServiceId$Aci; +PLorg/whispersystems/signalservice/api/push/ServiceIdType;->$values()[Lorg/whispersystems/signalservice/api/push/ServiceIdType; +PLorg/whispersystems/signalservice/api/push/ServiceIdType;->()V +PLorg/whispersystems/signalservice/api/push/ServiceIdType;->(Ljava/lang/String;ILjava/lang/String;)V +PLorg/whispersystems/signalservice/api/push/ServiceIdType;->queryParam()Ljava/lang/String; +PLorg/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException;->(ILjava/lang/String;)V +PLorg/whispersystems/signalservice/api/push/exceptions/NonSuccessfulResponseCodeException;->getCode()I +PLorg/whispersystems/signalservice/api/services/MessagingService$$ExternalSyntheticLambda4;->(Lorg/whispersystems/signalservice/internal/websocket/ResponseMapper;)V +PLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda1;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)V +PLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda2;->()V +PLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda3;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)V +PLorg/whispersystems/signalservice/api/services/ProfileService$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseMapper;->(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Lorg/signal/libsignal/zkgroup/profiles/ProfileKeyCredentialRequestContext;)V +PLorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseProcessor;->(Lorg/whispersystems/signalservice/internal/ServiceResponse;)V +PLorg/whispersystems/signalservice/api/services/ProfileService$ProfileResponseProcessor;->getError()Ljava/lang/Throwable; +PLorg/whispersystems/signalservice/api/services/ProfileService;->$r8$lambda$qreHJhpvwxlLuI7XzIfP9eBBI24(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; +PLorg/whispersystems/signalservice/api/services/ProfileService;->$r8$lambda$vXxdyhUGBLq7AFV9vG9NvMDxbNI(Lorg/whispersystems/signalservice/api/services/ProfileService;Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; +PLorg/whispersystems/signalservice/api/services/ProfileService;->()V +PLorg/whispersystems/signalservice/api/services/ProfileService;->(Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Lorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;Lorg/whispersystems/signalservice/api/SignalWebSocket;)V +PLorg/whispersystems/signalservice/api/services/ProfileService;->getProfile(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lio/reactivex/rxjava3/core/Single; +PLorg/whispersystems/signalservice/api/services/ProfileService;->getProfileRestFallback(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lio/reactivex/rxjava3/core/Single; +PLorg/whispersystems/signalservice/api/services/ProfileService;->lambda$getProfile$0(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; +PLorg/whispersystems/signalservice/api/services/ProfileService;->lambda$getProfileRestFallback$3(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;Ljava/lang/Throwable;)Lio/reactivex/rxjava3/core/SingleSource; +PLorg/whispersystems/signalservice/internal/ServiceResponse;->forApplicationError(Ljava/lang/Throwable;ILjava/lang/String;)Lorg/whispersystems/signalservice/internal/ServiceResponse; +PLorg/whispersystems/signalservice/internal/ServiceResponse;->forUnknownError(Ljava/lang/Throwable;)Lorg/whispersystems/signalservice/internal/ServiceResponse; +PLorg/whispersystems/signalservice/internal/ServiceResponse;->getApplicationError()Lj$/util/Optional; +PLorg/whispersystems/signalservice/internal/ServiceResponse;->getExecutionError()Lj$/util/Optional; +PLorg/whispersystems/signalservice/internal/ServiceResponseProcessor;->getError()Ljava/lang/Throwable; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda14;->()V +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket$1;->(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;Lorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;)V +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket$1;->onResponse(Lokhttp3/Call;Lokhttp3/Response;)V +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->getClient()Lokhttp3/OkHttpClient; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->getHostHeader()Lj$/util/Optional; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->getUrl()Ljava/lang/String; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket$EmptyResponseCodeHandler;->handle(ILokhttp3/ResponseBody;)V +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->-$$Nest$mvalidateServiceResponse(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;Lokhttp3/Response;)Lokhttp3/Response; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->buildOkHttpClient(Z)Lokhttp3/OkHttpClient; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->buildServiceRequest(Ljava/lang/String;Ljava/lang/String;Lokhttp3/RequestBody;Ljava/util/Map;Lj$/util/Optional;Z)Lokhttp3/Request; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getAuthorizationHeader(Lorg/whispersystems/signalservice/api/util/CredentialsProvider;)Ljava/lang/String; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getAvailablePreKeys(Lorg/whispersystems/signalservice/api/push/ServiceIdType;)Lorg/whispersystems/signalservice/internal/push/OneTimePreKeyCounts; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getRandom([Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;Ljava/security/SecureRandom;)Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getSenderCertificate()[B +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->getServiceConnection(Ljava/lang/String;Ljava/lang/String;Lokhttp3/RequestBody;Ljava/util/Map;Lj$/util/Optional;Z)Lokhttp3/Response; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->jsonRequestBody(Ljava/lang/String;)Lokhttp3/RequestBody; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ResponseCodeHandler;Lj$/util/Optional;)Ljava/lang/String; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Lokhttp3/RequestBody;Ljava/util/Map;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ResponseCodeHandler;Lj$/util/Optional;Z)Lokhttp3/Response; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->retrieveVersionedProfile(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;Lj$/util/Optional;Ljava/util/Locale;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->setAccountAttributes(Lorg/whispersystems/signalservice/api/account/AccountAttributes;)V +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->submitServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lj$/util/Optional;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; +PLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->validateServiceResponse(Lokhttp3/Response;)Lokhttp3/Response; +PLorg/whispersystems/signalservice/internal/push/http/AcceptLanguagesUtil;->formatLanguages(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +PLorg/whispersystems/signalservice/internal/push/http/AcceptLanguagesUtil;->getAcceptLanguageHeader(Ljava/util/Locale;)Ljava/lang/String; +PLorg/whispersystems/signalservice/internal/push/http/AcceptLanguagesUtil;->getHeadersWithAcceptLanguage(Ljava/util/Locale;)Ljava/util/Map; +PLorg/whispersystems/signalservice/internal/util/JsonUtil;->toJson(Ljava/lang/Object;)Ljava/lang/String; +PLorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer;->(Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture;Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer;)V +PLorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; +PLorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers;->map(Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture;Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; +PLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->()V +PLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->get()Ljava/lang/Object; +PLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; +PLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->notifyAllListeners()V +PLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->setException(Ljava/lang/Throwable;)Z +PLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder;->()V +PLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder;->build()Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper; +PLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->()V +PLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->()V +PLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->(Ljava/util/Map;)V +PLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->(Ljava/util/Map;Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper-IA;)V +PLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->extend()Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder; +PLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder;->(Ljava/lang/Class;)V +PLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder;->build()Lorg/whispersystems/signalservice/internal/websocket/ResponseMapper; +PLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder;->withResponseMapper(Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$CustomResponseMapper;)Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder; +PLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper;->(Ljava/lang/Class;Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$CustomResponseMapper;Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper;)V +PLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper;->(Ljava/lang/Class;Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$CustomResponseMapper;Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper;Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper-IA;)V +PLorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper;->extend(Ljava/lang/Class;)Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder; +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->()V +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->build()Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage; +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->headers(Ljava/util/List;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->id(Ljava/lang/Long;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->path(Ljava/lang/String;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder;->verb(Ljava/lang/String;)Lorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Builder; +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion$ADAPTER$1;->(Lcom/squareup/wire/FieldEncoding;Lkotlin/reflect/KClass;Lcom/squareup/wire/Syntax;)V +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion;->()V +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;->()V +PLorg/whispersystems/signalservice/internal/websocket/WebSocketRequestMessage;->(Ljava/lang/String;Ljava/lang/String;Lokio/ByteString;Ljava/util/List;Ljava/lang/Long;Lokio/ByteString;)V diff --git a/app/src/main/java/com/google/android/material/bottomsheet/BottomSheetBehaviorHack.kt b/app/src/main/java/com/google/android/material/bottomsheet/BottomSheetBehaviorHack.kt index a9b644e8..8c2469ba 100644 --- a/app/src/main/java/com/google/android/material/bottomsheet/BottomSheetBehaviorHack.kt +++ b/app/src/main/java/com/google/android/material/bottomsheet/BottomSheetBehaviorHack.kt @@ -1,14 +1,13 @@ package com.google.android.material.bottomsheet import android.view.View -import android.widget.FrameLayout import java.lang.ref.WeakReference /** * Manually adjust the nested scrolling child for a given [BottomSheetBehavior]. */ object BottomSheetBehaviorHack { - fun setNestedScrollingChild(behavior: BottomSheetBehavior, view: View) { + fun setNestedScrollingChild(behavior: BottomSheetBehavior, view: View) { behavior.nestedScrollingChildRef = WeakReference(view) } } diff --git a/app/src/main/java/org/archiver/ArchiveConstants.kt b/app/src/main/java/org/archiver/ArchiveConstants.kt deleted file mode 100644 index f71eaa22..00000000 --- a/app/src/main/java/org/archiver/ArchiveConstants.kt +++ /dev/null @@ -1,57 +0,0 @@ -package org.archiver - -class ArchiveConstants { - - companion object{ - const val SIGNAL_ARCHIVE_VERSION = "V1" - - - const val signalTestUserName = "signal" - const val signalTestPassword = "Aa!123456" - - const val signalCurrentPassword = ""/*"Aa123456"*/ - const val signalCurrentUser = "qasam" - - const val signalTestMobileNumber = "+972520123456" - const val isTestMode = false - // const val signalTestMobileNumber = "+447520619489" - //const val signalTestMobileNumber = "+972520099696" //EnterP - - const val integration = "https://integration.telemessage.co.il" - const val integrationKeeper = "https://api-gateway-integration.devops.telemessage.co.il" - - const val charlieProduction = "https://rest.telemessage.com" - const val prodKeeper = "https://archive.telemessage.com" - - const val ARCHIVE_TYPE_APP_MESSAGE = "Signal message" - const val ARCHIVE_TYPE_SMS = "SMS" - - const val ARCHIVE_SUBJECT_CHAT_GROUP = "chat group" - - const val ARCHIVE_SUBJECT_FROM_TEXT = "from" - const val ARCHIVE_SUBJECT_TO_TEXT = "to" - - const val ARCHIVE_FILE_FOLDER_NAME = "aa_archiver" - - const val SIGNAL_ARCHIVE_ATTACHMENT_TEMPLATE_PREFIX = SIGNAL_ARCHIVE_VERSION + "_" + "Signal" + "_" - - const val SIGNAL_PART_PATH = "/part/" - const val SIGNAL_STICKER_PATH = "/sticker/" - const val SIGNAL_BLOB_PATH = ".blob" - - const val isNeedToSetTeleMessageBackgroundAsDefault = true - - - const val GENERATE_TOK_NAME = "logfile" - const val GENERATE_TOK_PASS = "enRR8UVVywXYbFkqU#QDPRkO" - - const val SHARED_PREFERENCE_SELECTED_BASE_URL_PRODUCTION_KEY = "sharedPreferenceBaseURLKeyProduction" - const val SHARED_PREFERENCE_SELECTED_BASE_URL_KEEPER_KEY = "sharedPreferenceBaseURLKeyKeeper" - const val MAX_MEMBER_NAMES = 256 - } - - enum class ProtocolType(val type: String) { - ARCHIVE_PARAM_PROTOCOL_SEND("1"), - ARCHIVE_PARAM_PROTOCOL_INBOX("0") - } -} \ No newline at end of file diff --git a/app/src/main/java/org/archiver/ArchiveFileUtil.java b/app/src/main/java/org/archiver/ArchiveFileUtil.java deleted file mode 100644 index 291edd87..00000000 --- a/app/src/main/java/org/archiver/ArchiveFileUtil.java +++ /dev/null @@ -1,576 +0,0 @@ -package org.archiver; - -import android.Manifest; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.Context; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build; -import android.os.Environment; -import android.provider.DocumentsContract; -import android.provider.MediaStore; -import android.webkit.MimeTypeMap; - -import com.tm.logger.Log; - -import org.jetbrains.annotations.Nullable; -import org.tm.archive.attachments.Attachment; -import org.tm.archive.attachments.AttachmentId; -import org.tm.archive.attachments.DatabaseAttachment; -import org.tm.archive.contactshare.Contact; -import org.tm.archive.database.SignalDatabase; -import org.tm.archive.dependencies.ApplicationDependencies; -import org.tm.archive.providers.BlobProvider; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Random; - -public class ArchiveFileUtil { - - - public static String getPath(Context context, Uri uri){ - String[] projection = {MediaStore.MediaColumns.DATA}; - String path = ""; - ContentResolver cr = context.getApplicationContext().getContentResolver(); - Cursor metaCursor = cr.query(uri, projection, null, null, null); - if (metaCursor != null) { - try { - if (metaCursor.moveToFirst()) { - path = metaCursor.getString(0); - } - } finally { - metaCursor.close(); - } - } - return path; - } - - /* -This method can parse out the real local file path from a file URI. -*/ - public static String getUriRealPath(Context ctx, Uri uri) - { - String ret = ""; - - if( isAboveKitKat() ) - { - // Android sdk version number bigger than 19. - ret = getUriRealPathAboveKitkat(ctx, uri); - }else - { - // Android sdk version number smaller than 19. - ret = getImageRealPath(ctx.getContentResolver(), uri, null); - } - - return ret; - } - - /* - This method will parse out the real local file path from the file content URI. - The method is only applied to android sdk version number that is bigger than 19. - */ - public static String getUriRealPathAboveKitkat(Context ctx, Uri uri) - { - String ret = ""; - - if(ctx != null && uri != null) { - - if(isContentUri(uri)) - { - if(isGooglePhotoDoc(uri.getAuthority())) - { - ret = uri.getLastPathSegment(); - }else { - ret = getImageRealPath(ctx.getContentResolver(), uri, null); - } - }else if(isFileUri(uri)) { - ret = uri.getPath(); - }else if(isDocumentUri(ctx, uri)){ - - // Get uri related document id. - String documentId = DocumentsContract.getDocumentId(uri); - - // Get uri authority. - String uriAuthority = uri.getAuthority(); - - if(isMediaDoc(uriAuthority)) - { - String idArr[] = documentId.split(":"); - if(idArr.length == 2) - { - // First item is document type. - String docType = idArr[0]; - - // Second item is document real id. - String realDocId = idArr[1]; - - // Get content uri by document type. - Uri mediaContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - if("image".equals(docType)) - { - mediaContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - }else if("video".equals(docType)) - { - mediaContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - }else if("audio".equals(docType)) - { - mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - } - - // Get where clause with real document id. - String whereClause = MediaStore.Images.Media._ID + " = " + realDocId; - - ret = getImageRealPath(ctx.getContentResolver(), mediaContentUri, whereClause); - } - - }else if(isDownloadDoc(uriAuthority)) - { - // Build download uri. - Uri downloadUri = Uri.parse("content://downloads/public_downloads"); - - // Append download document id at uri end. - Uri downloadUriAppendId = ContentUris.withAppendedId(downloadUri, Long.valueOf(documentId)); - - ret = getImageRealPath(ctx.getContentResolver(), downloadUriAppendId, null); - - }else if(isExternalStoreDoc(uriAuthority)) - { - String idArr[] = documentId.split(":"); - if(idArr.length == 2) - { - String type = idArr[0]; - String realDocId = idArr[1]; - - if("primary".equalsIgnoreCase(type)) - { - ret = Environment.getExternalStorageDirectory() + "/" + realDocId; - } - } - } - } - } - - return ret; - } - - /* Check whether current android os version is bigger than kitkat or not. */ - public static boolean isAboveKitKat() - { - boolean ret = false; - ret = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - return ret; - } - - /* Check whether this uri represent a document or not. */ - public static boolean isDocumentUri(Context ctx, Uri uri) - { - boolean ret = false; - if(ctx != null && uri != null) { - ret = DocumentsContract.isDocumentUri(ctx, uri); - } - return ret; - } - - /* Check whether this uri is a content uri or not. - * content uri like content://media/external/images/media/1302716 - * */ - public static boolean isContentUri(Uri uri) - { - boolean ret = false; - if(uri != null) { - String uriSchema = uri.getScheme(); - if("content".equalsIgnoreCase(uriSchema)) - { - ret = true; - } - } - return ret; - } - - /* Check whether this uri is a file uri or not. - * file uri like file:///storage/41B7-12F1/DCIM/Camera/IMG_20180211_095139.jpg - * */ - public static boolean isFileUri(Uri uri) - { - boolean ret = false; - if(uri != null) { - String uriSchema = uri.getScheme(); - if("file".equalsIgnoreCase(uriSchema)) - { - ret = true; - } - } - return ret; - } - - - /* Check whether this document is provided by ExternalStorageProvider. Return true means the file is saved in external storage. */ - public static boolean isExternalStoreDoc(String uriAuthority) - { - boolean ret = false; - - if("com.android.externalstorage.documents".equals(uriAuthority)) - { - ret = true; - } - - return ret; - } - - /* Check whether this document is provided by DownloadsProvider. return true means this file is a downloaed file. */ - public static boolean isDownloadDoc(String uriAuthority) - { - boolean ret = false; - - if("com.android.providers.downloads.documents".equals(uriAuthority)) - { - ret = true; - } - - return ret; - } - - /* - Check if MediaProvider provide this document, if true means this image is created in android media app. - */ - public static boolean isMediaDoc(String uriAuthority) - { - boolean ret = false; - - if("com.android.providers.media.documents".equals(uriAuthority)) - { - ret = true; - } - - return ret; - } - - /* - Check whether google photos provide this document, if true means this image is created in google photos app. - */ - public static boolean isGooglePhotoDoc(String uriAuthority) - { - boolean ret = false; - - if("com.google.android.apps.photos.content".equals(uriAuthority)) - { - ret = true; - } - - return ret; - } - - /* Return uri represented document file real local path.*/ - public static String getImageRealPath(ContentResolver contentResolver, Uri uri, String whereClause) - { - String ret = ""; - - // Query the uri with condition. - Cursor cursor = contentResolver.query(uri, null, whereClause, null, null); - - if(cursor!=null) - { - boolean moveToFirst = cursor.moveToFirst(); - if(moveToFirst) - { - - // Get columns name by uri type. - String columnName = MediaStore.Images.Media.DATA; - - if( uri==MediaStore.Images.Media.EXTERNAL_CONTENT_URI ) - { - columnName = MediaStore.Images.Media.DATA; - }else if( uri==MediaStore.Audio.Media.EXTERNAL_CONTENT_URI ) - { - columnName = MediaStore.Audio.Media.DATA; - }else if( uri==MediaStore.Video.Media.EXTERNAL_CONTENT_URI ) - { - columnName = MediaStore.Video.Media.DATA; - } - - // Get column index. - int imageColumnIndex = cursor.getColumnIndex(columnName); - - // Get column value which is the uri related file local path. - ret = cursor.getString(imageColumnIndex); - } - } - - return ret; - } - - public static String getRealPath(final Context context, final Uri uri) { - final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - - // DocumentProvider - if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { - System.out.println("getPath() uri: " + uri.toString()); - System.out.println("getPath() uri authority: " + uri.getAuthority()); - System.out.println("getPath() uri path: " + uri.getPath()); - - // ExternalStorageProvider - if ("com.android.externalstorage.documents".equals(uri.getAuthority())) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - System.out.println("getPath() docId: " + docId + ", split: " + split.length + ", type: " + type); - - // This is for checking Main Memory - if ("primary".equalsIgnoreCase(type)) { - if (split.length > 1) { - return Environment.getExternalStorageDirectory() + "/" + split[1] + "/"; - } else { - return Environment.getExternalStorageDirectory() + "/"; - } - // This is for checking SD Card - } else { - return "storage" + "/" + docId.replace(":", "/"); - } - - } - } - return null; - } - - public static void copyInputStreamToFile(InputStream in, File file) { - OutputStream out = null; - - try { - out = new FileOutputStream(file); - byte[] buf = new byte[1024]; - int len; - while((len=in.read(buf))>0){ - out.write(buf,0,len); - } - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - // Ensure that the InputStreams are closed even if there's an exception. - try { - if ( out != null ) { - out.close(); - } - - // If you want to close the "in" InputStream yourself then remove this - // from here but ensure that you close it yourself eventually. - in.close(); - } - catch ( IOException e ) { - e.printStackTrace(); - } - } - } - - public static void deleteFile(Context context,String dirName,String fileName){ - - File dir = new File(context.getCacheDir().toString()); - if(dir.exists()){ - for (File file : dir.listFiles()) { - if(file.getName().equalsIgnoreCase(fileName)){ - file.delete(); - break; - } - } - } - } - - public static File createFileFromContentUri(Context context, String contentUri){ - File resultFile = null; - if(contentUri.contains(ArchiveConstants.SIGNAL_PART_PATH) ) { - resultFile = getFileFromDataBaseUri(context, contentUri); - }else if(contentUri.contains(ArchiveConstants.SIGNAL_STICKER_PATH)){ - resultFile = getStickerFileFromBlobProvider(context, contentUri); - }else if(contentUri.contains(ArchiveConstants.SIGNAL_BLOB_PATH)){ - resultFile = getFileFromBlobProvider(context, contentUri); - }else { - resultFile = getFileFromDeviceUri(context, contentUri); - } - return resultFile; - } - - public static File getFileFromDataBaseUri(Context context, String contentUri) { - - String[] splitUri = contentUri.split("/"); - int splitLength = splitUri.length; - DatabaseAttachment databaseAttachment = SignalDatabase.attachments().getAttachment(new AttachmentId(Long.parseLong(splitUri[splitLength - 1]),Long.parseLong(splitUri[splitLength - 2]))); - - InputStream attachmentInputStream = null; - try { - attachmentInputStream = SignalDatabase.attachments().getAttachmentStream(databaseAttachment.getAttachmentId(),0); - } catch (IOException e) { - e.printStackTrace(); - } - - String fileName = getFileNameWithType(databaseAttachment.getFileName(), 0 ,databaseAttachment.getAttachmentId().getRowId(),databaseAttachment.getContentType()); - File resultFile = new File(context.getCacheDir(), fileName); - ArchiveFileUtil.copyInputStreamToFile(attachmentInputStream, resultFile); - - return resultFile; - } - - public static String getFileType(DatabaseAttachment databaseAttachment) { - String fileType; - try { - fileType = databaseAttachment.getFileName().split("\\.")[1]; - }catch (Exception e){ - fileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(databaseAttachment.getContentType()); - } - return fileType; - } - - public static String getFileType(String fileName, String contentType) { - String fileType; - try { - if(fileName != null) { - fileType = fileName.split("\\.")[fileName.split("\\.").length - 1]; - }else{ - fileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(contentType); - } - }catch (Exception e){ - fileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(contentType); - } - return fileType; - } - - public static String getFileType(Attachment attachment) { - String fileType; - try { - fileType = attachment.getFileName().split("\\.")[1]; - }catch (Exception e){ - fileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(attachment.getContentType()); - } - return fileType; - } - - private static File getFileFromBlobProvider(Context context, String contentUri) { - File resultFile = null; - String fileName = ""; - String fileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(context.getContentResolver().getType(Uri.parse(contentUri))); - InputStream stream = null; - try { - stream = BlobProvider.getInstance().getStream(ApplicationDependencies.getApplication(), Uri.parse(contentUri)); - } catch (IOException e) { - e.printStackTrace(); - Log.e("ArchiveFileUtil", "getFileFromBlobProvider -> error getStream!!!!--------------"); - return null; - } - fileName = contentUri.split("/")[contentUri.split("/").length - 1].split("\\.")[0] + "." + fileType; - - resultFile = new File(context.getCacheDir(), fileName); - - ArchiveFileUtil.copyInputStreamToFile(stream, resultFile); - - return resultFile; - } - - private static File getStickerFileFromBlobProvider(Context context, String contentUri) { - File resultFile = null; - String fileName = ""; - InputStream stream = null; - try { - stream = SignalDatabase.stickers().getStickerStream(ContentUris.parseId(Uri.parse(contentUri))); - } catch (IOException e) { - e.printStackTrace(); - } - - fileName = contentUri.split("/")[contentUri.split("/").length - 1].split("\\.")[0] + "." + "webp"; - - resultFile = new File(context.getCacheDir(), fileName); - - ArchiveFileUtil.copyInputStreamToFile(stream, resultFile); - - return resultFile; - } - - public static boolean checkWriteExternalPermission(Context context) - { - String permission = Manifest.permission.READ_EXTERNAL_STORAGE; - int res = context.checkCallingOrSelfPermission(permission); - return (res == PackageManager.PERMISSION_GRANTED); - } - - @Nullable - private static File getFileFromDeviceUri(Context context, String contentUri) { - if(checkWriteExternalPermission(context)) { - File resultFile = null; - String fileName = ""; - String fileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(context.getContentResolver().getType(Uri.parse(contentUri))); - InputStream inputStream = null; - - fileName = contentUri.split("/")[contentUri.split("/").length - 1].split("\\.")[0] + "." + fileType; - - resultFile = new File(context.getCacheDir(), fileName); - try { - inputStream = context.getContentResolver().openInputStream(Uri.parse(contentUri)); - ArchiveFileUtil.copyInputStreamToFile(inputStream, resultFile); - - } catch (Exception e) { - e.printStackTrace(); - } - - return resultFile; - } - return null; - } - - public static File createVCFFileFromContact(Context context, Contact contact){ - - File vcfFile = new File(context.getCacheDir(), contact.getName().isEmpty()? "contact" : contact.getName().getDisplayName().replaceAll(" ","_") + ".vcf"); - FileWriter fw = null; - try { - fw = new FileWriter(vcfFile); - fw.write("BEGIN:VCARD\r\n"); - fw.write("VERSION:3.0\r\n"); - fw.write("N:" + contact.getName().getFamilyName() + ";" + contact.getName().getGivenName() + "\r\n"); - fw.write("FN:" + contact.getName().getGivenName() + " " + contact.getName().getFamilyName() + "\r\n"); - if(contact.getOrganization() != null) { - fw.write("ORG:" + contact.getOrganization() + "\r\n"); - } - for (int i = 0; i < contact.getPostalAddresses().size(); i++) { - fw.write("TEL;TYPE=WORK,VOICE:" + contact.getPostalAddresses().get(0).getLabel() + "\r\n"); - } - - for (int i = 0; i < contact.getPhoneNumbers().size(); i++) { - fw.write("TEL;TYPE=WORK,VOICE:" + contact.getPhoneNumbers().get(i).getNumber() + "\r\n"); - } - - fw.write("ADR;TYPE=WORK:;;" + contact.getPostalAddresses()+ "\r\n"); - for (int i = 0; i < contact.getEmails().size(); i++) { - fw.write("EMAIL;TYPE=PREF,INTERNET:" + contact.getEmails().get(i).getEmail() + "\r\n"); - } - - fw.write("END:VCARD\r\n"); - fw.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - return vcfFile; - - } - - - public static String getFileNameWithType(String fileName, long messageId, long attachmentId, String contentType) { - return getFileNameWithType(fileName, messageId, attachmentId, contentType, false); - } - - public static String getFileNameWithType(String fileName, long messageId, long attachmentId, String contentType, boolean isIncoming) { - - if (isIncoming || fileName == null){ - return ArchiveUtil.Companion.generateAttachmentName(messageId, attachmentId) + "." + ArchiveFileUtil.getFileType(fileName, contentType); - }else{ - return fileName.replace(" ", "_"); - } - } - -} diff --git a/app/src/main/java/org/archiver/ArchiveLogger.kt b/app/src/main/java/org/archiver/ArchiveLogger.kt deleted file mode 100644 index b01d2cb6..00000000 --- a/app/src/main/java/org/archiver/ArchiveLogger.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.archiver - -import android.util.Log - - -class ArchiveLogger { - - companion object{ - - const val LOGGER_TAG = "TMSignalArchive" - - fun sendArchiveLog(log : String){ - Log.d(LOGGER_TAG, log) - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/archiver/ArchivePreferenceConstants.kt b/app/src/main/java/org/archiver/ArchivePreferenceConstants.kt deleted file mode 100644 index 6bcf3dcd..00000000 --- a/app/src/main/java/org/archiver/ArchivePreferenceConstants.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.archiver - -class ArchivePreferenceConstants { - - companion object{ - const val FCM_TOKEN_SHARED_PREFERENCE_NAME = "archiveConfig" - const val FCM_TOKEN_PREFERENCE_KEY = "FCMTokenPreferenceKey" - - - const val PREF_KEY_DEVICE_PHONE_NUMBER = "devicePhoneNumber" - - const val PREF_KEY_DEVICE_NAME = "fullNamePref" - - const val PREF_KEY_MAIN_ACTIVITY_RESTART = "isMainActivityAlreadyRestarted4" - - const val GENERATE_TOK_NAME = "logfile" - const val GENERATE_TOK_PASS = "enRR8UVVywXYbFkqU#QDPRkO" - - - - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/archiver/ArchiveSender.kt b/app/src/main/java/org/archiver/ArchiveSender.kt deleted file mode 100644 index 1dac023f..00000000 --- a/app/src/main/java/org/archiver/ArchiveSender.kt +++ /dev/null @@ -1,338 +0,0 @@ -package org.archiver - -import android.content.Context -import com.tm.androidcopysdk.DataGrabber -import com.tm.androidcopysdk.utils.Contact -import com.tm.logger.Log -import org.archiver.ArchiveLogger.Companion.sendArchiveLog -import org.archiver.ArchiveUtil.Companion.cleanMessageBodyFromUnusedCharacters -import org.archiver.ArchiveUtil.Companion.createMessageNameList -import org.archiver.ArchiveUtil.Companion.createMessageNameListV2 -import org.archiver.ArchiveUtil.Companion.createSubjectForArchiving -import org.archiver.ArchiveUtil.Companion.createToRecipientList -import org.archiver.ArchiveUtil.Companion.createToRecipientListV2 -import org.archiver.ArchiveUtil.Companion.fromContactName -import org.archiver.ArchiveUtil.Companion.getChatMode -import org.archiver.ArchiveUtil.Companion.getChatName -import org.archiver.ArchiveUtil.Companion.getChatNameV2 -import org.archiver.ArchiveUtil.Companion.getFromPartForSubject -import org.archiver.ArchiveUtil.Companion.getGroupInboxRecipientNumber -import org.archiver.ArchiveUtil.Companion.groupId - -import org.tm.archive.attachments.DatabaseAttachment -import org.tm.archive.database.SignalDatabase -import org.tm.archive.database.model.MediaMmsMessageRecord -import org.tm.archive.database.model.MessageRecord -import org.tm.archive.mms.IncomingMediaMessage -import org.tm.archive.mms.OutgoingMessage -import org.tm.archive.recipients.Recipient -import org.tm.archive.sms.IncomingTextMessage -import java.io.File - -class ArchiveSender { - - companion object{ - - const val TAG = "ArchiveSender" - private fun sendArchiveMessage(context: Context, uniqueMessageId: String , aProtocolType: ArchiveConstants.ProtocolType, toRecipientsList: Array, from: String, messageBody: String?, dateInTimeStamp: Long, subject: String, chatMode: DataGrabber.CHAT_MODE, chatName: String, chatId: String?, fromNameString: Contact, toRecipientsListNames: Array, archiveFile: Array? = null){ - // Log.d(TAG, "messageId = $uniqueMessageId message text $messageBody") - Log.d(TAG, "sendArchiveMessage -> body = $messageBody sub = $subject") - - if(archiveFile == null || archiveFile[0] == null) { - Log.d(TAG, "sendArchiveMessage -> only text") - DataGrabber.getInstance(context).setMessage(aProtocolType.type, toRecipientsList, from, messageBody, uniqueMessageId, dateInTimeStamp.toString(), subject, ArchiveUtil.getPhoneNumberInTestMode(context), chatMode, chatName, chatId, fromNameString, from, toRecipientsListNames, toRecipientsList) - }else { - Log.d(TAG, "sendArchiveMessage -> also file") - DataGrabber.getInstance(context).setMmsMessage(aProtocolType.type, toRecipientsList, from, messageBody, uniqueMessageId /*+ "M"*/, dateInTimeStamp.toString(), subject, ArchiveUtil.getPhoneNumberInTestMode(context), chatMode, chatName, chatId, fromNameString, from, toRecipientsListNames, toRecipientsList, archiveFile) - } - } - - - fun updateArchiveSDKToSendMMSMessage(context: Context, fileName: String, needCompress: Boolean){ - DataGrabber.getInstance(context).updateFileMms(fileName, needCompress) - } - - fun archiveMessageInbox(context: Context, type: ArchiveConstants.ProtocolType, archiveRecipient: Recipient, message: IncomingTextMessage, messageId: Long, groupTile: String) { - Log.d(TAG, "archiveMessageInbox") - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = message.groupId != null - var inboxRecipient = "" - if (archiveRecipient.isGroup) { - inboxRecipient = getGroupInboxRecipientNumber(archiveRecipient, message) - } - val from = getFromPartForSubject(context, isInbox, archiveRecipient, inboxRecipient) - val toRecipientsList = createToRecipientList(context, isInbox, archiveRecipient, isGroup, from) - val subject = createSubjectForArchiving(context, isInbox, isGroup, archiveRecipient, inboxRecipient, false, groupTile) - val chatMode = getChatMode(isGroup) - val chatName = getChatName(context, archiveRecipient, isGroup) - val chatId = groupId(archiveRecipient) - val fromContactName = fromContactName(context, archiveRecipient, isInbox) - val toName = createMessageNameList(context, archiveRecipient, isInbox, ArchiveUtil.getRecipientsListFromParticipantIds(archiveRecipient), isGroup, Contact(from)) - val messageBody = if(message.messageBody != null){ - message.messageBody - }else{ - "" - } - - val uniqueMessageId = ArchiveUtil.getUniqueMessageId(context, message.sentTimestampMillis, from) - - sendArchiveMessage(context,uniqueMessageId , type, toRecipientsList, from, messageBody, System.currentTimeMillis(), subject, chatMode, chatName, chatId, fromContactName, toName) - - sendArchiveLog("archiveMessageInbox --> type = $type uniqueMessageId Message ID = $uniqueMessageId subject = $subject group name = $groupTile") - - } - - fun archiveMessageInboxV2(context: Context, type: ArchiveConstants.ProtocolType, senderRecipient: Recipient, threadRecipient: Recipient, messageBody: String , messageSendingTime: Long) { - Log.d(TAG, "archiveMessageInboxV2 -> message = $messageBody") - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = threadRecipient.isGroup - var inboxRecipient = "" - if (isGroup) { - inboxRecipient = if(senderRecipient.e164.isPresent) senderRecipient.e164.get() else "0"//getGroupInboxRecipientNumberV2(senderRecipient, threadRecipient) - } - val groupTile = if(threadRecipient.getGroupName(context) != null) threadRecipient.getGroupName(context) else "" - val from = getFromPartForSubject(context, isInbox, senderRecipient, inboxRecipient) - val toRecipientsList = createToRecipientListV2(context, isInbox, senderRecipient,threadRecipient, isGroup, from) - val subject = createSubjectForArchiving(context, isInbox, isGroup, senderRecipient, inboxRecipient, false, groupTile) - val chatMode = getChatMode(isGroup) - val chatName = getChatNameV2(context, threadRecipient, isGroup) - val chatId = groupId(threadRecipient) - val fromContactName = fromContactName(context, senderRecipient, isInbox) - val toName = createMessageNameListV2(context, senderRecipient, threadRecipient, isInbox, ArchiveUtil.getRecipientsListFromParticipantIds(senderRecipient), isGroup, Contact(from)) - - val uniqueMessageId = ArchiveUtil.getUniqueMessageId(context, messageSendingTime, from) - - sendArchiveMessage(context,uniqueMessageId , type, toRecipientsList, from, messageBody, System.currentTimeMillis(), subject, chatMode, chatName, chatId, fromContactName, toName) - - sendArchiveLog("archiveMessageInbox --> type = $type uniqueMessageId Message ID = $uniqueMessageId subject = $subject group name = $groupTile") - - } - - - fun archiveMessageOutboxV1(context: Context, type: ArchiveConstants.ProtocolType, archiveRecipient: Recipient, messageBody: String, messageId: Long, sendingTime: Long) { - Log.d(TAG, "archiveMessageOutboxV1 -> message = $messageBody") - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = archiveRecipient.isGroup - val inboxRecipient = "" - - val from = getFromPartForSubject(context, isInbox, archiveRecipient, inboxRecipient) - val toRecipientsList = createToRecipientList(context, isInbox, archiveRecipient, isGroup, from) - val chatName = getChatName(context, archiveRecipient, isGroup) - val subject = createSubjectForArchiving(context, isInbox, isGroup, archiveRecipient, inboxRecipient, false, chatName) - val chatMode = getChatMode(isGroup) - - val chatId = groupId(archiveRecipient) - val fromContactName = fromContactName(context, archiveRecipient, isInbox) - val toName = createMessageNameList(context, archiveRecipient, isInbox, ArchiveUtil.getRecipientsListFromParticipantIds(archiveRecipient), isGroup, Contact(from)) - val cleanMessageBody = cleanMessageBodyFromUnusedCharacters(messageBody) - - val uniqueMessageId = ArchiveUtil.getUniqueMessageId(context, sendingTime, from) - - sendArchiveMessage(context,uniqueMessageId, type, toRecipientsList, from, cleanMessageBody, System.currentTimeMillis(), subject, chatMode, chatName, chatId, fromContactName, toName) - sendArchiveLog("archiveMessageOutbox --> type = $type subject = $subject uniqueMessageId Message ID = $messageId") - } - - - //This method also sent sms if attachments list size is 0 - fun archiveMessageOutboxMMS(context: Context, type: ArchiveConstants.ProtocolType, archiveRecipient: Recipient, message: OutgoingMessage, messageId: Long, archiveFile: Array? = null) { - - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = archiveRecipient.isGroup - val inboxRecipient = "" - var groupTitle = "" - if (message.threadRecipient.groupId.isPresent) { - groupTitle = SignalDatabase.groups.getGroup(message.threadRecipient.groupId.get()).get().title!! - } - - val from = getFromPartForSubject(context, isInbox, archiveRecipient, inboxRecipient) - val toRecipientsList = createToRecipientList(context, isInbox, archiveRecipient, isGroup, from) - val subject = createSubjectForArchiving(context, isInbox, isGroup, archiveRecipient, inboxRecipient, false, groupTitle) - val chatMode = getChatMode(isGroup) - val chatName = getChatName(context, archiveRecipient, isGroup) - val chatId = groupId(archiveRecipient) - val fromContactName = fromContactName(context, archiveRecipient, isInbox) - val toName = createMessageNameList(context, archiveRecipient, isInbox, ArchiveUtil.getRecipientsListFromParticipantIds(archiveRecipient), isGroup, Contact(from)) - val messageBody = ArchiveUtil.createPreviewLinkBody(null, message) - - val uniqueMessageId = ArchiveUtil.getUniqueMessageId(context, message.sentTimeMillis, from) - - sendArchiveMessage(context, uniqueMessageId, type, toRecipientsList, from, messageBody , System.currentTimeMillis(), subject, chatMode, chatName, chatId, fromContactName, toName, archiveFile) - - sendArchiveLog("archiveMessageOutboxMMS --> type = $type subject = $subject uniqueMessageId Message ID = $uniqueMessageId") - - } - - fun archiveMessageInboxMMS(aContext: Context, aGroupTitle: String?, aType: ArchiveConstants.ProtocolType, aArchiveRecipient: Recipient, aRecipientList: MutableList?, aMessage: IncomingMediaMessage, aMessageId: Long, aArchiveFile: File? = null) { - var listOfFile: Array? = null - if(aArchiveFile != null) { - listOfFile = Array(1) { aArchiveFile } - } - archiveMessageInboxMMS(aContext, aGroupTitle, aType, aArchiveRecipient, aRecipientList, aMessage, aMessageId, listOfFile) - } - - fun archiveMessageInboxMMS(context: Context, groupTitle: String?, type: ArchiveConstants.ProtocolType, archiveRecipient: Recipient, recipientList: MutableList?, message: IncomingMediaMessage, messageId: Long, archiveFile: Array? = null) { - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = message.isGroupMessage - val inboxRecipient = "" - val from = getFromPartForSubject(context, isInbox, archiveRecipient, inboxRecipient) - val toRecipientsList = createToRecipientList(context, isInbox, archiveRecipient, isGroup, from, recipientList) - val subject = createSubjectForArchiving(context, isInbox, isGroup, archiveRecipient, inboxRecipient, false, groupTitle) - val chatMode = getChatMode(isGroup) - val chatName = getChatName(context, archiveRecipient, isGroup,groupTitle?: "") - val chatId = groupId(archiveRecipient, message.groupId) - val fromContactName = fromContactName(context, archiveRecipient, isInbox) - val toName = createMessageNameList(context, archiveRecipient, isInbox, recipientList, isGroup, Contact(from)) - val messageBody = ArchiveUtil.createPreviewLinkBody(message, null) - - val uniqueMessageId = ArchiveUtil.getUniqueMessageId(context, message.sentTimeMillis, from) - - sendArchiveMessage(context, uniqueMessageId, type, toRecipientsList, from, messageBody, System.currentTimeMillis(), subject, chatMode, chatName, chatId, fromContactName, toName, archiveFile) - - sendArchiveLog("archiveMessageInboxMMS --> type = $type subject = $subject recipientList $recipientList uniqueMessageId Message ID = $uniqueMessageId") - - - } - - - fun archiveMessageInboxMMSV2(context: Context, type: ArchiveConstants.ProtocolType, senderRecipient: Recipient, threadRecipient: Recipient, messageBody: String , messageSendingTime: Long, aArchiveFile: File? = null) { - var listOfFile: Array? = null - if(aArchiveFile != null) { - listOfFile = Array(1) { aArchiveFile } - } - archiveMessageInboxMMSV2(context, type, senderRecipient, threadRecipient, messageBody, messageSendingTime, listOfFile) - } - - fun archiveMessageInboxMMSV2(context: Context, type: ArchiveConstants.ProtocolType, senderRecipient: Recipient, threadRecipient: Recipient, messageBody: String? , messageSendingTime: Long, archiveFile: Array? = null) { - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = threadRecipient.isGroup - val inboxRecipient = "" - val groupTile = if(threadRecipient.getGroupName(context) != null) threadRecipient.getGroupName(context) else "" - val from = getFromPartForSubject(context, isInbox, senderRecipient, inboxRecipient) - val toRecipientsList = createToRecipientListV2(context, isInbox, senderRecipient,threadRecipient, isGroup, from) - val subject = createSubjectForArchiving(context, isInbox, isGroup, senderRecipient, inboxRecipient, false, groupTile) - val chatMode = getChatMode(isGroup) - val chatName = getChatNameV2(context, threadRecipient, isGroup) - val chatId = groupId(threadRecipient) - val fromContactName = fromContactName(context, senderRecipient, isInbox) - val toName = createMessageNameListV2(context, senderRecipient, threadRecipient, isInbox, ArchiveUtil.getRecipientsListFromParticipantIds(senderRecipient), isGroup, Contact(from)) - - // val messageBody = ArchiveUtil.createPreviewLinkBody(message, null) TODO: FIXIT!! - - val uniqueMessageId = ArchiveUtil.getUniqueMessageId(context, messageSendingTime, from) - - sendArchiveMessage(context, uniqueMessageId, type, toRecipientsList, from, - messageBody ?: "", System.currentTimeMillis(), subject, chatMode, chatName, chatId, fromContactName, toName, archiveFile) - - // sendArchiveLog("archiveMessageInboxMMS --> type = $type subject = $subject recipientList $recipientList uniqueMessageId Message ID = $uniqueMessageId") - - - } - - fun archiveMessageOutboxSyncMMS(context: Context, groupTitle: String, type: ArchiveConstants.ProtocolType, archiveRecipient: Recipient, recipientList: MutableList?, message: OutgoingMessage, messageId: Long, archiveFile: Array? = null) { - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = archiveRecipient.isGroup - val inboxRecipient = "" - val from = getFromPartForSubject(context, isInbox, archiveRecipient, inboxRecipient) - val toRecipientsList = createToRecipientList(context, isInbox, archiveRecipient, isGroup, from, recipientList) - val subject = createSubjectForArchiving(context, isInbox, isGroup, archiveRecipient, inboxRecipient, false, groupTitle) - val chatMode = getChatMode(isGroup) - val chatName = getChatName(context, archiveRecipient, isGroup) - val chatId = groupId(archiveRecipient) - val fromContactName = fromContactName(context, archiveRecipient, isInbox) - val toName = createMessageNameList(context, archiveRecipient, isInbox, recipientList, isGroup, Contact(from)) - val messageBody = ArchiveUtil.createPreviewLinkBody( null, message) - - val uniqueMessageId = ArchiveUtil.getUniqueMessageId(context, message.sentTimeMillis, from) - - sendArchiveMessage(context,uniqueMessageId, type, toRecipientsList, from, messageBody, System.currentTimeMillis(), subject, chatMode, chatName, chatId, fromContactName, toName, archiveFile) - - sendArchiveLog("archiveMessageOutboxSyncMMS --> type = $type subject = $subject uniqueMessageId Message ID = $uniqueMessageId") - } - - - - - - - ///////////DELETE MESSAGE///////// - - fun sendArchiveDeleteMessage(context: Context, message: MessageRecord, type: ArchiveConstants.ProtocolType, isDeletedForAll: Boolean){ - - val archiveRecipient = message.fromRecipient - val isInbox = type === ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_INBOX - val isGroup = archiveRecipient.isGroup - - val status = getMessageStatus(isGroup, message) - val deletePrefixMessage = getDeleteMessagePrefix(isDeletedForAll, status) - - val inboxRecipient = "" - - val from = getFromPartForSubject(context, isInbox, archiveRecipient, inboxRecipient) - val toRecipientsList = createToRecipientList(context, isInbox, archiveRecipient, isGroup, from) - val chatName = getChatName(context, archiveRecipient, isGroup) - val subject = createSubjectForArchiving( - context, - isInbox, - isGroup, - archiveRecipient, - inboxRecipient, - false, - chatName - ) - val chatMode = getChatMode(isGroup) - - val chatId = groupId(archiveRecipient) - val fromContactName = fromContactName(context, archiveRecipient, isInbox) - val toName = createMessageNameList(context, archiveRecipient, isInbox, ArchiveUtil.getRecipientsListFromParticipantIds(archiveRecipient), isGroup, Contact(from)) - val cleanMessageBody = cleanMessageBodyFromUnusedCharacters(message.body) - val listFileAsString = getListFileAsString(message) - val uniqueMessageId = ArchiveUtil.getUniqueDeleteMessageId(message.timestamp, from, true, isDeletedForAll) - val originalMessageId = "Original Message (Msg ID - " + ArchiveUtil.getUniqueDeleteMessageId(message.timestamp, from, false, isDeletedForAll) + ")" - val deleteMessageBody = deletePrefixMessage + subject + "\n\n" + originalMessageId + "\n\n" + cleanMessageBody + listFileAsString - - sendArchiveMessage(context,uniqueMessageId, type, toRecipientsList, from, deleteMessageBody, System.currentTimeMillis(), deletePrefixMessage + subject, chatMode, chatName, chatId, fromContactName, toName) - - } - - private fun getDeleteMessagePrefix( - isDeletedForAll: Boolean, - status: String - ) = if (isDeletedForAll) { - "DELETED For All – $status " - } else { - "DELETED For Me – $status " - } - - private fun getMessageStatus( - isGroup: Boolean, - message: MessageRecord - ) = if (!isGroup) { - if (message.readReceiptCount == 0) "UNREAD" else "READ" - } else { - "UNKNOWN" - } - - private fun getListFileAsString( - messageRecord: MessageRecord - ): String { - //(message as MediaMmsMessageRecord).slideDeck - if (!messageRecord.isMms) { - return "" - } - - val filesName = (messageRecord as MediaMmsMessageRecord).slideDeck - - val listOfDeletedFileNames = StringBuilder() - - listOfDeletedFileNames.append("\n").append("Files: ").append("\n") - for (i in filesName.slides) { - listOfDeletedFileNames.append(ArchiveUtil.generateAttachmentName((i.asAttachment() as DatabaseAttachment).attachmentId.rowId, (i.asAttachment() as DatabaseAttachment).attachmentId.uniqueId)).append("\n") - } - - return "$listOfDeletedFileNames" - } - - - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/archiver/ArchiveUtil.kt b/app/src/main/java/org/archiver/ArchiveUtil.kt deleted file mode 100644 index 797d03fb..00000000 --- a/app/src/main/java/org/archiver/ArchiveUtil.kt +++ /dev/null @@ -1,769 +0,0 @@ -package org.archiver - -import android.content.Context -import android.net.Uri -import com.google.android.gms.tasks.OnCompleteListener -import com.google.firebase.messaging.FirebaseMessaging -import com.google.gson.Gson -import com.tm.androidcopysdk.DataGrabber -import com.tm.androidcopysdk.network.NetworkManager -import com.tm.androidcopysdk.network.keepAlive.KeepALiveResponse -import com.tm.androidcopysdk.network.keepAlive.KeepAliveRequest -import com.tm.androidcopysdk.utils.Contact -import com.tm.androidcopysdk.utils.PrefManager -import com.tm.authenticatorsdk.selfAuthenticator.AuthenticationAppType -import com.tm.logger.Log -import com.tm.utils.Definitions -import org.archiver.ArchiveConstants.Companion.ARCHIVE_SUBJECT_CHAT_GROUP -import org.archiver.ArchiveConstants.Companion.ARCHIVE_SUBJECT_FROM_TEXT -import org.archiver.ArchiveConstants.Companion.ARCHIVE_SUBJECT_TO_TEXT -import org.archiver.ArchiveConstants.Companion.SIGNAL_ARCHIVE_ATTACHMENT_TEMPLATE_PREFIX -import org.archiver.ArchiveConstants.Companion.isTestMode -import org.archiver.ArchiveConstants.Companion.signalTestMobileNumber -import org.archiver.ArchiveSender.Companion.archiveMessageOutboxMMS -import org.archiver.ArchiveSender.Companion.archiveMessageOutboxV1 -import org.archiver.ArchiveSender.Companion.updateArchiveSDKToSendMMSMessage -import org.tm.archive.BuildConfig -import org.tm.archive.attachments.AttachmentId -import org.tm.archive.database.SignalDatabase -import org.tm.archive.database.model.Mention -import org.tm.archive.dependencies.ApplicationDependencies -import org.tm.archive.groups.GroupId -import org.tm.archive.linkpreview.LinkPreview -import org.tm.archive.mms.IncomingMediaMessage -import org.tm.archive.mms.OutgoingMessage -import org.tm.archive.providers.BlobProvider -import org.tm.archive.recipients.Recipient -import org.tm.archive.recipients.RecipientId -import org.tm.archive.sms.IncomingTextMessage -import java.io.File -import java.io.IOException -import java.util.function.Function -import java.util.function.Predicate -import java.util.stream.Collectors - - -class ArchiveUtil { - - companion object { - - const val TAG = "ArchiveUtil" - @JvmStatic - var listAttachmentId : List = emptyList() - - @JvmStatic - fun createToRecipientList( - context: Context, - isInboxArchiveMessage: Boolean, - aRecipient: Recipient, - isGroup: Boolean, - from: String, - recipientList: MutableList? = null - ): Array { - var recipientListFromRecipient: List = if (isGroup) { - recipientList?.filter { it.e164.isPresent }?.map { it.e164.get() } - ?: getRecipientsListFromParticipantIds(aRecipient).filter { it.e164.isPresent }.map { it.e164.get() } - - } else { - if (isInboxArchiveMessage) { - listOf(getPhoneNumberInTestMode(context)) - } else { - if (aRecipient.e164.isPresent) { - listOf(aRecipient.e164.get().toString()) - } else { - listOf("") - } - } - } - - recipientListFromRecipient = if (!isInboxArchiveMessage) { - if (recipientListFromRecipient.size > 1) { - recipientListFromRecipient.filter { it != getPhoneNumberInTestMode(context) } - } else { - //Sending message in group that contains only me - recipientListFromRecipient - } - } else { - recipientListFromRecipient.filter { it != from } - } - return recipientListFromRecipient.toTypedArray(); - } - - -@JvmStatic - fun createToRecipientListV2( - context: Context, - isInboxArchiveMessage: Boolean, - aRecipient: Recipient, - threadRecipient: Recipient, - isGroup: Boolean, - from: String, - recipientList: MutableList? = null - ): Array { - var recipientListFromRecipient: List = if (isGroup) { - getRecipientsListFromThreadRecipient(threadRecipient).filter { it.e164.isPresent }.map { it.e164.get() } - } else { - if (isInboxArchiveMessage) { - listOf(getPhoneNumberInTestMode(context)) - } else { - if (aRecipient.e164.isPresent) { - listOf(aRecipient.e164.get().toString()) - } else { - listOf("") - } - } - } - - recipientListFromRecipient = if (!isInboxArchiveMessage) { - if (recipientListFromRecipient.size > 1) { - recipientListFromRecipient.filter { it != getPhoneNumberInTestMode(context) } - } else { - //Sending message in group that contains only me - recipientListFromRecipient - } - } else { - recipientListFromRecipient.filter { it != from } - } - return recipientListFromRecipient.toTypedArray(); - } - - - @JvmStatic - fun createSubjectForArchiving( - context: Context, - isInboxArchiveMessage: Boolean, - isGroup: Boolean, - recipient: Recipient, - inboxRecipient: String = "", - forceSms: Boolean, - groupTitle: String? = "", - deletePrefix : String ="" - ): String { - - val archiveType: String = getArchiveType(isInboxArchiveMessage, isGroup, forceSms) - val to = getToPartForSubject(context, isInboxArchiveMessage, recipient, isGroup, groupTitle) - val from = getFromPartForSubject(context, isInboxArchiveMessage, recipient, inboxRecipient) - - val clearSubject = "$archiveType $ARCHIVE_SUBJECT_FROM_TEXT ${ - from.toString().replace("+", "") - } $ARCHIVE_SUBJECT_TO_TEXT ${to.replace("+", "")}" - return deletePrefix + clearSubject.replace("\u2069", "").replace("\u2068", "") - } - - @JvmStatic - private fun getToPartForSubject( - context: Context, - isInboxArchiveMessage: Boolean, - recipient: Recipient, - isGroup: Boolean, - groupTitle: String? - ): String { - return when { - isGroup -> { - "$ARCHIVE_SUBJECT_CHAT_GROUP $groupTitle" - } - isInboxArchiveMessage -> { - getPhoneNumberInTestMode(context) - } - else -> { - if (recipient.e164.isPresent) { - recipient.e164.get() - } else { - "" - } - } - } - } - - @JvmStatic - fun getFromPartForSubject( - context: Context, - isInboxArchiveMessage: Boolean, - recipient: Recipient, - inboxRecipient: String = "" - ): String { - return when { - isInboxArchiveMessage -> { - when { - recipient.e164.isPresent -> { - recipient.e164.get() - } - inboxRecipient.isNotEmpty() -> { - inboxRecipient - } - else -> { - recipient.requireE164() - } - } - } - else -> { - getPhoneNumberInTestMode(context) - } - } - } - - @JvmStatic - fun getArchiveType( - isInboxArchiveMessage: Boolean, - isGroupMessage: Boolean, - forceSms: Boolean - ): String { - - return if (isInboxArchiveMessage || isGroupMessage) { - ArchiveConstants.ARCHIVE_TYPE_APP_MESSAGE - } else { - if (forceSms) { - ArchiveConstants.ARCHIVE_TYPE_SMS - } else { - ArchiveConstants.ARCHIVE_TYPE_APP_MESSAGE - } - } - } - - @JvmStatic - fun getPhoneNumberInTestMode(context: Context): String { - return if (isTestMode) { - signalTestMobileNumber - } else { - PrefManager.getStringPref( - context, - ArchivePreferenceConstants.PREF_KEY_DEVICE_PHONE_NUMBER, - "" - ); - } - } - - @JvmStatic - fun getChatMode(isGroup: Boolean): DataGrabber.CHAT_MODE { - return when { - isGroup -> { - DataGrabber.CHAT_MODE.group - } - else -> { - DataGrabber.CHAT_MODE.chat - } - } - } - - @JvmStatic - fun getChatName( - context: Context, - recipient: Recipient, - isGroup: Boolean, - groupTitle: String = "" - ): String { - return if (isGroup) { - if (groupTitle.isNotEmpty()) { - groupTitle - } else { - recipient.getGroupName(context) ?: "" - } - } else { - "" - } - } - - @JvmStatic - fun getChatNameV2( - context: Context, - threadRecipient: Recipient, - isGroup: Boolean, - groupTitle: String = "" - ): String { - return if (isGroup) { - if (groupTitle.isNotEmpty()) { - groupTitle - } else { - threadRecipient.getGroupName(context) ?: "" - } - } else { - "" - } - } - - @JvmStatic - fun getGroupInboxRecipientNumber( - archiveRecipient: Recipient, - message: IncomingTextMessage - ): String { - - val recipientList = getRecipientsListFromParticipantIds(archiveRecipient).filter { - message.authorId.toLong() == it.id.toLong() - } - return recipientList[0].e164.get() - } - - @JvmStatic - fun groupId(recipient: Recipient, groupId: GroupId? = null): String? { - return when { - recipient.isGroup -> { - recipient.groupId.get().toString() - } - groupId != null -> { - groupId.toString() - } - - else -> { - "" - } - } - } - - - @JvmStatic - fun fromContactName( - context: Context, - recipient: Recipient, - isInboxArchiveMessage: Boolean - ): Contact { - return if (isInboxArchiveMessage) { - Contact(recipient.getDisplayName(context)).cleanContactNameFromUnUsedCharacters() - } else { - Contact(Recipient.self().profileName.toString()).cleanContactNameFromUnUsedCharacters() - } - - } - - @JvmStatic - fun getRecipientsListFromParticipantIds(recipient: Recipient) : MutableList { - val selfId = ApplicationDependencies.getRecipientCache().selfId - return recipient.participantIds.stream() - .filter(Predicate { id: RecipientId -> id != selfId }) - .limit(ArchiveConstants.MAX_MEMBER_NAMES.toLong()) - .map(Function { id: RecipientId? -> Recipient.resolved(id!!) }) - .collect(Collectors.toList()) - } - - @JvmStatic - fun getRecipientsListFromThreadRecipient(threadRecipient: Recipient) : List { - return threadRecipient.participantIds.stream() - .limit(ArchiveConstants.MAX_MEMBER_NAMES.toLong()) - .map(Function { id: RecipientId? -> Recipient.resolved(id!!) }) - .collect(Collectors.toList()) - } - - @JvmStatic - fun createMessageNameList( - context: Context, - recipient: Recipient, - isInboxArchiveMessage: Boolean, - recipientList: List? = null, - isGroup: Boolean, - from: Contact = Contact("") - ): Array { - - - val tempRecipientList = getRecipientsListFromParticipantIds(recipient) - - val rl = if (!isInboxArchiveMessage) { - if (recipientList!!.size > 1) { - recipientList!!.filter { - it.e164.isPresent && it.e164.get() != getPhoneNumberInTestMode(context) - } ?:tempRecipientList.filter { - it.e164.isPresent && it.e164.get() != getPhoneNumberInTestMode(context) - } - } else { - //Sending message in group that contains only me - recipientList - } - } else { - recipientList?.filter { - it.e164.isPresent && it.e164.get() != from.toString() - } - ?: tempRecipientList.filter { - it.e164.isPresent && it.e164.get() != from.toString() - } - } - - val recipientListFromRecipient: List = if (isGroup) { - - rl.map { - Contact(it.getDisplayName(context)) - } - - } else { - if (isInboxArchiveMessage) { - listOf(Contact(Recipient.self().profileName.toString())) - } else { - listOf(Contact(recipient.getDisplayName(context))) - } - } - - if (recipientListFromRecipient.toTypedArray().isEmpty()) { - return arrayOf(Contact()) - } - - //SIG-437 - Clean list from [FSI]*[PDI] - recipientListFromRecipient.forEachIndexed { index, contact -> - contact.firstName = contact.cleanContactNameFromUnUsedCharacters().firstName - contact.lastName = contact.cleanContactNameFromUnUsedCharacters().lastName - } - - return recipientListFromRecipient.toTypedArray() - } - - @JvmStatic - fun createMessageNameListV2( - context: Context, - recipient: Recipient, - threadRecipient: Recipient, - isInboxArchiveMessage: Boolean, - recipientList: List? = null, - isGroup: Boolean, - from: Contact = Contact("") - ): Array { - - - val threadRecipientList = getRecipientsListFromThreadRecipient(threadRecipient) - - val rl = if (!isInboxArchiveMessage) { - if (recipientList!!.size > 1) { - recipientList!!.filter { - it.e164.isPresent && it.e164.get() != getPhoneNumberInTestMode(context) - } ?:threadRecipientList.filter { - it.e164.isPresent && it.e164.get() != getPhoneNumberInTestMode(context) - } - } else { - //Sending message in group that contains only me - recipientList - } - } else { - threadRecipientList.filter { - it.e164.isPresent && it.e164.get() != from.toString() - } - } - - val recipientListFromRecipient: List = if (isGroup) { - - rl.map { - Contact(it.getDisplayName(context)) - } - - } else { - if (isInboxArchiveMessage) { - listOf(Contact(Recipient.self().profileName.toString())) - } else { - listOf(Contact(recipient.getDisplayName(context))) - } - } - - if (recipientListFromRecipient.toTypedArray().isEmpty()) { - return arrayOf(Contact()) - } - - //SIG-437 - Clean list from [FSI]*[PDI] - recipientListFromRecipient.forEachIndexed { index, contact -> - contact.firstName = contact.cleanContactNameFromUnUsedCharacters().firstName - contact.lastName = contact.cleanContactNameFromUnUsedCharacters().lastName - } - - return recipientListFromRecipient.toTypedArray() - } - - @JvmStatic - fun generateAttachmentName(messageId: Long, attachmentId: Long): String { - return SIGNAL_ARCHIVE_ATTACHMENT_TEMPLATE_PREFIX + attachmentId + "_" + messageId - } - - @JvmStatic - fun getFileFromAttachmentId(context: Context, attachmentId: AttachmentId) : File { - val uri = SignalDatabase.attachments.getAttachment(attachmentId)!!.uri - Log.d("ArchiveUtil", "getFileFromAttachmentId -> uri $uri") - return ArchiveFileUtil.getFileFromDataBaseUri(context, uri.toString()) - } - - @JvmStatic - fun getMessageBody(messageBody: String?, mentionsList: List): String? { - return if (messageBody != null) { - var result = messageBody ?: "" - return if (mentionsList.isNotEmpty()) { - mentionsList.forEachIndexed { index, mention -> - val givenName = - getRecipientFromRecipientID(mentionsList[index].recipientId).profileName.givenName - val e164Object = getRecipientFromRecipientID(mentionsList[index].recipientId).e164 - val name = if (givenName.isEmpty()) { - if (e164Object.isPresent) { - e164Object.get() - } else { - "" - } - } else { - givenName - } - result = result.replaceFirst("\uFFFC", "\u0040" + name) - } - result - } else { - messageBody - } - } else { - null - } - } - - @JvmStatic - fun createPreviewLinkBody( - incomingMediaMessage: IncomingMediaMessage?, - outComingMediaMessage: OutgoingMessage? - ): String? { - var body = "" - if (incomingMediaMessage != null) { - return if (incomingMediaMessage.linkPreviews.isEmpty()) { - getMessageBody(incomingMediaMessage.body, incomingMediaMessage.mentions) - } else { - generateBodyFromLinkPreview(incomingMediaMessage.linkPreviews[0]) + "\n" + incomingMediaMessage.body - } - } else if (outComingMediaMessage != null) { - return if (outComingMediaMessage.linkPreviews.isEmpty()) { - getMessageBody(outComingMediaMessage.body, outComingMediaMessage.mentions) - } else { - generateBodyFromLinkPreview(outComingMediaMessage.linkPreviews[0]) + "\n" + outComingMediaMessage.body - } - } - return "" - } - - @JvmStatic - private fun generateBodyFromLinkPreview(linkPreview: LinkPreview?): String { - var body = "" - if (linkPreview!!.title.isNotEmpty()) { - body += """ - Site title: ${linkPreview.title} - - """.trimIndent() - } - if (linkPreview.url.isNotEmpty()) { - body += """ - Site url: ${linkPreview.url} - - """.trimIndent() - } - - if (linkPreview.description.isNotEmpty()) { - body += """ - Site description: ${linkPreview.description} - - """.trimIndent() - } - return body - } - - @JvmStatic - fun cleanMessageBodyFromUnusedCharacters(messageBody: String?): String { - return if (messageBody != null && messageBody.isNotEmpty()) { - messageBody.replace("\u2069", "").replace("\u2068", "") - } else { - "" - } - } - - @JvmStatic - fun getRecipientFromRecipientID(recipientId: RecipientId): Recipient { - return Recipient.resolved(recipientId) - } - - @JvmStatic - fun archiveOutboxMessage(context: Context, messageId: Long, message: OutgoingMessage) { - - - var tempFileForArchiving: File? = null - var isMediaMessage = false - var filesToSend = arrayOfNulls(message.attachments.size) - for (i in message.attachments.indices) { - tempFileForArchiving = - ArchiveFileUtil.createFileFromContentUri(context, message.attachments[i].uri.toString()) - filesToSend[i] = tempFileForArchiving - isMediaMessage = true - } - if (message.linkPreviews.isNotEmpty()) { - if (message.linkPreviews[0].thumbnail.isPresent && message.linkPreviews[0].thumbnail.get().uri.toString() - .isNotEmpty() - ) { - filesToSend = arrayOfNulls(1) - filesToSend[0] = ArchiveFileUtil.createFileFromContentUri( - context, - message.linkPreviews[0].thumbnail.get().uri.toString() - ) - isMediaMessage = true - } else { - isMediaMessage = false - } - - } - if (message.sharedContacts.size > 0) { - filesToSend = arrayOfNulls(1) - val vcfFile = ArchiveFileUtil.createVCFFileFromContact(context, message.sharedContacts[0]) - filesToSend[0] = vcfFile - isMediaMessage = true - } - - //TODO - Archiving of "replay messages" (the original message is in "message.getQuote") - if (message.outgoingQuote != null) { - archiveMessageOutboxMMS( - context, - ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_SEND, - message.threadRecipient, - message, - messageId, - null - ) - isMediaMessage = true - } - - if (isMediaMessage) { - archiveMessageOutboxMMS( - context, - ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_SEND, - message.threadRecipient, - message, - messageId, - filesToSend - ) - for (i in filesToSend.indices) { - if (filesToSend[i] != null) { - updateArchiveSDKToSendMMSMessage(context, filesToSend[i]!!.name, true) - } - } - } else { - if (!message.isGroupUpdate - && !message.isExpirationUpdate - ) { - - val messageBody = createPreviewLinkBody(null, message) - archiveMessageOutboxV1( - context, - ArchiveConstants.ProtocolType.ARCHIVE_PARAM_PROTOCOL_SEND, - message.threadRecipient, - messageBody!!, - messageId, - message.sentTimeMillis - ) - } else { - //TODO - Group events/updates!! - } - - } - } - - @JvmStatic - fun fetchFCMToken(context: Context, aITokenCallback : ITokenCallback?) { - Log.d(TAG, "Starting fetch FCM token..") - - FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> - if (!task.isSuccessful) { - Log.d("ArchiverUtil", "fetchFCMToken Fetching FCM registration token failed ${task.exception}") - Log.d(TAG, "fetchFCMToken FCM_TM_UTILS Fetching FCM registration token failed ${task.exception}") - - aITokenCallback?.onFetchingFailed() - return@OnCompleteListener - } - - // Get new FCM registration token - val token = task.result - Log.d(TAG, "FCM token is = $token") - Log.d(TAG,"fetchFCMToken FCM_TM_UTILS FCM token is = $token") - - PrefManager.setStringPref( - context, - ArchivePreferenceConstants.FCM_TOKEN_PREFERENCE_KEY, - token - ) - - aITokenCallback?.onFetchingSucceed() - }) - - } - - interface ITokenCallback { - fun onFetchingFailed() - fun onFetchingSucceed() - } - - @JvmStatic - fun getFCMTokenIfExists(context: Context): String? { - return PrefManager.getStringPref( - context, - ArchivePreferenceConstants.FCM_TOKEN_PREFERENCE_KEY, - "" - ) - } - - @JvmStatic - fun getUniqueMessageId(context: Context, messageSendingTime: Long, from: String): String { - - return "${messageSendingTime}_${from.replace("+","")}" - - } - - @JvmStatic - fun getUniqueDeleteMessageId(messageSendingTime: Long, from: String, isDeleteMessage: Boolean = false, deletedForAll : Boolean = false): String { - - var uniqueMessageId = "${messageSendingTime}_${from.replace("+","")}" - - if(isDeleteMessage){ - uniqueMessageId = (if (deletedForAll) "DELETE_FOR_ALL-" else "DELETE_FOR_ME-") + uniqueMessageId - } - return uniqueMessageId - - } - - @JvmStatic - fun doTeleMessageKeepAlivePing(context: Context) { - - object : Thread() { - override fun run() { - try { - val nm = NetworkManager( - context, - PrefManager.getStringPref(context, "baseurl", Definitions.BaseUrl) - ) - var sr: KeepAliveRequest? = null - sr = if (getFCMTokenIfExists(context) == null || getFCMTokenIfExists(context)!! - .isEmpty() - ) { - Log.d(TAG, "KeepAliveRequest with 1 param") - KeepAliveRequest(AuthenticationAppType.TELEGRAM.aAppServerId.toString()) - } else { - Log.d(TAG, "KeepAliveRequest with 4 param") - KeepAliveRequest( - AuthenticationAppType.SIGNAL.aAppServerId.toString(), - BuildConfig.VERSION_NAME, - BuildConfig.VERSION_CODE.toString(), - getFCMTokenIfExists(context) - ) - } - Log.d(TAG, "request KeepAlive: " + Gson().toJson(sr)) - //Log.d(TAG, "send message:" + sr.getTextContent()); - val res = nm.start(sr, null, context, true); - // Log.d(TAG, "response KeepAlive: " + new Gson().toJson(res)); - if (res == null) { - Log.d(TAG, "response is null") - } else if (res.isSuccessful) { - Log.d(TAG, "response.isSuccessful() = true") - } else { - Log.d(TAG, "response.isSuccessful() = false") - } - } catch (e: Exception) { - e.printStackTrace() - } - } - }.start() - - - } - - fun Contact.cleanContactNameFromUnUsedCharacters() : Contact{ - this.firstName = this.firstName.replace("\u2068", "").replace("\u2069","").replace("\u202c","") - this.lastName = this.lastName.replace("\u2068", "").replace("\u2069","").replace("\u202c","") - return this - } - } - - enum class InboxArchiveTypes { - MEDIA, - HYPER_LINK, - STICKER, - CONTACT, - MENTIONS; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/archiver/FCMConnector.kt b/app/src/main/java/org/archiver/FCMConnector.kt deleted file mode 100644 index 43b46403..00000000 --- a/app/src/main/java/org/archiver/FCMConnector.kt +++ /dev/null @@ -1,141 +0,0 @@ -package org.archiver - -import android.content.Context -import com.google.firebase.FirebaseApp -import com.google.firebase.FirebaseOptions -import com.tm.androidcopysdk.AndroidCopySDK -import com.tm.androidcopysdk.utils.PrefManager -import com.tm.logger.Log -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.archiver.ArchiveUtil.Companion.fetchFCMToken -import org.archiver.ArchiveUtil.Companion.getFCMTokenIfExists -import org.tm.archive.ApplicationContext -import org.tm.archive.dependencies.ApplicationDependencies -import org.tm.archive.gcm.FcmUtil -import org.tm.archive.jobs.FcmRefreshJob -import org.tm.archive.keyvalue.SignalStore - -class FCMConnector { - - companion object { - - const val TAG = "FCMConnector" - - const val RETRIEVE_ONE_TIME_PIN_FCM_FROM_TYPE = "Get Inbox" - const val RETRIEVE_ONE_TIME_PIN_FCM_MSG = "MESSAGE" - const val RETRIEVE_ONE_TIME_PIN_CODE_SUCCESSES_SUB_STRING = "code : " - - - @JvmStatic - fun initOfficialSignalFirebaseAccount(context: Context) { - Log.d(TAG, "init---Official---SignalFirebaseAccount"); - val options = FirebaseOptions.Builder() - .setApplicationId("1:312334754206:android:a9297b152879f266") - .setApiKey("AIzaSyDrfzNAPBPzX6key51hqo3p5LZXF5Y-yxU") - .setProjectId("api-project-312334754206") - .setGcmSenderId("312334754206") - .build() - - try { - FirebaseApp.clearInstancesForTest() - FirebaseApp.initializeApp( - ApplicationContext.getInstance(context).applicationContext, - options - ) - } catch (e: Exception) { - Log.d(TAG, "App already exists " + e.message) - } - CoroutineScope(Dispatchers.IO).launch { - val token = FcmUtil.getToken(context) - if (token.isPresent) { - val oldToken = SignalStore.account().fcmToken - Log.i( - TAG, - "fcmconnector -> FCM_TM_UTILS token: " + token.get().length - ) - if (token.get() != oldToken) { - val oldLength = oldToken?.length ?: -1 - Log.i( - TAG, - "fcmconnector -> FCM_TM_UTILS Token changed. oldLength: " + oldLength + " newLength: " + token.get().length - ) - - Log.i( - TAG, "FCM_TM_UTILS Token changed. new Token: " + token.get() - ) - - } else { - Log.i(TAG, "Token didn't change.") - } - - if (SignalStore.account().isRegistered) { - - ApplicationDependencies.getJobManager().add(FcmRefreshJob()) - - - } - } - - } - } - - @JvmStatic - fun initTeleMessageSignalFirebaseAccount(context: Context, fcmName: String?, isClearAll: Boolean) { - Log.d(TAG,"init---Telemessage---SignalFirebaseAccount") - val isAlreadyDoneSelfAuthentication = - PrefManager.getBooleanPref(context, "isAlreadyDoneSelfAuthentication", false) - Log.d( - TAG, - "SelfAuthenticatorProcess -> onCreate = isAlreadyDoneSelfAuthentication = $isAlreadyDoneSelfAuthentication" - ) - if (getFCMTokenIfExists(context) == null || getFCMTokenIfExists(context)!! - .isEmpty() || !isAlreadyDoneSelfAuthentication - ) { - Log.d(TAG, "ArchiveUtil.getFCMTokenIfExists(this) == null --" + (getFCMTokenIfExists(context) == null)) - Log.d(TAG, "ArchiveUtil.getFCMTokenIfExists(this).isEmpty() --" + getFCMTokenIfExists(context)!!.isEmpty()) - Log.d(TAG, "!isAlreadyDoneSelfAuthentication --" + !isAlreadyDoneSelfAuthentication) - Log.i(TAG, "init Telemessage -> current FCM: " + FirebaseApp.getInstance().options.projectId) - val options = FirebaseOptions.Builder() - .setApplicationId("1:578202328450:android:0c71bb144fc9cf628e039b") - .setApiKey("AIzaSyAl8hz1VyCAniywmN4_3yUTK17-PNmn98M") - .setProjectId("signal-d0e5e") - .setGcmSenderId("578202328450") - .build() - try { - if (isClearAll) { - FirebaseApp.clearInstancesForTest() - } - if (fcmName == null || fcmName.isEmpty()) { - FirebaseApp.initializeApp( - ApplicationContext.getInstance(context).applicationContext, - options - ) - } else { - FirebaseApp.initializeApp( - ApplicationContext.getInstance(context).applicationContext, - options, - fcmName - ) - } - Log.d(TAG, "FirebaseApp.getApps(context): " + FirebaseApp.getApps(context)) - Log.i( - TAG, - "init telemessage account" - ) - } catch (e: java.lang.Exception) { - Log.d(TAG, "App already exists") - } - } - fetchFCMToken(context, null) - } - - @JvmStatic - fun updateSignUpCredentials(context: Context, userName: String?, password: String?) { - AndroidCopySDK.getInstance(context) - .signupSucess(userName, password) - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/conscrypt/ConscryptSignal.java b/app/src/main/java/org/conscrypt/ConscryptSignal.java new file mode 100644 index 00000000..3b4421b4 --- /dev/null +++ b/app/src/main/java/org/conscrypt/ConscryptSignal.java @@ -0,0 +1,800 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.conscrypt; + +import java.nio.ByteBuffer; +import java.security.KeyManagementException; +import java.security.PrivateKey; +import java.security.Provider; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLContextSpi; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLEngineResult; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSessionContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +/** + * Core API for creating and configuring all Conscrypt types. + * This is identical to the original Conscrypt.java, except with the slow + * version initialization code removed. + */ +@SuppressWarnings("unused") +public final class ConscryptSignal { + private ConscryptSignal() {} + + /** + * Returns {@code true} if the Conscrypt native library has been successfully loaded. + */ + public static boolean isAvailable() { + try { + checkAvailability(); + return true; + } catch (Throwable e) { + return false; + } + } + + // BEGIN MODIFICATION + /*public static class Version { + private final int major; + private final int minor; + private final int patch; + + private Version(int major, int minor, int patch) { + this.major = major; + this.minor = minor; + this.patch = patch; + } + + public int major() { return major; } + public int minor() { return minor; } + public int patch() { return patch; } + } + + private static final Version VERSION; + + static { + int major = -1; + int minor = -1; + int patch = -1; + InputStream stream = null; + try { + stream = Conscrypt.class.getResourceAsStream("conscrypt.properties"); + if (stream != null) { + Properties props = new Properties(); + props.load(stream); + major = Integer.parseInt(props.getProperty("org.conscrypt.version.major", "-1")); + minor = Integer.parseInt(props.getProperty("org.conscrypt.version.minor", "-1")); + patch = Integer.parseInt(props.getProperty("org.conscrypt.version.patch", "-1")); + } + } catch (IOException e) { + // TODO(prb): This should probably be fatal or have some fallback behaviour + } finally { + IoUtils.closeQuietly(stream); + } + if ((major >= 0) && (minor >= 0) && (patch >= 0)) { + VERSION = new Version(major, minor, patch); + } else { + VERSION = null; + } + } + + /** + * Returns the version of this distribution of Conscrypt. If version information is + * unavailable, returns {@code null}. + */ + /*public static Version version() { + return VERSION; + }*/ + + // END MODIFICATION + + /** + * Checks that the Conscrypt support is available for the system. + * + * @throws UnsatisfiedLinkError if unavailable + */ + public static void checkAvailability() { + NativeCrypto.checkAvailability(); + } + + /** + * Indicates whether the given {@link Provider} was created by this distribution of Conscrypt. + */ + public static boolean isConscrypt(Provider provider) { + return provider instanceof OpenSSLProvider; + } + + /** + * Constructs a new {@link Provider} with the default name. + */ + public static Provider newProvider() { + checkAvailability(); + return new OpenSSLProvider(); + } + + /** + * Constructs a new {@link Provider} with the given name. + * + * @deprecated Use {@link #newProviderBuilder()} instead. + */ + @Deprecated + public static Provider newProvider(String providerName) { + checkAvailability(); + return newProviderBuilder().setName(providerName).build(); + } + + public static class ProviderBuilder { + private String name = Platform.getDefaultProviderName(); + private boolean provideTrustManager = Platform.provideTrustManagerByDefault(); + private String defaultTlsProtocol = NativeCrypto.SUPPORTED_PROTOCOL_TLSV1_3; + + private ProviderBuilder() {} + + /** + * Sets the name of the Provider to be built. + */ + public ProviderBuilder setName(String name) { + this.name = name; + return this; + } + + /** + * Causes the returned provider to provide an implementation of + * {@link javax.net.ssl.TrustManagerFactory}. + * @deprecated Use provideTrustManager(true) + */ + @Deprecated + public ProviderBuilder provideTrustManager() { + return provideTrustManager(true); + } + + /** + * Specifies whether the returned provider will provide an implementation of + * {@link javax.net.ssl.TrustManagerFactory}. + */ + public ProviderBuilder provideTrustManager(boolean provide) { + this.provideTrustManager = provide; + return this; + } + + /** + * Specifies what the default TLS protocol should be for SSLContext identifiers + * {@code TLS}, {@code SSL}, and {@code Default}. + */ + public ProviderBuilder defaultTlsProtocol(String defaultTlsProtocol) { + this.defaultTlsProtocol = defaultTlsProtocol; + return this; + } + + public Provider build() { + return new OpenSSLProvider(name, provideTrustManager, defaultTlsProtocol); + } + } + + public static ProviderBuilder newProviderBuilder() { + return new ProviderBuilder(); + } + + /** + * Returns the maximum length (in bytes) of an encrypted packet. + */ + public static int maxEncryptedPacketLength() { + return NativeConstants.SSL3_RT_MAX_PACKET_SIZE; + } + + /** + * Gets the default X.509 trust manager. + */ + @ExperimentalApi + public static X509TrustManager getDefaultX509TrustManager() throws KeyManagementException { + checkAvailability(); + return SSLParametersImpl.getDefaultX509TrustManager(); + } + + /** + * Indicates whether the given {@link SSLContext} was created by this distribution of Conscrypt. + */ + public static boolean isConscrypt(SSLContext context) { + return context.getProvider() instanceof OpenSSLProvider; + } + + /** + * Constructs a new instance of the preferred {@link SSLContextSpi}. + */ + public static SSLContextSpi newPreferredSSLContextSpi() { + checkAvailability(); + return OpenSSLContextImpl.getPreferred(); + } + + /** + * Sets the client-side persistent cache to be used by the context. + */ + public static void setClientSessionCache(SSLContext context, SSLClientSessionCache cache) { + SSLSessionContext clientContext = context.getClientSessionContext(); + if (!(clientContext instanceof ClientSessionContext)) { + throw new IllegalArgumentException( + "Not a conscrypt client context: " + clientContext.getClass().getName()); + } + ((ClientSessionContext) clientContext).setPersistentCache(cache); + } + + /** + * Sets the server-side persistent cache to be used by the context. + */ + public static void setServerSessionCache(SSLContext context, SSLServerSessionCache cache) { + SSLSessionContext serverContext = context.getServerSessionContext(); + if (!(serverContext instanceof ServerSessionContext)) { + throw new IllegalArgumentException( + "Not a conscrypt client context: " + serverContext.getClass().getName()); + } + ((ServerSessionContext) serverContext).setPersistentCache(cache); + } + + /** + * Indicates whether the given {@link SSLSocketFactory} was created by this distribution of + * Conscrypt. + */ + public static boolean isConscrypt(SSLSocketFactory factory) { + return factory instanceof OpenSSLSocketFactoryImpl; + } + + private static OpenSSLSocketFactoryImpl toConscrypt(SSLSocketFactory factory) { + if (!isConscrypt(factory)) { + throw new IllegalArgumentException( + "Not a conscrypt socket factory: " + factory.getClass().getName()); + } + return (OpenSSLSocketFactoryImpl) factory; + } + + /** + * Configures the default socket to be created for all socket factory instances. + */ + @ExperimentalApi + public static void setUseEngineSocketByDefault(boolean useEngineSocket) { + OpenSSLSocketFactoryImpl.setUseEngineSocketByDefault(useEngineSocket); + OpenSSLServerSocketFactoryImpl.setUseEngineSocketByDefault(useEngineSocket); + } + + /** + * Configures the socket to be created for the given socket factory instance. + */ + @ExperimentalApi + public static void setUseEngineSocket(SSLSocketFactory factory, boolean useEngineSocket) { + toConscrypt(factory).setUseEngineSocket(useEngineSocket); + } + + /** + * Indicates whether the given {@link SSLServerSocketFactory} was created by this distribution + * of Conscrypt. + */ + public static boolean isConscrypt(SSLServerSocketFactory factory) { + return factory instanceof OpenSSLServerSocketFactoryImpl; + } + + private static OpenSSLServerSocketFactoryImpl toConscrypt(SSLServerSocketFactory factory) { + if (!isConscrypt(factory)) { + throw new IllegalArgumentException( + "Not a conscrypt server socket factory: " + factory.getClass().getName()); + } + return (OpenSSLServerSocketFactoryImpl) factory; + } + + /** + * Configures the socket to be created for the given server socket factory instance. + */ + @ExperimentalApi + public static void setUseEngineSocket(SSLServerSocketFactory factory, boolean useEngineSocket) { + toConscrypt(factory).setUseEngineSocket(useEngineSocket); + } + + /** + * Indicates whether the given {@link SSLSocket} was created by this distribution of Conscrypt. + */ + public static boolean isConscrypt(SSLSocket socket) { + return socket instanceof AbstractConscryptSocket; + } + + private static AbstractConscryptSocket toConscrypt(SSLSocket socket) { + if (!isConscrypt(socket)) { + throw new IllegalArgumentException( + "Not a conscrypt socket: " + socket.getClass().getName()); + } + return (AbstractConscryptSocket) socket; + } + + /** + * This method enables Server Name Indication (SNI) and overrides the hostname supplied + * during socket creation. If the hostname is not a valid SNI hostname, the SNI extension + * will be omitted from the handshake. + * + * @param socket the socket + * @param hostname the desired SNI hostname, or null to disable + */ + public static void setHostname(SSLSocket socket, String hostname) { + toConscrypt(socket).setHostname(hostname); + } + + /** + * Returns either the hostname supplied during socket creation or via + * {@link #setHostname(SSLSocket, String)}. No DNS resolution is attempted before + * returning the hostname. + */ + public static String getHostname(SSLSocket socket) { + return toConscrypt(socket).getHostname(); + } + + /** + * This method attempts to create a textual representation of the peer host or IP. Does + * not perform a reverse DNS lookup. This is typically used during session creation. + */ + public static String getHostnameOrIP(SSLSocket socket) { + return toConscrypt(socket).getHostnameOrIP(); + } + + /** + * This method enables session ticket support. + * + * @param socket the socket + * @param useSessionTickets True to enable session tickets + */ + public static void setUseSessionTickets(SSLSocket socket, boolean useSessionTickets) { + toConscrypt(socket).setUseSessionTickets(useSessionTickets); + } + + /** + * Enables/disables TLS Channel ID for the given server-side socket. + * + *

This method needs to be invoked before the handshake starts. + * + * @param socket the socket + * @param enabled Whether to enable channel ID. + * @throws IllegalStateException if this is a client socket or if the handshake has already + * started. + */ + public static void setChannelIdEnabled(SSLSocket socket, boolean enabled) { + toConscrypt(socket).setChannelIdEnabled(enabled); + } + + /** + * Gets the TLS Channel ID for the given server-side socket. Channel ID is only available + * once the handshake completes. + * + * @param socket the socket + * @return channel ID or {@code null} if not available. + * @throws IllegalStateException if this is a client socket or if the handshake has not yet + * completed. + * @throws SSLException if channel ID is available but could not be obtained. + */ + public static byte[] getChannelId(SSLSocket socket) throws SSLException { + return toConscrypt(socket).getChannelId(); + } + + /** + * Sets the {@link PrivateKey} to be used for TLS Channel ID by this client socket. + * + *

This method needs to be invoked before the handshake starts. + * + * @param socket the socket + * @param privateKey private key (enables TLS Channel ID) or {@code null} for no key + * (disables TLS Channel ID). + * The private key must be an Elliptic Curve (EC) key based on the NIST P-256 curve (aka + * SECG secp256r1 or ANSI + * X9.62 prime256v1). + * @throws IllegalStateException if this is a server socket or if the handshake has already + * started. + */ + public static void setChannelIdPrivateKey(SSLSocket socket, PrivateKey privateKey) { + toConscrypt(socket).setChannelIdPrivateKey(privateKey); + } + + /** + * Returns the ALPN protocol agreed upon by client and server. + * + * @param socket the socket + * @return the selected protocol or {@code null} if no protocol was agreed upon. + */ + public static String getApplicationProtocol(SSLSocket socket) { + return toConscrypt(socket).getApplicationProtocol(); + } + + /** + * Sets an application-provided ALPN protocol selector. If provided, this will override + * the list of protocols set by {@link #setApplicationProtocols(SSLSocket, String[])}. + * + * @param socket the socket + * @param selector the ALPN protocol selector + */ + public static void setApplicationProtocolSelector(SSLSocket socket, + ApplicationProtocolSelector selector) { + toConscrypt(socket).setApplicationProtocolSelector(selector); + } + + /** + * Sets the application-layer protocols (ALPN) in prioritization order. + * + * @param socket the socket being configured + * @param protocols the protocols in descending order of preference. If empty, no protocol + * indications will be used. This array will be copied. + * @throws IllegalArgumentException - if protocols is null, or if any element in a non-empty + * array is null or an empty (zero-length) string + */ + public static void setApplicationProtocols(SSLSocket socket, String[] protocols) { + toConscrypt(socket).setApplicationProtocols(protocols); + } + + /** + * Gets the application-layer protocols (ALPN) in prioritization order. + * + * @param socket the socket + * @return the protocols in descending order of preference, or an empty array if protocol + * indications are not being used. Always returns a new array. + */ + public static String[] getApplicationProtocols(SSLSocket socket) { + return toConscrypt(socket).getApplicationProtocols(); + } + + /** + * Returns the tls-unique channel binding value for this connection, per RFC 5929. This + * will return {@code null} if there is no such value available, such as if the handshake + * has not yet completed or this connection is closed. + */ + public static byte[] getTlsUnique(SSLSocket socket) { + return toConscrypt(socket).getTlsUnique(); + } + + /** + * Exports a value derived from the TLS master secret as described in RFC 5705. + * + * @param label the label to use in calculating the exported value. This must be + * an ASCII-only string. + * @param context the application-specific context value to use in calculating the + * exported value. This may be {@code null} to use no application context, which is + * treated differently than an empty byte array. + * @param length the number of bytes of keying material to return. + * @return a value of the specified length, or {@code null} if the handshake has not yet + * completed or the connection has been closed. + * @throws SSLException if the value could not be exported. + */ + public static byte[] exportKeyingMaterial(SSLSocket socket, String label, byte[] context, + int length) throws SSLException { + return toConscrypt(socket).exportKeyingMaterial(label, context, length); + } + + /** + * Indicates whether the given {@link SSLEngine} was created by this distribution of Conscrypt. + */ + public static boolean isConscrypt(SSLEngine engine) { + return engine instanceof AbstractConscryptEngine; + } + + private static AbstractConscryptEngine toConscrypt(SSLEngine engine) { + if (!isConscrypt(engine)) { + throw new IllegalArgumentException( + "Not a conscrypt engine: " + engine.getClass().getName()); + } + return (AbstractConscryptEngine) engine; + } + + /** + * Provides the given engine with the provided bufferAllocator. + * @throws IllegalArgumentException if the provided engine is not a Conscrypt engine. + * @throws IllegalStateException if the provided engine has already begun its handshake. + */ + @ExperimentalApi + public static void setBufferAllocator(SSLEngine engine, BufferAllocator bufferAllocator) { + toConscrypt(engine).setBufferAllocator(bufferAllocator); + } + + /** + * Provides the given socket with the provided bufferAllocator. If the given socket is a + * Conscrypt socket but does not use buffer allocators, this method does nothing. + * @throws IllegalArgumentException if the provided socket is not a Conscrypt socket. + * @throws IllegalStateException if the provided socket has already begun its handshake. + */ + @ExperimentalApi + public static void setBufferAllocator(SSLSocket socket, BufferAllocator bufferAllocator) { + AbstractConscryptSocket s = toConscrypt(socket); + if (s instanceof ConscryptEngineSocket) { + ((ConscryptEngineSocket) s).setBufferAllocator(bufferAllocator); + } + } + + /** + * Configures the default {@link BufferAllocator} to be used by all future + * {@link SSLEngine} instances from this provider. + */ + @ExperimentalApi + public static void setDefaultBufferAllocator(BufferAllocator bufferAllocator) { + ConscryptEngine.setDefaultBufferAllocator(bufferAllocator); + } + + /** + * This method enables Server Name Indication (SNI) and overrides the hostname supplied + * during engine creation. + * + * @param engine the engine + * @param hostname the desired SNI hostname, or {@code null} to disable + */ + public static void setHostname(SSLEngine engine, String hostname) { + toConscrypt(engine).setHostname(hostname); + } + + /** + * Returns either the hostname supplied during socket creation or via + * {@link #setHostname(SSLEngine, String)}. No DNS resolution is attempted before + * returning the hostname. + */ + public static String getHostname(SSLEngine engine) { + return toConscrypt(engine).getHostname(); + } + + /** + * Returns the maximum overhead, in bytes, of sealing a record with SSL. + */ + public static int maxSealOverhead(SSLEngine engine) { + return toConscrypt(engine).maxSealOverhead(); + } + + /** + * Sets a listener on the given engine for completion of the TLS handshake + */ + public static void setHandshakeListener(SSLEngine engine, HandshakeListener handshakeListener) { + toConscrypt(engine).setHandshakeListener(handshakeListener); + } + + /** + * Enables/disables TLS Channel ID for the given server-side engine. + * + *

This method needs to be invoked before the handshake starts. + * + * @param engine the engine + * @param enabled Whether to enable channel ID. + * @throws IllegalStateException if this is a client engine or if the handshake has already + * started. + */ + public static void setChannelIdEnabled(SSLEngine engine, boolean enabled) { + toConscrypt(engine).setChannelIdEnabled(enabled); + } + + /** + * Gets the TLS Channel ID for the given server-side engine. Channel ID is only available + * once the handshake completes. + * + * @param engine the engine + * @return channel ID or {@code null} if not available. + * @throws IllegalStateException if this is a client engine or if the handshake has not yet + * completed. + * @throws SSLException if channel ID is available but could not be obtained. + */ + public static byte[] getChannelId(SSLEngine engine) throws SSLException { + return toConscrypt(engine).getChannelId(); + } + + /** + * Sets the {@link PrivateKey} to be used for TLS Channel ID by this client engine. + * + *

This method needs to be invoked before the handshake starts. + * + * @param engine the engine + * @param privateKey private key (enables TLS Channel ID) or {@code null} for no key + * (disables TLS Channel ID). + * The private key must be an Elliptic Curve (EC) key based on the NIST P-256 curve (aka + * SECG secp256r1 or ANSI X9.62 prime256v1). + * @throws IllegalStateException if this is a server engine or if the handshake has already + * started. + */ + public static void setChannelIdPrivateKey(SSLEngine engine, PrivateKey privateKey) { + toConscrypt(engine).setChannelIdPrivateKey(privateKey); + } + + /** + * Extended unwrap method for multiple source and destination buffers. + * + * @param engine the target engine for the unwrap + * @param srcs the source buffers + * @param dsts the destination buffers + * @return the result of the unwrap operation + * @throws SSLException thrown if an SSL error occurred + */ + public static SSLEngineResult unwrap(SSLEngine engine, final ByteBuffer[] srcs, + final ByteBuffer[] dsts) throws SSLException { + return toConscrypt(engine).unwrap(srcs, dsts); + } + + /** + * Exteneded unwrap method for multiple source and destination buffers. + * + * @param engine the target engine for the unwrap. + * @param srcs the source buffers + * @param srcsOffset the offset in the {@code srcs} array of the first source buffer + * @param srcsLength the number of source buffers starting at {@code srcsOffset} + * @param dsts the destination buffers + * @param dstsOffset the offset in the {@code dsts} array of the first destination buffer + * @param dstsLength the number of destination buffers starting at {@code dstsOffset} + * @return the result of the unwrap operation + * @throws SSLException thrown if an SSL error occurred + */ + public static SSLEngineResult unwrap(SSLEngine engine, final ByteBuffer[] srcs, int srcsOffset, + final int srcsLength, final ByteBuffer[] dsts, final int dstsOffset, + final int dstsLength) throws SSLException { + return toConscrypt(engine).unwrap( + srcs, srcsOffset, srcsLength, dsts, dstsOffset, dstsLength); + } + + /** + * This method enables session ticket support. + * + * @param engine the engine + * @param useSessionTickets True to enable session tickets + */ + public static void setUseSessionTickets(SSLEngine engine, boolean useSessionTickets) { + toConscrypt(engine).setUseSessionTickets(useSessionTickets); + } + + /** + * Sets the application-layer protocols (ALPN) in prioritization order. + * + * @param engine the engine being configured + * @param protocols the protocols in descending order of preference. If empty, no protocol + * indications will be used. This array will be copied. + * @throws IllegalArgumentException - if protocols is null, or if any element in a non-empty + * array is null or an empty (zero-length) string + */ + public static void setApplicationProtocols(SSLEngine engine, String[] protocols) { + toConscrypt(engine).setApplicationProtocols(protocols); + } + + /** + * Gets the application-layer protocols (ALPN) in prioritization order. + * + * @param engine the engine + * @return the protocols in descending order of preference, or an empty array if protocol + * indications are not being used. Always returns a new array. + */ + public static String[] getApplicationProtocols(SSLEngine engine) { + return toConscrypt(engine).getApplicationProtocols(); + } + + /** + * Sets an application-provided ALPN protocol selector. If provided, this will override + * the list of protocols set by {@link #setApplicationProtocols(SSLEngine, String[])}. + * + * @param engine the engine + * @param selector the ALPN protocol selector + */ + public static void setApplicationProtocolSelector(SSLEngine engine, + ApplicationProtocolSelector selector) { + toConscrypt(engine).setApplicationProtocolSelector(selector); + } + + /** + * Returns the ALPN protocol agreed upon by client and server. + * + * @param engine the engine + * @return the selected protocol or {@code null} if no protocol was agreed upon. + */ + public static String getApplicationProtocol(SSLEngine engine) { + return toConscrypt(engine).getApplicationProtocol(); + } + + /** + * Returns the tls-unique channel binding value for this connection, per RFC 5929. This + * will return {@code null} if there is no such value available, such as if the handshake + * has not yet completed or this connection is closed. + */ + public static byte[] getTlsUnique(SSLEngine engine) { + return toConscrypt(engine).getTlsUnique(); + } + + /** + * Exports a value derived from the TLS master secret as described in RFC 5705. + * + * @param label the label to use in calculating the exported value. This must be + * an ASCII-only string. + * @param context the application-specific context value to use in calculating the + * exported value. This may be {@code null} to use no application context, which is + * treated differently than an empty byte array. + * @param length the number of bytes of keying material to return. + * @return a value of the specified length, or {@code null} if the handshake has not yet + * completed or the connection has been closed. + * @throws SSLException if the value could not be exported. + */ + public static byte[] exportKeyingMaterial(SSLEngine engine, String label, byte[] context, + int length) throws SSLException { + return toConscrypt(engine).exportKeyingMaterial(label, context, length); + } + + /** + * Indicates whether the given {@link TrustManager} was created by this distribution of + * Conscrypt. + */ + public static boolean isConscrypt(TrustManager trustManager) { + return trustManager instanceof TrustManagerImpl; + } + + private static TrustManagerImpl toConscrypt(TrustManager trustManager) { + if (!isConscrypt(trustManager)) { + throw new IllegalArgumentException( + "Not a Conscrypt trust manager: " + trustManager.getClass().getName()); + } + return (TrustManagerImpl) trustManager; + } + + /** + * Set the default hostname verifier that will be used for HTTPS endpoint identification by + * Conscrypt trust managers. If {@code null} (the default), endpoint identification will use + * the default hostname verifier set in + * {@link HttpsURLConnection#setDefaultHostnameVerifier(javax.net.ssl.HostnameVerifier)}. + */ + public synchronized static void setDefaultHostnameVerifier(ConscryptHostnameVerifier verifier) { + TrustManagerImpl.setDefaultHostnameVerifier(verifier); + } + + /** + * Returns the currently-set default hostname verifier for Conscrypt trust managers. + * + * @see #setDefaultHostnameVerifier(ConscryptHostnameVerifier) + */ + public synchronized static ConscryptHostnameVerifier getDefaultHostnameVerifier(TrustManager trustManager) { + return TrustManagerImpl.getDefaultHostnameVerifier(); + } + + /** + * Set the hostname verifier that will be used for HTTPS endpoint identification by the + * given trust manager. If {@code null} (the default), endpoint identification will use the + * default hostname verifier set in {@link #setDefaultHostnameVerifier(ConscryptHostnameVerifier)}. + * + * @throws IllegalArgumentException if the provided trust manager is not a Conscrypt trust + * manager per {@link #isConscrypt(TrustManager)} + */ + public static void setHostnameVerifier(TrustManager trustManager, ConscryptHostnameVerifier verifier) { + toConscrypt(trustManager).setHostnameVerifier(verifier); + } + + /** + * Returns the currently-set hostname verifier for the given trust manager. + * + * @throws IllegalArgumentException if the provided trust manager is not a Conscrypt trust + * manager per {@link #isConscrypt(TrustManager)} + * + * @see #setHostnameVerifier(TrustManager, ConscryptHostnameVerifier) + */ + public static ConscryptHostnameVerifier getHostnameVerifier(TrustManager trustManager) { + return toConscrypt(trustManager).getHostnameVerifier(); + } + + /** + * Wraps the HttpsURLConnection.HostnameVerifier into a ConscryptHostnameVerifier + */ + public static ConscryptHostnameVerifier wrapHostnameVerifier(final HostnameVerifier verifier) { + return new ConscryptHostnameVerifier() { + @Override + public boolean verify(X509Certificate[] certificates, String hostname, SSLSession session) { + return verifier.verify(hostname, session); + } + }; + } +} diff --git a/app/src/main/java/org/intune/IntuneAuthManager.kt b/app/src/main/java/org/intune/IntuneAuthManager.kt deleted file mode 100644 index d5a61b80..00000000 --- a/app/src/main/java/org/intune/IntuneAuthManager.kt +++ /dev/null @@ -1,77 +0,0 @@ -package org.intune - -import android.app.Activity -import android.app.AlertDialog -import com.tm.authenticatorsdk.mamsdk.MDMAuthenticator -import com.tm.authenticatorsdk.selfAuthenticator.IAuthenticationStatus -import com.tm.logger.Log -import org.tm.archive.R -import kotlin.system.exitProcess - -//**TM_SA**//add all intune package -object IntuneAuthManager { - const val MDM_Auth_Status_String = "MDMAuthStatus" - - enum class MdmAuthStatus{ - ALREADY_SIGN, - START_INTUNE_AUTH, - START_SELF_AUTH - } - - fun continueIntuneAuthentication(aIAuthenticationStatus: IAuthenticationStatus) { - /*if (!SelfAuthenticatorManager.isSelfAuthenticationAlreadyStarted()) { - SelfAuthenticatorManager.saveSelfAuthenticationFirstTimeTryingTime() - }*/ - MDMAuthenticator.continueIntuneSelfAuthentication(aIAuthenticationStatus) - } - - fun showDialog(context: Activity, listener: MDMDialogListener) { - - val dialogBuilder = AlertDialog.Builder(context) - Log.d("IntuneAuthManager", "showDialog") - // set message of alert dialog - dialogBuilder.setTitle(context.resources.getString(R.string.intune_auth_title)) - dialogBuilder.setMessage(context.resources.getString(R.string.intune_auth_message)) - // if the dialog is cancelable - .setCancelable(false) - // positive button text and action - .setNegativeButton( - context.resources.getString(R.string.intune_auth_ok) - ) { _, _ -> - listener.startIntuneAgain() - } - .setPositiveButton( - context.resources.getString(R.string.intune_auth_cancel) - ) { _, _ -> - exitProcess(0) - } - - val alertDialog = dialogBuilder.create() - alertDialog.show() - } - - /** - * update app status of auth. - * it has two cases, intune auth already finish successfully or start self auth even it's managed device - * 0 - intune auth finished successfully. don't start auth again - * 1 - start intune auth - * 2 - start self auth even it's managed device - */ - /*fun updatedIntuneAuthenticatorPreference(_MDMAuthStatus: Int) { - Log.d("IntuneAuthManager", - "updatedIntuneAuthenticatorPreference," + - " status auth is(" + - "0 - already signed, " + - "1 - should sign intune auth," + - " 2 - should sign self auth) ? $_MDMAuthStatus") - val mDMAuthStatusString = "MDMAuthStatus" - val preferences = ApplicationContext.getInstance().getSharedPreferences( - INTUNE_AUTHENTICATION_PREFERENCE_NAME, Context.MODE_PRIVATE - ) - - val editor = preferences.edit() - editor.putInt(mDMAuthStatusString, _MDMAuthStatus) - editor.apply() - }*/ - -} \ No newline at end of file diff --git a/app/src/main/java/org/intune/MDMDialogListener.kt b/app/src/main/java/org/intune/MDMDialogListener.kt deleted file mode 100644 index 5440bf5b..00000000 --- a/app/src/main/java/org/intune/MDMDialogListener.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.intune - -interface MDMDialogListener { - fun startIntuneAgain() -} \ No newline at end of file diff --git a/app/src/main/java/org/selfAuthentication/AuthenticationUtils.kt b/app/src/main/java/org/selfAuthentication/AuthenticationUtils.kt deleted file mode 100644 index 6711bc5d..00000000 --- a/app/src/main/java/org/selfAuthentication/AuthenticationUtils.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.selfAuthentication - -import android.app.Activity -import android.os.Build - -class AuthenticationUtils { - - companion object{ - fun forceCloseApplication(aContext: Activity) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - aContext.finishAndRemoveTask() - } else { - aContext.finishAffinity() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/selfAuthentication/ProgressDialog.kt b/app/src/main/java/org/selfAuthentication/ProgressDialog.kt deleted file mode 100644 index 04254346..00000000 --- a/app/src/main/java/org/selfAuthentication/ProgressDialog.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.selfAuthentication - -import android.app.Dialog -import android.content.Context -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.view.LayoutInflater -import org.tm.archive.R - -class ProgressDialog { - companion object { - fun progressDialog(context: Context): Dialog { - val dialog = Dialog(context) - val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null) - dialog.setContentView(inflate) - dialog.setCancelable(false) - dialog.window!!.setBackgroundDrawable( - ColorDrawable(Color.TRANSPARENT) - ) - return dialog - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/selfAuthentication/SelfAuthenticationDialogBuilder.kt b/app/src/main/java/org/selfAuthentication/SelfAuthenticationDialogBuilder.kt deleted file mode 100644 index 845f5c31..00000000 --- a/app/src/main/java/org/selfAuthentication/SelfAuthenticationDialogBuilder.kt +++ /dev/null @@ -1,249 +0,0 @@ -package com.tm.authenticatorsdk.selfAuthenticator - -import android.app.Activity -import android.app.AlertDialog -import android.app.Dialog -import android.content.Context -import android.content.DialogInterface -import android.os.Handler -import android.os.Looper -import com.tm.androidcopysdk.AndroidCopySDK -import com.tm.androidcopysdk.ISendLogCallback -import com.tm.androidcopysdk.utils.PrefManager -import com.tm.logger.BuildConfig -import com.tm.logger.Log -import org.archiver.ArchiveConstants -import org.archiver.ArchivePreferenceConstants -import org.selfAuthentication.AuthenticationUtils -import org.selfAuthentication.ProgressDialog -import org.selfAuthentication.SelfAuthenticatorManager -import org.tm.archive.ApplicationContext -import org.tm.archive.R - -import java.util.* - - -class SelfAuthenticationDialogBuilder : ISendLogCallback{ - - lateinit var mFirstFailureWarningAlertDialog : AlertDialog - lateinit var mFirstFailureWarningLogsSent : AlertDialog - lateinit var mFirstFailureSecondFailureWarning : AlertDialog - lateinit var mLogsSentContext : Activity - lateinit var mProgressDialog : Dialog - - companion object{ - val TEXT_MESSAGE_FOR_SENDING_LOGS = "Signal signup failure for " + org.tm.archive.BuildConfig.signal_teleMessage_version + " authentication version – could not locate the TeleMessage account. Please help." - } - - - fun showSelfAuthenticationFirstFailureWarning( - context: Activity - ) { - if(!::mFirstFailureWarningAlertDialog.isInitialized || !mFirstFailureWarningAlertDialog.isShowing) { - initFirstAuthenticationFailureMessageDialog(context) - } - - if(!mFirstFailureWarningAlertDialog.isShowing){ - if(!context.isFinishing){ - mFirstFailureWarningAlertDialog.show() - } - } - } - - fun showSelfAuthenticationFirstFailureWarningLogsSent(context: Activity) { - if(!::mFirstFailureWarningLogsSent.isInitialized || !mFirstFailureWarningLogsSent.isShowing) { - initAuthenticationFailureLogsSentMessageDialog(context) - } - - if(!mFirstFailureWarningLogsSent.isShowing){ - if(!context.isFinishing){ - mFirstFailureWarningLogsSent.show() - } - // showDialogInTheActivity(context, mFirstFailureWarningLogsSent) - } - } - - - fun checkIfNeedToCloseTheAppOrJustDismissTheDialog(context: Activity, dialog: DialogInterface?) { - if (SelfAuthenticatorManager.isAppValidationTimePassed(context)) { - AuthenticationUtils.forceCloseApplication(context) - } else { - dialog?.dismiss() - } - } - - - fun showSelfAuthenticationSecondFailureWarning( - context: Activity - ) { - Log.d("SelfAuthenticatorProcess", "${!::mFirstFailureSecondFailureWarning.isInitialized}") - if(::mFirstFailureSecondFailureWarning.isInitialized){ - Log.d("SelfAuthenticatorProcess", "---> ${!mFirstFailureSecondFailureWarning.isShowing}") - } - if (!::mFirstFailureSecondFailureWarning.isInitialized || !mFirstFailureSecondFailureWarning.isShowing) { - initSecondAuthenticationFailureMessageDialog(context) - }else { - Log.d("SelfAuthenticatorProcess", "else to -- > !::mFirstFailureSecondFailureWarning.isInitialized || !mFirstFailureSecondFailureWarning.isShowing") - if(!context.isFinishing){ - mFirstFailureSecondFailureWarning.show() - } - } - } - - private fun initFirstAuthenticationFailureMessageDialog(context: Activity) { - val mFirstFailureWarningDialogBuilder = AlertDialog.Builder(context) - - // set message of alert dialog - mFirstFailureWarningDialogBuilder.setMessage(context.resources.getString(R.string.get_self_authentication_first_warning_message_step_1)) - // if the dialog is cancelable - .setCancelable(false) - // positive button text and action - .setNegativeButton( - context.resources.getString(R.string.get_self_authentication_first_warning_message_step_1_dismiss), - DialogInterface.OnClickListener { dialog, id -> - checkIfNeedToCloseTheAppOrJustDismissTheDialog(context, dialog) - }) - .setPositiveButton( - context.resources.getString(R.string.get_self_authentication_failure_contact_us), - DialogInterface.OnClickListener { dialog, id -> - onTeleMessageSendLogsToSupportClicked(context) - if (!context.isFinishing) { - getAuthenticationProgressDialog(context).show() - } - dialog.dismiss() - }) - - mFirstFailureWarningAlertDialog = mFirstFailureWarningDialogBuilder.create() - } - - private fun initSecondAuthenticationFailureMessageDialog(context: Activity) { - val dialogBuilder = AlertDialog.Builder(context) - Log.d( - "SelfAuthenticatorProcess", - "!::mFirstFailureSecondFailureWarning.isInitialized || !mFirstFailureSecondFailureWarning.isShowing" - ) - // set message of alert dialog - dialogBuilder.setMessage(context.resources.getString(R.string.get_self_authentication_second_warning_message_step_2)) - // if the dialog is cancelable - .setCancelable(false) - // positive button text and action - .setNegativeButton( - context.resources.getString(R.string.get_self_authentication_failure_message_close), - DialogInterface.OnClickListener { dialog, id -> - checkIfNeedToCloseTheAppOrJustDismissTheDialog(context, dialog) - }) - .setPositiveButton( - context.resources.getString(R.string.get_self_authentication_failure_contact_us), - DialogInterface.OnClickListener { dialog, id -> - onTeleMessageSendLogsToSupportClicked(context) - if (!context.isFinishing) { - getAuthenticationProgressDialog(context).show() - } - }) - - mFirstFailureSecondFailureWarning = dialogBuilder.create() - if (!context.isFinishing) { - mFirstFailureSecondFailureWarning.show() - } - } - - - private fun initAuthenticationFailureLogsSentMessageDialog(context: Activity) { - val dialogBuilder = AlertDialog.Builder(context) - // set message of alert dialog - dialogBuilder.setMessage(context.resources.getString(R.string.get_self_authentication_contact_us_sent)) - // if the dialog is cancelable - .setCancelable(false) - // positive button text and action - .setNegativeButton( - context.resources.getString(R.string.get_self_authentication_failure_message_close), - DialogInterface.OnClickListener { dialog, id -> - checkIfNeedToCloseTheAppOrJustDismissTheDialog(context, dialog) - }) - // create dialog box - mFirstFailureWarningLogsSent = dialogBuilder.create() - } - - - fun onTeleMessageSendLogsToSupportClicked(context: Activity) { - Log.d("SelfAuthenticatorProcess", "onTeleMessageSendLogsToSupportClicked started") - mLogsSentContext = context - val name = PrefManager.getStringPref(context, ArchivePreferenceConstants.PREF_KEY_DEVICE_NAME, "") - val freeText = TEXT_MESSAGE_FOR_SENDING_LOGS - AndroidCopySDK.getInstance(context).sentLogs( - context, - this, - PrefManager.getStringPref(context, ArchivePreferenceConstants.PREF_KEY_DEVICE_PHONE_NUMBER, ""), - "Signal logs - " + Calendar.getInstance().time.toString(), - name, - freeText, - "", - "", - "", - ArchiveConstants.GENERATE_TOK_NAME, - ArchiveConstants.GENERATE_TOK_PASS - ) - } - - fun showDialogInTheActivity(activity: Activity, dialog: AlertDialog){ - Log.d("SelfAuthenticatorProcess", "showDialogInTheActivity ") - if(!activity.isFinishing){ - Log.d("SelfAuthenticatorProcess", "showDialogInTheActivity !activity.isFinishing") - //dialog.show() - val handler = Handler(Looper.getMainLooper()) - handler.postDelayed({ - dialog.show() - }, 100) - } - } - - fun getAuthenticationProgressDialog(activity: Activity): Dialog { - if(!::mProgressDialog.isInitialized || (mProgressDialog.ownerActivity != null && mProgressDialog.ownerActivity!!.localClassName != activity.localClassName)){ - mProgressDialog = ProgressDialog.progressDialog(activity) - } - - return mProgressDialog - } - - fun isOneOfTheAuthenticationDialogIsShowing(): Boolean{ - return ::mFirstFailureWarningAlertDialog.isInitialized && mFirstFailureWarningAlertDialog.isShowing || - ::mFirstFailureWarningLogsSent.isInitialized && mFirstFailureWarningLogsSent.isShowing || - ::mFirstFailureSecondFailureWarning.isInitialized && mFirstFailureSecondFailureWarning.isShowing || - ::mProgressDialog.isInitialized && mProgressDialog.isShowing - } - - override fun sendLogFailure() { - if(::mProgressDialog.isInitialized) { - mProgressDialog.dismiss() - } - } - - override fun sendLogSucceed() { - if(::mProgressDialog.isInitialized) { - mProgressDialog.dismiss() - } - SelfAuthenticatorManager.showLogSentIfNeeded(mLogsSentContext) - } - - fun showProgressDialog(activity: Activity) { - if(!::mProgressDialog.isInitialized || (mProgressDialog.ownerActivity != null && mProgressDialog.ownerActivity!!.localClassName != activity.localClassName)){ - mProgressDialog = AlertDialog.Builder(activity).setCancelable(false).create() - } - - val handler = Handler(Looper.getMainLooper()) - handler.postDelayed({ - mProgressDialog.show() - }, 1) - - } - - fun hideProgressDialog() { - if(::mProgressDialog.isInitialized) { - Handler(Looper.getMainLooper()).post(Runnable { - mProgressDialog.hide() - }) - - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/selfAuthentication/SelfAuthenticatorConstants.kt b/app/src/main/java/org/selfAuthentication/SelfAuthenticatorConstants.kt deleted file mode 100644 index 32e545b1..00000000 --- a/app/src/main/java/org/selfAuthentication/SelfAuthenticatorConstants.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.archive.selfAuthentication - -class SelfAuthenticatorConstants { - - companion object{ - - val selfVersion = "1.1.1" - - val selfAuthenticationSucceed = "selfAuthenticationSucceed" - val selfAuthenticationFailed = "selfAuthenticationFailed" - var isAuthenticationProcessOpened = false - } -} \ No newline at end of file diff --git a/app/src/main/java/org/selfAuthentication/SelfAuthenticatorManager.kt b/app/src/main/java/org/selfAuthentication/SelfAuthenticatorManager.kt deleted file mode 100644 index b0a99696..00000000 --- a/app/src/main/java/org/selfAuthentication/SelfAuthenticatorManager.kt +++ /dev/null @@ -1,128 +0,0 @@ -package org.selfAuthentication - -import android.app.Activity -import android.content.Context -import com.tm.authenticatorsdk.selfAuthenticator.* -import com.tm.logger.Log -import org.archive.selfAuthentication.SelfAuthenticatorConstants -import org.tm.archive.ApplicationContext -import org.tm.archive.BuildConfig -import java.util.concurrent.TimeUnit - -//In order to change the environment base url call to this method: -//ApiUtil.Companion.selectServerEnvironment(Context) -//The default environment is charlieProduction = https://rest.telemessage.com - -object SelfAuthenticatorManager { - - - const val SELF_AUTHENTICATION_PREFERENCE_NAME = "SelfAuthenticatorPref" - const val SELF_AUTHENRICATION_PREF_FIRST_TIME_TRYING_KEY = "firstTimeTrying" - val SELF_AUTHENRICATION_WHEN_TO_SHOW_FIRST_WARNNING_IN_HOURS = 2 * 24 - val SELF_AUTHENRICATION_WHEN_TO_SHOW_SECOND_WARNNING_IN_HOURS = 7 * 24 - - - init { - Log.d("SelfAuthenticatorProcess","class SelfAuthenticatorManager started.") - } - - lateinit var selfAuthenticator: SelfAuthenticator - val mSelfAuthenticationDialogBuilder = SelfAuthenticationDialogBuilder() - - fun initAuthenticator(phoneNumber: String) { - - selfAuthenticator = SelfAuthenticator - Log.d("SelfAuthenticatorProcess", "initAuthenticator - The phone number is: $phoneNumber") - selfAuthenticator.initSelfAuthenticator( - AuthenticationAppType.SIGNAL, - phoneNumber, - BuildConfig.VERSION_NAME - ) - - } - - fun startAuthentication(context: Context, aIAuthenticationStatus: IAuthenticationStatus) { - if (!isSelfAuthenticationAlreadyStarted(context)) { - saveSelfAuthenticationFirstTimeTryingTime(context) - } - selfAuthenticator.startSelfAuthentication(aIAuthenticationStatus) - } - - fun isSelfAuthenticationAlreadyStarted(context: Context): Boolean { - return getSelfAuthenticationFirstTimeTryingInHours(context) != -1 - } - - fun saveSelfAuthenticationFirstTimeTryingTime(context: Context) { - if (!isSelfAuthenticationAlreadyStarted(context)) { - ApplicationContext.getInstance(context).applicationContext.getSharedPreferences( - SELF_AUTHENTICATION_PREFERENCE_NAME, - Context.MODE_PRIVATE - ).apply { - edit().apply { - putLong( - SELF_AUTHENRICATION_PREF_FIRST_TIME_TRYING_KEY, - System.currentTimeMillis() - ) - apply() - } - } - } - } - - fun getSelfAuthenticationFirstTimeTryingInHours(context: Context): Int { - val sharedPreferences = ApplicationContext.getInstance(context).getSharedPreferences(SELF_AUTHENTICATION_PREFERENCE_NAME, Context.MODE_PRIVATE) - val firstTimeInstallInMill = sharedPreferences.getLong(SELF_AUTHENRICATION_PREF_FIRST_TIME_TRYING_KEY, -1) - if(firstTimeInstallInMill != (-1).toLong()){ - Log.d("SelfAuthenticatorProcess", "hourDifferenceFromNow() = " + (hourDifferenceFromNow(firstTimeInstallInMill)).toInt()) - return (hourDifferenceFromNow(firstTimeInstallInMill)).toInt() - } - Log.d("SelfAuthenticatorProcess", "hourDifferenceFromNow() = " + -1) - return -1 - } - - private fun hourDifferenceFromNow(millisTime: Long): Long { - val now = System.currentTimeMillis() - return TimeUnit.MILLISECONDS.toHours(now - millisTime) - } - - fun showTheRelevantDialogIfNeeded( - aContext: Activity - ) { - - Log.d("SelfAuthenticatorProcess", "getSelfAuthenticationFirstTimeTryingInHours() = " + getSelfAuthenticationFirstTimeTryingInHours(aContext)) - Log.d("SelfAuthenticatorProcess", "getSelfAuthenticationFirstTimeTryingInHours() > SELF_AUTHENRICATION_WHEN_TO_SHOW_FIRST_WARNNING_IN_DAYS = " + (getSelfAuthenticationFirstTimeTryingInHours(aContext) > SELF_AUTHENRICATION_WHEN_TO_SHOW_FIRST_WARNNING_IN_HOURS)) - Log.d("SelfAuthenticatorProcess", "isAppValidationTimePassed() = " + isAppValidationTimePassed(aContext)) - - if (getSelfAuthenticationFirstTimeTryingInHours(aContext) > SELF_AUTHENRICATION_WHEN_TO_SHOW_FIRST_WARNNING_IN_HOURS) { - if (!isAppValidationTimePassed(aContext)) { - mSelfAuthenticationDialogBuilder.showSelfAuthenticationFirstFailureWarning(aContext) - } else { - mSelfAuthenticationDialogBuilder.showSelfAuthenticationSecondFailureWarning(aContext) - } - } - } - - fun isAppValidationTimePassed(aContext: Context): Boolean{ - return getSelfAuthenticationFirstTimeTryingInHours(aContext) > SELF_AUTHENRICATION_WHEN_TO_SHOW_SECOND_WARNNING_IN_HOURS - } - - fun showLogSentIfNeeded( - aContext: Activity - ){ - mSelfAuthenticationDialogBuilder.showSelfAuthenticationFirstFailureWarningLogsSent(aContext) - } - - fun isOneOfTheAuthenticationDialogIsShowing(): Boolean{ - return mSelfAuthenticationDialogBuilder.isOneOfTheAuthenticationDialogIsShowing() - } - - fun showProgressDialog(activity: Activity){ - mSelfAuthenticationDialogBuilder.showProgressDialog(activity) - } - - fun hideProgressDialog(){ - mSelfAuthenticationDialogBuilder.hideProgressDialog() - } - - -} \ No newline at end of file diff --git a/app/src/main/java/org/tm/archive/AppCapabilities.kt b/app/src/main/java/org/tm/archive/AppCapabilities.kt index 081dcaba..28b6a9e7 100644 --- a/app/src/main/java/org/tm/archive/AppCapabilities.kt +++ b/app/src/main/java/org/tm/archive/AppCapabilities.kt @@ -1,6 +1,5 @@ package org.tm.archive -import org.tm.archive.util.FeatureFlags import org.whispersystems.signalservice.api.account.AccountAttributes object AppCapabilities { @@ -17,7 +16,7 @@ object AppCapabilities { changeNumber = true, stories = true, giftBadges = true, - pni = FeatureFlags.phoneNumberPrivacy(), + pni = true, paymentActivation = true ) } diff --git a/app/src/main/java/org/tm/archive/ApplicationContext.java b/app/src/main/java/org/tm/archive/ApplicationContext.java index 1bb396bf..c40e623d 100644 --- a/app/src/main/java/org/tm/archive/ApplicationContext.java +++ b/app/src/main/java/org/tm/archive/ApplicationContext.java @@ -16,7 +16,6 @@ */ package org.tm.archive; -import android.app.Application; import android.content.Context; import androidx.annotation.NonNull; @@ -26,24 +25,16 @@ import androidx.annotation.WorkerThread; import androidx.multidex.MultiDexApplication; import com.google.android.gms.security.ProviderInstaller; -import com.google.firebase.FirebaseApp; -import com.tm.androidcopysdk.AndroidCopySDK; -import com.tm.androidcopysdk.AndroidCopySettings; -import com.tm.androidcopysdk.BackupService; -import com.tm.androidcopysdk.CommonUtils; -import com.tm.androidcopysdk.utils.PrefManager; -import com.tm.authenticatorsdk.selfAuthenticator.AuthenticatorConstants; -import org.archiver.ArchiveConstants; -import org.archiver.ArchiveLogger; -import org.archiver.FCMConnector; -import org.conscrypt.Conscrypt; +import org.conscrypt.ConscryptSignal; import org.greenrobot.eventbus.EventBus; import org.signal.aesgcmprovider.AesGcmProvider; import org.signal.core.util.MemoryTracker; +import org.signal.core.util.concurrent.AnrDetector; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.AndroidLogger; import org.signal.core.util.logging.Log; +import org.signal.core.util.logging.Scrubber; import org.signal.core.util.tracing.Tracer; import org.signal.glide.SignalGlideCodecs; import org.signal.libsignal.protocol.logging.SignalProtocolLoggerProvider; @@ -63,8 +54,10 @@ import org.tm.archive.jobs.AccountConsistencyWorkerJob; import org.tm.archive.jobs.CheckServiceReachabilityJob; import org.tm.archive.jobs.DownloadLatestEmojiDataJob; import org.tm.archive.jobs.EmojiSearchIndexDownloadJob; +import org.tm.archive.jobs.ExternalLaunchDonationJob; import org.tm.archive.jobs.FcmRefreshJob; import org.tm.archive.jobs.FontDownloaderJob; +import org.tm.archive.jobs.GroupRingCleanupJob; import org.tm.archive.jobs.GroupV2UpdateSelfProfileKeyJob; import org.tm.archive.jobs.MultiDeviceContactUpdateJob; import org.tm.archive.jobs.PnpInitializeDevicesJob; @@ -94,15 +87,13 @@ import org.tm.archive.service.KeyCachingService; import org.tm.archive.service.LocalBackupListener; import org.tm.archive.service.RotateSenderCertificateListener; import org.tm.archive.service.RotateSignedPreKeyListener; -import org.tm.archive.service.UpdateApkRefreshListener; +import org.tm.archive.apkupdate.ApkUpdateRefreshListener; import org.tm.archive.service.webrtc.AndroidTelecomUtil; import org.tm.archive.storage.StorageSyncHelper; import org.tm.archive.util.AppForegroundObserver; import org.tm.archive.util.AppStartup; import org.tm.archive.util.DynamicTheme; import org.tm.archive.util.FeatureFlags; -import org.tm.archive.util.PowerManagerCompat; -import org.tm.archive.util.ServiceUtil; import org.tm.archive.util.SignalLocalMetrics; import org.tm.archive.util.SignalUncaughtExceptionHandler; import org.tm.archive.util.TextSecurePreferences; @@ -121,11 +112,9 @@ import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException; import io.reactivex.rxjava3.exceptions.UndeliverableException; import io.reactivex.rxjava3.plugins.RxJavaPlugins; import io.reactivex.rxjava3.schedulers.Schedulers; -import kotlin.Pair; +import kotlin.Unit; import rxdogtag2.RxDogTag; -import static org.archiver.ArchiveConstants.isTestMode; - /** * Will be called once when the TextSecure process is created. * @@ -137,18 +126,11 @@ import static org.archiver.ArchiveConstants.isTestMode; public class ApplicationContext extends MultiDexApplication implements AppForegroundObserver.Listener { private static final String TAG = Log.tag(ApplicationContext.class); - private static Application mApplicationContext;//**TM_SA**// - @VisibleForTesting - protected PersistentLogger persistentLogger; public static ApplicationContext getInstance(Context context) { return (ApplicationContext)context.getApplicationContext(); } - public static Application getInstance() {//**TM_SA**// - return mApplicationContext; - } - @Override public void onCreate() { Tracer.getInstance().start("Application#onCreate()"); @@ -173,27 +155,29 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr initializeLogging(); Log.i(TAG, "onCreate()"); }) + .addBlocking("anr-detector", this::startAnrDetector) .addBlocking("security-provider", this::initializeSecurityProvider) .addBlocking("crash-handling", this::initializeCrashHandling) .addBlocking("rx-init", this::initializeRx) .addBlocking("event-bus", () -> EventBus.builder().logNoSubscriberMessages(false).installDefaultEventBus()) .addBlocking("app-dependencies", this::initializeAppDependencies) + .addBlocking("scrubber", () -> Scrubber.setIdentifierHmacKeyProvider(() -> SignalStore.svr().getOrCreateMasterKey().deriveLoggingKey())) .addBlocking("first-launch", this::initializeFirstEverAppLaunch) .addBlocking("app-migrations", this::initializeApplicationMigrations) - .addBlocking("mark-registration", () -> RegistrationUtil.maybeMarkRegistrationComplete()) .addBlocking("lifecycle-observer", () -> ApplicationDependencies.getAppForegroundObserver().addListener(this)) .addBlocking("message-retriever", this::initializeMessageRetrieval) .addBlocking("dynamic-theme", () -> DynamicTheme.setDefaultDayNightMode(this)) .addBlocking("proxy-init", () -> { if (SignalStore.proxy().isProxyEnabled()) { Log.w(TAG, "Proxy detected. Enabling Conscrypt.setUseEngineSocketByDefault()"); - Conscrypt.setUseEngineSocketByDefault(true); + ConscryptSignal.setUseEngineSocketByDefault(true); } }) .addBlocking("blob-provider", this::initializeBlobProvider) .addBlocking("feature-flags", FeatureFlags::init) .addBlocking("ring-rtc", this::initializeRingRtc) .addBlocking("glide", () -> SignalGlideModule.setRegisterGlideComponents(new SignalGlideComponents())) + .addNonBlocking(() -> RegistrationUtil.maybeMarkRegistrationComplete()) .addNonBlocking(() -> GlideApp.get(this)) .addNonBlocking(this::cleanAvatarStorage) .addNonBlocking(this::initializeRevealableMessageManager) @@ -231,72 +215,14 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr .addPostRender(() -> ApplicationDependencies.getExoPlayerPool().getPoolStats().getMaxUnreserved()) .addPostRender(() -> ApplicationDependencies.getRecipientCache().warmUp()) .addPostRender(AccountConsistencyWorkerJob::enqueueIfNecessary) + .addPostRender(GroupRingCleanupJob::enqueue) .execute(); Log.d(TAG, "onCreate() took " + (System.currentTimeMillis() - startTime) + " ms"); SignalLocalMetrics.ColdStart.onApplicationCreateFinished(); Tracer.getInstance().end("Application#onCreate()"); - - //**TM_SA**// start - com.tm.logger.Log.i(TAG, "1 current FCM: " + FirebaseApp.getInstance().getOptions().getProjectId()); - mApplicationContext = this; - - com.tm.logger.Log.createInstance(getApplicationContext()); - ArchiveLogger.Companion.sendArchiveLog("TeleMessage logger created"); - - initArchiveUrlsAndStartArchive(); } - private void initArchiveUrlsAndStartArchive() { - - if(CommonUtils.isMyServiceRunning(mApplicationContext, BackupService.class)){ - CommonUtils.stopBackupService(mApplicationContext, false); - } - - ArchiveLogger.Companion.sendArchiveLog("initializeTMAndroidArchive \nsetUrl: \nchosenUrl =" + ArchiveConstants.charlieProduction + "\nKeeperUrl =" + ArchiveConstants.prodKeeper); - if(org.tm.archive.BuildConfig.DEBUG){ - String baseUrlPrefProd = PrefManager.getStringPref(mApplicationContext, ArchiveConstants.SHARED_PREFERENCE_SELECTED_BASE_URL_PRODUCTION_KEY, ArchiveConstants.charlieProduction); - String baseUrlPrefKeeper = PrefManager.getStringPref(mApplicationContext, ArchiveConstants.SHARED_PREFERENCE_SELECTED_BASE_URL_KEEPER_KEY,ArchiveConstants.prodKeeper); - AuthenticatorConstants.Companion.setBASE_URL(new Pair(baseUrlPrefProd, baseUrlPrefKeeper)); - CommonUtils.setUrl(mApplicationContext, baseUrlPrefProd, baseUrlPrefKeeper); - }else { - CommonUtils.setUrl(mApplicationContext, ArchiveConstants.charlieProduction, ArchiveConstants.prodKeeper); - } - CommonUtils.setSqlInfo(getApplicationContext(), ArchiveConstants.isTestMode ? ArchiveConstants.signalTestPassword : ArchiveConstants.signalCurrentPassword); - - //set SDK to active -> need to change it with the self register - boolean installationEventSent = PrefManager.getBooleanPref(getApplicationContext(), R.string.installation_event_sent, false); - PrefManager.setBooleanPref(getApplicationContext(), "activated_aa" ,true); - - if(isTestMode || !installationEventSent) { - initializeTMAndroidArchive(); - ArchiveLogger.Companion.sendArchiveLog("initializeTMAndroidArchive"); - } - - CommonUtils.startBackupService(getApplicationContext()); - ArchiveLogger.Companion.sendArchiveLog("Backup service started"); - } - - private void initializeTMAndroidArchive() { - - AndroidCopySettings mSettings = new AndroidCopySettings(); - - PrefManager.setStringPref(getApplicationContext(),"wifi3g","WIFI3G"); - - mSettings.setData(AndroidCopySettings.DataSaving.WIFI3G); - com.tm.logger.Log.d("initializeTMAndroidArchive", "signupSucess with emptey password and user name"); - AndroidCopySDK.getInstance(getApplicationContext()).signupSucess(/*ArchiveConstants.signalTestUserName, ArchiveConstants.signalTestPassword*/ "", ""); - - ArchiveLogger.Companion.sendArchiveLog("User name = " + "Password = "); - - boolean installationEventSent = PrefManager.getBooleanPref(getApplicationContext(), R.string.installation_event_sent, false); - // InstallEvent should be sent only once - if(!installationEventSent) { - PrefManager.setBooleanPref(getApplicationContext(),R.string.installation_event_sent,true); - } - } - //**TM_SA**// End - @Override public void onForeground() { long startTime = System.currentTimeMillis(); @@ -306,11 +232,13 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr ApplicationDependencies.getMegaphoneRepository().onAppForegrounded(); ApplicationDependencies.getDeadlockDetector().start(); SubscriptionKeepAliveJob.enqueueAndTrackTimeIfNecessary(); + ExternalLaunchDonationJob.enqueueIfNecessary(); FcmFetchManager.onForeground(this); + startAnrDetector(); SignalExecutors.BOUNDED.execute(() -> { FeatureFlags.refreshIfNecessary(); - RetrieveProfileJob.enqueueRoutineFetchIfNecessary(this); + RetrieveProfileJob.enqueueRoutineFetchIfNecessary(); executePendingContactSync(); KeyCachingService.onAppForegrounded(this); ApplicationDependencies.getShakeToReport().enable(); @@ -340,10 +268,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr ApplicationDependencies.getShakeToReport().disable(); ApplicationDependencies.getDeadlockDetector().stop(); MemoryTracker.stop(); - } - - public PersistentLogger getPersistentLogger() { - return persistentLogger; + AnrDetector.stop(); } public void checkBuildExpiration() { @@ -353,6 +278,17 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr } } + /** + * Note: this is purposefully "started" twice -- once during application create, and once during foreground. + * This is so we can capture ANR's that happen on boot before the foreground event. + */ + private void startAnrDetector() { + AnrDetector.start(TimeUnit.SECONDS.toMillis(5), FeatureFlags::internalUser, (dumps) -> { + LogDatabase.getInstance(this).anrs().save(System.currentTimeMillis(), dumps); + return Unit.INSTANCE; + }); + } + private void initializeSecurityProvider() { int aesPosition = Security.insertProviderAt(new AesGcmProvider(), 1); Log.i(TAG, "Installed AesGcmProvider: " + aesPosition); @@ -362,7 +298,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr throw new ProviderInitializationException(); } - int conscryptPosition = Security.insertProviderAt(Conscrypt.newProvider(), 2); + int conscryptPosition = Security.insertProviderAt(ConscryptSignal.newProvider(), 2); Log.i(TAG, "Installed Conscrypt provider: " + conscryptPosition); if (conscryptPosition < 0) { @@ -372,14 +308,14 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr @VisibleForTesting protected void initializeLogging() { - persistentLogger = new PersistentLogger(this); - org.signal.core.util.logging.Log.initialize(FeatureFlags::internalUser, new AndroidLogger(), persistentLogger); + Log.initialize(FeatureFlags::internalUser, new AndroidLogger(), new PersistentLogger(this)); SignalProtocolLoggerProvider.setProvider(new CustomSignalProtocolLogger()); SignalExecutors.UNBOUNDED.execute(() -> { Log.blockUntilAllWritesFinished(); - LogDatabase.getInstance(this).trimToSize(); + LogDatabase.getInstance(this).logs().trimToSize(); + LogDatabase.getInstance(this).crashes().trimToSize(); }); } @@ -448,8 +384,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr long nextSetTime = SignalStore.account().getFcmTokenLastSetTime() + TimeUnit.HOURS.toMillis(6); if (SignalStore.account().getFcmToken() == null || nextSetTime <= System.currentTimeMillis()) { - FCMConnector.initOfficialSignalFirebaseAccount(this);//**TM_SA**// -// ApplicationDependencies.getJobManager().add(new FcmRefreshJob());//**TM_SA**// + ApplicationDependencies.getJobManager().add(new FcmRefreshJob()); } } } @@ -484,8 +419,8 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr RotateSenderCertificateListener.schedule(this); RoutineMessageFetchReceiver.startOrUpdateAlarm(this); - if (BuildConfig.PLAY_STORE_DISABLED) { - UpdateApkRefreshListener.schedule(this); + if (BuildConfig.MANAGES_APP_UPDATES) { + ApkUpdateRefreshListener.schedule(this); } } @@ -495,6 +430,9 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr if (FeatureFlags.callingFieldTrialAnyAddressPortsKillSwitch()) { fieldTrials.put("RingRTC-AnyAddressPortsKillSwitch", "Enabled"); } + if (!SignalStore.internalValues().callingDisableLBRed()) { + fieldTrials.put("RingRTC-Audio-LBRed-For-Opus", "Enabled,bitrate_pri:22000"); + } CallManager.initialize(this, new RingRtcLogger(), fieldTrials); } catch (UnsatisfiedLinkError e) { throw new AssertionError("Unable to load ringrtc library", e); diff --git a/app/src/main/java/org/tm/archive/AvatarPreviewActivity.java b/app/src/main/java/org/tm/archive/AvatarPreviewActivity.java index 6ea1ccb0..1f4b2986 100644 --- a/app/src/main/java/org/tm/archive/AvatarPreviewActivity.java +++ b/app/src/main/java/org/tm/archive/AvatarPreviewActivity.java @@ -6,7 +6,6 @@ import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; import android.transition.TransitionInflater; import android.view.View; diff --git a/app/src/main/java/org/tm/archive/BaseActivity.java b/app/src/main/java/org/tm/archive/BaseActivity.java index 0b335c42..aa8fd6a7 100644 --- a/app/src/main/java/org/tm/archive/BaseActivity.java +++ b/app/src/main/java/org/tm/archive/BaseActivity.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.view.View; -import android.view.WindowManager; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; @@ -18,7 +17,6 @@ import org.signal.core.util.logging.Log; import org.tm.archive.dependencies.ApplicationDependencies; import org.tm.archive.util.AppStartup; import org.tm.archive.util.ConfigurationUtil; -import org.tm.archive.util.TextSecurePreferences; import org.tm.archive.util.WindowUtil; import org.tm.archive.util.dynamiclanguage.DynamicLanguageContextWrapper; diff --git a/app/src/main/java/org/tm/archive/BindableConversationItem.java b/app/src/main/java/org/tm/archive/BindableConversationItem.java index dfd62c19..32a841d7 100644 --- a/app/src/main/java/org/tm/archive/BindableConversationItem.java +++ b/app/src/main/java/org/tm/archive/BindableConversationItem.java @@ -57,6 +57,10 @@ public interface BindableConversationItem extends Unbindable, GiphyMp4Playable, void setEventListener(@Nullable EventListener listener); + default void setParentScrolling(boolean isParentScrolling) { + // Intentionally Blank. + } + default void updateTimestamps() { // Intentionally Blank. } diff --git a/app/src/main/java/org/tm/archive/BindableConversationListItem.java b/app/src/main/java/org/tm/archive/BindableConversationListItem.java index 4e7b843e..74bb2bba 100644 --- a/app/src/main/java/org/tm/archive/BindableConversationListItem.java +++ b/app/src/main/java/org/tm/archive/BindableConversationListItem.java @@ -20,4 +20,5 @@ public interface BindableConversationListItem extends Unbindable { void setSelectedConversations(@NonNull ConversationSet conversations); void updateTypingIndicator(@NonNull Set typingThreads); + void updateTimestamp(); } diff --git a/app/src/main/java/org/tm/archive/ContactSelectionListFragment.java b/app/src/main/java/org/tm/archive/ContactSelectionListFragment.java index beb402c7..8875ed77 100644 --- a/app/src/main/java/org/tm/archive/ContactSelectionListFragment.java +++ b/app/src/main/java/org/tm/archive/ContactSelectionListFragment.java @@ -35,7 +35,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.Px; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; @@ -50,6 +49,8 @@ import androidx.transition.TransitionManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.pnikosis.materialishprogress.ProgressWheel; +import org.signal.core.util.concurrent.LifecycleDisposable; +import org.signal.core.util.concurrent.RxExtensions; import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; import org.tm.archive.components.RecyclerViewFastScroller; @@ -70,10 +71,11 @@ import org.tm.archive.contacts.sync.ContactDiscovery; import org.tm.archive.groups.SelectionLimits; import org.tm.archive.groups.ui.GroupLimitDialog; import org.tm.archive.permissions.Permissions; +import org.tm.archive.profiles.manage.UsernameRepository; +import org.tm.archive.profiles.manage.UsernameRepository.UsernameAciFetchResult; import org.tm.archive.recipients.Recipient; import org.tm.archive.recipients.RecipientId; import org.tm.archive.util.CommunicationActions; -import org.signal.core.util.concurrent.LifecycleDisposable; import org.tm.archive.util.TextSecurePreferences; import org.tm.archive.util.UsernameUtil; import org.tm.archive.util.ViewUtil; @@ -85,6 +87,7 @@ import java.io.IOException; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; @@ -145,6 +148,8 @@ public final class ContactSelectionListFragment extends LoggingFragment { private Set currentSelection; private boolean isMulti; private boolean canSelectSelf; + private boolean resetPositionOnCommit = false; + private ListClickListener listClickListener = new ListClickListener(); @Nullable private SwipeRefreshLayout.OnRefreshListener onRefreshListener; @@ -423,6 +428,10 @@ public final class ContactSelectionListFragment extends LoggingFragment { onRefreshListener = null; } + public int getSelectedMembersSize() { + return contactSearchMediator.getSelectedMembersSize(); + } + private @NonNull Bundle safeArguments() { return getArguments() != null ? getArguments() : new Bundle(); } @@ -519,12 +528,21 @@ public final class ContactSelectionListFragment extends LoggingFragment { } public void setQueryFilter(String filter) { - this.cursorFilter = filter; + if (Objects.equals(filter, this.cursorFilter)) { + return; + } + + this.resetPositionOnCommit = true; + this.cursorFilter = filter; + contactSearchMediator.onFilterChanged(filter); } public void resetQueryFilter() { setQueryFilter(null); + + this.resetPositionOnCommit = true; + swipeRefresh.setRefreshing(false); } @@ -542,11 +560,12 @@ public final class ContactSelectionListFragment extends LoggingFragment { headerActionView.setVisibility(View.GONE); } - public void setRecyclerViewPaddingBottom(@Px int paddingBottom) { - ViewUtil.setPaddingBottom(recyclerView, paddingBottom); - } - private void onLoadFinished(int count) { + if (resetPositionOnCommit) { + resetPositionOnCommit = false; + recyclerView.scrollToPosition(0); + } + swipeRefresh.setVisibility(View.VISIBLE); showContactsLayout.setVisibility(View.GONE); @@ -666,11 +685,18 @@ public final class ContactSelectionListFragment extends LoggingFragment { AlertDialog loadingDialog = SimpleProgressDialog.show(requireContext()); SimpleTask.run(getViewLifecycleOwner().getLifecycle(), () -> { - return UsernameUtil.fetchAciForUsername(username); - }, uuid -> { + try { + return RxExtensions.safeBlockingGet(UsernameRepository.fetchAciForUsername(UsernameUtil.sanitizeUsernameFromSearch(username))); + } catch (InterruptedException e) { + Log.w(TAG, "Interrupted?", e); + return UsernameAciFetchResult.NetworkError.INSTANCE; + } + }, result -> { loadingDialog.dismiss(); - if (uuid.isPresent()) { - Recipient recipient = Recipient.externalUsername(uuid.get(), username); + + // TODO Could be more specific with errors + if (result instanceof UsernameAciFetchResult.Success success) { + Recipient recipient = Recipient.externalUsername(success.getAci(), username); SelectedContact selected = SelectedContact.forUsername(recipient.getId(), username); if (onContactSelectedListener != null) { diff --git a/app/src/main/java/org/tm/archive/DeviceActivity.java b/app/src/main/java/org/tm/archive/DeviceActivity.java index 6e6a9484..1a705c48 100644 --- a/app/src/main/java/org/tm/archive/DeviceActivity.java +++ b/app/src/main/java/org/tm/archive/DeviceActivity.java @@ -5,13 +5,11 @@ import android.annotation.SuppressLint; import android.content.Context; import android.net.Uri; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.os.Vibrator; import android.text.TextUtils; import android.transition.TransitionInflater; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; @@ -32,7 +30,7 @@ import org.tm.archive.crypto.ProfileKeyUtil; import org.tm.archive.dependencies.ApplicationDependencies; import org.tm.archive.keyvalue.SignalStore; import org.tm.archive.permissions.Permissions; -import org.tm.archive.util.Base64; +import org.signal.core.util.Base64; import org.tm.archive.util.DynamicLanguage; import org.tm.archive.util.DynamicNoActionBarTheme; import org.tm.archive.util.DynamicTheme; @@ -197,7 +195,7 @@ public class DeviceActivity extends PassphraseRequiredActivity ProfileKey profileKey = ProfileKeyUtil.getSelfProfileKey(); TextSecurePreferences.setMultiDevice(DeviceActivity.this, true); - accountManager.addDevice(ephemeralId, publicKey, aciIdentityKeyPair, pniIdentityKeyPair, profileKey, verificationCode); + accountManager.addDevice(ephemeralId, publicKey, aciIdentityKeyPair, pniIdentityKeyPair, profileKey, SignalStore.svr().getOrCreateMasterKey(), verificationCode); return SUCCESS; } catch (NotFoundException e) { diff --git a/app/src/main/java/org/tm/archive/DeviceProvisioningActivity.java b/app/src/main/java/org/tm/archive/DeviceProvisioningActivity.java index 92774769..f292c0a8 100644 --- a/app/src/main/java/org/tm/archive/DeviceProvisioningActivity.java +++ b/app/src/main/java/org/tm/archive/DeviceProvisioningActivity.java @@ -38,7 +38,7 @@ public class DeviceProvisioningActivity extends PassphraseRequiredActivity { .setOnDismissListener(dialog13 -> finish()) .create(); - dialog.setIcon(getResources().getDrawable(R.drawable.ic_launcher_foreground_new));//**TM_SA**// + dialog.setIcon(getResources().getDrawable(R.drawable.icon_dialog)); dialog.show(); } } diff --git a/app/src/main/java/org/tm/archive/MainActivity.java b/app/src/main/java/org/tm/archive/MainActivity.java index aa6df7a8..40cf4c44 100644 --- a/app/src/main/java/org/tm/archive/MainActivity.java +++ b/app/src/main/java/org/tm/archive/MainActivity.java @@ -6,8 +6,6 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.view.View; import android.view.ViewTreeObserver; @@ -17,20 +15,20 @@ import androidx.core.content.ContextCompat; import androidx.lifecycle.ViewModelProvider; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.tm.androidcopysdk.utils.PrefManager; -import org.archiver.ArchivePreferenceConstants; import org.signal.core.util.concurrent.LifecycleDisposable; +import org.signal.core.util.logging.Log; +import org.signal.donations.StripeApi; import org.tm.archive.components.DebugLogsPromptDialogFragment; import org.tm.archive.components.PromptBatterySaverDialogFragment; +import org.tm.archive.components.settings.app.AppSettingsActivity; import org.tm.archive.components.voice.VoiceNoteMediaController; import org.tm.archive.components.voice.VoiceNoteMediaControllerOwner; import org.tm.archive.conversationlist.RelinkDevicesReminderBottomSheetFragment; -import org.tm.archive.dependencies.ApplicationDependencies; import org.tm.archive.devicetransfer.olddevice.OldDeviceExitActivity; import org.tm.archive.keyvalue.SignalStore; import org.tm.archive.net.DeviceTransferBlockingInterceptor; -import org.tm.archive.notifications.SlowNotificationsViewModel; +import org.tm.archive.notifications.VitalsViewModel; import org.tm.archive.stories.tabs.ConversationListTabRepository; import org.tm.archive.stories.tabs.ConversationListTabsViewModel; import org.tm.archive.util.AppStartup; @@ -50,7 +48,7 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot private VoiceNoteMediaController mediaController; private ConversationListTabsViewModel conversationListTabsViewModel; - private SlowNotificationsViewModel slowNotificationsViewModel; + private VitalsViewModel vitalsViewModel; private final LifecycleDisposable lifecycleDisposable = new LifecycleDisposable(); @@ -94,35 +92,34 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot ConversationListTabRepository repository = new ConversationListTabRepository(); ConversationListTabsViewModel.Factory factory = new ConversationListTabsViewModel.Factory(repository); - handleGroupLinkInIntent(getIntent()); - handleProxyInIntent(getIntent()); - handleSignalMeIntent(getIntent()); - handleCallLinkInIntent(getIntent()); + handleDeeplinkIntent(getIntent()); CachedInflater.from(this).clear(); conversationListTabsViewModel = new ViewModelProvider(this, factory).get(ConversationListTabsViewModel.class); updateTabVisibility(); - slowNotificationsViewModel = new ViewModelProvider(this).get(SlowNotificationsViewModel.class); + vitalsViewModel = new ViewModelProvider(this).get(VitalsViewModel.class); lifecycleDisposable.add( - slowNotificationsViewModel - .getSlowNotificationState() - .subscribe(this::presentSlowNotificationState) + vitalsViewModel + .getVitalsState() + .subscribe(this::presentVitalsState) ); } @SuppressLint("NewApi") - private void presentSlowNotificationState(SlowNotificationsViewModel.State slowNotificationState) { - switch (slowNotificationState) { + private void presentVitalsState(VitalsViewModel.State state) { + switch (state) { case NONE: break; case PROMPT_BATTERY_SAVER_DIALOG: PromptBatterySaverDialogFragment.show(getSupportFragmentManager()); break; - case PROMPT_DEBUGLOGS: - DebugLogsPromptDialogFragment.show(this, getSupportFragmentManager()); + case PROMPT_DEBUGLOGS_FOR_NOTIFICATIONS: + DebugLogsPromptDialogFragment.show(this, DebugLogsPromptDialogFragment.Purpose.NOTIFICATIONS); + case PROMPT_DEBUGLOGS_FOR_CRASH: + DebugLogsPromptDialogFragment.show(this, DebugLogsPromptDialogFragment.Purpose.CRASH); break; } } @@ -137,10 +134,7 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - handleGroupLinkInIntent(intent); - handleProxyInIntent(intent); - handleSignalMeIntent(intent); - handleCallLinkInIntent(intent); + handleDeeplinkIntent(intent); } @Override @@ -173,35 +167,9 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot updateTabVisibility(); - slowNotificationsViewModel.checkSlowNotificationHeuristics(); - //**TM_SA**// start - notifyMessageIfNeeded(); + vitalsViewModel.checkSlowNotificationHeuristics(); } - private void notifyMessageIfNeeded() { - boolean isAlreadyRestarted = PrefManager.getBooleanPref(this, ArchivePreferenceConstants.PREF_KEY_MAIN_ACTIVITY_RESTART, false); - - if(!isAlreadyRestarted){ - PrefManager.setBooleanPref(this, ArchivePreferenceConstants.PREF_KEY_MAIN_ACTIVITY_RESTART, true); - - final Handler handler = new Handler(Looper.getMainLooper()); - handler.postDelayed(new Runnable() { - @Override - public void run() { - notifyMessage(); - } - }, 4000); - } - } - - public synchronized void notifyMessage(){ - synchronized (ApplicationDependencies.getIncomingMessageObserver()) { - ApplicationDependencies.getIncomingMessageObserver().notifyAll(); - } - } - - //**TM_SA**// End - @Override protected void onStop() { super.onStop(); @@ -232,6 +200,14 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot return navigator; } + private void handleDeeplinkIntent(Intent intent) { + handleGroupLinkInIntent(intent); + handleProxyInIntent(intent); + handleSignalMeIntent(intent); + handleCallLinkInIntent(intent); + handleDonateReturnIntent(intent); + } + private void handleGroupLinkInIntent(Intent intent) { Uri data = intent.getData(); if (data != null) { @@ -260,6 +236,13 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot } } + private void handleDonateReturnIntent(Intent intent) { + Uri data = intent.getData(); + if (data != null && data.toString().startsWith(StripeApi.RETURN_URL_IDEAL)) { + startActivity(AppSettingsActivity.manageSubscriptions(this)); + } + } + public void onFirstRender() { onFirstRender = true; } diff --git a/app/src/main/java/org/tm/archive/NewConversationActivity.java b/app/src/main/java/org/tm/archive/NewConversationActivity.java index 3f3b69ca..835450fc 100644 --- a/app/src/main/java/org/tm/archive/NewConversationActivity.java +++ b/app/src/main/java/org/tm/archive/NewConversationActivity.java @@ -51,7 +51,6 @@ import org.tm.archive.keyvalue.SignalStore; import org.tm.archive.recipients.Recipient; import org.tm.archive.recipients.RecipientId; import org.tm.archive.util.CommunicationActions; -import org.tm.archive.util.FeatureFlags; import org.tm.archive.util.views.SimpleProgressDialog; import java.io.IOException; @@ -313,7 +312,7 @@ public class NewConversationActivity extends ContactSelectionActivity } private @Nullable ActionItem createRemoveActionItem(@NonNull Recipient recipient) { - if (!FeatureFlags.hideContacts() || recipient.isSelf() || recipient.isGroup()) { + if (recipient.isSelf() || recipient.isGroup()) { return null; } diff --git a/app/src/main/java/org/tm/archive/PassphrasePromptActivity.java b/app/src/main/java/org/tm/archive/PassphrasePromptActivity.java index c3b257a4..bdfade45 100644 --- a/app/src/main/java/org/tm/archive/PassphrasePromptActivity.java +++ b/app/src/main/java/org/tm/archive/PassphrasePromptActivity.java @@ -21,7 +21,6 @@ import android.app.KeyguardManager; import android.content.Context; import android.content.Intent; import android.graphics.PorterDuff; -import android.os.Build; import android.os.Bundle; import android.text.Editable; import android.text.InputType; diff --git a/app/src/main/java/org/tm/archive/PassphraseRequiredActivity.java b/app/src/main/java/org/tm/archive/PassphraseRequiredActivity.java index 7daa916f..0f6611c1 100644 --- a/app/src/main/java/org/tm/archive/PassphraseRequiredActivity.java +++ b/app/src/main/java/org/tm/archive/PassphraseRequiredActivity.java @@ -24,7 +24,7 @@ import org.tm.archive.lock.v2.CreateSvrPinActivity; import org.tm.archive.migrations.ApplicationMigrationActivity; import org.tm.archive.migrations.ApplicationMigrations; import org.tm.archive.pin.PinRestoreActivity; -import org.tm.archive.profiles.edit.EditProfileActivity; +import org.tm.archive.profiles.edit.CreateProfileActivity; import org.tm.archive.push.SignalServiceNetworkAccess; import org.tm.archive.recipients.Recipient; import org.tm.archive.registration.RegistrationNavigationActivity; @@ -228,7 +228,7 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements } private Intent getCreateProfileNameIntent() { - Intent intent = EditProfileActivity.getIntentForUserProfile(this); + Intent intent = CreateProfileActivity.getIntentForUserProfile(this); return getRoutedIntent(intent, getIntent()); } diff --git a/app/src/main/java/org/tm/archive/WebRtcCallActivity.java b/app/src/main/java/org/tm/archive/WebRtcCallActivity.java index 65701391..823d5671 100644 --- a/app/src/main/java/org/tm/archive/WebRtcCallActivity.java +++ b/app/src/main/java/org/tm/archive/WebRtcCallActivity.java @@ -57,7 +57,8 @@ import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.IdentityKey; import org.tm.archive.components.TooltipPopup; import org.tm.archive.components.sensors.DeviceOrientationMonitor; -import org.tm.archive.components.webrtc.CallLinkInfoSheet; +import org.tm.archive.components.webrtc.CallLinkProfileKeySender; +import org.tm.archive.components.webrtc.CallOverflowPopupWindow; import org.tm.archive.components.webrtc.CallParticipantsListUpdatePopupWindow; import org.tm.archive.components.webrtc.CallParticipantsState; import org.tm.archive.components.webrtc.CallStateUpdatePopupWindow; @@ -72,13 +73,16 @@ import org.tm.archive.components.webrtc.WebRtcCallView; import org.tm.archive.components.webrtc.WebRtcCallViewModel; import org.tm.archive.components.webrtc.WebRtcControls; import org.tm.archive.components.webrtc.WifiToCellularPopupWindow; +import org.tm.archive.components.webrtc.controls.ControlsAndInfoController; +import org.tm.archive.components.webrtc.controls.ControlsAndInfoViewModel; import org.tm.archive.components.webrtc.participantslist.CallParticipantsListDialog; +import org.tm.archive.components.webrtc.requests.CallLinkIncomingRequestSheet; import org.tm.archive.conversation.ui.error.SafetyNumberChangeDialog; import org.tm.archive.dependencies.ApplicationDependencies; import org.tm.archive.events.WebRtcViewModel; import org.tm.archive.messagerequests.CalleeMustAcceptMessageRequestActivity; import org.tm.archive.permissions.Permissions; -import org.tm.archive.recipients.LiveRecipient; +import org.tm.archive.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment; import org.tm.archive.recipients.Recipient; import org.tm.archive.recipients.RecipientId; import org.tm.archive.safety.SafetyNumberBottomSheet; @@ -93,11 +97,13 @@ import org.tm.archive.util.TextSecurePreferences; import org.tm.archive.util.ThrottledDebouncer; import org.tm.archive.util.Util; import org.tm.archive.util.VibrateUtil; +import org.tm.archive.util.WindowUtil; import org.tm.archive.util.livedata.LiveDataUtil; import org.tm.archive.webrtc.CallParticipantsViewState; import org.tm.archive.webrtc.audio.SignalAudioManager; import org.whispersystems.signalservice.api.messages.calls.HangupMessage; +import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -109,7 +115,7 @@ import io.reactivex.rxjava3.disposables.Disposable; import static org.tm.archive.components.sensors.Orientation.PORTRAIT_BOTTOM_EDGE; -public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChangeDialog.Callback { +public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChangeDialog.Callback, ReactWithAnyEmojiBottomSheetDialogFragment.Callback { private static final String TAG = Log.tag(WebRtcCallActivity.class); @@ -134,13 +140,16 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan private CallParticipantsListUpdatePopupWindow participantUpdateWindow; private CallStateUpdatePopupWindow callStateUpdatePopupWindow; + private CallOverflowPopupWindow callOverflowPopupWindow; private WifiToCellularPopupWindow wifiToCellularPopupWindow; private DeviceOrientationMonitor deviceOrientationMonitor; private FullscreenHelper fullscreenHelper; private WebRtcCallView callScreen; private TooltipPopup videoTooltip; + private TooltipPopup switchCameraTooltip; private WebRtcCallViewModel viewModel; + private ControlsAndInfoViewModel controlsAndInfoViewModel; private boolean enableVideoIfAvailable; private boolean hasWarnedAboutBluetooth; private WindowLayoutInfoConsumer windowLayoutInfoConsumer; @@ -149,6 +158,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan private PictureInPictureParams.Builder pipBuilderParams; private LifecycleDisposable lifecycleDisposable; private long lastCallLinkDisconnectDialogShowTime; + private ControlsAndInfoController controlsAndInfo; private Disposable ephemeralStateDisposable = Disposable.empty(); @@ -158,7 +168,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan super.attachBaseContext(newBase); } - @SuppressLint("SourceLockedOrientationActivity") + @SuppressLint({ "SourceLockedOrientationActivity", "MissingInflatedId" }) @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate(" + getIntent().getBooleanExtra(EXTRA_STARTED_FROM_FULLSCREEN, false) + ")"); @@ -186,6 +196,16 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan initializeViewModel(isLandscapeEnabled); initializePictureInPictureParams(); + controlsAndInfo = new ControlsAndInfoController(this, callScreen, callOverflowPopupWindow, viewModel, controlsAndInfoViewModel); + controlsAndInfo.addVisibilityListener(new FadeCallback()); + + fullscreenHelper.showAndHideWithSystemUI(getWindow(), + findViewById(R.id.call_screen_header_gradient), + findViewById(R.id.webrtc_call_view_toolbar_text), + findViewById(R.id.webrtc_call_view_toolbar_no_text)); + + lifecycleDisposable.add(controlsAndInfo); + logIntent(getIntent()); if (ANSWER_VIDEO_ACTION.equals(getIntent().getAction())) { @@ -207,6 +227,8 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan requestNewSizesThrottle = new ThrottledDebouncer(TimeUnit.SECONDS.toMillis(1)); initializePendingParticipantFragmentListener(); + + WindowUtil.setNavigationBarColor(this, ContextCompat.getColor(this, R.color.signal_dark_colorSurface)); } @Override @@ -416,6 +438,13 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan participantUpdateWindow = new CallParticipantsListUpdatePopupWindow(callScreen); callStateUpdatePopupWindow = new CallStateUpdatePopupWindow(callScreen); wifiToCellularPopupWindow = new WifiToCellularPopupWindow(callScreen); + callOverflowPopupWindow = new CallOverflowPopupWindow(this, callScreen, () -> { + CallParticipantsState state = viewModel.getCallParticipantsStateSnapshot(); + if (state == null) { + return false; + } + return state.getLocalParticipant().isHandRaised(); + }); } private void initializeViewModel(boolean isLandscapeEnabled) { @@ -428,7 +457,10 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan viewModel.setIsLandscapeEnabled(isLandscapeEnabled); viewModel.setIsInPipMode(isInPipMode()); viewModel.getMicrophoneEnabled().observe(this, callScreen::setMicEnabled); - viewModel.getWebRtcControls().observe(this, callScreen::setWebRtcControls); + viewModel.getWebRtcControls().observe(this, controls -> { + callScreen.setWebRtcControls(controls); + controlsAndInfo.updateControls(controls); + }); viewModel.getEvents().observe(this, this::handleViewModelEvent); lifecycleDisposable.add(viewModel.getInCallstatus().subscribe(this::handleInCallStatus)); @@ -472,6 +504,8 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan .subscribe(callScreen::updatePendingParticipantsList); lifecycleDisposable.add(disposable); + + controlsAndInfoViewModel = new ViewModelProvider(this).get(ControlsAndInfoViewModel.class); } private void initializePictureInPictureParams() { @@ -519,7 +553,6 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan .setText(R.string.WebRtcCallActivity__tap_here_to_turn_on_your_video) .setOnDismissListener(() -> viewModel.onDismissedVideoTooltip()) .show(TooltipPopup.POSITION_ABOVE); - return; } } else if (event instanceof WebRtcCallViewModel.Event.DismissVideoTooltip) { if (videoTooltip != null) { @@ -528,6 +561,20 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan } } else if (event instanceof WebRtcCallViewModel.Event.ShowWifiToCellularPopup) { wifiToCellularPopupWindow.show(); + } else if (event instanceof WebRtcCallViewModel.Event.ShowSwitchCameraTooltip) { + if (switchCameraTooltip == null) { + switchCameraTooltip = TooltipPopup.forTarget(callScreen.getSwitchCameraTooltipTarget()) + .setBackgroundTint(ContextCompat.getColor(this, R.color.core_ultramarine)) + .setTextColor(ContextCompat.getColor(this, R.color.core_white)) + .setText(R.string.WebRtcCallActivity__flip_camera_tooltip) + .setOnDismissListener(() -> viewModel.onDismissedSwitchCameraTooltip()) + .show(TooltipPopup.POSITION_ABOVE); + } + } else if (event instanceof WebRtcCallViewModel.Event.DismissSwitchCameraTooltip) { + if (switchCameraTooltip != null) { + switchCameraTooltip.dismiss(); + switchCameraTooltip = null; + } } else { throw new IllegalArgumentException("Unknown event: " + event); } @@ -774,6 +821,10 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan return; } + if (state.isCallLink()) { + CallLinkProfileKeySender.onSendAnyway(new HashSet<>(changedRecipients)); + } + if (state.getGroupCallState().isConnected()) { ApplicationDependencies.getSignalCallManager().groupApproveSafetyChange(changedRecipients); } else { @@ -818,6 +869,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan viewModel.setRecipient(event.getRecipient()); callScreen.setRecipient(event.getRecipient()); + controlsAndInfoViewModel.setRecipient(event.getRecipient()); switch (event.getState()) { case CALL_PRE_JOIN: @@ -905,7 +957,6 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan private void handleCallPreJoin(@NonNull WebRtcViewModel event) { if (event.getGroupState().isNotIdle()) { - callScreen.setStatusFromGroupCallState(event.getGroupState()); callScreen.setRingGroup(event.shouldRingGroup()); if (event.shouldRingGroup() && event.areRemoteDevicesInCall()) { @@ -926,6 +977,15 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan MessageSender.onMessageSent(); } + @Override + public void onReactWithAnyEmojiDialogDismissed() { /* no-op */ } + + @Override + public void onReactWithAnyEmojiSelected(@NonNull String emoji) { + ApplicationDependencies.getSignalCallManager().react(emoji); + callOverflowPopupWindow.dismiss(); + } + private final class ControlsListener implements WebRtcCallView.ControlsListener { @Override @@ -939,22 +999,13 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan } @Override - public void onControlsFadeOut() { - if (videoTooltip != null) { - videoTooltip.dismiss(); + public void toggleControls() { + WebRtcControls controlState = viewModel.getWebRtcControls().getValue(); + if (controlState != null && !controlState.displayIncomingCallButtons()) { + controlsAndInfo.toggleControls(); } } - @Override - public void showSystemUI() { - fullscreenHelper.showSystemUI(); - } - - @Override - public void hideSystemUI() { - fullscreenHelper.hideSystemUI(); - } - @Override public void onAudioOutputChanged(@NonNull WebRtcAudioOutput audioOutput) { maybeDisplaySpeakerphonePopup(audioOutput); @@ -1015,6 +1066,11 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan handleAnswerWithAudio(); } + @Override + public void onOverflowClicked() { + controlsAndInfo.toggleOverflowPopup(); + } + @Override public void onAcceptCallPressed() { if (viewModel.isAnswerWithVideoAvailable()) { @@ -1032,6 +1088,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan @Override public void onLocalPictureInPictureClicked() { viewModel.onLocalPictureInPictureClicked(); + controlsAndInfo.restartHideControlsTimer(); } @Override @@ -1048,13 +1105,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan @Override public void onCallInfoClicked() { - LiveRecipient liveRecipient = viewModel.getRecipient(); - - if (liveRecipient.get().isCallLink()) { - CallLinkInfoSheet.show(getSupportFragmentManager(), liveRecipient.get().requireCallLinkRoomId()); - } else { - CallParticipantsListDialog.show(getSupportFragmentManager()); - } + controlsAndInfo.showCallInfo(); } @Override @@ -1088,6 +1139,11 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan public void onLaunchPendingRequestsSheet() { new PendingParticipantsBottomSheet().show(getSupportFragmentManager(), BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG); } + + @Override + public void onLaunchRecipientSheet(@NonNull Recipient pendingRecipient) { + CallLinkIncomingRequestSheet.show(getSupportFragmentManager(), pendingRecipient.getId()); + } } private class WindowLayoutInfoConsumer implements Consumer { @@ -1112,4 +1168,20 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan } } } + + private class FadeCallback implements ControlsAndInfoController.BottomSheetVisibilityListener { + + @Override + public void onShown() { + fullscreenHelper.showSystemUI(); + } + + @Override + public void onHidden() { + fullscreenHelper.hideSystemUI(); + if (videoTooltip != null) { + videoTooltip.dismiss(); + } + } + } } diff --git a/app/src/main/java/org/tm/archive/absbackup/backupables/SvrAuthTokens.kt b/app/src/main/java/org/tm/archive/absbackup/backupables/SvrAuthTokens.kt index dc2eb3f9..136709f0 100644 --- a/app/src/main/java/org/tm/archive/absbackup/backupables/SvrAuthTokens.kt +++ b/app/src/main/java/org/tm/archive/absbackup/backupables/SvrAuthTokens.kt @@ -1,10 +1,10 @@ package org.tm.archive.absbackup.backupables -import com.google.protobuf.InvalidProtocolBufferException import org.signal.core.util.logging.Log import org.tm.archive.absbackup.AndroidBackupItem import org.tm.archive.absbackup.protos.SvrAuthToken import org.tm.archive.keyvalue.SignalStore +import java.io.IOException /** * This backs up the not-secret KBS Auth tokens, which can be combined with a PIN to prove ownership of a phone number in order to complete the registration process. @@ -30,7 +30,7 @@ object SvrAuthTokens : AndroidBackupItem { val proto = SvrAuthToken.ADAPTER.decode(data) SignalStore.svr().putAuthTokenList(proto.tokens) - } catch (e: InvalidProtocolBufferException) { + } catch (e: IOException) { Log.w(TAG, "Cannot restore KbsAuthToken from backup service.") } } diff --git a/app/src/main/java/org/tm/archive/animation/ResizeAnimation.java b/app/src/main/java/org/tm/archive/animation/ResizeAnimation.java index ac92eca0..799fda61 100644 --- a/app/src/main/java/org/tm/archive/animation/ResizeAnimation.java +++ b/app/src/main/java/org/tm/archive/animation/ResizeAnimation.java @@ -1,5 +1,6 @@ package org.tm.archive.animation; +import android.graphics.Point; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; @@ -16,6 +17,10 @@ public class ResizeAnimation extends Animation { private int startWidth; private int startHeight; + public ResizeAnimation(@NonNull View target, @NonNull Point dimension) { + this(target, dimension.x, dimension.y); + } + public ResizeAnimation(@NonNull View target, int targetWidthPx, int targetHeightPx) { this.target = target; this.targetWidthPx = targetWidthPx; diff --git a/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateDownloadManagerReceiver.kt b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateDownloadManagerReceiver.kt new file mode 100644 index 00000000..85dc0569 --- /dev/null +++ b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateDownloadManagerReceiver.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.apkupdate + +import android.app.DownloadManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import org.signal.core.util.logging.Log +import org.tm.archive.keyvalue.SignalStore + +/** + * Provided to the DownloadManager as a callback receiver for when it has finished downloading the APK we're trying to install. + * + * Registered in the manifest to list to [DownloadManager.ACTION_DOWNLOAD_COMPLETE]. + */ +class ApkUpdateDownloadManagerReceiver : BroadcastReceiver() { + + companion object { + private val TAG = Log.tag(ApkUpdateDownloadManagerReceiver::class.java) + } + + override fun onReceive(context: Context, intent: Intent) { + Log.i(TAG, "onReceive()") + + if (DownloadManager.ACTION_DOWNLOAD_COMPLETE != intent.action) { + Log.i(TAG, "Unexpected action: " + intent.action) + return + } + + val downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -2) + if (downloadId != SignalStore.apkUpdate().downloadId) { + Log.w(TAG, "downloadId doesn't match the one we're waiting for! Ignoring.") + return + } + + ApkUpdateInstaller.installOrPromptForInstall(context, downloadId, userInitiated = false) + } +} diff --git a/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateInstaller.kt b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateInstaller.kt new file mode 100644 index 00000000..d952e44a --- /dev/null +++ b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateInstaller.kt @@ -0,0 +1,150 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.apkupdate + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInstaller +import android.os.Build +import org.signal.core.util.PendingIntentFlags +import org.signal.core.util.StreamUtil +import org.signal.core.util.getDownloadManager +import org.signal.core.util.logging.Log +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.jobs.ApkUpdateJob +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.util.Environment +import org.tm.archive.util.FileUtils +import java.io.FileInputStream +import java.io.IOException +import java.io.InputStream +import java.security.MessageDigest + +object ApkUpdateInstaller { + + private val TAG = Log.tag(ApkUpdateInstaller::class.java) + + /** + * Installs the downloaded APK silently if possible. If not, prompts the user with a notification to install. + * May show errors instead under certain conditions. + * + * A common pattern you may see is that this is called with [userInitiated] = false (or some other state + * that prevents us from auto-updating, like the app being in the foreground), causing this function + * to show an install prompt notification. The user clicks that notification, calling this with + * [userInitiated] = true, and then everything installs. + */ + fun installOrPromptForInstall(context: Context, downloadId: Long, userInitiated: Boolean) { + if (downloadId != SignalStore.apkUpdate().downloadId) { + Log.w(TAG, "DownloadId doesn't match the one we're waiting for (current: $downloadId, expected: ${SignalStore.apkUpdate().downloadId})! We likely have newer data. Ignoring.") + ApkUpdateNotifications.dismissInstallPrompt(context) + ApplicationDependencies.getJobManager().add(ApkUpdateJob()) + return + } + + val digest = SignalStore.apkUpdate().digest + if (digest == null) { + Log.w(TAG, "DownloadId matches, but digest is null! Inconsistent state. Failing and clearing state.") + SignalStore.apkUpdate().clearDownloadAttributes() + ApkUpdateNotifications.showInstallFailed(context, ApkUpdateNotifications.FailureReason.UNKNOWN) + return + } + + if (!isMatchingDigest(context, downloadId, digest)) { + Log.w(TAG, "DownloadId matches, but digest does not! Bad download or inconsistent state. Failing and clearing state.") + SignalStore.apkUpdate().clearDownloadAttributes() + ApkUpdateNotifications.showInstallFailed(context, ApkUpdateNotifications.FailureReason.UNKNOWN) + return + } + + if (!userInitiated && !shouldAutoUpdate()) { + Log.w(TAG, "Not user-initiated and not eligible for auto-update. Prompting. (API=${Build.VERSION.SDK_INT}, Foreground=${ApplicationDependencies.getAppForegroundObserver().isForegrounded}, AutoUpdate=${SignalStore.apkUpdate().autoUpdate})") + ApkUpdateNotifications.showInstallPrompt(context, downloadId) + return + } + + try { + installApk(context, downloadId, userInitiated) + } catch (e: IOException) { + Log.w(TAG, "Hit IOException when trying to install APK!", e) + SignalStore.apkUpdate().clearDownloadAttributes() + ApkUpdateNotifications.showInstallFailed(context, ApkUpdateNotifications.FailureReason.UNKNOWN) + } catch (e: SecurityException) { + Log.w(TAG, "Hit SecurityException when trying to install APK!", e) + SignalStore.apkUpdate().clearDownloadAttributes() + ApkUpdateNotifications.showInstallFailed(context, ApkUpdateNotifications.FailureReason.UNKNOWN) + } + } + + @Throws(IOException::class, SecurityException::class) + private fun installApk(context: Context, downloadId: Long, userInitiated: Boolean) { + val apkInputStream: InputStream? = getDownloadedApkInputStream(context, downloadId) + if (apkInputStream == null) { + Log.w(TAG, "Could not open download APK input stream!") + return + } + + Log.d(TAG, "Beginning APK install...") + val packageInstaller: PackageInstaller = context.packageManager.packageInstaller + + val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL).apply { + // At this point, we always want to set this if possible, since we've already prompted the user with our own notification when necessary. + // This lets us skip the system-generated notification. + if (Build.VERSION.SDK_INT >= 31) { + setRequireUserAction(PackageInstaller.SessionParams.USER_ACTION_NOT_REQUIRED) + } + } + + Log.d(TAG, "Creating install session...") + val sessionId: Int = packageInstaller.createSession(sessionParams) + val session: PackageInstaller.Session = packageInstaller.openSession(sessionId) + + Log.d(TAG, "Writing APK data...") + session.use { activeSession -> + val sessionOutputStream = activeSession.openWrite(context.packageName, 0, -1) + StreamUtil.copy(apkInputStream, sessionOutputStream) + } + + val installerPendingIntent = PendingIntent.getBroadcast( + context, + sessionId, + Intent(context, ApkUpdatePackageInstallerReceiver::class.java).apply { + putExtra(ApkUpdatePackageInstallerReceiver.EXTRA_USER_INITIATED, userInitiated) + putExtra(ApkUpdatePackageInstallerReceiver.EXTRA_DOWNLOAD_ID, downloadId) + }, + PendingIntentFlags.mutable() or PendingIntentFlags.updateCurrent() + ) + + Log.d(TAG, "Committing session...") + session.commit(installerPendingIntent.intentSender) + } + + private fun getDownloadedApkInputStream(context: Context, downloadId: Long): InputStream? { + return try { + FileInputStream(context.getDownloadManager().openDownloadedFile(downloadId).fileDescriptor) + } catch (e: IOException) { + Log.w(TAG, e) + null + } + } + + private fun isMatchingDigest(context: Context, downloadId: Long, expectedDigest: ByteArray): Boolean { + return try { + FileInputStream(context.getDownloadManager().openDownloadedFile(downloadId).fileDescriptor).use { stream -> + val digest = FileUtils.getFileDigest(stream) + MessageDigest.isEqual(digest, expectedDigest) + } + } catch (e: IOException) { + Log.w(TAG, e) + false + } + } + + private fun shouldAutoUpdate(): Boolean { + // TODO Auto-updates temporarily restricted to nightlies. Once we have designs for allowing users to opt-out of auto-updates, we can re-enable this + return Environment.IS_NIGHTLY && Build.VERSION.SDK_INT >= 31 && SignalStore.apkUpdate().autoUpdate && !ApplicationDependencies.getAppForegroundObserver().isForegrounded + } +} diff --git a/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateNotificationReceiver.kt b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateNotificationReceiver.kt new file mode 100644 index 00000000..42abdf01 --- /dev/null +++ b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateNotificationReceiver.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.apkupdate + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import org.signal.core.util.logging.Log + +/** + * Receiver that is triggered based on various notification actions that can be taken on update-related notifications. + */ +class ApkUpdateNotificationReceiver : BroadcastReceiver() { + + companion object { + private val TAG = Log.tag(ApkUpdateNotificationReceiver::class.java) + + const val ACTION_INITIATE_INSTALL = "signal.apk_update_notification.initiate_install" + const val EXTRA_DOWNLOAD_ID = "signal.download_id" + } + + override fun onReceive(context: Context, intent: Intent?) { + if (intent == null) { + Log.w(TAG, "Null intent") + return + } + + val downloadId: Long = intent.getLongExtra(EXTRA_DOWNLOAD_ID, -2) + + when (val action: String? = intent.action) { + ACTION_INITIATE_INSTALL -> handleInstall(context, downloadId) + else -> Log.w(TAG, "Unrecognized notification action: $action") + } + } + + private fun handleInstall(context: Context, downloadId: Long) { + Log.i(TAG, "Got action to install.") + ApkUpdateInstaller.installOrPromptForInstall(context, downloadId, userInitiated = true) + } +} diff --git a/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateNotifications.kt b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateNotifications.kt new file mode 100644 index 00000000..518f6e26 --- /dev/null +++ b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateNotifications.kt @@ -0,0 +1,118 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.apkupdate + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import org.signal.core.util.PendingIntentFlags +import org.signal.core.util.logging.Log +import org.tm.archive.MainActivity +import org.tm.archive.R +import org.tm.archive.notifications.NotificationChannels +import org.tm.archive.notifications.NotificationIds +import org.tm.archive.util.ServiceUtil + +object ApkUpdateNotifications { + + val TAG = Log.tag(ApkUpdateNotifications::class.java) + + /** + * Shows a notification to prompt the user to install the app update. Only shown when silently auto-updating is not possible or are disabled by the user. + * Note: This is an 'ongoing' notification (i.e. not-user dismissable) and never dismissed programatically. This is because the act of installing the APK + * will dismiss it for us. + */ + @SuppressLint("LaunchActivityFromNotification") + fun showInstallPrompt(context: Context, downloadId: Long) { + Log.d(TAG, "Showing install prompt. DownloadId: $downloadId") + ServiceUtil.getNotificationManager(context).cancel(NotificationIds.APK_UPDATE_FAILED_INSTALL) + + val pendingIntent = PendingIntent.getBroadcast( + context, + 1, + Intent(context, ApkUpdateNotificationReceiver::class.java).apply { + action = ApkUpdateNotificationReceiver.ACTION_INITIATE_INSTALL + putExtra(ApkUpdateNotificationReceiver.EXTRA_DOWNLOAD_ID, downloadId) + }, + PendingIntentFlags.updateCurrent() + ) + + val notification = NotificationCompat.Builder(context, NotificationChannels.getInstance().APP_UPDATES) + .setOngoing(true) + .setContentTitle(context.getString(R.string.ApkUpdateNotifications_prompt_install_title)) + .setContentText(context.getString(R.string.ApkUpdateNotifications_prompt_install_body)) + .setSmallIcon(R.drawable.ic_notification) + .setColor(ContextCompat.getColor(context, R.color.core_ultramarine)) + .setContentIntent(pendingIntent) + .build() + + ServiceUtil.getNotificationManager(context).notify(NotificationIds.APK_UPDATE_PROMPT_INSTALL, notification) + } + + fun dismissInstallPrompt(context: Context) { + Log.d(TAG, "Dismissing install prompt.") + ServiceUtil.getNotificationManager(context).cancel(NotificationIds.APK_UPDATE_PROMPT_INSTALL) + } + + fun showInstallFailed(context: Context, reason: FailureReason) { + Log.d(TAG, "Showing failed notification. Reason: $reason") + ServiceUtil.getNotificationManager(context).cancel(NotificationIds.APK_UPDATE_PROMPT_INSTALL) + + val pendingIntent = PendingIntent.getActivity( + context, + 0, + Intent(context, MainActivity::class.java), + PendingIntentFlags.immutable() + ) + + val notification = NotificationCompat.Builder(context, NotificationChannels.getInstance().APP_UPDATES) + .setContentTitle(context.getString(R.string.ApkUpdateNotifications_failed_general_title)) + .setContentText(context.getString(R.string.ApkUpdateNotifications_failed_general_body)) + .setSmallIcon(R.drawable.ic_notification) + .setColor(ContextCompat.getColor(context, R.color.core_ultramarine)) + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .build() + + ServiceUtil.getNotificationManager(context).notify(NotificationIds.APK_UPDATE_FAILED_INSTALL, notification) + } + + fun showAutoUpdateSuccess(context: Context) { + val pendingIntent = PendingIntent.getActivity( + context, + 0, + Intent(context, MainActivity::class.java), + PendingIntentFlags.immutable() + ) + + val appVersionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName + + val notification = NotificationCompat.Builder(context, NotificationChannels.getInstance().APP_UPDATES) + .setContentTitle(context.getString(R.string.ApkUpdateNotifications_auto_update_success_title)) + .setContentText(context.getString(R.string.ApkUpdateNotifications_auto_update_success_body, appVersionName)) + .setSmallIcon(R.drawable.ic_notification) + .setColor(ContextCompat.getColor(context, R.color.core_ultramarine)) + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .build() + + ServiceUtil.getNotificationManager(context).notify(NotificationIds.APK_UPDATE_SUCCESSFUL_INSTALL, notification) + } + + enum class FailureReason { + UNKNOWN, + ABORTED, + BLOCKED, + INCOMPATIBLE, + INVALID, + CONFLICT, + STORAGE, + TIMEOUT + } +} diff --git a/app/src/main/java/org/tm/archive/apkupdate/ApkUpdatePackageInstallerReceiver.kt b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdatePackageInstallerReceiver.kt new file mode 100644 index 00000000..602fefe0 --- /dev/null +++ b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdatePackageInstallerReceiver.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.apkupdate + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInstaller +import org.signal.core.util.getParcelableExtraCompat +import org.signal.core.util.logging.Log +import org.tm.archive.apkupdate.ApkUpdateNotifications.FailureReason +import org.tm.archive.keyvalue.SignalStore + +/** + * This is the receiver that is triggered by the [PackageInstaller] to notify of various events. Package installation is initiated + * in [ApkUpdateInstaller]. + */ +class ApkUpdatePackageInstallerReceiver : BroadcastReceiver() { + + companion object { + private val TAG = Log.tag(ApkUpdatePackageInstallerReceiver::class.java) + + const val EXTRA_USER_INITIATED = "signal.user_initiated" + const val EXTRA_DOWNLOAD_ID = "signal.download_id" + } + + override fun onReceive(context: Context, intent: Intent?) { + val statusCode: Int = intent?.getIntExtra(PackageInstaller.EXTRA_STATUS, -1) ?: -1 + val statusMessage: String? = intent?.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + val userInitiated = intent?.getBooleanExtra(EXTRA_USER_INITIATED, false) ?: false + + Log.w(TAG, "[onReceive] Status: $statusCode, Message: $statusMessage") + + when (statusCode) { + PackageInstaller.STATUS_SUCCESS -> { + if (SignalStore.apkUpdate().lastApkUploadTime != SignalStore.apkUpdate().pendingApkUploadTime) { + Log.i(TAG, "Update installed successfully! Updating our lastApkUploadTime to ${SignalStore.apkUpdate().pendingApkUploadTime}") + SignalStore.apkUpdate().lastApkUploadTime = SignalStore.apkUpdate().pendingApkUploadTime + ApkUpdateNotifications.showAutoUpdateSuccess(context) + } else { + Log.i(TAG, "Spurious 'success' notification?") + } + } + PackageInstaller.STATUS_PENDING_USER_ACTION -> handlePendingUserAction(context, userInitiated, intent!!) + PackageInstaller.STATUS_FAILURE_ABORTED -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.ABORTED) + PackageInstaller.STATUS_FAILURE_BLOCKED -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.BLOCKED) + PackageInstaller.STATUS_FAILURE_INCOMPATIBLE -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.INCOMPATIBLE) + PackageInstaller.STATUS_FAILURE_INVALID -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.INVALID) + PackageInstaller.STATUS_FAILURE_CONFLICT -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.CONFLICT) + PackageInstaller.STATUS_FAILURE_STORAGE -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.STORAGE) + PackageInstaller.STATUS_FAILURE_TIMEOUT -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.TIMEOUT) + PackageInstaller.STATUS_FAILURE -> ApkUpdateNotifications.showInstallFailed(context, FailureReason.UNKNOWN) + else -> Log.w(TAG, "Unknown status! $statusCode") + } + } + + private fun handlePendingUserAction(context: Context, userInitiated: Boolean, intent: Intent) { + val downloadId = intent.getLongExtra(EXTRA_DOWNLOAD_ID, -2) + + if (!userInitiated) { + Log.w(TAG, "Not user-initiated, but needs user action! Showing prompt notification.") + ApkUpdateNotifications.showInstallPrompt(context, downloadId) + return + } + + val promptIntent: Intent? = intent.getParcelableExtraCompat(Intent.EXTRA_INTENT, Intent::class.java) + if (promptIntent == null) { + Log.w(TAG, "Missing prompt intent! Showing prompt notification instead.") + ApkUpdateNotifications.showInstallPrompt(context, downloadId) + return + } + + promptIntent.apply { + putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) + putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, "com.android.vending") + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + context.startActivity(promptIntent) + } +} diff --git a/app/src/main/java/org/tm/archive/service/UpdateApkRefreshListener.java b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateRefreshListener.java similarity index 54% rename from app/src/main/java/org/tm/archive/service/UpdateApkRefreshListener.java rename to app/src/main/java/org/tm/archive/apkupdate/ApkUpdateRefreshListener.java index 889fdb40..695ae169 100644 --- a/app/src/main/java/org/tm/archive/service/UpdateApkRefreshListener.java +++ b/app/src/main/java/org/tm/archive/apkupdate/ApkUpdateRefreshListener.java @@ -1,22 +1,28 @@ -package org.tm.archive.service; +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.apkupdate; import android.content.Context; -import android.content.Intent; import org.signal.core.util.logging.Log; import org.tm.archive.BuildConfig; import org.tm.archive.dependencies.ApplicationDependencies; -import org.tm.archive.jobs.UpdateApkJob; +import org.tm.archive.jobs.ApkUpdateJob; +import org.tm.archive.service.PersistentAlarmManagerListener; +import org.tm.archive.util.Environment; import org.tm.archive.util.TextSecurePreferences; import java.util.concurrent.TimeUnit; -public class UpdateApkRefreshListener extends PersistentAlarmManagerListener { +public class ApkUpdateRefreshListener extends PersistentAlarmManagerListener { - private static final String TAG = Log.tag(UpdateApkRefreshListener.class); + private static final String TAG = Log.tag(ApkUpdateRefreshListener.class); - private static final long INTERVAL = TimeUnit.HOURS.toMillis(6); + private static final long INTERVAL = Environment.IS_NIGHTLY ? TimeUnit.HOURS.toMillis(2) : TimeUnit.HOURS.toMillis(6); @Override protected long getNextScheduledExecutionTime(Context context) { @@ -27,9 +33,9 @@ public class UpdateApkRefreshListener extends PersistentAlarmManagerListener { protected long onAlarm(Context context, long scheduledTime) { Log.i(TAG, "onAlarm..."); - if (scheduledTime != 0 && BuildConfig.PLAY_STORE_DISABLED) { + if (scheduledTime != 0 && BuildConfig.MANAGES_APP_UPDATES) { Log.i(TAG, "Queueing APK update job..."); - ApplicationDependencies.getJobManager().add(new UpdateApkJob()); + ApplicationDependencies.getJobManager().add(new ApkUpdateJob()); } long newTime = System.currentTimeMillis() + INTERVAL; @@ -39,7 +45,7 @@ public class UpdateApkRefreshListener extends PersistentAlarmManagerListener { } public static void schedule(Context context) { - new UpdateApkRefreshListener().onReceive(context, getScheduleIntent()); + new ApkUpdateRefreshListener().onReceive(context, getScheduleIntent()); } } diff --git a/app/src/main/java/org/tm/archive/attachments/Attachment.java b/app/src/main/java/org/tm/archive/attachments/Attachment.java deleted file mode 100644 index d63551a5..00000000 --- a/app/src/main/java/org/tm/archive/attachments/Attachment.java +++ /dev/null @@ -1,234 +0,0 @@ -package org.tm.archive.attachments; - -import android.net.Uri; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.tm.archive.audio.AudioHash; -import org.tm.archive.blurhash.BlurHash; -import org.tm.archive.database.AttachmentTable; -import org.tm.archive.database.AttachmentTable.TransformProperties; -import org.tm.archive.stickers.StickerLocator; - -public abstract class Attachment { - - @NonNull - private final String contentType; - private final int transferState; - private final long size; - - @Nullable - private final String fileName; - - private final int cdnNumber; - - @Nullable - private final String location; - - @Nullable - private final String key; - - @Nullable - private final String relay; - - @Nullable - private final byte[] digest; - - @Nullable - private final byte[] incrementalDigest; - - @Nullable - private final String fastPreflightId; - - private final boolean voiceNote; - private final boolean borderless; - private final boolean videoGif; - private final int width; - private final int height; - private final boolean quote; - private final long uploadTimestamp; - - @Nullable - private final String caption; - - @Nullable - private final StickerLocator stickerLocator; - - @Nullable - private final BlurHash blurHash; - - @Nullable - private final AudioHash audioHash; - - @NonNull - private final TransformProperties transformProperties; - - public Attachment(@NonNull String contentType, - int transferState, - long size, - @Nullable String fileName, - int cdnNumber, - @Nullable String location, - @Nullable String key, - @Nullable String relay, - @Nullable byte[] digest, - @Nullable byte[] incrementalDigest, - @Nullable String fastPreflightId, - boolean voiceNote, - boolean borderless, - boolean videoGif, - int width, - int height, - boolean quote, - long uploadTimestamp, - @Nullable String caption, - @Nullable StickerLocator stickerLocator, - @Nullable BlurHash blurHash, - @Nullable AudioHash audioHash, - @Nullable TransformProperties transformProperties) - { - this.contentType = contentType; - this.transferState = transferState; - this.size = size; - this.fileName = fileName; - this.cdnNumber = cdnNumber; - this.location = location; - this.key = key; - this.relay = relay; - this.digest = digest; - this.incrementalDigest = incrementalDigest; - this.fastPreflightId = fastPreflightId; - this.voiceNote = voiceNote; - this.borderless = borderless; - this.videoGif = videoGif; - this.width = width; - this.height = height; - this.quote = quote; - this.uploadTimestamp = uploadTimestamp; - this.stickerLocator = stickerLocator; - this.caption = caption; - this.blurHash = blurHash; - this.audioHash = audioHash; - this.transformProperties = transformProperties != null ? transformProperties : TransformProperties.empty(); - } - - @Nullable - public abstract Uri getUri(); - - public abstract @Nullable Uri getPublicUri(); - - public int getTransferState() { - return transferState; - } - - public boolean isInProgress() { - return transferState != AttachmentTable.TRANSFER_PROGRESS_DONE && - transferState != AttachmentTable.TRANSFER_PROGRESS_FAILED && - transferState != AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE; - } - - public boolean isPermanentlyFailed() { - return transferState == AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE; - } - - public long getSize() { - return size; - } - - @Nullable - public String getFileName() { - return fileName; - } - - @NonNull - public String getContentType() { - return contentType; - } - - public int getCdnNumber() { - return cdnNumber; - } - - @Nullable - public String getLocation() { - return location; - } - - @Nullable - public String getKey() { - return key; - } - - @Nullable - public String getRelay() { - return relay; - } - - @Nullable - public byte[] getDigest() { - return digest; - } - - @Nullable - public byte[] getIncrementalDigest() { - return incrementalDigest; - } - - @Nullable - public String getFastPreflightId() { - return fastPreflightId; - } - - public boolean isVoiceNote() { - return voiceNote; - } - - public boolean isBorderless() { - return borderless; - } - - public boolean isVideoGif() { - return videoGif; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public boolean isQuote() { - return quote; - } - - public long getUploadTimestamp() { - return uploadTimestamp; - } - - public boolean isSticker() { - return stickerLocator != null; - } - - public @Nullable StickerLocator getSticker() { - return stickerLocator; - } - - public @Nullable BlurHash getBlurHash() { - return blurHash; - } - - public @Nullable AudioHash getAudioHash() { - return audioHash; - } - - public @Nullable String getCaption() { - return caption; - } - - public @NonNull TransformProperties getTransformProperties() { - return transformProperties; - } -} diff --git a/app/src/main/java/org/tm/archive/attachments/Attachment.kt b/app/src/main/java/org/tm/archive/attachments/Attachment.kt new file mode 100644 index 00000000..2c32672f --- /dev/null +++ b/app/src/main/java/org/tm/archive/attachments/Attachment.kt @@ -0,0 +1,152 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ +package org.tm.archive.attachments + +import android.net.Uri +import android.os.Parcel +import android.os.Parcelable +import androidx.core.os.ParcelCompat +import org.tm.archive.audio.AudioHash +import org.tm.archive.blurhash.BlurHash +import org.tm.archive.database.AttachmentTable +import org.tm.archive.database.AttachmentTable.TransformProperties +import org.tm.archive.stickers.StickerLocator +import org.tm.archive.util.ParcelUtil + +/** + * Note: We have to use our own Parcelable implementation because we need to do custom stuff to preserve + * subclass information. + */ +abstract class Attachment( + @JvmField + val contentType: String, + @JvmField + val transferState: Int, + @JvmField + val size: Long, + @JvmField + val fileName: String?, + @JvmField + val cdnNumber: Int, + @JvmField + val remoteLocation: String?, + @JvmField + val remoteKey: String?, + @JvmField + val remoteDigest: ByteArray?, + @JvmField + val incrementalDigest: ByteArray?, + @JvmField + val fastPreflightId: String?, + @JvmField + val voiceNote: Boolean, + @JvmField + val borderless: Boolean, + @JvmField + val videoGif: Boolean, + @JvmField + val width: Int, + @JvmField + val height: Int, + @JvmField + val incrementalMacChunkSize: Int, + @JvmField + val quote: Boolean, + @JvmField + val uploadTimestamp: Long, + @JvmField + val caption: String?, + @JvmField + val stickerLocator: StickerLocator?, + @JvmField + val blurHash: BlurHash?, + @JvmField + val audioHash: AudioHash?, + @JvmField + val transformProperties: TransformProperties? +) : Parcelable { + + abstract val uri: Uri? + abstract val publicUri: Uri? + + protected constructor(parcel: Parcel) : this( + contentType = parcel.readString()!!, + transferState = parcel.readInt(), + size = parcel.readLong(), + fileName = parcel.readString(), + cdnNumber = parcel.readInt(), + remoteLocation = parcel.readString(), + remoteKey = parcel.readString(), + remoteDigest = ParcelUtil.readByteArray(parcel), + incrementalDigest = ParcelUtil.readByteArray(parcel), + fastPreflightId = parcel.readString(), + voiceNote = ParcelUtil.readBoolean(parcel), + borderless = ParcelUtil.readBoolean(parcel), + videoGif = ParcelUtil.readBoolean(parcel), + width = parcel.readInt(), + height = parcel.readInt(), + incrementalMacChunkSize = parcel.readInt(), + quote = ParcelUtil.readBoolean(parcel), + uploadTimestamp = parcel.readLong(), + caption = parcel.readString(), + stickerLocator = ParcelCompat.readParcelable(parcel, StickerLocator::class.java.classLoader, StickerLocator::class.java), + blurHash = ParcelCompat.readParcelable(parcel, BlurHash::class.java.classLoader, BlurHash::class.java), + audioHash = ParcelCompat.readParcelable(parcel, AudioHash::class.java.classLoader, AudioHash::class.java), + transformProperties = ParcelCompat.readParcelable(parcel, TransformProperties::class.java.classLoader, TransformProperties::class.java) + ) + + override fun writeToParcel(dest: Parcel, flags: Int) { + AttachmentCreator.writeSubclass(dest, this) + dest.writeString(contentType) + dest.writeInt(transferState) + dest.writeLong(size) + dest.writeString(fileName) + dest.writeInt(cdnNumber) + dest.writeString(remoteLocation) + dest.writeString(remoteKey) + ParcelUtil.writeByteArray(dest, remoteDigest) + ParcelUtil.writeByteArray(dest, incrementalDigest) + dest.writeString(fastPreflightId) + ParcelUtil.writeBoolean(dest, voiceNote) + ParcelUtil.writeBoolean(dest, borderless) + ParcelUtil.writeBoolean(dest, videoGif) + dest.writeInt(width) + dest.writeInt(height) + dest.writeInt(incrementalMacChunkSize) + ParcelUtil.writeBoolean(dest, quote) + dest.writeLong(uploadTimestamp) + dest.writeString(caption) + dest.writeParcelable(stickerLocator, 0) + dest.writeParcelable(blurHash, 0) + dest.writeParcelable(audioHash, 0) + dest.writeParcelable(transformProperties, 0) + } + + override fun describeContents(): Int { + return 0 + } + + val isInProgress: Boolean + get() = transferState != AttachmentTable.TRANSFER_PROGRESS_DONE && transferState != AttachmentTable.TRANSFER_PROGRESS_FAILED && transferState != AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE + + val isPermanentlyFailed: Boolean + get() = transferState == AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE + + val isSticker: Boolean + get() = stickerLocator != null + + fun getIncrementalDigest(): ByteArray? { + return if (incrementalDigest != null && incrementalDigest.size > 0) { + incrementalDigest + } else { + null + } + } + + companion object { + @JvmField + val CREATOR: Parcelable.Creator = AttachmentCreator + } +} diff --git a/app/src/main/java/org/tm/archive/attachments/AttachmentCreator.kt b/app/src/main/java/org/tm/archive/attachments/AttachmentCreator.kt new file mode 100644 index 00000000..d03f45c8 --- /dev/null +++ b/app/src/main/java/org/tm/archive/attachments/AttachmentCreator.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.attachments + +import android.os.Parcel +import android.os.Parcelable + +/** + * Parcelable Creator for Attachments. Encapsulates the logic around dealing with + * subclasses, since Attachment is abstract and has several children. + */ +object AttachmentCreator : Parcelable.Creator { + enum class Subclass(val clazz: Class, val code: String) { + DATABASE(DatabaseAttachment::class.java, "database"), + POINTER(PointerAttachment::class.java, "pointer"), + TOMBSTONE(TombstoneAttachment::class.java, "tombstone"), + URI(UriAttachment::class.java, "uri") + } + + @JvmStatic + fun writeSubclass(dest: Parcel, instance: Attachment) { + val subclass = Subclass.values().firstOrNull { it.clazz == instance::class.java } ?: error("Unexpected subtype ${instance::class.java.simpleName}") + dest.writeString(subclass.code) + } + + override fun createFromParcel(source: Parcel): Attachment { + val rawCode = source.readString()!! + + return when (Subclass.values().first { rawCode == it.code }) { + Subclass.DATABASE -> DatabaseAttachment(source) + Subclass.POINTER -> PointerAttachment(source) + Subclass.TOMBSTONE -> TombstoneAttachment(source) + Subclass.URI -> UriAttachment(source) + } + } + + override fun newArray(size: Int): Array = arrayOfNulls(size) +} diff --git a/app/src/main/java/org/tm/archive/attachments/AttachmentId.java b/app/src/main/java/org/tm/archive/attachments/AttachmentId.java deleted file mode 100644 index 1c038c36..00000000 --- a/app/src/main/java/org/tm/archive/attachments/AttachmentId.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.tm.archive.attachments; - -import android.os.Parcel; -import android.os.Parcelable; - -import androidx.annotation.NonNull; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import org.tm.archive.util.Util; - -public class AttachmentId implements Parcelable { - - @JsonProperty - private final long rowId; - - @JsonProperty - private final long uniqueId; - - public AttachmentId(@JsonProperty("rowId") long rowId, @JsonProperty("uniqueId") long uniqueId) { - this.rowId = rowId; - this.uniqueId = uniqueId; - } - - private AttachmentId(Parcel in) { - this.rowId = in.readLong(); - this.uniqueId = in.readLong(); - } - - public long getRowId() { - return rowId; - } - - public long getUniqueId() { - return uniqueId; - } - - public String[] toStrings() { - return new String[] {String.valueOf(rowId), String.valueOf(uniqueId)}; - } - - public @NonNull String toString() { - return "AttachmentId::(" + rowId + ", " + uniqueId + ")"; - } - - public boolean isValid() { - return rowId >= 0 && uniqueId >= 0; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - AttachmentId attachmentId = (AttachmentId)o; - - if (rowId != attachmentId.rowId) return false; - return uniqueId == attachmentId.uniqueId; - } - - @Override - public int hashCode() { - return Util.hashCode(rowId, uniqueId); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeLong(rowId); - dest.writeLong(uniqueId); - } - - public static final Creator CREATOR = new Creator() { - @Override - public AttachmentId createFromParcel(Parcel in) { - return new AttachmentId(in); - } - - @Override - public AttachmentId[] newArray(int size) { - return new AttachmentId[size]; - } - }; - -} diff --git a/app/src/main/java/org/tm/archive/attachments/AttachmentId.kt b/app/src/main/java/org/tm/archive/attachments/AttachmentId.kt new file mode 100644 index 00000000..0879e976 --- /dev/null +++ b/app/src/main/java/org/tm/archive/attachments/AttachmentId.kt @@ -0,0 +1,20 @@ +package org.tm.archive.attachments + +import android.os.Parcelable +import com.fasterxml.jackson.annotation.JsonProperty +import kotlinx.parcelize.Parcelize + +@Parcelize +data class AttachmentId( + @JsonProperty("rowId") + @JvmField + val id: Long +) : Parcelable { + + val isValid: Boolean + get() = id >= 0 + + override fun toString(): String { + return "AttachmentId::$id" + } +} diff --git a/app/src/main/java/org/tm/archive/attachments/DatabaseAttachment.java b/app/src/main/java/org/tm/archive/attachments/DatabaseAttachment.java deleted file mode 100644 index 8ae14028..00000000 --- a/app/src/main/java/org/tm/archive/attachments/DatabaseAttachment.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.tm.archive.attachments; - -import android.net.Uri; - -import androidx.annotation.Nullable; - -import org.tm.archive.audio.AudioHash; -import org.tm.archive.blurhash.BlurHash; -import org.tm.archive.database.AttachmentTable.TransformProperties; -import org.tm.archive.mms.PartAuthority; -import org.tm.archive.stickers.StickerLocator; - -import java.util.Comparator; - -public class DatabaseAttachment extends Attachment { - - private final AttachmentId attachmentId; - private final long mmsId; - private final boolean hasData; - private final boolean hasThumbnail; - private final int displayOrder; - - public DatabaseAttachment(AttachmentId attachmentId, - long mmsId, - boolean hasData, - boolean hasThumbnail, - String contentType, - int transferProgress, - long size, - String fileName, - int cdnNumber, - String location, - String key, - String relay, - byte[] digest, - byte[] incrementalDigest, - String fastPreflightId, - boolean voiceNote, - boolean borderless, - boolean videoGif, - int width, - int height, - boolean quote, - @Nullable String caption, - @Nullable StickerLocator stickerLocator, - @Nullable BlurHash blurHash, - @Nullable AudioHash audioHash, - @Nullable TransformProperties transformProperties, - int displayOrder, - long uploadTimestamp) - { - super(contentType, transferProgress, size, fileName, cdnNumber, location, key, relay, digest, incrementalDigest, fastPreflightId, voiceNote, borderless, videoGif, width, height, quote, uploadTimestamp, caption, stickerLocator, blurHash, audioHash, transformProperties); - this.attachmentId = attachmentId; - this.hasData = hasData; - this.hasThumbnail = hasThumbnail; - this.mmsId = mmsId; - this.displayOrder = displayOrder; - } - - @Override - @Nullable - public Uri getUri() { - if (hasData) { - return PartAuthority.getAttachmentDataUri(attachmentId); - } else { - return null; - } - } - - @Override - public @Nullable Uri getPublicUri() { - if (hasData) { - return PartAuthority.getAttachmentPublicUri(getUri()); - } else { - return null; - } - } - - public AttachmentId getAttachmentId() { - return attachmentId; - } - - public int getDisplayOrder() { - return displayOrder; - } - - @Override - public boolean equals(Object other) { - return other != null && - other instanceof DatabaseAttachment && - ((DatabaseAttachment) other).attachmentId.equals(this.attachmentId); - } - - @Override - public int hashCode() { - return attachmentId.hashCode(); - } - - public long getMmsId() { - return mmsId; - } - - public boolean hasData() { - return hasData; - } - - public boolean hasThumbnail() { - return hasThumbnail; - } - - public static class DisplayOrderComparator implements Comparator { - @Override - public int compare(DatabaseAttachment lhs, DatabaseAttachment rhs) { - return Integer.compare(lhs.getDisplayOrder(), rhs.getDisplayOrder()); - } - } -} diff --git a/app/src/main/java/org/tm/archive/attachments/DatabaseAttachment.kt b/app/src/main/java/org/tm/archive/attachments/DatabaseAttachment.kt new file mode 100644 index 00000000..13b09eee --- /dev/null +++ b/app/src/main/java/org/tm/archive/attachments/DatabaseAttachment.kt @@ -0,0 +1,133 @@ +package org.tm.archive.attachments + +import android.net.Uri +import android.os.Parcel +import androidx.core.os.ParcelCompat +import org.tm.archive.audio.AudioHash +import org.tm.archive.blurhash.BlurHash +import org.tm.archive.database.AttachmentTable.TransformProperties +import org.tm.archive.mms.PartAuthority +import org.tm.archive.stickers.StickerLocator +import org.tm.archive.util.FeatureFlags +import org.tm.archive.util.ParcelUtil + +class DatabaseAttachment : Attachment { + + @JvmField + val attachmentId: AttachmentId + + @JvmField + val mmsId: Long + + @JvmField + val hasData: Boolean + + private val hasThumbnail: Boolean + val displayOrder: Int + + constructor( + attachmentId: AttachmentId, + mmsId: Long, + hasData: Boolean, + hasThumbnail: Boolean, + contentType: String?, + transferProgress: Int, + size: Long, + fileName: String?, + cdnNumber: Int, + location: String?, + key: String?, + digest: ByteArray?, + incrementalDigest: ByteArray?, + incrementalMacChunkSize: Int, + fastPreflightId: String?, + voiceNote: Boolean, + borderless: Boolean, + videoGif: Boolean, + width: Int, + height: Int, + quote: Boolean, + caption: String?, + stickerLocator: StickerLocator?, + blurHash: BlurHash?, + audioHash: AudioHash?, + transformProperties: TransformProperties?, + displayOrder: Int, + uploadTimestamp: Long + ) : super( + contentType = contentType!!, + transferState = transferProgress, + size = size, + fileName = fileName, + cdnNumber = cdnNumber, + remoteLocation = location, + remoteKey = key, + remoteDigest = digest, + incrementalDigest = incrementalDigest, + fastPreflightId = fastPreflightId, + voiceNote = voiceNote, + borderless = borderless, + videoGif = videoGif, width = width, + height = height, + incrementalMacChunkSize = incrementalMacChunkSize, + quote = quote, + uploadTimestamp = uploadTimestamp, + caption = caption, + stickerLocator = stickerLocator, + blurHash = blurHash, + audioHash = audioHash, + transformProperties = transformProperties + ) { + this.attachmentId = attachmentId + this.mmsId = mmsId + this.hasData = hasData + this.hasThumbnail = hasThumbnail + this.displayOrder = displayOrder + } + + constructor(parcel: Parcel) : super(parcel) { + attachmentId = ParcelCompat.readParcelable(parcel, AttachmentId::class.java.classLoader, AttachmentId::class.java)!! + hasData = ParcelUtil.readBoolean(parcel) + hasThumbnail = ParcelUtil.readBoolean(parcel) + mmsId = parcel.readLong() + displayOrder = parcel.readInt() + } + + override fun writeToParcel(dest: Parcel, flags: Int) { + super.writeToParcel(dest, flags) + dest.writeParcelable(attachmentId, 0) + ParcelUtil.writeBoolean(dest, hasData) + ParcelUtil.writeBoolean(dest, hasThumbnail) + dest.writeLong(mmsId) + dest.writeInt(displayOrder) + } + + override val uri: Uri? + get() = if (hasData || FeatureFlags.instantVideoPlayback() && getIncrementalDigest() != null) { + PartAuthority.getAttachmentDataUri(attachmentId) + } else { + null + } + + override val publicUri: Uri? + get() = if (hasData) { + PartAuthority.getAttachmentPublicUri(uri) + } else { + null + } + + override fun equals(other: Any?): Boolean { + return other != null && + other is DatabaseAttachment && other.attachmentId == attachmentId + } + + override fun hashCode(): Int { + return attachmentId.hashCode() + } + + class DisplayOrderComparator : Comparator { + override fun compare(lhs: DatabaseAttachment, rhs: DatabaseAttachment): Int { + return lhs.displayOrder.compareTo(rhs.displayOrder) + } + } +} diff --git a/app/src/main/java/org/tm/archive/attachments/MmsNotificationAttachment.java b/app/src/main/java/org/tm/archive/attachments/MmsNotificationAttachment.java deleted file mode 100644 index 22d72a86..00000000 --- a/app/src/main/java/org/tm/archive/attachments/MmsNotificationAttachment.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.tm.archive.attachments; - - -import android.net.Uri; - -import androidx.annotation.Nullable; - -import org.tm.archive.database.AttachmentTable; -import org.tm.archive.database.MessageTable; - -public class MmsNotificationAttachment extends Attachment { - - public MmsNotificationAttachment(int status, long size) { - super("application/mms", getTransferStateFromStatus(status), size, null, 0, null, null, null, null, null, null, false, false, false, 0, 0, false, 0, null, null, null, null, null); - } - - @Nullable - @Override - public Uri getUri() { - return null; - } - - @Override - public @Nullable Uri getPublicUri() { - return null; - } - - private static int getTransferStateFromStatus(int status) { - if (status == MessageTable.MmsStatus.DOWNLOAD_INITIALIZED || - status == MessageTable.MmsStatus.DOWNLOAD_NO_CONNECTIVITY) - { - return AttachmentTable.TRANSFER_PROGRESS_PENDING; - } else if (status == MessageTable.MmsStatus.DOWNLOAD_CONNECTING) { - return AttachmentTable.TRANSFER_PROGRESS_STARTED; - } else { - return AttachmentTable.TRANSFER_PROGRESS_FAILED; - } - } -} diff --git a/app/src/main/java/org/tm/archive/attachments/PointerAttachment.java b/app/src/main/java/org/tm/archive/attachments/PointerAttachment.java deleted file mode 100644 index 1a978b7e..00000000 --- a/app/src/main/java/org/tm/archive/attachments/PointerAttachment.java +++ /dev/null @@ -1,184 +0,0 @@ -package org.tm.archive.attachments; - -import android.net.Uri; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.tm.archive.blurhash.BlurHash; -import org.tm.archive.database.AttachmentTable; -import org.tm.archive.stickers.StickerLocator; -import org.tm.archive.util.Base64; -import org.whispersystems.signalservice.api.InvalidMessageStructureException; -import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; -import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; -import org.whispersystems.signalservice.api.util.AttachmentPointerUtil; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; - -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; - -public class PointerAttachment extends Attachment { - - private PointerAttachment(@NonNull String contentType, - int transferState, - long size, - @Nullable String fileName, - int cdnNumber, - @NonNull String location, - @Nullable String key, - @Nullable String relay, - @Nullable byte[] digest, - @Nullable byte[] incrementalDigest, - @Nullable String fastPreflightId, - boolean voiceNote, - boolean borderless, - boolean videoGif, - int width, - int height, - long uploadTimestamp, - @Nullable String caption, - @Nullable StickerLocator stickerLocator, - @Nullable BlurHash blurHash) - { - super(contentType, transferState, size, fileName, cdnNumber, location, key, relay, digest, incrementalDigest, fastPreflightId, voiceNote, borderless, videoGif, width, height, false, uploadTimestamp, caption, stickerLocator, blurHash, null, null); - } - - @Nullable - @Override - public Uri getUri() { - return null; - } - - @Override - public @Nullable Uri getPublicUri() { - return null; - } - - public static List forPointers(Optional> pointers) { - List results = new LinkedList<>(); - - if (pointers.isPresent()) { - for (SignalServiceAttachment pointer : pointers.get()) { - Optional result = forPointer(Optional.of(pointer)); - - if (result.isPresent()) { - results.add(result.get()); - } - } - } - - return results; - } - - public static List forPointers(@Nullable List pointers) { - List results = new LinkedList<>(); - - if (pointers != null) { - for (SignalServiceDataMessage.Quote.QuotedAttachment pointer : pointers) { - Optional result = forPointer(pointer); - - if (result.isPresent()) { - results.add(result.get()); - } - } - } - - return results; - } - - public static Optional forPointer(Optional pointer) { - return forPointer(pointer, null, null); - } - - public static Optional forPointer(Optional pointer, @Nullable StickerLocator stickerLocator) { - return forPointer(pointer, stickerLocator, null); - } - - public static Optional forPointer(Optional pointer, @Nullable StickerLocator stickerLocator, @Nullable String fastPreflightId) { - if (!pointer.isPresent() || !pointer.get().isPointer()) return Optional.empty(); - - String encodedKey = null; - - if (pointer.get().asPointer().getKey() != null) { - encodedKey = Base64.encodeBytes(pointer.get().asPointer().getKey()); - } - - return Optional.of(new PointerAttachment(pointer.get().getContentType(), - AttachmentTable.TRANSFER_PROGRESS_PENDING, - pointer.get().asPointer().getSize().orElse(0), - pointer.get().asPointer().getFileName().orElse(null), - pointer.get().asPointer().getCdnNumber(), - pointer.get().asPointer().getRemoteId().toString(), - encodedKey, null, - pointer.get().asPointer().getDigest().orElse(null), - pointer.get().asPointer().getIncrementalDigest().orElse(null), - fastPreflightId, - pointer.get().asPointer().getVoiceNote(), - pointer.get().asPointer().isBorderless(), - pointer.get().asPointer().isGif(), - pointer.get().asPointer().getWidth(), - pointer.get().asPointer().getHeight(), - pointer.get().asPointer().getUploadTimestamp(), - pointer.get().asPointer().getCaption().orElse(null), - stickerLocator, - BlurHash.parseOrNull(pointer.get().asPointer().getBlurHash().orElse(null)))); - - } - - public static Optional forPointer(SignalServiceDataMessage.Quote.QuotedAttachment pointer) { - SignalServiceAttachment thumbnail = pointer.getThumbnail(); - - return Optional.of(new PointerAttachment(pointer.getContentType(), - AttachmentTable.TRANSFER_PROGRESS_PENDING, - thumbnail != null ? thumbnail.asPointer().getSize().orElse(0) : 0, - pointer.getFileName(), - thumbnail != null ? thumbnail.asPointer().getCdnNumber() : 0, - thumbnail != null ? thumbnail.asPointer().getRemoteId().toString() : "0", - thumbnail != null && thumbnail.asPointer().getKey() != null ? Base64.encodeBytes(thumbnail.asPointer().getKey()) : null, - null, - thumbnail != null ? thumbnail.asPointer().getDigest().orElse(null) : null, - thumbnail != null ? thumbnail.asPointer().getIncrementalDigest().orElse(null) : null, - null, - false, - false, - false, - thumbnail != null ? thumbnail.asPointer().getWidth() : 0, - thumbnail != null ? thumbnail.asPointer().getHeight() : 0, - thumbnail != null ? thumbnail.asPointer().getUploadTimestamp() : 0, - thumbnail != null ? thumbnail.asPointer().getCaption().orElse(null) : null, - null, - null)); - } - - public static Optional forPointer(SignalServiceProtos.DataMessage.Quote.QuotedAttachment quotedAttachment) { - SignalServiceAttachment thumbnail; - try { - thumbnail = quotedAttachment.hasThumbnail() ? AttachmentPointerUtil.createSignalAttachmentPointer(quotedAttachment.getThumbnail()) : null; - } catch (InvalidMessageStructureException e) { - return Optional.empty(); - } - - return Optional.of(new PointerAttachment(quotedAttachment.getContentType(), - AttachmentTable.TRANSFER_PROGRESS_PENDING, - thumbnail != null ? thumbnail.asPointer().getSize().orElse(0) : 0, - quotedAttachment.getFileName(), - thumbnail != null ? thumbnail.asPointer().getCdnNumber() : 0, - thumbnail != null ? thumbnail.asPointer().getRemoteId().toString() : "0", - thumbnail != null && thumbnail.asPointer().getKey() != null ? Base64.encodeBytes(thumbnail.asPointer().getKey()) : null, - null, - thumbnail != null ? thumbnail.asPointer().getDigest().orElse(null) : null, - thumbnail != null ? thumbnail.asPointer().getIncrementalDigest().orElse(null) : null, - null, - false, - false, - false, - thumbnail != null ? thumbnail.asPointer().getWidth() : 0, - thumbnail != null ? thumbnail.asPointer().getHeight() : 0, - thumbnail != null ? thumbnail.asPointer().getUploadTimestamp() : 0, - thumbnail != null ? thumbnail.asPointer().getCaption().orElse(null) : null, - null, - null)); - } -} diff --git a/app/src/main/java/org/tm/archive/attachments/PointerAttachment.kt b/app/src/main/java/org/tm/archive/attachments/PointerAttachment.kt new file mode 100644 index 00000000..dd1db0f9 --- /dev/null +++ b/app/src/main/java/org/tm/archive/attachments/PointerAttachment.kt @@ -0,0 +1,187 @@ +package org.tm.archive.attachments + +import android.net.Uri +import android.os.Parcel +import org.signal.core.util.Base64.encodeWithPadding +import org.tm.archive.blurhash.BlurHash +import org.tm.archive.database.AttachmentTable +import org.tm.archive.stickers.StickerLocator +import org.whispersystems.signalservice.api.InvalidMessageStructureException +import org.whispersystems.signalservice.api.messages.SignalServiceAttachment +import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage +import org.whispersystems.signalservice.api.util.AttachmentPointerUtil +import org.whispersystems.signalservice.internal.push.DataMessage +import java.util.Optional + +class PointerAttachment : Attachment { + private constructor( + contentType: String, + transferState: Int, + size: Long, + fileName: String?, + cdnNumber: Int, + location: String, + key: String?, + digest: ByteArray?, + incrementalDigest: ByteArray?, + incrementalMacChunkSize: Int, + fastPreflightId: String?, + voiceNote: Boolean, + borderless: Boolean, + videoGif: Boolean, + width: Int, + height: Int, + uploadTimestamp: Long, + caption: String?, + stickerLocator: StickerLocator?, + blurHash: BlurHash? + ) : super( + contentType = contentType, + transferState = transferState, + size = size, + fileName = fileName, + cdnNumber = cdnNumber, + remoteLocation = location, + remoteKey = key, + remoteDigest = digest, + incrementalDigest = incrementalDigest, + fastPreflightId = fastPreflightId, + voiceNote = voiceNote, + borderless = borderless, + videoGif = videoGif, + width = width, + height = height, + incrementalMacChunkSize = incrementalMacChunkSize, + quote = false, + uploadTimestamp = uploadTimestamp, + caption = caption, + stickerLocator = stickerLocator, + blurHash = blurHash, + audioHash = null, + transformProperties = null + ) + + constructor(parcel: Parcel) : super(parcel) + + override val uri: Uri? = null + override val publicUri: Uri? = null + + companion object { + @JvmStatic + fun forPointers(pointers: Optional>): List { + if (!pointers.isPresent) { + return emptyList() + } + + return pointers.get() + .map { forPointer(Optional.ofNullable(it)) } + .filter { it.isPresent } + .map { it.get() } + } + + @JvmStatic + @JvmOverloads + fun forPointer(pointer: Optional, stickerLocator: StickerLocator? = null, fastPreflightId: String? = null): Optional { + if (!pointer.isPresent || !pointer.get().isPointer) { + return Optional.empty() + } + + val encodedKey: String? = if (pointer.get().asPointer().key != null) { + encodeWithPadding(pointer.get().asPointer().key) + } else { + null + } + + return Optional.of( + PointerAttachment( + contentType = pointer.get().contentType, + transferState = AttachmentTable.TRANSFER_PROGRESS_PENDING, + size = pointer.get().asPointer().size.orElse(0).toLong(), + fileName = pointer.get().asPointer().fileName.orElse(null), + cdnNumber = pointer.get().asPointer().cdnNumber, + location = pointer.get().asPointer().remoteId.toString(), + key = encodedKey, + digest = pointer.get().asPointer().digest.orElse(null), + incrementalDigest = pointer.get().asPointer().incrementalDigest.orElse(null), + incrementalMacChunkSize = pointer.get().asPointer().incrementalMacChunkSize, + fastPreflightId = fastPreflightId, + voiceNote = pointer.get().asPointer().voiceNote, + borderless = pointer.get().asPointer().isBorderless, + videoGif = pointer.get().asPointer().isGif, + width = pointer.get().asPointer().width, + height = pointer.get().asPointer().height, + uploadTimestamp = pointer.get().asPointer().uploadTimestamp, + caption = pointer.get().asPointer().caption.orElse(null), + stickerLocator = stickerLocator, + blurHash = BlurHash.parseOrNull(pointer.get().asPointer().blurHash.orElse(null)) + ) + ) + } + + fun forPointer(pointer: SignalServiceDataMessage.Quote.QuotedAttachment): Optional { + val thumbnail = pointer.thumbnail + + return Optional.of( + PointerAttachment( + contentType = pointer.contentType, + transferState = AttachmentTable.TRANSFER_PROGRESS_PENDING, + size = (if (thumbnail != null) thumbnail.asPointer().size.orElse(0) else 0).toLong(), + fileName = pointer.fileName, + cdnNumber = thumbnail?.asPointer()?.cdnNumber ?: 0, + location = thumbnail?.asPointer()?.remoteId?.toString() ?: "0", + key = if (thumbnail != null && thumbnail.asPointer().key != null) encodeWithPadding(thumbnail.asPointer().key) else null, + digest = thumbnail?.asPointer()?.digest?.orElse(null), + incrementalDigest = thumbnail?.asPointer()?.incrementalDigest?.orElse(null), + incrementalMacChunkSize = thumbnail?.asPointer()?.incrementalMacChunkSize ?: 0, + fastPreflightId = null, + voiceNote = false, + borderless = false, + videoGif = false, + width = thumbnail?.asPointer()?.width ?: 0, + height = thumbnail?.asPointer()?.height ?: 0, + uploadTimestamp = thumbnail?.asPointer()?.uploadTimestamp ?: 0, + caption = thumbnail?.asPointer()?.caption?.orElse(null), + stickerLocator = null, + blurHash = null + ) + ) + } + + fun forPointer(quotedAttachment: DataMessage.Quote.QuotedAttachment): Optional { + val thumbnail: SignalServiceAttachment? = try { + if (quotedAttachment.thumbnail != null) { + AttachmentPointerUtil.createSignalAttachmentPointer(quotedAttachment.thumbnail) + } else { + null + } + } catch (e: InvalidMessageStructureException) { + return Optional.empty() + } + + return Optional.of( + PointerAttachment( + contentType = quotedAttachment.contentType!!, + transferState = AttachmentTable.TRANSFER_PROGRESS_PENDING, + size = (if (thumbnail != null) thumbnail.asPointer().size.orElse(0) else 0).toLong(), + fileName = quotedAttachment.fileName, + cdnNumber = thumbnail?.asPointer()?.cdnNumber ?: 0, + location = thumbnail?.asPointer()?.remoteId?.toString() ?: "0", + key = if (thumbnail != null && thumbnail.asPointer().key != null) encodeWithPadding(thumbnail.asPointer().key) else null, + digest = thumbnail?.asPointer()?.digest?.orElse(null), + incrementalDigest = thumbnail?.asPointer()?.incrementalDigest?.orElse(null), + incrementalMacChunkSize = thumbnail?.asPointer()?.incrementalMacChunkSize ?: 0, + fastPreflightId = null, + voiceNote = false, + borderless = false, + videoGif = false, + width = thumbnail?.asPointer()?.width ?: 0, + height = thumbnail?.asPointer()?.height ?: 0, + uploadTimestamp = thumbnail?.asPointer()?.uploadTimestamp ?: 0, + caption = thumbnail?.asPointer()?.caption?.orElse(null), + stickerLocator = null, + blurHash = null + ) + ) + } + } +} diff --git a/app/src/main/java/org/tm/archive/attachments/TombstoneAttachment.java b/app/src/main/java/org/tm/archive/attachments/TombstoneAttachment.java deleted file mode 100644 index ff2b9daa..00000000 --- a/app/src/main/java/org/tm/archive/attachments/TombstoneAttachment.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.tm.archive.attachments; - -import android.net.Uri; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.tm.archive.database.AttachmentTable; - -/** - * An attachment that represents where an attachment used to be. Useful when you need to know that - * a message had an attachment and some metadata about it (like the contentType), even though the - * underlying media no longer exists. An example usecase would be view-once messages, so that we can - * quote them and know their contentType even though the media has been deleted. - */ -public class TombstoneAttachment extends Attachment { - - public TombstoneAttachment(@NonNull String contentType, boolean quote) { - super(contentType, AttachmentTable.TRANSFER_PROGRESS_DONE, 0, null, 0, null, null, null, null, null, null, false, false, false, 0, 0, quote, 0, null, null, null, null, null); - } - - @Override - public @Nullable Uri getUri() { - return null; - } - - @Override - public @Nullable Uri getPublicUri() { - return null; - } -} diff --git a/app/src/main/java/org/tm/archive/attachments/TombstoneAttachment.kt b/app/src/main/java/org/tm/archive/attachments/TombstoneAttachment.kt new file mode 100644 index 00000000..e0e04bb5 --- /dev/null +++ b/app/src/main/java/org/tm/archive/attachments/TombstoneAttachment.kt @@ -0,0 +1,44 @@ +package org.tm.archive.attachments + +import android.net.Uri +import android.os.Parcel +import org.tm.archive.database.AttachmentTable + +/** + * An attachment that represents where an attachment used to be. Useful when you need to know that + * a message had an attachment and some metadata about it (like the contentType), even though the + * underlying media no longer exists. An example usecase would be view-once messages, so that we can + * quote them and know their contentType even though the media has been deleted. + */ +class TombstoneAttachment : Attachment { + constructor(contentType: String, quote: Boolean) : super( + contentType = contentType, + quote = quote, + transferState = AttachmentTable.TRANSFER_PROGRESS_DONE, + size = 0, + fileName = null, + cdnNumber = 0, + remoteLocation = null, + remoteKey = null, + remoteDigest = null, + incrementalDigest = null, + fastPreflightId = null, + voiceNote = false, + borderless = false, + videoGif = false, + width = 0, + height = 0, + incrementalMacChunkSize = 0, + uploadTimestamp = 0, + caption = null, + stickerLocator = null, + blurHash = null, + audioHash = null, + transformProperties = null + ) + + constructor(parcel: Parcel) : super(parcel) + + override val uri: Uri? = null + override val publicUri: Uri? = null +} diff --git a/app/src/main/java/org/tm/archive/attachments/UriAttachment.java b/app/src/main/java/org/tm/archive/attachments/UriAttachment.java deleted file mode 100644 index b371ce54..00000000 --- a/app/src/main/java/org/tm/archive/attachments/UriAttachment.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.tm.archive.attachments; - -import android.net.Uri; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.tm.archive.audio.AudioHash; -import org.tm.archive.blurhash.BlurHash; -import org.tm.archive.database.AttachmentTable.TransformProperties; -import org.tm.archive.stickers.StickerLocator; - -import java.util.Objects; - -public class UriAttachment extends Attachment { - - private final @NonNull Uri dataUri; - - public UriAttachment(@NonNull Uri uri, - @NonNull String contentType, - int transferState, - long size, - @Nullable String fileName, - boolean voiceNote, - boolean borderless, - boolean videoGif, - boolean quote, - @Nullable String caption, - @Nullable StickerLocator stickerLocator, - @Nullable BlurHash blurHash, - @Nullable AudioHash audioHash, - @Nullable TransformProperties transformProperties) - { - this(uri, contentType, transferState, size, 0, 0, fileName, null, voiceNote, borderless, videoGif, quote, caption, stickerLocator, blurHash, audioHash, transformProperties); - } - - public UriAttachment(@NonNull Uri dataUri, - @NonNull String contentType, - int transferState, - long size, - int width, - int height, - @Nullable String fileName, - @Nullable String fastPreflightId, - boolean voiceNote, - boolean borderless, - boolean videoGif, - boolean quote, - @Nullable String caption, - @Nullable StickerLocator stickerLocator, - @Nullable BlurHash blurHash, - @Nullable AudioHash audioHash, - @Nullable TransformProperties transformProperties) - { - super(contentType, transferState, size, fileName, 0, null, null, null, null, null, fastPreflightId, voiceNote, borderless, videoGif, width, height, quote, 0, caption, stickerLocator, blurHash, audioHash, transformProperties); - this.dataUri = Objects.requireNonNull(dataUri); - } - - @Override - @NonNull - public Uri getUri() { - return dataUri; - } - - @Override - public @Nullable Uri getPublicUri() { - return null; - } - - @Override - public boolean equals(Object other) { - return other != null && other instanceof UriAttachment && ((UriAttachment) other).dataUri.equals(this.dataUri); - } - - @Override - public int hashCode() { - return dataUri.hashCode(); - } -} diff --git a/app/src/main/java/org/tm/archive/attachments/UriAttachment.kt b/app/src/main/java/org/tm/archive/attachments/UriAttachment.kt new file mode 100644 index 00000000..9119d840 --- /dev/null +++ b/app/src/main/java/org/tm/archive/attachments/UriAttachment.kt @@ -0,0 +1,114 @@ +package org.tm.archive.attachments + +import android.net.Uri +import android.os.Parcel +import androidx.core.os.ParcelCompat +import org.tm.archive.audio.AudioHash +import org.tm.archive.blurhash.BlurHash +import org.tm.archive.database.AttachmentTable.TransformProperties +import org.tm.archive.stickers.StickerLocator +import java.util.Objects + +class UriAttachment : Attachment { + + constructor( + uri: Uri, + contentType: String, + transferState: Int, + size: Long, + fileName: String?, + voiceNote: Boolean, + borderless: Boolean, + videoGif: Boolean, + quote: Boolean, + caption: String?, + stickerLocator: StickerLocator?, + blurHash: BlurHash?, + audioHash: AudioHash?, + transformProperties: TransformProperties? + ) : this( + dataUri = uri, + contentType = contentType, + transferState = transferState, + size = size, + width = 0, + height = 0, + fileName = fileName, + fastPreflightId = null, + voiceNote = voiceNote, + borderless = borderless, + videoGif = videoGif, + quote = quote, + caption = caption, + stickerLocator = stickerLocator, + blurHash = blurHash, + audioHash = audioHash, + transformProperties = transformProperties + ) + + constructor( + dataUri: Uri, + contentType: String, + transferState: Int, + size: Long, + width: Int, + height: Int, + fileName: String?, + fastPreflightId: String?, + voiceNote: Boolean, + borderless: Boolean, + videoGif: Boolean, + quote: Boolean, + caption: String?, + stickerLocator: StickerLocator?, + blurHash: BlurHash?, + audioHash: AudioHash?, + transformProperties: TransformProperties? + ) : super( + contentType = contentType, + transferState = transferState, + size = size, + fileName = fileName, + cdnNumber = 0, + remoteLocation = null, + remoteKey = null, + remoteDigest = null, + incrementalDigest = null, + fastPreflightId = fastPreflightId, + voiceNote = voiceNote, + borderless = borderless, + videoGif = videoGif, + width = width, + height = height, + incrementalMacChunkSize = 0, + quote = quote, + uploadTimestamp = 0, + caption = caption, + stickerLocator = stickerLocator, + blurHash = blurHash, + audioHash = audioHash, + transformProperties = transformProperties + ) { + uri = Objects.requireNonNull(dataUri) + } + + constructor(parcel: Parcel) : super(parcel) { + uri = ParcelCompat.readParcelable(parcel, Uri::class.java.classLoader, Uri::class.java)!! + } + + override val uri: Uri + override val publicUri: Uri? = null + + override fun writeToParcel(dest: Parcel, flags: Int) { + super.writeToParcel(dest, flags) + dest.writeParcelable(uri, 0) + } + + override fun equals(other: Any?): Boolean { + return other != null && other is UriAttachment && other.uri == uri + } + + override fun hashCode(): Int { + return uri.hashCode() + } +} diff --git a/app/src/main/java/org/tm/archive/audio/AudioFileInfo.java b/app/src/main/java/org/tm/archive/audio/AudioFileInfo.java index 355f0752..d9ef5b2a 100644 --- a/app/src/main/java/org/tm/archive/audio/AudioFileInfo.java +++ b/app/src/main/java/org/tm/archive/audio/AudioFileInfo.java @@ -2,19 +2,19 @@ package org.tm.archive.audio; import androidx.annotation.NonNull; -import com.google.protobuf.ByteString; - import org.tm.archive.database.model.databaseprotos.AudioWaveFormData; import java.util.concurrent.TimeUnit; +import okio.ByteString; + public class AudioFileInfo { private final long durationUs; private final byte[] waveFormBytes; private final float[] waveForm; public static @NonNull AudioFileInfo fromDatabaseProtobuf(@NonNull AudioWaveFormData audioWaveForm) { - return new AudioFileInfo(audioWaveForm.getDurationUs(), audioWaveForm.getWaveForm().toByteArray()); + return new AudioFileInfo(audioWaveForm.durationUs, audioWaveForm.waveForm.toByteArray()); } AudioFileInfo(long durationUs, byte[] waveFormBytes) { @@ -37,9 +37,9 @@ public class AudioFileInfo { } public @NonNull AudioWaveFormData toDatabaseProtobuf() { - return AudioWaveFormData.newBuilder() - .setDurationUs(durationUs) - .setWaveForm(ByteString.copyFrom(waveFormBytes)) - .build(); + return new AudioWaveFormData.Builder() + .durationUs(durationUs) + .waveForm(ByteString.of(waveFormBytes)) + .build(); } } \ No newline at end of file diff --git a/app/src/main/java/org/tm/archive/audio/AudioHash.java b/app/src/main/java/org/tm/archive/audio/AudioHash.java index 7649b316..0ec30283 100644 --- a/app/src/main/java/org/tm/archive/audio/AudioHash.java +++ b/app/src/main/java/org/tm/archive/audio/AudioHash.java @@ -1,17 +1,22 @@ package org.tm.archive.audio; +import android.os.Parcel; +import android.os.Parcelable; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.tm.archive.database.model.databaseprotos.AudioWaveFormData; -import org.whispersystems.util.Base64; +import org.tm.archive.util.ParcelUtil; +import org.signal.core.util.Base64; import java.io.IOException; +import java.util.Objects; /** * An AudioHash is a compact string representation of the wave form and duration for an audio file. */ -public final class AudioHash { +public final class AudioHash implements Parcelable { @NonNull private final String hash; @NonNull private final AudioWaveFormData audioWaveForm; @@ -22,13 +27,46 @@ public final class AudioHash { } public AudioHash(@NonNull AudioWaveFormData audioWaveForm) { - this(Base64.encodeBytes(audioWaveForm.toByteArray()), audioWaveForm); + this(Base64.encodeWithPadding(audioWaveForm.encode()), audioWaveForm); } + protected AudioHash(Parcel in) { + hash = Objects.requireNonNull(in.readString()); + + try { + audioWaveForm = AudioWaveFormData.ADAPTER.decode(Objects.requireNonNull(ParcelUtil.readByteArray(in))); + } catch (IOException e) { + throw new AssertionError(); + } + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(hash); + ParcelUtil.writeByteArray(dest, audioWaveForm.encode()); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator<>() { + @Override + public AudioHash createFromParcel(Parcel in) { + return new AudioHash(in); + } + + @Override + public AudioHash[] newArray(int size) { + return new AudioHash[size]; + } + }; + public static @Nullable AudioHash parseOrNull(@Nullable String hash) { if (hash == null) return null; try { - return new AudioHash(hash, AudioWaveFormData.parseFrom(Base64.decode(hash))); + return new AudioHash(hash, AudioWaveFormData.ADAPTER.decode(Base64.decode(hash))); } catch (IOException e) { return null; } diff --git a/app/src/main/java/org/tm/archive/audio/AudioRecorder.java b/app/src/main/java/org/tm/archive/audio/AudioRecorder.java index f22e9612..41913840 100644 --- a/app/src/main/java/org/tm/archive/audio/AudioRecorder.java +++ b/app/src/main/java/org/tm/archive/audio/AudioRecorder.java @@ -113,6 +113,23 @@ public class AudioRecorder { }); } + public void discardRecording() { + Log.i(TAG, "cancelRecording()"); + executor.execute(() -> { + if (recorder == null) { + Log.e(TAG, "MediaRecorder was never initialized successfully!"); + return; + } + audioFocusManager.abandonAudioFocus(); + recorder.stop(); + recordingUriFuture.cancel(true); + + recordingSubject = null; + recorder = null; + recordingUriFuture = null; + }); + } + public void stopRecording() { Log.i(TAG, "stopRecording()"); diff --git a/app/src/main/java/org/tm/archive/audio/AudioWaveFormGenerator.java b/app/src/main/java/org/tm/archive/audio/AudioWaveFormGenerator.java index eaddcf2b..72339ccd 100644 --- a/app/src/main/java/org/tm/archive/audio/AudioWaveFormGenerator.java +++ b/app/src/main/java/org/tm/archive/audio/AudioWaveFormGenerator.java @@ -57,12 +57,6 @@ public final class AudioWaveFormGenerator { throw new IOException("Mime not audio"); } - //**TM_SA**//S - if(mime.equals("audio/ac3")){ - throw new IOException("Ac3 Audio type not supported"); - } - //**TM_SA**//E - MediaCodec codec = MediaCodec.createDecoderByType(mime); if (totalDurationUs == 0) { diff --git a/app/src/main/java/org/tm/archive/audio/AudioWaveForms.kt b/app/src/main/java/org/tm/archive/audio/AudioWaveForms.kt index 7815bd60..8fdd5fea 100644 --- a/app/src/main/java/org/tm/archive/audio/AudioWaveForms.kt +++ b/app/src/main/java/org/tm/archive/audio/AudioWaveForms.kt @@ -107,7 +107,7 @@ object AudioWaveForms { private fun generateWaveForm(context: Context, uri: Uri, cacheKey: String, attachmentId: AttachmentId): CacheCheckResult { try { val startTime = System.currentTimeMillis() - SignalDatabase.attachments.writeAudioHash(attachmentId, AudioWaveFormData.getDefaultInstance()) + SignalDatabase.attachments.writeAudioHash(attachmentId, AudioWaveFormData()) Log.i(TAG, "Starting wave form generation ($cacheKey)") val fileInfo: AudioFileInfo = AudioWaveFormGenerator.generateWaveForm(context, uri) diff --git a/app/src/main/java/org/tm/archive/avatar/AvatarImage.kt b/app/src/main/java/org/tm/archive/avatar/AvatarImage.kt new file mode 100644 index 00000000..734a6224 --- /dev/null +++ b/app/src/main/java/org/tm/archive/avatar/AvatarImage.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.avatar + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.viewinterop.AndroidView +import org.tm.archive.components.AvatarImageView +import org.tm.archive.recipients.Recipient + +@Composable +fun AvatarImage( + recipient: Recipient, + modifier: Modifier = Modifier +) { + if (LocalInspectionMode.current) { + Spacer( + modifier = modifier + .background(color = Color.Red, shape = CircleShape) + ) + } else { + AndroidView( + factory = ::AvatarImageView, + modifier = modifier.background(color = Color.Transparent, shape = CircleShape) + ) { + it.setAvatarUsingProfile(recipient) + } + } +} diff --git a/app/src/main/java/org/tm/archive/avatar/picker/AvatarPickerFragment.kt b/app/src/main/java/org/tm/archive/avatar/picker/AvatarPickerFragment.kt index c15ec55e..eae574db 100644 --- a/app/src/main/java/org/tm/archive/avatar/picker/AvatarPickerFragment.kt +++ b/app/src/main/java/org/tm/archive/avatar/picker/AvatarPickerFragment.kt @@ -30,6 +30,7 @@ import org.tm.archive.components.recyclerview.GridDividerDecoration import org.tm.archive.groups.ParcelableGroupId import org.tm.archive.mediasend.AvatarSelectionActivity import org.tm.archive.mediasend.Media +import org.tm.archive.permissions.PermissionCompat import org.tm.archive.permissions.Permissions import org.tm.archive.util.ViewUtil import org.tm.archive.util.adapter.mapping.MappingAdapter @@ -238,7 +239,7 @@ class AvatarPickerFragment : Fragment(R.layout.avatar_picker_fragment) { @Suppress("DEPRECATION") private fun openGallery() { Permissions.with(this) - .request(Manifest.permission.READ_EXTERNAL_STORAGE) + .request(*PermissionCompat.forImages()) .ifNecessary() .onAllGranted { val intent = AvatarSelectionActivity.getIntentForGallery(requireContext()) diff --git a/app/src/main/java/org/tm/archive/backup/BackupCountQueries.kt b/app/src/main/java/org/tm/archive/backup/BackupCountQueries.kt index e4a014cf..11daeff1 100644 --- a/app/src/main/java/org/tm/archive/backup/BackupCountQueries.kt +++ b/app/src/main/java/org/tm/archive/backup/BackupCountQueries.kt @@ -21,7 +21,7 @@ object BackupCountQueries { @get:JvmStatic val attachmentCount: String = """ SELECT COUNT(*) FROM ${AttachmentTable.TABLE_NAME} - INNER JOIN ${MessageTable.TABLE_NAME} ON ${AttachmentTable.TABLE_NAME}.${AttachmentTable.MMS_ID} = ${MessageTable.TABLE_NAME}.${MessageTable.ID} + INNER JOIN ${MessageTable.TABLE_NAME} ON ${AttachmentTable.TABLE_NAME}.${AttachmentTable.MESSAGE_ID} = ${MessageTable.TABLE_NAME}.${MessageTable.ID} WHERE ${MessageTable.TABLE_NAME}.${MessageTable.EXPIRES_IN} <= 0 AND ${MessageTable.TABLE_NAME}.${MessageTable.VIEW_ONCE} <= 0 """ } diff --git a/app/src/main/java/org/tm/archive/backup/BackupFrameOutputStream.java b/app/src/main/java/org/tm/archive/backup/BackupFrameOutputStream.java index a8f13ea5..4b010ad7 100644 --- a/app/src/main/java/org/tm/archive/backup/BackupFrameOutputStream.java +++ b/app/src/main/java/org/tm/archive/backup/BackupFrameOutputStream.java @@ -119,8 +119,7 @@ class BackupFrameOutputStream extends FullBackupBase.BackupStream { try { write(outputStream, new BackupFrame.Builder() .attachment(new Attachment.Builder() - .rowId(attachmentId.getRowId()) - .attachmentId(attachmentId.getUniqueId()) + .rowId(attachmentId.id) .length(Util.toIntExact(size)) .build()) .build()); diff --git a/app/src/main/java/org/tm/archive/backup/BackupRecordInputStream.java b/app/src/main/java/org/tm/archive/backup/BackupRecordInputStream.java index 22c4d7a7..67e498f2 100644 --- a/app/src/main/java/org/tm/archive/backup/BackupRecordInputStream.java +++ b/app/src/main/java/org/tm/archive/backup/BackupRecordInputStream.java @@ -4,6 +4,7 @@ import androidx.annotation.NonNull; import org.signal.core.util.Conversions; import org.signal.core.util.StreamUtil; +import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.kdf.HKDF; import org.signal.libsignal.protocol.util.ByteUtil; import org.tm.archive.backup.proto.BackupFrame; @@ -27,6 +28,9 @@ import javax.crypto.spec.SecretKeySpec; class BackupRecordInputStream extends FullBackupBase.BackupStream { + private final String TAG = Log.tag(BackupRecordInputStream.class); + private final int MAX_BUFFER_SIZE = 8192; + private final int version; private final InputStream in; private final Cipher cipher; @@ -92,6 +96,35 @@ class BackupRecordInputStream extends FullBackupBase.BackupStream { return readFrame(in); } + boolean validateFrame() throws InvalidAlgorithmParameterException, IOException, InvalidKeyException { + int frameLength = decryptFrameLength(in); + if (frameLength <= 0) { + Log.i(TAG, "Backup frame is not valid due to negative frame length. This is likely because the decryption passphrase was wrong."); + return false; + } + + int bufferSize = Math.min(MAX_BUFFER_SIZE, frameLength); + byte[] buffer = new byte[bufferSize]; + byte[] theirMac = new byte[10]; + while (frameLength > 0) { + int read = in.read(buffer, 0, Math.min(buffer.length, frameLength)); + if (read == -1) return false; + + if (read < MAX_BUFFER_SIZE) { + final int frameEndIndex = read - 10; + mac.update(buffer, 0, frameEndIndex); + System.arraycopy(buffer, frameEndIndex, theirMac, 0, theirMac.length); + } else { + mac.update(buffer, 0, read); + } + frameLength -= read; + } + + byte[] ourMac = ByteUtil.trim(mac.doFinal(), 10); + + return MessageDigest.isEqual(ourMac, theirMac); + } + void readAttachmentTo(OutputStream out, int length) throws IOException { try { Conversions.intToByteArray(iv, 0, counter++); @@ -142,24 +175,7 @@ class BackupRecordInputStream extends FullBackupBase.BackupStream { private BackupFrame readFrame(InputStream in) throws IOException { try { - byte[] length = new byte[4]; - StreamUtil.readFully(in, length); - - Conversions.intToByteArray(iv, 0, counter++); - cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(cipherKey, "AES"), new IvParameterSpec(iv)); - - int frameLength; - if (BackupVersions.isFrameLengthEncrypted(version)) { - mac.update(length); - // this depends upon cipher being a stream cipher mode in order to get back the length without needing a full AES block-size input - byte[] decryptedLength = cipher.update(length); - if (decryptedLength.length != length.length) { - throw new IOException("Cipher was not a stream cipher!"); - } - frameLength = Conversions.byteArrayToInt(decryptedLength); - } else { - frameLength = Conversions.byteArrayToInt(length); - } + int frameLength = decryptFrameLength(in); byte[] frame = new byte[frameLength]; StreamUtil.readFully(in, frame); @@ -182,5 +198,27 @@ class BackupRecordInputStream extends FullBackupBase.BackupStream { } } + private int decryptFrameLength(InputStream inputStream) throws IOException, InvalidAlgorithmParameterException, InvalidKeyException { + byte[] length = new byte[4]; + StreamUtil.readFully(inputStream, length); + + Conversions.intToByteArray(iv, 0, counter++); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(cipherKey, "AES"), new IvParameterSpec(iv)); + + int frameLength; + if (BackupVersions.isFrameLengthEncrypted(version)) { + mac.update(length); + // this depends upon cipher being a stream cipher mode in order to get back the length without needing a full AES block-size input + byte[] decryptedLength = cipher.update(length); + if (decryptedLength.length != length.length) { + throw new IOException("Cipher was not a stream cipher!"); + } + frameLength = Conversions.byteArrayToInt(decryptedLength); + } else { + frameLength = Conversions.byteArrayToInt(length); + } + return frameLength; + } + static class BadMacException extends IOException {} } diff --git a/app/src/main/java/org/tm/archive/backup/FullBackupExporter.java b/app/src/main/java/org/tm/archive/backup/FullBackupExporter.java index d159bf38..ac8ae70b 100644 --- a/app/src/main/java/org/tm/archive/backup/FullBackupExporter.java +++ b/app/src/main/java/org/tm/archive/backup/FullBackupExporter.java @@ -44,7 +44,6 @@ import org.tm.archive.database.SessionTable; import org.tm.archive.database.SignedPreKeyTable; import org.tm.archive.database.StickerTable; import org.tm.archive.database.model.AvatarPickerDatabase; -import org.tm.archive.database.model.MessageId; import org.tm.archive.dependencies.ApplicationDependencies; import org.tm.archive.keyvalue.KeyValueDataSet; import org.tm.archive.keyvalue.SignalStore; @@ -65,6 +64,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import okio.ByteString; @@ -77,6 +77,7 @@ public class FullBackupExporter extends FullBackupBase { private static final long TABLE_RECORD_COUNT_MULTIPLIER = 3L; private static final long IDENTITY_KEY_BACKUP_RECORD_COUNT = 2L; private static final long FINAL_MESSAGE_COUNT = 1L; + private static final long EXPIRATION_BACKUP_THRESHOLD = TimeUnit.DAYS.toMillis(1); /** * Tables in list will still have their *schema* exported (so the tables will be created), @@ -159,15 +160,15 @@ public class FullBackupExporter extends FullBackupBase { for (String table : tables) { throwIfCanceled(cancellationSignal); if (table.equals(MessageTable.TABLE_NAME)) { - count = exportTable(table, input, outputStream, FullBackupExporter::isNonExpiringMmsMessage, null, count, estimatedCount, cancellationSignal); + count = exportTable(table, input, outputStream, cursor -> isNonExpiringMessage(cursor), null, count, estimatedCount, cancellationSignal); } else if (table.equals(ReactionTable.TABLE_NAME)) { - count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, new MessageId(CursorUtil.requireLong(cursor, ReactionTable.MESSAGE_ID))), null, count, estimatedCount, cancellationSignal); + count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, CursorUtil.requireLong(cursor, ReactionTable.MESSAGE_ID)), null, count, estimatedCount, cancellationSignal); } else if (table.equals(MentionTable.TABLE_NAME)) { - count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMmsMessage(input, CursorUtil.requireLong(cursor, MentionTable.MESSAGE_ID)), null, count, estimatedCount, cancellationSignal); + count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, CursorUtil.requireLong(cursor, MentionTable.MESSAGE_ID)), null, count, estimatedCount, cancellationSignal); } else if (table.equals(GroupReceiptTable.TABLE_NAME)) { - count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMmsMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(GroupReceiptTable.MMS_ID))), null, count, estimatedCount, cancellationSignal); + count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(GroupReceiptTable.MMS_ID))), null, count, estimatedCount, cancellationSignal); } else if (table.equals(AttachmentTable.TABLE_NAME)) { - count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMmsMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.MMS_ID))), (cursor, innerCount) -> exportAttachment(attachmentSecret, cursor, outputStream, innerCount, estimatedCount), count, estimatedCount, cancellationSignal); + count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.MESSAGE_ID))), (cursor, innerCount) -> exportAttachment(attachmentSecret, cursor, outputStream, innerCount, estimatedCount), count, estimatedCount, cancellationSignal); } else if (table.equals(StickerTable.TABLE_NAME)) { count = exportTable(table, input, outputStream, cursor -> true, (cursor, innerCount) -> exportSticker(attachmentSecret, cursor, outputStream, innerCount, estimatedCount), count, estimatedCount, cancellationSignal); } else if (!TABLE_CONTENT_BLOCKLIST.contains(table)) { @@ -444,11 +445,10 @@ public class FullBackupExporter extends FullBackupBase { long estimatedCount) throws IOException { - long rowId = cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.ROW_ID)); - long uniqueId = cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.UNIQUE_ID)); - long size = cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.SIZE)); + long rowId = cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.ID)); + long size = cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.DATA_SIZE)); - String data = cursor.getString(cursor.getColumnIndexOrThrow(AttachmentTable.DATA)); + String data = cursor.getString(cursor.getColumnIndexOrThrow(AttachmentTable.DATA_FILE)); byte[] random = cursor.getBlob(cursor.getColumnIndexOrThrow(AttachmentTable.DATA_RANDOM)); if (!TextUtils.isEmpty(data)) { @@ -457,14 +457,14 @@ public class FullBackupExporter extends FullBackupBase { if (size <= 0 || fileLength != dbLength) { size = calculateVeryOldStreamLength(attachmentSecret, random, data); - Log.w(TAG, "Needed size calculation! Manual: " + size + " File: " + fileLength + " DB: " + dbLength + " ID: " + new AttachmentId(rowId, uniqueId)); + Log.w(TAG, "Needed size calculation! Manual: " + size + " File: " + fileLength + " DB: " + dbLength + " ID: " + new AttachmentId(rowId)); } } EventBus.getDefault().post(new BackupEvent(BackupEvent.Type.PROGRESS, ++count, estimatedCount)); if (!TextUtils.isEmpty(data) && size > 0) { try (InputStream inputStream = openAttachmentStream(attachmentSecret, random, data)) { - outputStream.write(new AttachmentId(rowId, uniqueId), inputStream, size); + outputStream.write(new AttachmentId(rowId), inputStream, size); } catch (FileNotFoundException e) { Log.w(TAG, "Missing attachment", e); } @@ -579,27 +579,25 @@ public class FullBackupExporter extends FullBackupBase { return count; } - private static boolean isNonExpiringMmsMessage(@NonNull Cursor cursor) { - return cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.EXPIRES_IN)) <= 0 && - cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.VIEW_ONCE)) <= 0; + private static boolean isNonExpiringMessage(@NonNull Cursor cursor) { + long expiresIn = CursorUtil.requireLong(cursor, MessageTable.EXPIRES_IN); + boolean viewOnce = CursorUtil.requireBoolean(cursor, MessageTable.VIEW_ONCE); + + if (expiresIn == 0 && !viewOnce) { + return true; + } + + return expiresIn > EXPIRATION_BACKUP_THRESHOLD; } - private static boolean isNonExpiringSmsMessage(@NonNull Cursor cursor) { - return cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.EXPIRES_IN)) <= 0; - } - - private static boolean isForNonExpiringMessage(@NonNull SQLiteDatabase db, @NonNull MessageId messageId) { - return isForNonExpiringMmsMessage(db, messageId.getId()); - } - - private static boolean isForNonExpiringMmsMessage(@NonNull SQLiteDatabase db, long mmsId) { + private static boolean isForNonExpiringMessage(@NonNull SQLiteDatabase db, long messageId) { String[] columns = new String[] { MessageTable.EXPIRES_IN, MessageTable.VIEW_ONCE }; String where = MessageTable.ID + " = ?"; - String[] args = new String[] { String.valueOf(mmsId) }; + String[] args = SqlUtil.buildArgs(messageId); try (Cursor mmsCursor = db.query(MessageTable.TABLE_NAME, columns, where, args, null, null, null)) { if (mmsCursor != null && mmsCursor.moveToFirst()) { - return isNonExpiringMmsMessage(mmsCursor); + return isNonExpiringMessage(mmsCursor); } } diff --git a/app/src/main/java/org/tm/archive/backup/FullBackupImporter.java b/app/src/main/java/org/tm/archive/backup/FullBackupImporter.java index 522f2d91..58d7807f 100644 --- a/app/src/main/java/org/tm/archive/backup/FullBackupImporter.java +++ b/app/src/main/java/org/tm/archive/backup/FullBackupImporter.java @@ -45,6 +45,8 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -63,6 +65,24 @@ public class FullBackupImporter extends FullBackupBase { @SuppressWarnings("unused") private static final String TAG = Log.tag(FullBackupImporter.class); + public static boolean validatePassphrase(@NonNull Context context, + @NonNull Uri uri, + @NonNull String passphrase) + throws IOException + { + + try (InputStream is = getInputStream(context, uri)) { + BackupRecordInputStream inputStream = new BackupRecordInputStream(is, passphrase); + return inputStream.validateFrame(); + } catch (InvalidAlgorithmParameterException e) { + Log.w(TAG, "Invalid algorithm parameter exception in backup passphrase validation.", e); + return false; + } catch (InvalidKeyException e) { + Log.w(TAG, "Invalid key exception in backup passphrase validation.", e); + return false; + } + } + public static void importFile(@NonNull Context context, @NonNull AttachmentSecret attachmentSecret, @NonNull SQLiteDatabase db, @NonNull Uri uri, @NonNull String passphrase) throws IOException @@ -135,11 +155,9 @@ public class FullBackupImporter extends FullBackupBase { } private static void processVersion(@NonNull SQLiteDatabase db, DatabaseVersion version) throws IOException { - //**TM_SA**//s - /*if (version.version == null || version.version > db.getVersion()) { + if (version.version == null || version.version > db.getVersion()) { throw new DatabaseDowngradeException(db.getVersion(), version.version != null ? version.version : -1); - }*/ - //**TM_SA**//e + } db.setVersion(version.version); } @@ -176,26 +194,33 @@ public class FullBackupImporter extends FullBackupBase { private static void processAttachment(@NonNull Context context, @NonNull AttachmentSecret attachmentSecret, @NonNull SQLiteDatabase db, @NonNull Attachment attachment, BackupRecordInputStream inputStream) throws IOException { - File dataFile = AttachmentTable.newFile(context); - Pair output = ModernEncryptingPartOutputStream.createFor(attachmentSecret, dataFile, false); + File dataFile = AttachmentTable.newFile(context); + Pair output = ModernEncryptingPartOutputStream.createFor(attachmentSecret, dataFile, false); + boolean isLegacyTable = SqlUtil.tableExists(db, "part"); + + String dataFileColumnName = isLegacyTable ? "_data" : AttachmentTable.DATA_FILE; + String dataRandomColumnName = isLegacyTable ? "data_random" : AttachmentTable.DATA_RANDOM; + String idColumnName = isLegacyTable ? "_id" : AttachmentTable.ID; + String tableName = isLegacyTable ? "part" : AttachmentTable.TABLE_NAME; ContentValues contentValues = new ContentValues(); try { inputStream.readAttachmentTo(output.second, attachment.length); - contentValues.put(AttachmentTable.DATA, dataFile.getAbsolutePath()); - contentValues.put(AttachmentTable.DATA_RANDOM, output.first); + contentValues.put(dataFileColumnName, dataFile.getAbsolutePath()); + contentValues.put(dataRandomColumnName, output.first); } catch (BackupRecordInputStream.BadMacException e) { Log.w(TAG, "Bad MAC for attachment " + attachment.attachmentId + "! Can't restore it.", e); dataFile.delete(); - contentValues.put(AttachmentTable.DATA, (String) null); - contentValues.put(AttachmentTable.DATA_RANDOM, (String) null); + contentValues.put(dataFileColumnName, (String) null); + contentValues.put(dataRandomColumnName, (String) null); } - db.update(AttachmentTable.TABLE_NAME, contentValues, - AttachmentTable.ROW_ID + " = ? AND " + AttachmentTable.UNIQUE_ID + " = ?", - new String[] {String.valueOf(attachment.rowId), String.valueOf(attachment.attachmentId)}); + db.update(tableName, + contentValues, + idColumnName + " = ?", + SqlUtil.buildArgs(attachment.rowId)); } private static void processSticker(@NonNull Context context, @NonNull AttachmentSecret attachmentSecret, @NonNull SQLiteDatabase db, @NonNull Sticker sticker, BackupRecordInputStream inputStream) diff --git a/app/src/main/java/org/tm/archive/backup/v2/BackupRepository.kt b/app/src/main/java/org/tm/archive/backup/v2/BackupRepository.kt new file mode 100644 index 00000000..d7d8a91e --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/BackupRepository.kt @@ -0,0 +1,257 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2 + +import org.signal.core.util.EventTimer +import org.signal.core.util.logging.Log +import org.signal.core.util.withinTransaction +import org.signal.libsignal.zkgroup.profiles.ProfileKey +import org.tm.archive.backup.v2.database.ChatItemImportInserter +import org.tm.archive.backup.v2.database.clearAllDataForBackupRestore +import org.tm.archive.backup.v2.processor.AccountDataProcessor +import org.tm.archive.backup.v2.processor.CallLogBackupProcessor +import org.tm.archive.backup.v2.processor.ChatBackupProcessor +import org.tm.archive.backup.v2.processor.ChatItemBackupProcessor +import org.tm.archive.backup.v2.processor.RecipientBackupProcessor +import org.tm.archive.backup.v2.stream.BackupExportWriter +import org.tm.archive.backup.v2.stream.EncryptedBackupReader +import org.tm.archive.backup.v2.stream.EncryptedBackupWriter +import org.tm.archive.backup.v2.stream.PlainTextBackupReader +import org.tm.archive.backup.v2.stream.PlainTextBackupWriter +import org.tm.archive.database.SignalDatabase +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.recipients.RecipientId +import org.whispersystems.signalservice.api.NetworkResult +import org.whispersystems.signalservice.api.archive.ArchiveGetBackupInfoResponse +import org.whispersystems.signalservice.api.archive.ArchiveServiceCredential +import org.whispersystems.signalservice.api.push.ServiceId.ACI +import org.whispersystems.signalservice.api.push.ServiceId.PNI +import java.io.ByteArrayOutputStream +import java.io.InputStream +import kotlin.time.Duration.Companion.milliseconds + +object BackupRepository { + + private val TAG = Log.tag(BackupRepository::class.java) + + fun export(plaintext: Boolean = false): ByteArray { + val eventTimer = EventTimer() + + val outputStream = ByteArrayOutputStream() + val writer: BackupExportWriter = if (plaintext) { + PlainTextBackupWriter(outputStream) + } else { + EncryptedBackupWriter( + key = SignalStore.svr().getOrCreateMasterKey().deriveBackupKey(), + aci = SignalStore.account().aci!!, + outputStream = outputStream, + append = { mac -> outputStream.write(mac) } + ) + } + + writer.use { + // Note: Without a transaction, we may export inconsistent state. But because we have a transaction, + // writes from other threads are blocked. This is something to think more about. + SignalDatabase.rawDatabase.withinTransaction { + AccountDataProcessor.export { + writer.write(it) + eventTimer.emit("account") + } + + RecipientBackupProcessor.export { + writer.write(it) + eventTimer.emit("recipient") + } + + ChatBackupProcessor.export { frame -> + writer.write(frame) + eventTimer.emit("thread") + } + + CallLogBackupProcessor.export { frame -> + writer.write(frame) + eventTimer.emit("call") + } + + ChatItemBackupProcessor.export { frame -> + writer.write(frame) + eventTimer.emit("message") + } + } + } + + Log.d(TAG, "export() ${eventTimer.stop().summary}") + + return outputStream.toByteArray() + } + + fun import(length: Long, inputStreamFactory: () -> InputStream, selfData: SelfData, plaintext: Boolean = false) { + val eventTimer = EventTimer() + + val frameReader = if (plaintext) { + PlainTextBackupReader(inputStreamFactory()) + } else { + EncryptedBackupReader( + key = SignalStore.svr().getOrCreateMasterKey().deriveBackupKey(), + aci = selfData.aci, + streamLength = length, + dataStream = inputStreamFactory + ) + } + + // Note: Without a transaction, bad imports could lead to lost data. But because we have a transaction, + // writes from other threads are blocked. This is something to think more about. + SignalDatabase.rawDatabase.withinTransaction { + SignalStore.clearAllDataForBackupRestore() + SignalDatabase.recipients.clearAllDataForBackupRestore() + SignalDatabase.distributionLists.clearAllDataForBackupRestore() + SignalDatabase.threads.clearAllDataForBackupRestore() + SignalDatabase.messages.clearAllDataForBackupRestore() + SignalDatabase.attachments.clearAllDataForBackupRestore() + + // Add back self after clearing data + val selfId: RecipientId = SignalDatabase.recipients.getAndPossiblyMerge(selfData.aci, selfData.pni, selfData.e164, pniVerified = true, changeSelf = true) + SignalDatabase.recipients.setProfileKey(selfId, selfData.profileKey) + SignalDatabase.recipients.setProfileSharing(selfId, true) + + val backupState = BackupState() + val chatItemInserter: ChatItemImportInserter = ChatItemBackupProcessor.beginImport(backupState) + + for (frame in frameReader) { + when { + frame.account != null -> { + AccountDataProcessor.import(frame.account, selfId) + eventTimer.emit("account") + } + + frame.recipient != null -> { + RecipientBackupProcessor.import(frame.recipient, backupState) + eventTimer.emit("recipient") + } + + frame.chat != null -> { + ChatBackupProcessor.import(frame.chat, backupState) + eventTimer.emit("chat") + } + + frame.call != null -> { + CallLogBackupProcessor.import(frame.call, backupState) + eventTimer.emit("call") + } + + frame.chatItem != null -> { + chatItemInserter.insert(frame.chatItem) + eventTimer.emit("chatItem") + // TODO if there's stuff in the stream after chatItems, we need to flush the inserter before going to the next phase + } + + else -> Log.w(TAG, "Unrecognized frame") + } + } + + if (chatItemInserter.flush()) { + eventTimer.emit("chatItem") + } + + backupState.chatIdToLocalThreadId.values.forEach { + SignalDatabase.threads.update(it, unarchive = false, allowDeletion = false) + } + } + + Log.d(TAG, "import() ${eventTimer.stop().summary}") + } + + /** + * Returns an object with details about the remote backup state. + */ + fun getRemoteBackupState(): NetworkResult { + val api = ApplicationDependencies.getSignalServiceAccountManager().archiveApi + val backupKey = SignalStore.svr().getOrCreateMasterKey().deriveBackupKey() + + return api + .triggerBackupIdReservation(backupKey) + .then { getAuthCredential() } + .then { credential -> + api.setPublicKey(backupKey, credential) + .also { Log.i(TAG, "PublicKeyResult: $it") } + .map { credential } + } + .then { credential -> + api.getBackupInfo(backupKey, credential) + } + } + + /** + * A simple test method that just hits various network endpoints. Only useful for the playground. + * + * @return True if successful, otherwise false. + */ + fun uploadBackupFile(backupStream: InputStream, backupStreamLength: Long): Boolean { + val api = ApplicationDependencies.getSignalServiceAccountManager().archiveApi + val backupKey = SignalStore.svr().getOrCreateMasterKey().deriveBackupKey() + + return api + .triggerBackupIdReservation(backupKey) + .then { getAuthCredential() } + .then { credential -> + api.setPublicKey(backupKey, credential) + .also { Log.i(TAG, "PublicKeyResult: $it") } + .map { credential } + } + .then { credential -> + api.getMessageBackupUploadForm(backupKey, credential) + .also { Log.i(TAG, "UploadFormResult: $it") } + } + .then { form -> + api.getBackupResumableUploadUrl(form) + .also { Log.i(TAG, "ResumableUploadUrlResult: $it") } + .map { form to it } + } + .then { formAndUploadUrl -> + val (form, resumableUploadUrl) = formAndUploadUrl + api.uploadBackupFile(form, resumableUploadUrl, backupStream, backupStreamLength) + .also { Log.i(TAG, "UploadBackupFileResult: $it") } + } + .also { Log.i(TAG, "OverallResult: $it") } is NetworkResult.Success + } + + /** + * Retrieves an auth credential, preferring a cached value if available. + */ + private fun getAuthCredential(): NetworkResult { + val currentTime = System.currentTimeMillis() + + val credential = SignalStore.backup().credentialsByDay.getForCurrentTime(currentTime.milliseconds) + + if (credential != null) { + return NetworkResult.Success(credential) + } + + Log.w(TAG, "No credentials found for today, need to fetch new ones! This shouldn't happen under normal circumstances. We should ensure the routine fetch is running properly.") + + return ApplicationDependencies.getSignalServiceAccountManager().archiveApi.getServiceCredentials(currentTime).map { result -> + SignalStore.backup().addCredentials(result.credentials.toList()) + SignalStore.backup().clearCredentialsOlderThan(currentTime) + SignalStore.backup().credentialsByDay.getForCurrentTime(currentTime.milliseconds)!! + } + } + + data class SelfData( + val aci: ACI, + val pni: PNI, + val e164: String, + val profileKey: ProfileKey + ) +} + +class BackupState { + val backupToLocalRecipientId = HashMap() + val chatIdToLocalThreadId = HashMap() + val chatIdToLocalRecipientId = HashMap() + val chatIdToBackupRecipientId = HashMap() + val callIdToType = HashMap() +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/AttachmentTableBackupExtensions.kt b/app/src/main/java/org/tm/archive/backup/v2/database/AttachmentTableBackupExtensions.kt new file mode 100644 index 00000000..31f3eb64 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/AttachmentTableBackupExtensions.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import org.signal.core.util.delete +import org.tm.archive.database.AttachmentTable + +fun AttachmentTable.clearAllDataForBackupRestore() { + writableDatabase.delete(AttachmentTable.TABLE_NAME).run() +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/CallTableBackupExtensions.kt b/app/src/main/java/org/tm/archive/backup/v2/database/CallTableBackupExtensions.kt new file mode 100644 index 00000000..485cc198 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/CallTableBackupExtensions.kt @@ -0,0 +1,124 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import android.database.Cursor +import android.database.sqlite.SQLiteDatabase +import androidx.core.content.contentValuesOf +import org.signal.core.util.isNull +import org.signal.core.util.requireInt +import org.signal.core.util.requireLong +import org.signal.core.util.select +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.backup.v2.proto.Call +import org.tm.archive.database.CallTable +import org.tm.archive.database.RecipientTable +import java.io.Closeable + +typealias BackupCall = org.tm.archive.backup.v2.proto.Call + +fun CallTable.getCallsForBackup(): CallLogIterator { + return CallLogIterator( + readableDatabase + .select() + .from(CallTable.TABLE_NAME) + .where("${CallTable.EVENT} != ${CallTable.Event.serialize(CallTable.Event.DELETE)}") + .run() + ) +} + +fun CallTable.restoreCallLogFromBackup(call: BackupCall, backupState: BackupState) { + val type = when (call.type) { + Call.Type.VIDEO_CALL -> CallTable.Type.VIDEO_CALL + Call.Type.AUDIO_CALL -> CallTable.Type.AUDIO_CALL + Call.Type.AD_HOC_CALL -> CallTable.Type.AD_HOC_CALL + Call.Type.GROUP_CALL -> CallTable.Type.GROUP_CALL + Call.Type.UNKNOWN_TYPE -> return + } + + val event = when (call.event) { + Call.Event.DELETE -> CallTable.Event.DELETE + Call.Event.JOINED -> CallTable.Event.JOINED + Call.Event.GENERIC_GROUP_CALL -> CallTable.Event.GENERIC_GROUP_CALL + Call.Event.DECLINED -> CallTable.Event.DECLINED + Call.Event.ACCEPTED -> CallTable.Event.ACCEPTED + Call.Event.MISSED -> CallTable.Event.MISSED + Call.Event.OUTGOING_RING -> CallTable.Event.OUTGOING_RING + Call.Event.OUTGOING -> CallTable.Event.ONGOING + Call.Event.NOT_ACCEPTED -> CallTable.Event.NOT_ACCEPTED + Call.Event.UNKNOWN_EVENT -> return + } + + val direction = if (call.outgoing) CallTable.Direction.OUTGOING else CallTable.Direction.INCOMING + + backupState.callIdToType[call.callId] = CallTable.Call.getMessageType(type, direction, event) + + val values = contentValuesOf( + CallTable.CALL_ID to call.callId, + CallTable.PEER to backupState.backupToLocalRecipientId[call.conversationRecipientId]!!.serialize(), + CallTable.TYPE to CallTable.Type.serialize(type), + CallTable.DIRECTION to CallTable.Direction.serialize(direction), + CallTable.EVENT to CallTable.Event.serialize(event), + CallTable.TIMESTAMP to call.timestamp + ) + + writableDatabase.insert(CallTable.TABLE_NAME, SQLiteDatabase.CONFLICT_IGNORE, values) +} + +/** + * Provides a nice iterable interface over a [RecipientTable] cursor, converting rows to [BackupRecipient]s. + * Important: Because this is backed by a cursor, you must close it. It's recommended to use `.use()` or try-with-resources. + */ +class CallLogIterator(private val cursor: Cursor) : Iterator, Closeable { + override fun hasNext(): Boolean { + return cursor.count > 0 && !cursor.isLast + } + + override fun next(): BackupCall? { + if (!cursor.moveToNext()) { + throw NoSuchElementException() + } + + val callId = cursor.requireLong(CallTable.CALL_ID) + val type = CallTable.Type.deserialize(cursor.requireInt(CallTable.TYPE)) + val direction = CallTable.Direction.deserialize(cursor.requireInt(CallTable.DIRECTION)) + val event = CallTable.Event.deserialize(cursor.requireInt(CallTable.EVENT)) + + return BackupCall( + callId = callId, + conversationRecipientId = cursor.requireLong(CallTable.PEER), + type = when (type) { + CallTable.Type.AUDIO_CALL -> Call.Type.AUDIO_CALL + CallTable.Type.VIDEO_CALL -> Call.Type.VIDEO_CALL + CallTable.Type.AD_HOC_CALL -> Call.Type.AD_HOC_CALL + CallTable.Type.GROUP_CALL -> Call.Type.GROUP_CALL + }, + outgoing = when (direction) { + CallTable.Direction.OUTGOING -> true + else -> false + }, + timestamp = cursor.requireLong(CallTable.TIMESTAMP), + ringerRecipientId = if (cursor.isNull(CallTable.RINGER)) null else cursor.requireLong(CallTable.RINGER), + event = when (event) { + CallTable.Event.ONGOING -> Call.Event.OUTGOING + CallTable.Event.OUTGOING_RING -> Call.Event.OUTGOING_RING + CallTable.Event.ACCEPTED -> Call.Event.ACCEPTED + CallTable.Event.DECLINED -> Call.Event.DECLINED + CallTable.Event.GENERIC_GROUP_CALL -> Call.Event.GENERIC_GROUP_CALL + CallTable.Event.JOINED -> Call.Event.JOINED + CallTable.Event.MISSED, + CallTable.Event.MISSED_NOTIFICATION_PROFILE -> Call.Event.MISSED + CallTable.Event.DELETE -> Call.Event.DELETE + CallTable.Event.RINGING -> Call.Event.UNKNOWN_EVENT + CallTable.Event.NOT_ACCEPTED -> Call.Event.NOT_ACCEPTED + } + ) + } + + override fun close() { + cursor.close() + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/ChatItemExportIterator.kt b/app/src/main/java/org/tm/archive/backup/v2/database/ChatItemExportIterator.kt new file mode 100644 index 00000000..e40681d0 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/ChatItemExportIterator.kt @@ -0,0 +1,482 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import android.database.Cursor +import com.annimon.stream.Stream +import okio.ByteString.Companion.toByteString +import org.signal.core.util.Base64 +import org.signal.core.util.Base64.decodeOrThrow +import org.signal.core.util.logging.Log +import org.signal.core.util.requireBlob +import org.signal.core.util.requireBoolean +import org.signal.core.util.requireInt +import org.signal.core.util.requireLong +import org.signal.core.util.requireString +import org.tm.archive.backup.v2.proto.CallChatUpdate +import org.tm.archive.backup.v2.proto.ChatItem +import org.tm.archive.backup.v2.proto.ChatUpdateMessage +import org.tm.archive.backup.v2.proto.ExpirationTimerChatUpdate +import org.tm.archive.backup.v2.proto.GroupCallChatUpdate +import org.tm.archive.backup.v2.proto.IndividualCallChatUpdate +import org.tm.archive.backup.v2.proto.ProfileChangeChatUpdate +import org.tm.archive.backup.v2.proto.Quote +import org.tm.archive.backup.v2.proto.Reaction +import org.tm.archive.backup.v2.proto.RemoteDeletedMessage +import org.tm.archive.backup.v2.proto.SendStatus +import org.tm.archive.backup.v2.proto.SessionSwitchoverChatUpdate +import org.tm.archive.backup.v2.proto.SimpleChatUpdate +import org.tm.archive.backup.v2.proto.StandardMessage +import org.tm.archive.backup.v2.proto.Text +import org.tm.archive.backup.v2.proto.ThreadMergeChatUpdate +import org.tm.archive.database.GroupReceiptTable +import org.tm.archive.database.MessageTable +import org.tm.archive.database.MessageTypes +import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.SignalDatabase.Companion.calls +import org.tm.archive.database.documents.IdentityKeyMismatchSet +import org.tm.archive.database.documents.NetworkFailureSet +import org.tm.archive.database.model.GroupCallUpdateDetailsUtil +import org.tm.archive.database.model.ReactionRecord +import org.tm.archive.database.model.databaseprotos.BodyRangeList +import org.tm.archive.database.model.databaseprotos.ProfileChangeDetails +import org.tm.archive.database.model.databaseprotos.SessionSwitchoverEvent +import org.tm.archive.database.model.databaseprotos.ThreadMergeEvent +import org.tm.archive.mms.QuoteModel +import org.tm.archive.util.JsonUtils +import org.whispersystems.signalservice.api.push.ServiceId.ACI +import org.whispersystems.signalservice.api.util.UuidUtil +import org.whispersystems.signalservice.api.util.toByteArray +import java.io.Closeable +import java.io.IOException +import java.util.LinkedList +import java.util.Queue +import java.util.UUID +import org.tm.archive.backup.v2.proto.BodyRange as BackupBodyRange + +/** + * An iterator for chat items with a clever performance twist: rather than do the extra queries one at a time (for reactions, + * attachments, etc), this will populate items in batches, doing bulk lookups to improve throughput. We keep these in a buffer + * and only do more queries when the buffer is empty. + * + * All of this complexity is hidden from the user -- they just get a normal iterator interface. + */ +class ChatItemExportIterator(private val cursor: Cursor, private val batchSize: Int) : Iterator, Closeable { + + companion object { + private val TAG = Log.tag(ChatItemExportIterator::class.java) + + const val COLUMN_BASE_TYPE = "base_type" + } + + /** + * A queue of already-parsed ChatItems. Processing in batches means that we read ahead in the cursor and put + * the pending items here. + */ + private val buffer: Queue = LinkedList() + + override fun hasNext(): Boolean { + return buffer.isNotEmpty() || (cursor.count > 0 && !cursor.isLast && !cursor.isAfterLast) + } + + override fun next(): ChatItem { + if (buffer.isNotEmpty()) { + return buffer.remove() + } + + val records: LinkedHashMap = linkedMapOf() + + for (i in 0 until batchSize) { + if (cursor.moveToNext()) { + val record = cursor.toBackupMessageRecord() + records[record.id] = record + } else { + break + } + } + + val reactionsById: Map> = SignalDatabase.reactions.getReactionsForMessages(records.keys) + val groupReceiptsById: Map> = SignalDatabase.groupReceipts.getGroupReceiptInfoForMessages(records.keys) + + for ((id, record) in records) { + val builder = record.toBasicChatItemBuilder(groupReceiptsById[id]) + + when { + record.remoteDeleted -> builder.remoteDeletedMessage = RemoteDeletedMessage() + MessageTypes.isJoinedType(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.JOINED_SIGNAL)) + MessageTypes.isIdentityUpdate(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.IDENTITY_UPDATE)) + MessageTypes.isIdentityVerified(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.IDENTITY_VERIFIED)) + MessageTypes.isIdentityDefault(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.IDENTITY_DEFAULT)) + MessageTypes.isChangeNumber(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.CHANGE_NUMBER)) + MessageTypes.isBoostRequest(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.BOOST_REQUEST)) + MessageTypes.isEndSessionType(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.END_SESSION)) + MessageTypes.isChatSessionRefresh(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.CHAT_SESSION_REFRESH)) + MessageTypes.isBadDecryptType(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.BAD_DECRYPT)) + MessageTypes.isPaymentsActivated(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.PAYMENTS_ACTIVATED)) + MessageTypes.isPaymentsRequestToActivate(record.type) -> builder.updateMessage = ChatUpdateMessage(simpleUpdate = SimpleChatUpdate(type = SimpleChatUpdate.Type.PAYMENT_ACTIVATION_REQUEST)) + MessageTypes.isExpirationTimerUpdate(record.type) -> builder.updateMessage = ChatUpdateMessage(expirationTimerChange = ExpirationTimerChatUpdate((record.expiresIn / 1000).toInt())) + MessageTypes.isProfileChange(record.type) -> { + builder.updateMessage = ChatUpdateMessage( + profileChange = try { + val decoded: ByteArray = Base64.decode(record.body!!) + val profileChangeDetails = ProfileChangeDetails.ADAPTER.decode(decoded) + if (profileChangeDetails.profileNameChange != null) { + ProfileChangeChatUpdate(previousName = profileChangeDetails.profileNameChange.previous, newName = profileChangeDetails.profileNameChange.newValue) + } else { + ProfileChangeChatUpdate() + } + } catch (e: IOException) { + Log.w(TAG, "Profile name change details could not be read", e) + ProfileChangeChatUpdate() + } + ) + } + MessageTypes.isSessionSwitchoverType(record.type) -> { + builder.updateMessage = ChatUpdateMessage( + sessionSwitchover = try { + val event = SessionSwitchoverEvent.ADAPTER.decode(decodeOrThrow(record.body!!)) + SessionSwitchoverChatUpdate(event.e164.e164ToLong()!!) + } catch (e: Exception) { + SessionSwitchoverChatUpdate() + } + ) + } + MessageTypes.isThreadMergeType(record.type) -> { + builder.updateMessage = ChatUpdateMessage( + threadMerge = try { + val event = ThreadMergeEvent.ADAPTER.decode(decodeOrThrow(record.body!!)) + ThreadMergeChatUpdate(event.previousE164.e164ToLong()!!) + } catch (e: Exception) { + ThreadMergeChatUpdate() + } + ) + } + MessageTypes.isCallLog(record.type) -> { + val call = calls.getCallByMessageId(record.id) + if (call != null) { + builder.updateMessage = ChatUpdateMessage(callingMessage = CallChatUpdate(callId = call.callId)) + } else { + when { + MessageTypes.isMissedAudioCall(record.type) -> { + builder.updateMessage = ChatUpdateMessage(callingMessage = CallChatUpdate(callMessage = IndividualCallChatUpdate(type = IndividualCallChatUpdate.Type.MISSED_AUDIO_CALL))) + } + MessageTypes.isMissedVideoCall(record.type) -> { + builder.updateMessage = ChatUpdateMessage(callingMessage = CallChatUpdate(callMessage = IndividualCallChatUpdate(type = IndividualCallChatUpdate.Type.MISSED_VIDEO_CALL))) + } + MessageTypes.isIncomingAudioCall(record.type) -> { + builder.updateMessage = ChatUpdateMessage(callingMessage = CallChatUpdate(callMessage = IndividualCallChatUpdate(type = IndividualCallChatUpdate.Type.INCOMING_AUDIO_CALL))) + } + MessageTypes.isIncomingVideoCall(record.type) -> { + builder.updateMessage = ChatUpdateMessage(callingMessage = CallChatUpdate(callMessage = IndividualCallChatUpdate(type = IndividualCallChatUpdate.Type.INCOMING_VIDEO_CALL))) + } + MessageTypes.isOutgoingAudioCall(record.type) -> { + builder.updateMessage = ChatUpdateMessage(callingMessage = CallChatUpdate(callMessage = IndividualCallChatUpdate(type = IndividualCallChatUpdate.Type.OUTGOING_AUDIO_CALL))) + } + MessageTypes.isOutgoingVideoCall(record.type) -> { + builder.updateMessage = ChatUpdateMessage(callingMessage = CallChatUpdate(callMessage = IndividualCallChatUpdate(type = IndividualCallChatUpdate.Type.OUTGOING_VIDEO_CALL))) + } + MessageTypes.isGroupCall(record.type) -> { + try { + val groupCallUpdateDetails = GroupCallUpdateDetailsUtil.parse(record.body) + + val joinedMembers = Stream.of(groupCallUpdateDetails.inCallUuids) + .map { uuid: String? -> UuidUtil.parseOrNull(uuid) } + .withoutNulls() + .map { obj: UUID? -> ACI.from(obj!!).toByteString() } + .toList() + builder.updateMessage = ChatUpdateMessage( + callingMessage = CallChatUpdate( + groupCall = GroupCallChatUpdate( + startedCallAci = ACI.from(UuidUtil.parseOrThrow(groupCallUpdateDetails.startedCallUuid)).toByteString(), + startedCallTimestamp = groupCallUpdateDetails.startedCallTimestamp, + inCallAcis = joinedMembers + ) + ) + ) + } catch (exception: java.lang.Exception) { + continue + } + } + } + } + } + record.body == null -> { + Log.w(TAG, "Record missing a body, skipping") + continue + } + else -> builder.standardMessage = record.toTextMessage(reactionsById[id]) + } + + buffer += builder.build() + } + + return if (buffer.isNotEmpty()) { + buffer.remove() + } else { + throw NoSuchElementException() + } + } + + override fun close() { + cursor.close() + } + + private fun String.e164ToLong(): Long? { + val fixed = if (this.startsWith("+")) { + this.substring(1) + } else { + this + } + + return fixed.toLongOrNull() + } + + private fun BackupMessageRecord.toBasicChatItemBuilder(groupReceipts: List?): ChatItem.Builder { + val record = this + + return ChatItem.Builder().apply { + chatId = record.threadId + authorId = record.fromRecipientId + dateSent = record.dateSent + sealedSender = record.sealedSender + expireStartDate = if (record.expireStarted > 0) record.expireStarted else null + expiresInMs = if (record.expiresIn > 0) record.expiresIn else null + revisions = emptyList() + sms = !MessageTypes.isSecureType(record.type) + + if (MessageTypes.isOutgoingMessageType(record.type)) { + outgoing = ChatItem.OutgoingMessageDetails( + sendStatus = record.toBackupSendStatus(groupReceipts) + ) + } else { + incoming = ChatItem.IncomingMessageDetails( + dateServerSent = record.dateServer, + dateReceived = record.dateReceived, + read = record.read + ) + } + } + } + + private fun BackupMessageRecord.toTextMessage(reactionRecords: List?): StandardMessage { + return StandardMessage( + quote = this.toQuote(), + text = Text( + body = this.body!!, + bodyRanges = this.bodyRanges?.toBackupBodyRanges() ?: emptyList() + ), + // TODO Link previews! + linkPreview = emptyList(), + longText = null, + reactions = reactionRecords.toBackupReactions() + ) + } + + private fun BackupMessageRecord.toQuote(): Quote? { + return if (this.quoteTargetSentTimestamp != MessageTable.QUOTE_NOT_PRESENT_ID && this.quoteAuthor > 0) { + // TODO Attachments! + val type = QuoteModel.Type.fromCode(this.quoteType) + Quote( + targetSentTimestamp = this.quoteTargetSentTimestamp.takeIf { !this.quoteMissing && it != MessageTable.QUOTE_TARGET_MISSING_ID }, + authorId = this.quoteAuthor, + text = this.quoteBody, + bodyRanges = this.quoteBodyRanges?.toBackupBodyRanges() ?: emptyList(), + type = when (type) { + QuoteModel.Type.NORMAL -> Quote.Type.NORMAL + QuoteModel.Type.GIFT_BADGE -> Quote.Type.GIFTBADGE + } + ) + } else { + null + } + } + + private fun ByteArray.toBackupBodyRanges(): List { + val decoded: BodyRangeList = try { + BodyRangeList.ADAPTER.decode(this) + } catch (e: IOException) { + Log.w(TAG, "Failed to decode BodyRangeList!") + return emptyList() + } + + return decoded.ranges.map { + BackupBodyRange( + start = it.start, + length = it.length, + mentionAci = it.mentionUuid?.let { UuidUtil.parseOrThrow(it) }?.toByteArray()?.toByteString(), + style = it.style?.toBackupBodyRangeStyle() + ) + } + } + + private fun BodyRangeList.BodyRange.Style.toBackupBodyRangeStyle(): BackupBodyRange.Style { + return when (this) { + BodyRangeList.BodyRange.Style.BOLD -> BackupBodyRange.Style.BOLD + BodyRangeList.BodyRange.Style.ITALIC -> BackupBodyRange.Style.ITALIC + BodyRangeList.BodyRange.Style.STRIKETHROUGH -> BackupBodyRange.Style.STRIKETHROUGH + BodyRangeList.BodyRange.Style.MONOSPACE -> BackupBodyRange.Style.MONOSPACE + BodyRangeList.BodyRange.Style.SPOILER -> BackupBodyRange.Style.SPOILER + } + } + + private fun List?.toBackupReactions(): List { + return this + ?.map { + Reaction( + emoji = it.emoji, + authorId = it.author.toLong(), + sentTimestamp = it.dateSent, + receivedTimestamp = it.dateReceived + ) + } ?: emptyList() + } + + private fun BackupMessageRecord.toBackupSendStatus(groupReceipts: List?): List { + if (!MessageTypes.isOutgoingMessageType(this.type)) { + return emptyList() + } + + if (!groupReceipts.isNullOrEmpty()) { + return groupReceipts.toBackupSendStatus(this.networkFailureRecipientIds, this.identityMismatchRecipientIds) + } + + val status: SendStatus.Status = when { + this.viewed -> SendStatus.Status.VIEWED + this.hasReadReceipt -> SendStatus.Status.READ + this.hasDeliveryReceipt -> SendStatus.Status.DELIVERED + this.baseType == MessageTypes.BASE_SENT_TYPE -> SendStatus.Status.SENT + MessageTypes.isFailedMessageType(this.type) -> SendStatus.Status.FAILED + else -> SendStatus.Status.PENDING + } + + return listOf( + SendStatus( + recipientId = this.toRecipientId, + deliveryStatus = status, + lastStatusUpdateTimestamp = this.receiptTimestamp, + sealedSender = this.sealedSender, + networkFailure = this.networkFailureRecipientIds.contains(this.toRecipientId), + identityKeyMismatch = this.identityMismatchRecipientIds.contains(this.toRecipientId) + ) + ) + } + + private fun List.toBackupSendStatus(networkFailureRecipientIds: Set, identityMismatchRecipientIds: Set): List { + return this.map { + SendStatus( + recipientId = it.recipientId.toLong(), + deliveryStatus = it.status.toBackupDeliveryStatus(), + sealedSender = it.isUnidentified, + lastStatusUpdateTimestamp = it.timestamp, + networkFailure = networkFailureRecipientIds.contains(it.recipientId.toLong()), + identityKeyMismatch = identityMismatchRecipientIds.contains(it.recipientId.toLong()) + ) + } + } + + private fun Int.toBackupDeliveryStatus(): SendStatus.Status { + return when (this) { + GroupReceiptTable.STATUS_UNDELIVERED -> SendStatus.Status.PENDING + GroupReceiptTable.STATUS_DELIVERED -> SendStatus.Status.DELIVERED + GroupReceiptTable.STATUS_READ -> SendStatus.Status.READ + GroupReceiptTable.STATUS_VIEWED -> SendStatus.Status.VIEWED + GroupReceiptTable.STATUS_SKIPPED -> SendStatus.Status.SKIPPED + else -> SendStatus.Status.SKIPPED + } + } + + private fun String?.parseNetworkFailures(): Set { + if (this.isNullOrBlank()) { + return emptySet() + } + + return try { + JsonUtils.fromJson(this, NetworkFailureSet::class.java).items.map { it.recipientId.toLong() }.toSet() + } catch (e: IOException) { + emptySet() + } + } + + private fun String?.parseIdentityMismatches(): Set { + if (this.isNullOrBlank()) { + return emptySet() + } + + return try { + JsonUtils.fromJson(this, IdentityKeyMismatchSet::class.java).items.map { it.recipientId.toLong() }.toSet() + } catch (e: IOException) { + emptySet() + } + } + + private fun Cursor.toBackupMessageRecord(): BackupMessageRecord { + return BackupMessageRecord( + id = this.requireLong(MessageTable.ID), + dateSent = this.requireLong(MessageTable.DATE_SENT), + dateReceived = this.requireLong(MessageTable.DATE_RECEIVED), + dateServer = this.requireLong(MessageTable.DATE_SERVER), + type = this.requireLong(MessageTable.TYPE), + threadId = this.requireLong(MessageTable.THREAD_ID), + body = this.requireString(MessageTable.BODY), + bodyRanges = this.requireBlob(MessageTable.MESSAGE_RANGES), + fromRecipientId = this.requireLong(MessageTable.FROM_RECIPIENT_ID), + toRecipientId = this.requireLong(MessageTable.TO_RECIPIENT_ID), + expiresIn = this.requireLong(MessageTable.EXPIRES_IN), + expireStarted = this.requireLong(MessageTable.EXPIRE_STARTED), + remoteDeleted = this.requireBoolean(MessageTable.REMOTE_DELETED), + sealedSender = this.requireBoolean(MessageTable.UNIDENTIFIED), + quoteTargetSentTimestamp = this.requireLong(MessageTable.QUOTE_ID), + quoteAuthor = this.requireLong(MessageTable.QUOTE_AUTHOR), + quoteBody = this.requireString(MessageTable.QUOTE_BODY), + quoteMissing = this.requireBoolean(MessageTable.QUOTE_MISSING), + quoteBodyRanges = this.requireBlob(MessageTable.QUOTE_BODY_RANGES), + quoteType = this.requireInt(MessageTable.QUOTE_TYPE), + originalMessageId = this.requireLong(MessageTable.ORIGINAL_MESSAGE_ID), + latestRevisionId = this.requireLong(MessageTable.LATEST_REVISION_ID), + hasDeliveryReceipt = this.requireBoolean(MessageTable.HAS_DELIVERY_RECEIPT), + viewed = this.requireBoolean(MessageTable.VIEWED_COLUMN), + hasReadReceipt = this.requireBoolean(MessageTable.HAS_READ_RECEIPT), + read = this.requireBoolean(MessageTable.READ), + receiptTimestamp = this.requireLong(MessageTable.RECEIPT_TIMESTAMP), + networkFailureRecipientIds = this.requireString(MessageTable.NETWORK_FAILURES).parseNetworkFailures(), + identityMismatchRecipientIds = this.requireString(MessageTable.MISMATCHED_IDENTITIES).parseIdentityMismatches(), + baseType = this.requireLong(COLUMN_BASE_TYPE) + ) + } + + private class BackupMessageRecord( + val id: Long, + val dateSent: Long, + val dateReceived: Long, + val dateServer: Long, + val type: Long, + val threadId: Long, + val body: String?, + val bodyRanges: ByteArray?, + val fromRecipientId: Long, + val toRecipientId: Long, + val expiresIn: Long, + val expireStarted: Long, + val remoteDeleted: Boolean, + val sealedSender: Boolean, + val quoteTargetSentTimestamp: Long, + val quoteAuthor: Long, + val quoteBody: String?, + val quoteMissing: Boolean, + val quoteBodyRanges: ByteArray?, + val quoteType: Int, + val originalMessageId: Long, + val latestRevisionId: Long, + val hasDeliveryReceipt: Boolean, + val hasReadReceipt: Boolean, + val viewed: Boolean, + val receiptTimestamp: Long, + val read: Boolean, + val networkFailureRecipientIds: Set, + val identityMismatchRecipientIds: Set, + val baseType: Long + ) +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/ChatItemImportInserter.kt b/app/src/main/java/org/tm/archive/backup/v2/database/ChatItemImportInserter.kt new file mode 100644 index 00000000..92a53fd2 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/ChatItemImportInserter.kt @@ -0,0 +1,516 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import android.content.ContentValues +import androidx.core.content.contentValuesOf +import org.signal.core.util.Base64 +import org.signal.core.util.SqlUtil +import org.signal.core.util.logging.Log +import org.signal.core.util.requireLong +import org.signal.core.util.toInt +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.backup.v2.proto.BodyRange +import org.tm.archive.backup.v2.proto.ChatItem +import org.tm.archive.backup.v2.proto.ChatUpdateMessage +import org.tm.archive.backup.v2.proto.IndividualCallChatUpdate +import org.tm.archive.backup.v2.proto.Quote +import org.tm.archive.backup.v2.proto.Reaction +import org.tm.archive.backup.v2.proto.SendStatus +import org.tm.archive.backup.v2.proto.SimpleChatUpdate +import org.tm.archive.backup.v2.proto.StandardMessage +import org.tm.archive.database.CallTable +import org.tm.archive.database.GroupReceiptTable +import org.tm.archive.database.MessageTable +import org.tm.archive.database.MessageTypes +import org.tm.archive.database.ReactionTable +import org.tm.archive.database.SQLiteDatabase +import org.tm.archive.database.documents.IdentityKeyMismatch +import org.tm.archive.database.documents.IdentityKeyMismatchSet +import org.tm.archive.database.documents.NetworkFailure +import org.tm.archive.database.documents.NetworkFailureSet +import org.tm.archive.database.model.databaseprotos.BodyRangeList +import org.tm.archive.database.model.databaseprotos.ProfileChangeDetails +import org.tm.archive.database.model.databaseprotos.SessionSwitchoverEvent +import org.tm.archive.database.model.databaseprotos.ThreadMergeEvent +import org.tm.archive.mms.QuoteModel +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId +import org.tm.archive.util.JsonUtils +import org.whispersystems.signalservice.api.util.UuidUtil + +/** + * An object that will ingest all fo the [ChatItem]s you want to write, buffer them until hitting a specified batch size, and then batch insert them + * for fast throughput. + */ +class ChatItemImportInserter( + private val db: SQLiteDatabase, + private val backupState: BackupState, + private val batchSize: Int +) { + companion object { + private val TAG = Log.tag(ChatItemImportInserter::class.java) + + private val MESSAGE_COLUMNS = arrayOf( + MessageTable.DATE_SENT, + MessageTable.DATE_RECEIVED, + MessageTable.DATE_SERVER, + MessageTable.TYPE, + MessageTable.THREAD_ID, + MessageTable.READ, + MessageTable.BODY, + MessageTable.FROM_RECIPIENT_ID, + MessageTable.TO_RECIPIENT_ID, + MessageTable.HAS_DELIVERY_RECEIPT, + MessageTable.HAS_READ_RECEIPT, + MessageTable.VIEWED_COLUMN, + MessageTable.MISMATCHED_IDENTITIES, + MessageTable.EXPIRES_IN, + MessageTable.EXPIRE_STARTED, + MessageTable.UNIDENTIFIED, + MessageTable.REMOTE_DELETED, + MessageTable.REMOTE_DELETED, + MessageTable.NETWORK_FAILURES, + MessageTable.QUOTE_ID, + MessageTable.QUOTE_AUTHOR, + MessageTable.QUOTE_BODY, + MessageTable.QUOTE_MISSING, + MessageTable.QUOTE_BODY_RANGES, + MessageTable.QUOTE_TYPE, + MessageTable.SHARED_CONTACTS, + MessageTable.LINK_PREVIEWS, + MessageTable.MESSAGE_RANGES, + MessageTable.VIEW_ONCE + ) + + private val REACTION_COLUMNS = arrayOf( + ReactionTable.MESSAGE_ID, + ReactionTable.AUTHOR_ID, + ReactionTable.EMOJI, + ReactionTable.DATE_SENT, + ReactionTable.DATE_RECEIVED + ) + + private val GROUP_RECEIPT_COLUMNS = arrayOf( + GroupReceiptTable.MMS_ID, + GroupReceiptTable.RECIPIENT_ID, + GroupReceiptTable.STATUS, + GroupReceiptTable.TIMESTAMP, + GroupReceiptTable.UNIDENTIFIED + ) + } + + private val selfId = Recipient.self().id + private val buffer: Buffer = Buffer() + private var messageId: Long = SqlUtil.getNextAutoIncrementId(db, MessageTable.TABLE_NAME) + + /** + * Indicate that you want to insert the [ChatItem] into the database. + * If this item causes the buffer to hit the batch size, then a batch of items will actually be inserted. + */ + fun insert(chatItem: ChatItem) { + val fromLocalRecipientId: RecipientId? = backupState.backupToLocalRecipientId[chatItem.authorId] + if (fromLocalRecipientId == null) { + Log.w(TAG, "[insert] Could not find a local recipient for backup recipient ID ${chatItem.authorId}! Skipping.") + return + } + + val chatLocalRecipientId: RecipientId? = backupState.chatIdToLocalRecipientId[chatItem.chatId] + if (chatLocalRecipientId == null) { + Log.w(TAG, "[insert] Could not find a local recipient for chatId ${chatItem.chatId}! Skipping.") + return + } + + val localThreadId: Long? = backupState.chatIdToLocalThreadId[chatItem.chatId] + if (localThreadId == null) { + Log.w(TAG, "[insert] Could not find a local threadId for backup chatId ${chatItem.chatId}! Skipping.") + return + } + + val chatBackupRecipientId: Long? = backupState.chatIdToBackupRecipientId[chatItem.chatId] + if (chatBackupRecipientId == null) { + Log.w(TAG, "[insert] Could not find a backup recipientId for backup chatId ${chatItem.chatId}! Skipping.") + return + } + + buffer.messages += chatItem.toMessageInsert(fromLocalRecipientId, chatLocalRecipientId, localThreadId) + buffer.reactions += chatItem.toReactionContentValues(messageId) + buffer.groupReceipts += chatItem.toGroupReceiptContentValues(messageId, chatBackupRecipientId) + + messageId++ + + if (buffer.size >= batchSize) { + flush() + } + } + + /** Returns true if something was written to the db, otherwise false. */ + fun flush(): Boolean { + if (buffer.size == 0) { + return false + } + + buildBulkInsert(MessageTable.TABLE_NAME, MESSAGE_COLUMNS, buffer.messages).forEach { + db.rawQuery("${it.query.where} RETURNING ${MessageTable.ID}", it.query.whereArgs).use { cursor -> + var index = 0 + while (cursor.moveToNext()) { + val rowId = cursor.requireLong(MessageTable.ID) + val followup = it.inserts[index].followUp + if (followup != null) { + followup(rowId) + } + index++ + } + } + } + + SqlUtil.buildBulkInsert(ReactionTable.TABLE_NAME, REACTION_COLUMNS, buffer.reactions).forEach { + db.execSQL(it.where, it.whereArgs) + } + + SqlUtil.buildBulkInsert(GroupReceiptTable.TABLE_NAME, GROUP_RECEIPT_COLUMNS, buffer.groupReceipts).forEach { + db.execSQL(it.where, it.whereArgs) + } + + messageId = SqlUtil.getNextAutoIncrementId(db, MessageTable.TABLE_NAME) + + return true + } + + private fun buildBulkInsert(tableName: String, columns: Array, messageInserts: List, maxQueryArgs: Int = 999): List { + val batchSize = maxQueryArgs / columns.size + + return messageInserts + .chunked(batchSize) + .map { batch: List -> BatchInsert(batch, SqlUtil.buildSingleBulkInsert(tableName, columns, batch.map { it.contentValues })) } + .toList() + } + + private fun ChatItem.toMessageInsert(fromRecipientId: RecipientId, chatRecipientId: RecipientId, threadId: Long): MessageInsert { + val contentValues = this.toMessageContentValues(fromRecipientId, chatRecipientId, threadId) + + var followUp: ((Long) -> Unit)? = null + if (this.updateMessage != null) { + if (this.updateMessage.callingMessage != null && this.updateMessage.callingMessage.callId != null) { + followUp = { messageRowId -> + val callContentValues = ContentValues() + callContentValues.put(CallTable.MESSAGE_ID, messageRowId) + db.update(CallTable.TABLE_NAME, SQLiteDatabase.CONFLICT_IGNORE, callContentValues, "${CallTable.CALL_ID} = ?", SqlUtil.buildArgs(this.updateMessage.callingMessage.callId)) + } + } + } + return MessageInsert(contentValues, followUp) + } + + private class BatchInsert(val inserts: List, val query: SqlUtil.Query) + + private fun ChatItem.toMessageContentValues(fromRecipientId: RecipientId, chatRecipientId: RecipientId, threadId: Long): ContentValues { + val contentValues = ContentValues() + + contentValues.put(MessageTable.TYPE, this.getMessageType()) + contentValues.put(MessageTable.DATE_SENT, this.dateSent) + contentValues.put(MessageTable.DATE_SERVER, this.incoming?.dateServerSent ?: -1) + contentValues.put(MessageTable.FROM_RECIPIENT_ID, fromRecipientId.serialize()) + contentValues.put(MessageTable.TO_RECIPIENT_ID, (if (this.outgoing != null) chatRecipientId else selfId).serialize()) + contentValues.put(MessageTable.THREAD_ID, threadId) + contentValues.put(MessageTable.DATE_RECEIVED, this.incoming?.dateReceived ?: this.dateSent) + contentValues.put(MessageTable.RECEIPT_TIMESTAMP, this.outgoing?.sendStatus?.maxOf { it.lastStatusUpdateTimestamp } ?: 0) + contentValues.putNull(MessageTable.LATEST_REVISION_ID) + contentValues.putNull(MessageTable.ORIGINAL_MESSAGE_ID) + contentValues.put(MessageTable.REVISION_NUMBER, 0) + contentValues.put(MessageTable.EXPIRES_IN, this.expiresInMs ?: 0) + contentValues.put(MessageTable.EXPIRE_STARTED, this.expireStartDate ?: 0) + + if (this.outgoing != null) { + val viewed = this.outgoing.sendStatus.any { it.deliveryStatus == SendStatus.Status.VIEWED } + val hasReadReceipt = viewed || this.outgoing.sendStatus.any { it.deliveryStatus == SendStatus.Status.READ } + val hasDeliveryReceipt = viewed || hasReadReceipt || this.outgoing.sendStatus.any { it.deliveryStatus == SendStatus.Status.DELIVERED } + + contentValues.put(MessageTable.VIEWED_COLUMN, viewed.toInt()) + contentValues.put(MessageTable.HAS_READ_RECEIPT, hasReadReceipt.toInt()) + contentValues.put(MessageTable.HAS_DELIVERY_RECEIPT, hasDeliveryReceipt.toInt()) + contentValues.put(MessageTable.UNIDENTIFIED, this.outgoing.sendStatus.count { it.sealedSender }) + contentValues.put(MessageTable.READ, 1) + + contentValues.addNetworkFailures(this, backupState) + contentValues.addIdentityKeyMismatches(this, backupState) + } else { + contentValues.put(MessageTable.VIEWED_COLUMN, 0) + contentValues.put(MessageTable.HAS_READ_RECEIPT, 0) + contentValues.put(MessageTable.HAS_DELIVERY_RECEIPT, 0) + contentValues.put(MessageTable.UNIDENTIFIED, this.sealedSender?.toInt()) + contentValues.put(MessageTable.READ, this.incoming?.read?.toInt() ?: 0) + } + + contentValues.put(MessageTable.QUOTE_ID, 0) + contentValues.put(MessageTable.QUOTE_AUTHOR, 0) + contentValues.put(MessageTable.QUOTE_MISSING, 0) + contentValues.put(MessageTable.QUOTE_TYPE, 0) + contentValues.put(MessageTable.VIEW_ONCE, 0) + contentValues.put(MessageTable.REMOTE_DELETED, 0) + + when { + this.standardMessage != null -> contentValues.addStandardMessage(this.standardMessage) + this.remoteDeletedMessage != null -> contentValues.put(MessageTable.REMOTE_DELETED, 1) + this.updateMessage != null -> contentValues.addUpdateMessage(this.updateMessage) + } + + return contentValues + } + + private fun ChatItem.toReactionContentValues(messageId: Long): List { + val reactions: List = when { + this.standardMessage != null -> this.standardMessage.reactions + this.contactMessage != null -> this.contactMessage.reactions + this.voiceMessage != null -> this.voiceMessage.reactions + this.stickerMessage != null -> this.stickerMessage.reactions + else -> emptyList() + } + + return reactions + .mapNotNull { + val authorId: Long? = backupState.backupToLocalRecipientId[it.authorId]?.toLong() + + if (authorId != null) { + contentValuesOf( + ReactionTable.MESSAGE_ID to messageId, + ReactionTable.AUTHOR_ID to authorId, + ReactionTable.DATE_SENT to it.sentTimestamp, + ReactionTable.DATE_RECEIVED to it.receivedTimestamp, + ReactionTable.EMOJI to it.emoji + ) + } else { + Log.w(TAG, "[Reaction] Could not find a local recipient for backup recipient ID ${it.authorId}! Skipping.") + null + } + } + } + + private fun ChatItem.toGroupReceiptContentValues(messageId: Long, chatBackupRecipientId: Long): List { + if (this.outgoing == null) { + return emptyList() + } + + // TODO This seems like an indirect/bad way to detect if this is a 1:1 or group convo + if (this.outgoing.sendStatus.size == 1 && this.outgoing.sendStatus[0].recipientId == chatBackupRecipientId) { + return emptyList() + } + + return this.outgoing.sendStatus.mapNotNull { sendStatus -> + val recipientId = backupState.backupToLocalRecipientId[sendStatus.recipientId] + + if (recipientId != null) { + contentValuesOf( + GroupReceiptTable.MMS_ID to messageId, + GroupReceiptTable.RECIPIENT_ID to recipientId.serialize(), + GroupReceiptTable.STATUS to sendStatus.deliveryStatus.toLocalSendStatus(), + GroupReceiptTable.TIMESTAMP to sendStatus.lastStatusUpdateTimestamp, + GroupReceiptTable.UNIDENTIFIED to sendStatus.sealedSender + ) + } else { + Log.w(TAG, "[GroupReceipts] Could not find a local recipient for backup recipient ID ${sendStatus.recipientId}! Skipping.") + null + } + } + } + + private fun ChatItem.getMessageType(): Long { + var type: Long = if (this.outgoing != null) { + if (this.outgoing.sendStatus.count { it.identityKeyMismatch } > 0) { + MessageTypes.BASE_SENT_FAILED_TYPE + } else if (this.outgoing.sendStatus.count { it.networkFailure } > 0) { + MessageTypes.BASE_SENDING_TYPE + } else { + MessageTypes.BASE_SENT_TYPE + } + } else { + MessageTypes.BASE_INBOX_TYPE + } + + if (!this.sms) { + type = type or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT + } + + return type + } + + private fun ContentValues.addStandardMessage(standardMessage: StandardMessage) { + if (standardMessage.text != null) { + this.put(MessageTable.BODY, standardMessage.text.body) + + if (standardMessage.text.bodyRanges.isNotEmpty()) { + this.put(MessageTable.MESSAGE_RANGES, standardMessage.text.bodyRanges.toLocalBodyRanges()?.encode() as ByteArray?) + } + } + + if (standardMessage.quote != null) { + this.addQuote(standardMessage.quote) + } + } + + private fun ContentValues.addUpdateMessage(updateMessage: ChatUpdateMessage) { + var typeFlags: Long = 0 + when { + updateMessage.simpleUpdate != null -> { + typeFlags = when (updateMessage.simpleUpdate.type) { + SimpleChatUpdate.Type.UNKNOWN -> 0 + SimpleChatUpdate.Type.JOINED_SIGNAL -> MessageTypes.JOINED_TYPE + SimpleChatUpdate.Type.IDENTITY_UPDATE -> MessageTypes.KEY_EXCHANGE_IDENTITY_UPDATE_BIT + SimpleChatUpdate.Type.IDENTITY_VERIFIED -> MessageTypes.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT + SimpleChatUpdate.Type.IDENTITY_DEFAULT -> MessageTypes.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT + SimpleChatUpdate.Type.CHANGE_NUMBER -> MessageTypes.CHANGE_NUMBER_TYPE + SimpleChatUpdate.Type.BOOST_REQUEST -> MessageTypes.BOOST_REQUEST_TYPE + SimpleChatUpdate.Type.END_SESSION -> MessageTypes.END_SESSION_BIT + SimpleChatUpdate.Type.CHAT_SESSION_REFRESH -> MessageTypes.ENCRYPTION_REMOTE_FAILED_BIT + SimpleChatUpdate.Type.BAD_DECRYPT -> MessageTypes.BAD_DECRYPT_TYPE + SimpleChatUpdate.Type.PAYMENTS_ACTIVATED -> MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED + SimpleChatUpdate.Type.PAYMENT_ACTIVATION_REQUEST -> MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST + } + } + updateMessage.expirationTimerChange != null -> { + typeFlags = MessageTypes.EXPIRATION_TIMER_UPDATE_BIT + put(MessageTable.EXPIRES_IN, updateMessage.expirationTimerChange.expiresInMs.toLong()) + } + updateMessage.profileChange != null -> { + typeFlags = MessageTypes.PROFILE_CHANGE_TYPE + val profileChangeDetails = ProfileChangeDetails(profileNameChange = ProfileChangeDetails.StringChange(previous = updateMessage.profileChange.previousName, newValue = updateMessage.profileChange.newName)) + .encode() + put(MessageTable.BODY, Base64.encodeWithPadding(profileChangeDetails)) + } + updateMessage.sessionSwitchover != null -> { + typeFlags = MessageTypes.SESSION_SWITCHOVER_TYPE + val sessionSwitchoverDetails = SessionSwitchoverEvent(e164 = updateMessage.sessionSwitchover.e164.toString()).encode() + put(MessageTable.BODY, Base64.encodeWithPadding(sessionSwitchoverDetails)) + } + updateMessage.threadMerge != null -> { + typeFlags = MessageTypes.THREAD_MERGE_TYPE + val threadMergeDetails = ThreadMergeEvent(previousE164 = updateMessage.threadMerge.previousE164.toString()).encode() + put(MessageTable.BODY, Base64.encodeWithPadding(threadMergeDetails)) + } + updateMessage.callingMessage != null -> { + when { + updateMessage.callingMessage.callId != null -> { + typeFlags = backupState.callIdToType[updateMessage.callingMessage.callId]!! + } + updateMessage.callingMessage.callMessage != null -> { + typeFlags = when (updateMessage.callingMessage.callMessage.type) { + IndividualCallChatUpdate.Type.INCOMING_AUDIO_CALL -> MessageTypes.INCOMING_AUDIO_CALL_TYPE + IndividualCallChatUpdate.Type.INCOMING_VIDEO_CALL -> MessageTypes.INCOMING_VIDEO_CALL_TYPE + IndividualCallChatUpdate.Type.OUTGOING_AUDIO_CALL -> MessageTypes.OUTGOING_AUDIO_CALL_TYPE + IndividualCallChatUpdate.Type.OUTGOING_VIDEO_CALL -> MessageTypes.OUTGOING_VIDEO_CALL_TYPE + IndividualCallChatUpdate.Type.MISSED_AUDIO_CALL -> MessageTypes.MISSED_AUDIO_CALL_TYPE + IndividualCallChatUpdate.Type.MISSED_VIDEO_CALL -> MessageTypes.MISSED_VIDEO_CALL_TYPE + IndividualCallChatUpdate.Type.UNKNOWN -> typeFlags + } + } + } + // Calls don't use the incoming/outgoing flags, so we overwrite the flags here + this.put(MessageTable.TYPE, typeFlags) + } + } + this.put(MessageTable.TYPE, getAsLong(MessageTable.TYPE) or typeFlags) + } + + private fun ContentValues.addQuote(quote: Quote) { + this.put(MessageTable.QUOTE_ID, quote.targetSentTimestamp ?: MessageTable.QUOTE_TARGET_MISSING_ID) + this.put(MessageTable.QUOTE_AUTHOR, backupState.backupToLocalRecipientId[quote.authorId]!!.serialize()) + this.put(MessageTable.QUOTE_BODY, quote.text) + this.put(MessageTable.QUOTE_TYPE, quote.type.toLocalQuoteType()) + this.put(MessageTable.QUOTE_BODY_RANGES, quote.bodyRanges.toLocalBodyRanges()?.encode()) + // TODO quote attachments + this.put(MessageTable.QUOTE_MISSING, (quote.targetSentTimestamp == null).toInt()) + } + + private fun Quote.Type.toLocalQuoteType(): Int { + return when (this) { + Quote.Type.UNKNOWN -> QuoteModel.Type.NORMAL.code + Quote.Type.NORMAL -> QuoteModel.Type.NORMAL.code + Quote.Type.GIFTBADGE -> QuoteModel.Type.GIFT_BADGE.code + } + } + + private fun ContentValues.addNetworkFailures(chatItem: ChatItem, backupState: BackupState) { + if (chatItem.outgoing == null) { + return + } + + val networkFailures = chatItem.outgoing.sendStatus + .filter { status -> status.networkFailure } + .mapNotNull { status -> backupState.backupToLocalRecipientId[status.recipientId] } + .map { recipientId -> NetworkFailure(recipientId) } + .toSet() + + if (networkFailures.isNotEmpty()) { + this.put(MessageTable.NETWORK_FAILURES, JsonUtils.toJson(NetworkFailureSet(networkFailures))) + } + } + + private fun ContentValues.addIdentityKeyMismatches(chatItem: ChatItem, backupState: BackupState) { + if (chatItem.outgoing == null) { + return + } + + val mismatches = chatItem.outgoing.sendStatus + .filter { status -> status.identityKeyMismatch } + .mapNotNull { status -> backupState.backupToLocalRecipientId[status.recipientId] } + .map { recipientId -> IdentityKeyMismatch(recipientId, null) } // TODO We probably want the actual identity key in this status situation? + .toSet() + + if (mismatches.isNotEmpty()) { + this.put(MessageTable.MISMATCHED_IDENTITIES, JsonUtils.toJson(IdentityKeyMismatchSet(mismatches))) + } + } + + private fun List.toLocalBodyRanges(): BodyRangeList? { + if (this.isEmpty()) { + return null + } + + return BodyRangeList( + ranges = this.map { bodyRange -> + BodyRangeList.BodyRange( + mentionUuid = bodyRange.mentionAci?.let { UuidUtil.fromByteString(it) }?.toString(), + style = bodyRange.style?.let { + when (bodyRange.style) { + BodyRange.Style.BOLD -> BodyRangeList.BodyRange.Style.BOLD + BodyRange.Style.ITALIC -> BodyRangeList.BodyRange.Style.ITALIC + BodyRange.Style.MONOSPACE -> BodyRangeList.BodyRange.Style.MONOSPACE + BodyRange.Style.SPOILER -> BodyRangeList.BodyRange.Style.SPOILER + BodyRange.Style.STRIKETHROUGH -> BodyRangeList.BodyRange.Style.STRIKETHROUGH + else -> null + } + }, + start = bodyRange.start ?: 0, + length = bodyRange.length ?: 0 + ) + } + ) + } + + private fun SendStatus.Status.toLocalSendStatus(): Int { + return when (this) { + SendStatus.Status.UNKNOWN -> GroupReceiptTable.STATUS_UNKNOWN + SendStatus.Status.FAILED -> GroupReceiptTable.STATUS_UNKNOWN + SendStatus.Status.PENDING -> GroupReceiptTable.STATUS_UNDELIVERED + SendStatus.Status.SENT -> GroupReceiptTable.STATUS_UNDELIVERED + SendStatus.Status.DELIVERED -> GroupReceiptTable.STATUS_DELIVERED + SendStatus.Status.READ -> GroupReceiptTable.STATUS_READ + SendStatus.Status.VIEWED -> GroupReceiptTable.STATUS_VIEWED + SendStatus.Status.SKIPPED -> GroupReceiptTable.STATUS_SKIPPED + } + } + + private class MessageInsert(val contentValues: ContentValues, val followUp: ((Long) -> Unit)?) + + private class Buffer( + val messages: MutableList = mutableListOf(), + val reactions: MutableList = mutableListOf(), + val groupReceipts: MutableList = mutableListOf() + ) { + val size: Int + get() = listOf(messages.size, reactions.size, groupReceipts.size).max() + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/DistributionListTablesBackupExtensions.kt b/app/src/main/java/org/tm/archive/backup/v2/database/DistributionListTablesBackupExtensions.kt new file mode 100644 index 00000000..3cb3e3bf --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/DistributionListTablesBackupExtensions.kt @@ -0,0 +1,114 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import okio.ByteString.Companion.toByteString +import org.signal.core.util.CursorUtil +import org.signal.core.util.delete +import org.signal.core.util.logging.Log +import org.signal.core.util.readToList +import org.signal.core.util.requireLong +import org.signal.core.util.requireNonNullString +import org.signal.core.util.requireObject +import org.signal.core.util.select +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.database.DistributionListTables +import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.model.DistributionListId +import org.tm.archive.database.model.DistributionListPrivacyMode +import org.tm.archive.database.model.DistributionListRecord +import org.tm.archive.recipients.RecipientId +import org.whispersystems.signalservice.api.push.DistributionId +import org.whispersystems.signalservice.api.util.UuidUtil +import org.whispersystems.signalservice.api.util.toByteArray +import org.tm.archive.backup.v2.proto.DistributionList as BackupDistributionList + +private val TAG = Log.tag(DistributionListTables::class.java) + +fun DistributionListTables.getAllForBackup(): List { + val records = readableDatabase + .select() + .from(DistributionListTables.ListTable.TABLE_NAME) + .run() + .readToList { cursor -> + val id: DistributionListId = DistributionListId.from(cursor.requireLong(DistributionListTables.ListTable.ID)) + val privacyMode: DistributionListPrivacyMode = cursor.requireObject(DistributionListTables.ListTable.PRIVACY_MODE, DistributionListPrivacyMode.Serializer) + + DistributionListRecord( + id = id, + name = cursor.requireNonNullString(DistributionListTables.ListTable.NAME), + distributionId = DistributionId.from(cursor.requireNonNullString(DistributionListTables.ListTable.DISTRIBUTION_ID)), + allowsReplies = CursorUtil.requireBoolean(cursor, DistributionListTables.ListTable.ALLOWS_REPLIES), + rawMembers = getRawMembers(id, privacyMode), + members = getMembers(id), + deletedAtTimestamp = 0L, + isUnknown = CursorUtil.requireBoolean(cursor, DistributionListTables.ListTable.IS_UNKNOWN), + privacyMode = privacyMode + ) + } + + return records + .map { record -> + BackupRecipient( + distributionList = BackupDistributionList( + name = record.name, + distributionId = record.distributionId.asUuid().toByteArray().toByteString(), + allowReplies = record.allowsReplies, + deletionTimestamp = record.deletedAtTimestamp, + privacyMode = record.privacyMode.toBackupPrivacyMode(), + memberRecipientIds = record.members.map { it.toLong() } + ) + ) + } +} + +fun DistributionListTables.restoreFromBackup(dlist: BackupDistributionList, backupState: BackupState): RecipientId { + val members: List = dlist.memberRecipientIds + .mapNotNull { backupState.backupToLocalRecipientId[it] } + + if (members.size != dlist.memberRecipientIds.size) { + Log.w(TAG, "Couldn't find some member recipients! Missing backup recipientIds: ${dlist.memberRecipientIds.toSet() - members.toSet()}") + } + + val dlistId = this.createList( + name = dlist.name, + members = members, + distributionId = DistributionId.from(UuidUtil.fromByteString(dlist.distributionId)), + allowsReplies = dlist.allowReplies, + deletionTimestamp = dlist.deletionTimestamp, + storageId = null, + privacyMode = dlist.privacyMode.toLocalPrivacyMode() + )!! + + return SignalDatabase.distributionLists.getRecipientId(dlistId)!! +} + +fun DistributionListTables.clearAllDataForBackupRestore() { + writableDatabase + .delete(DistributionListTables.ListTable.TABLE_NAME) + .run() + + writableDatabase + .delete(DistributionListTables.MembershipTable.TABLE_NAME) + .run() +} + +private fun DistributionListPrivacyMode.toBackupPrivacyMode(): BackupDistributionList.PrivacyMode { + return when (this) { + DistributionListPrivacyMode.ONLY_WITH -> BackupDistributionList.PrivacyMode.ONLY_WITH + DistributionListPrivacyMode.ALL -> BackupDistributionList.PrivacyMode.ALL + DistributionListPrivacyMode.ALL_EXCEPT -> BackupDistributionList.PrivacyMode.ALL_EXCEPT + } +} + +private fun BackupDistributionList.PrivacyMode.toLocalPrivacyMode(): DistributionListPrivacyMode { + return when (this) { + BackupDistributionList.PrivacyMode.UNKNOWN -> DistributionListPrivacyMode.ALL + BackupDistributionList.PrivacyMode.ONLY_WITH -> DistributionListPrivacyMode.ONLY_WITH + BackupDistributionList.PrivacyMode.ALL -> DistributionListPrivacyMode.ALL + BackupDistributionList.PrivacyMode.ALL_EXCEPT -> DistributionListPrivacyMode.ALL_EXCEPT + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/MessageTableBackupExtensions.kt b/app/src/main/java/org/tm/archive/backup/v2/database/MessageTableBackupExtensions.kt new file mode 100644 index 00000000..c4a9e0b4 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/MessageTableBackupExtensions.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import org.signal.core.util.SqlUtil +import org.signal.core.util.logging.Log +import org.signal.core.util.select +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.database.MessageTable +import org.tm.archive.database.MessageTypes + +private val TAG = Log.tag(MessageTable::class.java) +private const val BASE_TYPE = "base_type" + +fun MessageTable.getMessagesForBackup(): ChatItemExportIterator { + val cursor = readableDatabase + .select( + MessageTable.ID, + MessageTable.DATE_SENT, + MessageTable.DATE_RECEIVED, + MessageTable.DATE_SERVER, + MessageTable.TYPE, + MessageTable.THREAD_ID, + MessageTable.BODY, + MessageTable.MESSAGE_RANGES, + MessageTable.FROM_RECIPIENT_ID, + MessageTable.TO_RECIPIENT_ID, + MessageTable.EXPIRES_IN, + MessageTable.EXPIRE_STARTED, + MessageTable.REMOTE_DELETED, + MessageTable.UNIDENTIFIED, + MessageTable.QUOTE_ID, + MessageTable.QUOTE_AUTHOR, + MessageTable.QUOTE_BODY, + MessageTable.QUOTE_MISSING, + MessageTable.QUOTE_BODY_RANGES, + MessageTable.QUOTE_TYPE, + MessageTable.ORIGINAL_MESSAGE_ID, + MessageTable.LATEST_REVISION_ID, + MessageTable.HAS_DELIVERY_RECEIPT, + MessageTable.HAS_READ_RECEIPT, + MessageTable.VIEWED_COLUMN, + MessageTable.RECEIPT_TIMESTAMP, + MessageTable.READ, + MessageTable.NETWORK_FAILURES, + MessageTable.MISMATCHED_IDENTITIES, + "${MessageTable.TYPE} & ${MessageTypes.BASE_TYPE_MASK} AS ${ChatItemExportIterator.COLUMN_BASE_TYPE}" + ) + .from(MessageTable.TABLE_NAME) + .where( + """ + $BASE_TYPE IN ( + ${MessageTypes.BASE_INBOX_TYPE}, + ${MessageTypes.BASE_OUTBOX_TYPE}, + ${MessageTypes.BASE_SENT_TYPE}, + ${MessageTypes.BASE_SENDING_TYPE}, + ${MessageTypes.BASE_SENT_FAILED_TYPE} + ) OR ${MessageTable.IS_CALL_TYPE_CLAUSE} + """ + ) + .orderBy("${MessageTable.DATE_RECEIVED} ASC") + .run() + + return ChatItemExportIterator(cursor, 100) +} + +fun MessageTable.createChatItemInserter(backupState: BackupState): ChatItemImportInserter { + return ChatItemImportInserter(writableDatabase, backupState, 100) +} + +fun MessageTable.clearAllDataForBackupRestore() { + writableDatabase.delete(MessageTable.TABLE_NAME, null, null) + SqlUtil.resetAutoIncrementValue(writableDatabase, MessageTable.TABLE_NAME) +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/RecipientTableBackupExtensions.kt b/app/src/main/java/org/tm/archive/backup/v2/database/RecipientTableBackupExtensions.kt new file mode 100644 index 00000000..cda46f9c --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/RecipientTableBackupExtensions.kt @@ -0,0 +1,332 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import android.content.ContentValues +import android.database.Cursor +import okio.ByteString.Companion.toByteString +import org.signal.core.util.Base64 +import org.signal.core.util.SqlUtil +import org.signal.core.util.delete +import org.signal.core.util.logging.Log +import org.signal.core.util.nullIfBlank +import org.signal.core.util.requireBoolean +import org.signal.core.util.requireInt +import org.signal.core.util.requireLong +import org.signal.core.util.requireNonNullBlob +import org.signal.core.util.requireString +import org.signal.core.util.select +import org.signal.core.util.toInt +import org.signal.core.util.update +import org.signal.libsignal.zkgroup.InvalidInputException +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.backup.v2.proto.AccountData +import org.tm.archive.backup.v2.proto.Contact +import org.tm.archive.backup.v2.proto.Group +import org.tm.archive.backup.v2.proto.Self +import org.tm.archive.database.GroupTable +import org.tm.archive.database.RecipientTable +import org.tm.archive.database.RecipientTableCursorUtil +import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.model.databaseprotos.RecipientExtras +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.phonenumbers.PhoneNumberFormatter +import org.tm.archive.profiles.ProfileName +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId +import org.whispersystems.signalservice.api.push.ServiceId.ACI +import org.whispersystems.signalservice.api.push.ServiceId.PNI +import java.io.Closeable + +typealias BackupRecipient = org.tm.archive.backup.v2.proto.Recipient +typealias BackupGroup = Group + +/** + * Fetches all individual contacts for backups and returns the result as an iterator. + * It's important to note that the iterator still needs to be closed after it's used. + * It's recommended to use `.use` or a try-with-resources pattern. + */ +fun RecipientTable.getContactsForBackup(selfId: Long): BackupContactIterator { + val cursor = readableDatabase + .select( + RecipientTable.ID, + RecipientTable.ACI_COLUMN, + RecipientTable.PNI_COLUMN, + RecipientTable.USERNAME, + RecipientTable.E164, + RecipientTable.BLOCKED, + RecipientTable.HIDDEN, + RecipientTable.REGISTERED, + RecipientTable.UNREGISTERED_TIMESTAMP, + RecipientTable.PROFILE_KEY, + RecipientTable.PROFILE_SHARING, + RecipientTable.PROFILE_GIVEN_NAME, + RecipientTable.PROFILE_FAMILY_NAME, + RecipientTable.PROFILE_JOINED_NAME, + RecipientTable.MUTE_UNTIL, + RecipientTable.EXTRAS + ) + .from(RecipientTable.TABLE_NAME) + .where( + """ + ${RecipientTable.TYPE} = ? AND ( + ${RecipientTable.ACI_COLUMN} NOT NULL OR + ${RecipientTable.PNI_COLUMN} NOT NULL OR + ${RecipientTable.E164} NOT NULL + ) + """, + RecipientTable.RecipientType.INDIVIDUAL.id + ) + .run() + + return BackupContactIterator(cursor, selfId) +} + +fun RecipientTable.getGroupsForBackup(): BackupGroupIterator { + val cursor = readableDatabase + .select( + "${RecipientTable.TABLE_NAME}.${RecipientTable.ID}", + "${RecipientTable.TABLE_NAME}.${RecipientTable.BLOCKED}", + "${RecipientTable.TABLE_NAME}.${RecipientTable.PROFILE_SHARING}", + "${RecipientTable.TABLE_NAME}.${RecipientTable.MUTE_UNTIL}", + "${RecipientTable.TABLE_NAME}.${RecipientTable.EXTRAS}", + "${GroupTable.TABLE_NAME}.${GroupTable.V2_MASTER_KEY}", + "${GroupTable.TABLE_NAME}.${GroupTable.SHOW_AS_STORY_STATE}" + ) + .from( + """ + ${RecipientTable.TABLE_NAME} + INNER JOIN ${GroupTable.TABLE_NAME} ON ${RecipientTable.TABLE_NAME}.${RecipientTable.ID} = ${GroupTable.TABLE_NAME}.${GroupTable.RECIPIENT_ID} + """ + ) + .run() + + return BackupGroupIterator(cursor) +} + +/** + * Takes a [BackupRecipient] and writes it into the database. + */ +fun RecipientTable.restoreRecipientFromBackup(recipient: BackupRecipient, backupState: BackupState): RecipientId? { + // TODO Need to handle groups + // TODO Also, should we move this when statement up to mimic the export? Kinda weird that this calls distributionListTable functions + return when { + recipient.contact != null -> restoreContactFromBackup(recipient.contact) + recipient.distributionList != null -> SignalDatabase.distributionLists.restoreFromBackup(recipient.distributionList, backupState) + recipient.self != null -> Recipient.self().id + else -> { + Log.w(TAG, "Unrecognized recipient type!") + null + } + } +} + +/** + * Given [AccountData], this will insert the necessary data for the local user into the [RecipientTable]. + */ +fun RecipientTable.restoreSelfFromBackup(accountData: AccountData, selfId: RecipientId) { + val values = ContentValues().apply { + put(RecipientTable.PROFILE_GIVEN_NAME, accountData.givenName.nullIfBlank()) + put(RecipientTable.PROFILE_FAMILY_NAME, accountData.familyName.nullIfBlank()) + put(RecipientTable.PROFILE_JOINED_NAME, ProfileName.fromParts(accountData.givenName, accountData.familyName).toString().nullIfBlank()) + put(RecipientTable.PROFILE_AVATAR, accountData.avatarUrlPath.nullIfBlank()) + put(RecipientTable.REGISTERED, RecipientTable.RegisteredState.REGISTERED.id) + put(RecipientTable.PROFILE_SHARING, true) + put(RecipientTable.UNREGISTERED_TIMESTAMP, 0) + put(RecipientTable.EXTRAS, RecipientExtras().encode()) + + try { + put(RecipientTable.PROFILE_KEY, Base64.encodeWithPadding(accountData.profileKey.toByteArray()).nullIfBlank()) + } catch (e: InvalidInputException) { + Log.w(TAG, "Missing profile key during restore") + } + + put(RecipientTable.USERNAME, accountData.username) + } + + writableDatabase + .update(RecipientTable.TABLE_NAME) + .values(values) + .where("${RecipientTable.ID} = ?", selfId) + .run() +} + +fun RecipientTable.clearAllDataForBackupRestore() { + writableDatabase.delete(RecipientTable.TABLE_NAME).run() + SqlUtil.resetAutoIncrementValue(writableDatabase, RecipientTable.TABLE_NAME) + + RecipientId.clearCache() + ApplicationDependencies.getRecipientCache().clear() + ApplicationDependencies.getRecipientCache().clearSelf() +} + +private fun RecipientTable.restoreContactFromBackup(contact: Contact): RecipientId { + val id = getAndPossiblyMergePnpVerified( + aci = ACI.parseOrNull(contact.aci?.toByteArray()), + pni = PNI.parseOrNull(contact.pni?.toByteArray()), + e164 = contact.formattedE164 + ) + + val profileKey = contact.profileKey?.toByteArray() + + writableDatabase + .update(RecipientTable.TABLE_NAME) + .values( + RecipientTable.BLOCKED to contact.blocked, + RecipientTable.HIDDEN to contact.hidden, + RecipientTable.PROFILE_FAMILY_NAME to contact.profileFamilyName.nullIfBlank(), + RecipientTable.PROFILE_GIVEN_NAME to contact.profileGivenName.nullIfBlank(), + RecipientTable.PROFILE_JOINED_NAME to ProfileName.fromParts(contact.profileGivenName.nullIfBlank(), contact.profileFamilyName.nullIfBlank()).toString().nullIfBlank(), + RecipientTable.PROFILE_KEY to if (profileKey == null) null else Base64.encodeWithPadding(profileKey), + RecipientTable.PROFILE_SHARING to contact.profileSharing.toInt(), + RecipientTable.REGISTERED to contact.registered.toLocalRegisteredState().id, + RecipientTable.USERNAME to contact.username, + RecipientTable.UNREGISTERED_TIMESTAMP to contact.unregisteredTimestamp, + RecipientTable.EXTRAS to contact.toLocalExtras().encode() + ) + .where("${RecipientTable.ID} = ?", id) + .run() + + return id +} + +private fun Contact.toLocalExtras(): RecipientExtras { + return RecipientExtras( + hideStory = this.hideStory + ) +} + +/** + * Provides a nice iterable interface over a [RecipientTable] cursor, converting rows to [BackupRecipient]s. + * Important: Because this is backed by a cursor, you must close it. It's recommended to use `.use()` or try-with-resources. + */ +class BackupContactIterator(private val cursor: Cursor, private val selfId: Long) : Iterator, Closeable { + override fun hasNext(): Boolean { + return cursor.count > 0 && !cursor.isLast + } + + override fun next(): BackupRecipient? { + if (!cursor.moveToNext()) { + throw NoSuchElementException() + } + + val id = cursor.requireLong(RecipientTable.ID) + if (id == selfId) { + return BackupRecipient( + id = id, + self = Self() + ) + } + + val aci = ACI.parseOrNull(cursor.requireString(RecipientTable.ACI_COLUMN)) + val pni = PNI.parseOrNull(cursor.requireString(RecipientTable.PNI_COLUMN)) + val e164 = cursor.requireString(RecipientTable.E164)?.e164ToLong() + val registeredState = RecipientTable.RegisteredState.fromId(cursor.requireInt(RecipientTable.REGISTERED)) + val profileKey = cursor.requireString(RecipientTable.PROFILE_KEY) + val extras = RecipientTableCursorUtil.getExtras(cursor) + + if (aci == null && pni == null && e164 == null) { + return null + } + + return BackupRecipient( + id = id, + contact = Contact( + aci = aci?.toByteArray()?.toByteString(), + pni = pni?.toByteArray()?.toByteString(), + username = cursor.requireString(RecipientTable.USERNAME), + e164 = cursor.requireString(RecipientTable.E164)?.e164ToLong(), + blocked = cursor.requireBoolean(RecipientTable.BLOCKED), + hidden = cursor.requireBoolean(RecipientTable.HIDDEN), + registered = registeredState.toContactRegisteredState(), + unregisteredTimestamp = cursor.requireLong(RecipientTable.UNREGISTERED_TIMESTAMP), + profileKey = if (profileKey != null) Base64.decode(profileKey).toByteString() else null, + profileSharing = cursor.requireBoolean(RecipientTable.PROFILE_SHARING), + profileGivenName = cursor.requireString(RecipientTable.PROFILE_GIVEN_NAME).nullIfBlank(), + profileFamilyName = cursor.requireString(RecipientTable.PROFILE_FAMILY_NAME).nullIfBlank(), + hideStory = extras?.hideStory() ?: false + ) + ) + } + + override fun close() { + cursor.close() + } +} + +/** + * Provides a nice iterable interface over a [RecipientTable] cursor, converting rows to [BackupRecipient]s. + * Important: Because this is backed by a cursor, you must close it. It's recommended to use `.use()` or try-with-resources. + */ +class BackupGroupIterator(private val cursor: Cursor) : Iterator, Closeable { + override fun hasNext(): Boolean { + return cursor.count > 0 && !cursor.isLast + } + + override fun next(): BackupRecipient { + if (!cursor.moveToNext()) { + throw NoSuchElementException() + } + + val extras = RecipientTableCursorUtil.getExtras(cursor) + val showAsStoryState: GroupTable.ShowAsStoryState = GroupTable.ShowAsStoryState.deserialize(cursor.requireInt(GroupTable.SHOW_AS_STORY_STATE)) + + return BackupRecipient( + id = cursor.requireLong(RecipientTable.ID), + group = BackupGroup( + masterKey = cursor.requireNonNullBlob(GroupTable.V2_MASTER_KEY).toByteString(), + whitelisted = cursor.requireBoolean(RecipientTable.PROFILE_SHARING), + hideStory = extras?.hideStory() ?: false, + storySendMode = showAsStoryState.toGroupStorySendMode() + ) + ) + } + + override fun close() { + cursor.close() + } +} + +private fun String.e164ToLong(): Long? { + val fixed = if (this.startsWith("+")) { + this.substring(1) + } else { + this + } + + return fixed.toLongOrNull() +} + +private fun RecipientTable.RegisteredState.toContactRegisteredState(): Contact.Registered { + return when (this) { + RecipientTable.RegisteredState.REGISTERED -> Contact.Registered.REGISTERED + RecipientTable.RegisteredState.NOT_REGISTERED -> Contact.Registered.NOT_REGISTERED + RecipientTable.RegisteredState.UNKNOWN -> Contact.Registered.UNKNOWN + } +} + +private fun Contact.Registered.toLocalRegisteredState(): RecipientTable.RegisteredState { + return when (this) { + Contact.Registered.REGISTERED -> RecipientTable.RegisteredState.REGISTERED + Contact.Registered.NOT_REGISTERED -> RecipientTable.RegisteredState.NOT_REGISTERED + Contact.Registered.UNKNOWN -> RecipientTable.RegisteredState.UNKNOWN + } +} + +private fun GroupTable.ShowAsStoryState.toGroupStorySendMode(): Group.StorySendMode { + return when (this) { + GroupTable.ShowAsStoryState.ALWAYS -> Group.StorySendMode.ENABLED + GroupTable.ShowAsStoryState.NEVER -> Group.StorySendMode.DISABLED + GroupTable.ShowAsStoryState.IF_ACTIVE -> Group.StorySendMode.DEFAULT + } +} + +private val Contact.formattedE164: String? + get() { + return e164?.let { + PhoneNumberFormatter.get(ApplicationDependencies.getApplication()).format(e164.toString()) + } + } diff --git a/app/src/main/java/org/tm/archive/backup/v2/database/ThreadTableBackupExtensions.kt b/app/src/main/java/org/tm/archive/backup/v2/database/ThreadTableBackupExtensions.kt new file mode 100644 index 00000000..bf0ae10d --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/database/ThreadTableBackupExtensions.kt @@ -0,0 +1,78 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.database + +import android.database.Cursor +import org.signal.core.util.SqlUtil +import org.signal.core.util.insertInto +import org.signal.core.util.logging.Log +import org.signal.core.util.requireBoolean +import org.signal.core.util.requireInt +import org.signal.core.util.requireLong +import org.signal.core.util.select +import org.signal.core.util.toInt +import org.tm.archive.backup.v2.proto.Chat +import org.tm.archive.database.ThreadTable +import org.tm.archive.recipients.RecipientId +import java.io.Closeable + +private val TAG = Log.tag(ThreadTable::class.java) + +fun ThreadTable.getThreadsForBackup(): ChatIterator { + val cursor = readableDatabase + .select( + ThreadTable.ID, + ThreadTable.RECIPIENT_ID, + ThreadTable.ARCHIVED, + ThreadTable.PINNED, + ThreadTable.EXPIRES_IN + ) + .from(ThreadTable.TABLE_NAME) + .run() + + return ChatIterator(cursor) +} + +fun ThreadTable.clearAllDataForBackupRestore() { + writableDatabase.delete(ThreadTable.TABLE_NAME, null, null) + SqlUtil.resetAutoIncrementValue(writableDatabase, ThreadTable.TABLE_NAME) + clearCache() +} + +fun ThreadTable.restoreFromBackup(chat: Chat, recipientId: RecipientId): Long? { + return writableDatabase + .insertInto(ThreadTable.TABLE_NAME) + .values( + ThreadTable.RECIPIENT_ID to recipientId.serialize(), + ThreadTable.PINNED to chat.pinnedOrder, + ThreadTable.ARCHIVED to chat.archived.toInt() + ) + .run() +} + +class ChatIterator(private val cursor: Cursor) : Iterator, Closeable { + override fun hasNext(): Boolean { + return cursor.count > 0 && !cursor.isLast + } + + override fun next(): Chat { + if (!cursor.moveToNext()) { + throw NoSuchElementException() + } + + return Chat( + id = cursor.requireLong(ThreadTable.ID), + recipientId = cursor.requireLong(ThreadTable.RECIPIENT_ID), + archived = cursor.requireBoolean(ThreadTable.ARCHIVED), + pinnedOrder = cursor.requireInt(ThreadTable.PINNED), + expirationTimerMs = cursor.requireLong(ThreadTable.EXPIRES_IN) + ) + } + + override fun close() { + cursor.close() + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/processor/AccountDataProcessor.kt b/app/src/main/java/org/tm/archive/backup/v2/processor/AccountDataProcessor.kt new file mode 100644 index 00000000..76006710 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/processor/AccountDataProcessor.kt @@ -0,0 +1,160 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.processor + +import okio.ByteString.Companion.EMPTY +import okio.ByteString.Companion.toByteString +import org.tm.archive.backup.v2.database.restoreSelfFromBackup +import org.tm.archive.backup.v2.proto.AccountData +import org.tm.archive.backup.v2.proto.Frame +import org.tm.archive.backup.v2.stream.BackupFrameEmitter +import org.tm.archive.components.settings.app.usernamelinks.UsernameQrCodeColorScheme +import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.SignalDatabase.Companion.recipients +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.jobs.RetrieveProfileAvatarJob +import org.tm.archive.keyvalue.PhoneNumberPrivacyValues +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId +import org.tm.archive.subscription.Subscriber +import org.tm.archive.util.ProfileUtil +import org.tm.archive.util.TextSecurePreferences +import org.whispersystems.signalservice.api.push.UsernameLinkComponents +import org.whispersystems.signalservice.api.storage.StorageRecordProtoUtil.defaultAccountRecord +import org.whispersystems.signalservice.api.subscriptions.SubscriberId +import org.whispersystems.signalservice.api.util.UuidUtil + +object AccountDataProcessor { + + fun export(emitter: BackupFrameEmitter) { + val context = ApplicationDependencies.getApplication() + + val self = Recipient.self().fresh() + val record = recipients.getRecordForSync(self.id) + + val subscriber: Subscriber? = SignalStore.donationsValues().getSubscriber() + + emitter.emit( + Frame( + account = AccountData( + profileKey = self.profileKey?.toByteString() ?: EMPTY, + givenName = self.profileName.givenName, + familyName = self.profileName.familyName, + avatarUrlPath = self.profileAvatar ?: "", + subscriptionManuallyCancelled = SignalStore.donationsValues().isUserManuallyCancelled(), + username = SignalStore.account().username, + subscriberId = subscriber?.subscriberId?.bytes?.toByteString() ?: defaultAccountRecord.subscriberId, + subscriberCurrencyCode = subscriber?.currencyCode ?: defaultAccountRecord.subscriberCurrencyCode, + accountSettings = AccountData.AccountSettings( + storyViewReceiptsEnabled = SignalStore.storyValues().viewedReceiptsEnabled, + noteToSelfMarkedUnread = record != null && record.syncExtras.isForcedUnread, + typingIndicators = TextSecurePreferences.isTypingIndicatorsEnabled(context), + readReceipts = TextSecurePreferences.isReadReceiptsEnabled(context), + sealedSenderIndicators = TextSecurePreferences.isShowUnidentifiedDeliveryIndicatorsEnabled(context), + linkPreviews = SignalStore.settings().isLinkPreviewsEnabled, + notDiscoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberListingMode.isUnlisted, + phoneNumberSharingMode = SignalStore.phoneNumberPrivacy().phoneNumberSharingMode.toBackupPhoneNumberSharingMode(), + preferContactAvatars = SignalStore.settings().isPreferSystemContactPhotos, + universalExpireTimer = SignalStore.settings().universalExpireTimer, + preferredReactionEmoji = SignalStore.emojiValues().reactions, + storiesDisabled = SignalStore.storyValues().isFeatureDisabled, + hasViewedOnboardingStory = SignalStore.storyValues().userHasViewedOnboardingStory, + hasSetMyStoriesPrivacy = SignalStore.storyValues().userHasBeenNotifiedAboutStories, + keepMutedChatsArchived = SignalStore.settings().shouldKeepMutedChatsArchived(), + displayBadgesOnProfile = SignalStore.donationsValues().getDisplayBadgesOnProfile(), + hasSeenGroupStoryEducationSheet = SignalStore.storyValues().userHasSeenGroupStoryEducationSheet + ) + ) + ) + ) + } + + fun import(accountData: AccountData, selfId: RecipientId) { + recipients.restoreSelfFromBackup(accountData, selfId) + + SignalStore.account().setRegistered(true) + + val context = ApplicationDependencies.getApplication() + val settings = accountData.accountSettings + + if (settings != null) { + TextSecurePreferences.setReadReceiptsEnabled(context, settings.readReceipts) + TextSecurePreferences.setTypingIndicatorsEnabled(context, settings.typingIndicators) + TextSecurePreferences.setShowUnidentifiedDeliveryIndicatorsEnabled(context, settings.sealedSenderIndicators) + SignalStore.settings().isLinkPreviewsEnabled = settings.linkPreviews + SignalStore.phoneNumberPrivacy().phoneNumberListingMode = if (settings.notDiscoverableByPhoneNumber) PhoneNumberPrivacyValues.PhoneNumberListingMode.UNLISTED else PhoneNumberPrivacyValues.PhoneNumberListingMode.LISTED + SignalStore.phoneNumberPrivacy().phoneNumberSharingMode = settings.phoneNumberSharingMode.toLocalPhoneNumberMode() + SignalStore.settings().isPreferSystemContactPhotos = settings.preferContactAvatars + SignalStore.settings().universalExpireTimer = settings.universalExpireTimer + SignalStore.emojiValues().reactions = settings.preferredReactionEmoji + SignalStore.donationsValues().setDisplayBadgesOnProfile(settings.displayBadgesOnProfile) + SignalStore.settings().setKeepMutedChatsArchived(settings.keepMutedChatsArchived) + SignalStore.storyValues().userHasBeenNotifiedAboutStories = settings.hasSetMyStoriesPrivacy + SignalStore.storyValues().userHasViewedOnboardingStory = settings.hasViewedOnboardingStory + SignalStore.storyValues().isFeatureDisabled = settings.storiesDisabled + SignalStore.storyValues().userHasSeenGroupStoryEducationSheet = settings.hasSeenGroupStoryEducationSheet + SignalStore.storyValues().viewedReceiptsEnabled = settings.storyViewReceiptsEnabled ?: settings.readReceipts + + if (accountData.subscriptionManuallyCancelled) { + SignalStore.donationsValues().updateLocalStateForManualCancellation() + } else { + SignalStore.donationsValues().clearUserManuallyCancelled() + } + + if (accountData.subscriberId.size > 0) { + val subscriber = Subscriber(SubscriberId.fromBytes(accountData.subscriberId.toByteArray()), accountData.subscriberCurrencyCode) + SignalStore.donationsValues().setSubscriber(subscriber) + } + + if (accountData.avatarUrlPath.isNotEmpty()) { + ApplicationDependencies.getJobManager().add(RetrieveProfileAvatarJob(Recipient.self().fresh(), accountData.avatarUrlPath)) + } + + if (accountData.usernameLink != null) { + SignalStore.account().usernameLink = UsernameLinkComponents( + accountData.usernameLink.entropy.toByteArray(), + UuidUtil.parseOrThrow(accountData.usernameLink.serverId.toByteArray()) + ) + SignalStore.misc().usernameQrCodeColorScheme = accountData.usernameLink.color.toLocalUsernameColor() + } + } + + SignalDatabase.runPostSuccessfulTransaction { ProfileUtil.handleSelfProfileKeyChange() } + + Recipient.self().live().refresh() + } + + private fun PhoneNumberPrivacyValues.PhoneNumberSharingMode.toBackupPhoneNumberSharingMode(): AccountData.PhoneNumberSharingMode { + return when (this) { + PhoneNumberPrivacyValues.PhoneNumberSharingMode.DEFAULT -> AccountData.PhoneNumberSharingMode.EVERYBODY + PhoneNumberPrivacyValues.PhoneNumberSharingMode.EVERYBODY -> AccountData.PhoneNumberSharingMode.EVERYBODY + PhoneNumberPrivacyValues.PhoneNumberSharingMode.NOBODY -> AccountData.PhoneNumberSharingMode.NOBODY + } + } + + private fun AccountData.PhoneNumberSharingMode.toLocalPhoneNumberMode(): PhoneNumberPrivacyValues.PhoneNumberSharingMode { + return when (this) { + AccountData.PhoneNumberSharingMode.UNKNOWN -> PhoneNumberPrivacyValues.PhoneNumberSharingMode.EVERYBODY + AccountData.PhoneNumberSharingMode.EVERYBODY -> PhoneNumberPrivacyValues.PhoneNumberSharingMode.EVERYBODY + AccountData.PhoneNumberSharingMode.NOBODY -> PhoneNumberPrivacyValues.PhoneNumberSharingMode.NOBODY + } + } + + private fun AccountData.UsernameLink.Color?.toLocalUsernameColor(): UsernameQrCodeColorScheme { + return when (this) { + AccountData.UsernameLink.Color.BLUE -> UsernameQrCodeColorScheme.Blue + AccountData.UsernameLink.Color.WHITE -> UsernameQrCodeColorScheme.White + AccountData.UsernameLink.Color.GREY -> UsernameQrCodeColorScheme.Grey + AccountData.UsernameLink.Color.OLIVE -> UsernameQrCodeColorScheme.Tan + AccountData.UsernameLink.Color.GREEN -> UsernameQrCodeColorScheme.Green + AccountData.UsernameLink.Color.ORANGE -> UsernameQrCodeColorScheme.Orange + AccountData.UsernameLink.Color.PINK -> UsernameQrCodeColorScheme.Pink + AccountData.UsernameLink.Color.PURPLE -> UsernameQrCodeColorScheme.Purple + else -> UsernameQrCodeColorScheme.Blue + } + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/processor/CallLogBackupProcessor.kt b/app/src/main/java/org/tm/archive/backup/v2/processor/CallLogBackupProcessor.kt new file mode 100644 index 00000000..74bbc253 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/processor/CallLogBackupProcessor.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.processor + +import org.signal.core.util.logging.Log +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.backup.v2.database.getCallsForBackup +import org.tm.archive.backup.v2.database.restoreCallLogFromBackup +import org.tm.archive.backup.v2.proto.Frame +import org.tm.archive.backup.v2.stream.BackupFrameEmitter +import org.tm.archive.database.SignalDatabase + +typealias BackupCall = org.tm.archive.backup.v2.proto.Call + +object CallLogBackupProcessor { + + val TAG = Log.tag(CallLogBackupProcessor::class.java) + + fun export(emitter: BackupFrameEmitter) { + SignalDatabase.calls.getCallsForBackup().use { reader -> + for (callLog in reader) { + if (callLog != null) { + emitter.emit(Frame(call = callLog)) + } + } + } + } + + fun import(call: BackupCall, backupState: BackupState) { + SignalDatabase.calls.restoreCallLogFromBackup(call, backupState) + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/processor/ChatBackupProcessor.kt b/app/src/main/java/org/tm/archive/backup/v2/processor/ChatBackupProcessor.kt new file mode 100644 index 00000000..17898efd --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/processor/ChatBackupProcessor.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.processor + +import org.signal.core.util.logging.Log +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.backup.v2.database.getThreadsForBackup +import org.tm.archive.backup.v2.database.restoreFromBackup +import org.tm.archive.backup.v2.proto.Chat +import org.tm.archive.backup.v2.proto.Frame +import org.tm.archive.backup.v2.stream.BackupFrameEmitter +import org.tm.archive.database.SignalDatabase +import org.tm.archive.recipients.RecipientId + +object ChatBackupProcessor { + val TAG = Log.tag(ChatBackupProcessor::class.java) + + fun export(emitter: BackupFrameEmitter) { + SignalDatabase.threads.getThreadsForBackup().use { reader -> + for (chat in reader) { + emitter.emit(Frame(chat = chat)) + } + } + } + + fun import(chat: Chat, backupState: BackupState) { + val recipientId: RecipientId? = backupState.backupToLocalRecipientId[chat.recipientId] + if (recipientId == null) { + Log.w(TAG, "Missing recipient for chat ${chat.id}") + return + } + + SignalDatabase.threads.restoreFromBackup(chat, recipientId)?.let { threadId -> + backupState.chatIdToLocalRecipientId[chat.id] = recipientId + backupState.chatIdToLocalThreadId[chat.id] = threadId + backupState.chatIdToBackupRecipientId[chat.id] = chat.recipientId + } + + // TODO there's several fields in the chat that actually need to be restored on the recipient table + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/processor/ChatItemBackupProcessor.kt b/app/src/main/java/org/tm/archive/backup/v2/processor/ChatItemBackupProcessor.kt new file mode 100644 index 00000000..6335a2c6 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/processor/ChatItemBackupProcessor.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.processor + +import org.signal.core.util.logging.Log +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.backup.v2.database.ChatItemImportInserter +import org.tm.archive.backup.v2.database.createChatItemInserter +import org.tm.archive.backup.v2.database.getMessagesForBackup +import org.tm.archive.backup.v2.proto.Frame +import org.tm.archive.backup.v2.stream.BackupFrameEmitter +import org.tm.archive.database.SignalDatabase + +object ChatItemBackupProcessor { + val TAG = Log.tag(ChatItemBackupProcessor::class.java) + + fun export(emitter: BackupFrameEmitter) { + SignalDatabase.messages.getMessagesForBackup().use { chatItems -> + for (chatItem in chatItems) { + emitter.emit(Frame(chatItem = chatItem)) + } + } + } + + fun beginImport(backupState: BackupState): ChatItemImportInserter { + return SignalDatabase.messages.createChatItemInserter(backupState) + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/processor/RecipientBackupProcessor.kt b/app/src/main/java/org/tm/archive/backup/v2/processor/RecipientBackupProcessor.kt new file mode 100644 index 00000000..e42df29b --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/processor/RecipientBackupProcessor.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.processor + +import org.signal.core.util.logging.Log +import org.tm.archive.backup.v2.BackupState +import org.tm.archive.backup.v2.database.getAllForBackup +import org.tm.archive.backup.v2.database.getContactsForBackup +import org.tm.archive.backup.v2.database.getGroupsForBackup +import org.tm.archive.backup.v2.database.restoreRecipientFromBackup +import org.tm.archive.backup.v2.proto.Frame +import org.tm.archive.backup.v2.stream.BackupFrameEmitter +import org.tm.archive.database.SignalDatabase +import org.tm.archive.recipients.Recipient + +typealias BackupRecipient = org.tm.archive.backup.v2.proto.Recipient + +object RecipientBackupProcessor { + + val TAG = Log.tag(RecipientBackupProcessor::class.java) + + fun export(emitter: BackupFrameEmitter) { + val selfId = Recipient.self().id.toLong() + + SignalDatabase.recipients.getContactsForBackup(selfId).use { reader -> + for (backupRecipient in reader) { + if (backupRecipient != null) { + emitter.emit(Frame(recipient = backupRecipient)) + } + } + } + + SignalDatabase.recipients.getGroupsForBackup().use { reader -> + for (backupRecipient in reader) { + emitter.emit(Frame(recipient = backupRecipient)) + } + } + + SignalDatabase.distributionLists.getAllForBackup().forEach { + emitter.emit(Frame(recipient = it)) + } + } + + fun import(recipient: BackupRecipient, backupState: BackupState) { + val newId = SignalDatabase.recipients.restoreRecipientFromBackup(recipient, backupState) + if (newId != null) { + backupState.backupToLocalRecipientId[recipient.id] = newId + } + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/BackupEncryptedOutputStream.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupEncryptedOutputStream.kt new file mode 100644 index 00000000..b080af8a --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupEncryptedOutputStream.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.signal.libsignal.protocol.kdf.HKDF +import java.io.FilterOutputStream +import java.io.OutputStream +import javax.crypto.Cipher +import javax.crypto.Mac +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +class BackupEncryptedOutputStream(key: ByteArray, backupId: ByteArray, wrapped: OutputStream) : FilterOutputStream(wrapped) { + + val cipher: Cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") + val mac: Mac = Mac.getInstance("HmacSHA256") + + var finalMac: ByteArray? = null + + init { + if (key.size != 32) { + throw IllegalArgumentException("Key must be 32 bytes!") + } + + if (backupId.size != 16) { + throw IllegalArgumentException("BackupId must be 32 bytes!") + } + + val extendedKey = HKDF.deriveSecrets(key, backupId, "20231003_Signal_Backups_EncryptMessageBackup".toByteArray(), 80) + val macKey = extendedKey.copyOfRange(0, 32) + val cipherKey = extendedKey.copyOfRange(32, 64) + val iv = extendedKey.copyOfRange(64, 80) + + cipher.init(Cipher.ENCRYPT_MODE, SecretKeySpec(cipherKey, "AES"), IvParameterSpec(iv)) + mac.init(SecretKeySpec(macKey, "HmacSHA256")) + } + + override fun write(b: Int) { + throw UnsupportedOperationException() + } + + override fun write(data: ByteArray) { + write(data, 0, data.size) + } + + override fun write(data: ByteArray, off: Int, len: Int) { + cipher.update(data, off, len)?.let { ciphertext -> + mac.update(ciphertext) + super.write(ciphertext) + } + } + + override fun flush() { + cipher.doFinal()?.let { ciphertext -> + mac.update(ciphertext) + super.write(ciphertext) + } + + finalMac = mac.doFinal() + + super.flush() + } + + override fun close() { + flush() + super.close() + } + + fun getMac(): ByteArray { + return finalMac ?: throw IllegalStateException("Mac not yet available! You must call flush() before asking for the mac.") + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/BackupExportWriter.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupExportWriter.kt new file mode 100644 index 00000000..21e27362 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupExportWriter.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.tm.archive.backup.v2.proto.Frame + +interface BackupExportWriter : AutoCloseable { + fun write(frame: Frame) +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/BackupFrameEmitter.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupFrameEmitter.kt new file mode 100644 index 00000000..98ab0bc4 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupFrameEmitter.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.tm.archive.backup.v2.proto.Frame + +/** + * An interface that lets sub-processors emit [Frame]s as they export data. + */ +fun interface BackupFrameEmitter { + fun emit(frame: Frame) +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/BackupImportStream.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupImportStream.kt new file mode 100644 index 00000000..ad4abc71 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/BackupImportStream.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.tm.archive.backup.v2.proto.Frame + +interface BackupImportStream { + fun read(): Frame? +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/EncryptedBackupReader.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/EncryptedBackupReader.kt new file mode 100644 index 00000000..6e32369f --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/EncryptedBackupReader.kt @@ -0,0 +1,112 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.signal.core.util.readFully +import org.signal.core.util.readNBytesOrThrow +import org.signal.core.util.readVarInt32 +import org.signal.core.util.stream.MacInputStream +import org.signal.core.util.stream.TruncatingInputStream +import org.tm.archive.backup.v2.proto.Frame +import org.whispersystems.signalservice.api.backup.BackupKey +import org.whispersystems.signalservice.api.push.ServiceId.ACI +import java.io.EOFException +import java.io.IOException +import java.io.InputStream +import java.util.zip.GZIPInputStream +import javax.crypto.Cipher +import javax.crypto.CipherInputStream +import javax.crypto.Mac +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +/** + * Provides the ability to read backup frames in a streaming fashion from a target [InputStream]. + * As it's being read, it will be both decrypted and uncompressed. Specifically, the data is decrypted, + * that decrypted data is gunzipped, then that data is read as frames. + */ +class EncryptedBackupReader( + key: BackupKey, + aci: ACI, + streamLength: Long, + dataStream: () -> InputStream +) : Iterator, AutoCloseable { + + var next: Frame? = null + val stream: InputStream + + init { + val keyMaterial = key.deriveSecrets(aci) + + val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding").apply { + init(Cipher.DECRYPT_MODE, SecretKeySpec(keyMaterial.cipherKey, "AES"), IvParameterSpec(keyMaterial.iv)) + } + + validateMac(keyMaterial.macKey, streamLength, dataStream()) + + stream = GZIPInputStream( + CipherInputStream( + TruncatingInputStream( + wrapped = dataStream(), + maxBytes = streamLength - MAC_SIZE + ), + cipher + ) + ) + + next = read() + } + + override fun hasNext(): Boolean { + return next != null + } + + override fun next(): Frame { + next?.let { out -> + next = read() + return out + } ?: throw NoSuchElementException() + } + + private fun read(): Frame? { + try { + val length = stream.readVarInt32().also { if (it < 0) return null } + val frameBytes: ByteArray = stream.readNBytesOrThrow(length) + + return Frame.ADAPTER.decode(frameBytes) + } catch (e: EOFException) { + return null + } + } + + override fun close() { + stream.close() + } + + companion object { + const val MAC_SIZE = 32 + + fun validateMac(macKey: ByteArray, streamLength: Long, dataStream: InputStream) { + val mac = Mac.getInstance("HmacSHA256").apply { + init(SecretKeySpec(macKey, "HmacSHA256")) + } + + val macStream = MacInputStream( + wrapped = TruncatingInputStream(dataStream, maxBytes = streamLength - MAC_SIZE), + mac = mac + ) + + macStream.readFully(false) + + val calculatedMac = macStream.mac.doFinal() + val expectedMac = dataStream.readNBytesOrThrow(MAC_SIZE) + + if (!calculatedMac.contentEquals(expectedMac)) { + throw IOException("Invalid MAC!") + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/EncryptedBackupWriter.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/EncryptedBackupWriter.kt new file mode 100644 index 00000000..f8c6f594 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/EncryptedBackupWriter.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.signal.core.util.stream.MacOutputStream +import org.signal.core.util.writeVarInt32 +import org.tm.archive.backup.v2.proto.Frame +import org.whispersystems.signalservice.api.backup.BackupKey +import org.whispersystems.signalservice.api.push.ServiceId.ACI +import java.io.IOException +import java.io.OutputStream +import java.util.zip.GZIPOutputStream +import javax.crypto.Cipher +import javax.crypto.CipherOutputStream +import javax.crypto.Mac +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +/** + * Provides the ability to write backup frames in a streaming fashion to a target [OutputStream]. + * As it's being written, it will be both encrypted and compressed. Specifically, the backup frames + * are gzipped, that gzipped data is encrypted, and then an HMAC of the encrypted data is appended + * to the end of the [outputStream]. + */ +class EncryptedBackupWriter( + key: BackupKey, + aci: ACI, + private val outputStream: OutputStream, + private val append: (ByteArray) -> Unit +) : BackupExportWriter { + + private val mainStream: GZIPOutputStream + private val macStream: MacOutputStream + + init { + val keyMaterial = key.deriveSecrets(aci) + + val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding").apply { + init(Cipher.ENCRYPT_MODE, SecretKeySpec(keyMaterial.cipherKey, "AES"), IvParameterSpec(keyMaterial.iv)) + } + + val mac = Mac.getInstance("HmacSHA256").apply { + init(SecretKeySpec(keyMaterial.macKey, "HmacSHA256")) + } + + macStream = MacOutputStream(outputStream, mac) + + mainStream = GZIPOutputStream( + CipherOutputStream( + macStream, + cipher + ) + ) + } + + @Throws(IOException::class) + override fun write(frame: Frame) { + val frameBytes: ByteArray = frame.encode() + + mainStream.writeVarInt32(frameBytes.size) + mainStream.write(frameBytes) + } + + @Throws(IOException::class) + override fun close() { + // We need to close the main stream in order for the gzip and all the cipher operations to fully finish before + // we can calculate the MAC. Unfortunately flush()/finish() is not sufficient. So we have to defer to the + // caller to append the bytes to the end of the data however they see fit (like appending to a file). + mainStream.close() + val mac = macStream.mac.doFinal() + append(mac) + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/PlainTextBackupReader.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/PlainTextBackupReader.kt new file mode 100644 index 00000000..4fbaad04 --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/PlainTextBackupReader.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.signal.core.util.readNBytesOrThrow +import org.signal.core.util.readVarInt32 +import org.tm.archive.backup.v2.proto.Frame +import java.io.EOFException +import java.io.InputStream + +/** + * Reads a plaintext backup import stream one frame at a time. + */ +class PlainTextBackupReader(val inputStream: InputStream) : Iterator { + + var next: Frame? = null + + init { + next = read() + } + + override fun hasNext(): Boolean { + return next != null + } + + override fun next(): Frame { + next?.let { out -> + next = read() + return out + } ?: throw NoSuchElementException() + } + + private fun read(): Frame? { + try { + val length = inputStream.readVarInt32().also { if (it < 0) return null } + val frameBytes: ByteArray = inputStream.readNBytesOrThrow(length) + + return Frame.ADAPTER.decode(frameBytes) + } catch (e: EOFException) { + return null + } + } +} diff --git a/app/src/main/java/org/tm/archive/backup/v2/stream/PlainTextBackupWriter.kt b/app/src/main/java/org/tm/archive/backup/v2/stream/PlainTextBackupWriter.kt new file mode 100644 index 00000000..9acb5c7d --- /dev/null +++ b/app/src/main/java/org/tm/archive/backup/v2/stream/PlainTextBackupWriter.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.backup.v2.stream + +import org.signal.core.util.writeVarInt32 +import org.tm.archive.backup.v2.proto.Frame +import java.io.IOException +import java.io.OutputStream + +/** + * Writes backup frames to the wrapped stream in plain text. Only for testing! + */ +class PlainTextBackupWriter(private val outputStream: OutputStream) : BackupExportWriter { + + @Throws(IOException::class) + override fun write(frame: Frame) { + val frameBytes: ByteArray = frame.encode() + + outputStream.writeVarInt32(frameBytes.size) + outputStream.write(frameBytes) + } + + override fun close() { + outputStream.close() + } +} diff --git a/app/src/main/java/org/tm/archive/badges/BadgeImageView.kt b/app/src/main/java/org/tm/archive/badges/BadgeImageView.kt index 113115e5..aeeef039 100644 --- a/app/src/main/java/org/tm/archive/badges/BadgeImageView.kt +++ b/app/src/main/java/org/tm/archive/badges/BadgeImageView.kt @@ -8,6 +8,7 @@ import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy import org.tm.archive.R import org.tm.archive.badges.glide.BadgeSpriteTransformation import org.tm.archive.badges.models.Badge +import org.tm.archive.components.settings.app.subscription.BadgeImageSize import org.tm.archive.database.model.databaseprotos.GiftBadge import org.tm.archive.glide.GiftBadgeModel import org.tm.archive.mms.GlideApp @@ -31,6 +32,10 @@ class BadgeImageView @JvmOverloads constructor( isClickable = false } + constructor(context: Context, badgeImageSize: BadgeImageSize) : this(context) { + badgeSize = badgeImageSize.sizeCode + } + override fun setOnClickListener(l: OnClickListener?) { val wasClickable = isClickable super.setOnClickListener(l) diff --git a/app/src/main/java/org/tm/archive/badges/Badges.kt b/app/src/main/java/org/tm/archive/badges/Badges.kt index 46f1503d..4bb96097 100644 --- a/app/src/main/java/org/tm/archive/badges/Badges.kt +++ b/app/src/main/java/org/tm/archive/badges/Badges.kt @@ -101,16 +101,16 @@ object Badges { @JvmStatic fun toDatabaseBadge(badge: Badge): BadgeList.Badge { - return BadgeList.Badge.newBuilder() - .setId(badge.id) - .setCategory(badge.category.code) - .setDescription(badge.description) - .setExpiration(badge.expirationTimestamp) - .setVisible(badge.visible) - .setName(badge.name) - .setImageUrl(badge.imageUrl.toString()) - .setImageDensity(badge.imageDensity) - .build() + return BadgeList.Badge( + id = badge.id, + category = badge.category.code, + description = badge.description, + expiration = badge.expirationTimestamp, + visible = badge.visible, + name = badge.name, + imageUrl = badge.imageUrl.toString(), + imageDensity = badge.imageDensity + ) } @JvmStatic diff --git a/app/src/main/java/org/tm/archive/badges/gifts/GiftMessageView.kt b/app/src/main/java/org/tm/archive/badges/gifts/GiftMessageView.kt index 65bad963..fbee2a28 100644 --- a/app/src/main/java/org/tm/archive/badges/gifts/GiftMessageView.kt +++ b/app/src/main/java/org/tm/archive/badges/gifts/GiftMessageView.kt @@ -79,12 +79,11 @@ class GiftMessageView @JvmOverloads constructor( } actionView.setText( - when (giftBadge.redemptionState ?: GiftBadge.RedemptionState.UNRECOGNIZED) { + when (giftBadge.redemptionState) { GiftBadge.RedemptionState.PENDING -> R.string.GiftMessageView__redeem GiftBadge.RedemptionState.STARTED -> R.string.GiftMessageView__redeeming GiftBadge.RedemptionState.REDEEMED -> R.string.GiftMessageView__redeemed GiftBadge.RedemptionState.FAILED -> R.string.GiftMessageView__redeem - GiftBadge.RedemptionState.UNRECOGNIZED -> R.string.GiftMessageView__redeem } ) } diff --git a/app/src/main/java/org/tm/archive/badges/gifts/Gifts.kt b/app/src/main/java/org/tm/archive/badges/gifts/Gifts.kt index b58a69dd..5c7a004a 100644 --- a/app/src/main/java/org/tm/archive/badges/gifts/Gifts.kt +++ b/app/src/main/java/org/tm/archive/badges/gifts/Gifts.kt @@ -1,13 +1,13 @@ package org.tm.archive.badges.gifts import android.content.Context +import org.signal.core.util.Base64 import org.signal.libsignal.zkgroup.InvalidInputException import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation import org.tm.archive.R import org.tm.archive.database.model.databaseprotos.GiftBadge import org.tm.archive.mms.OutgoingMessage import org.tm.archive.recipients.Recipient -import org.tm.archive.util.Base64 import java.lang.Integer.min import java.util.concurrent.TimeUnit @@ -32,7 +32,7 @@ object Gifts { ): OutgoingMessage { return OutgoingMessage( threadRecipient = recipient, - body = Base64.encodeBytes(giftBadge.toByteArray()), + body = Base64.encodeWithPadding(giftBadge.encode()), isSecure = true, sentTimeMillis = sentTimestamp, expiresIn = expiresIn, diff --git a/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowConfirmationFragment.kt b/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowConfirmationFragment.kt index 358a47a6..639ac79a 100644 --- a/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowConfirmationFragment.kt +++ b/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowConfirmationFragment.kt @@ -14,6 +14,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.subjects.PublishSubject import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.logging.Log +import org.signal.core.util.money.FiatMoney import org.tm.archive.MainActivity import org.tm.archive.R import org.tm.archive.components.InputAwareLayout @@ -26,6 +27,7 @@ import org.tm.archive.components.settings.app.subscription.donate.DonateToSignal import org.tm.archive.components.settings.app.subscription.donate.DonationCheckoutDelegate import org.tm.archive.components.settings.app.subscription.donate.DonationProcessorAction import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayResponse import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource import org.tm.archive.components.settings.configure import org.tm.archive.components.settings.conversation.preferences.RecipientPreference @@ -83,7 +85,7 @@ class GiftFlowConfirmationFragment : keyboardPagerViewModel.setOnlyPage(KeyboardPage.EMOJI) - donationCheckoutDelegate = DonationCheckoutDelegate(this, this, DonationErrorSource.GIFT) + donationCheckoutDelegate = DonationCheckoutDelegate(this, this, viewModel.uiSessionKey, DonationErrorSource.GIFT) processingDonationPaymentDialog = MaterialAlertDialogBuilder(requireContext()) .setView(R.layout.processing_payment_dialog) @@ -106,6 +108,7 @@ class GiftFlowConfirmationFragment : GiftFlowConfirmationFragmentDirections.actionGiftFlowConfirmationFragmentToGatewaySelectorBottomSheet( with(viewModel.snapshot) { GatewayRequest( + uiSessionKey = viewModel.uiSessionKey, donateToSignalType = DonateToSignalType.GIFT, badge = giftBadge!!, label = getString(R.string.preferences__one_time), @@ -262,6 +265,14 @@ class GiftFlowConfirmationFragment : findNavController().safeNavigate(GiftFlowConfirmationFragmentDirections.actionGiftFlowConfirmationFragmentToCreditCardFragment(gatewayRequest)) } + override fun navigateToIdealDetailsFragment(gatewayRequest: GatewayRequest) { + error("Unsupported operation") + } + + override fun navigateToBankTransferMandate(gatewayResponse: GatewayResponse) { + error("Unsupported operation") + } + override fun onPaymentComplete(gatewayRequest: GatewayRequest) { val mainActivityIntent = MainActivity.clearTop(requireContext()) @@ -275,7 +286,10 @@ class GiftFlowConfirmationFragment : } override fun onProcessorActionProcessed() = Unit - override fun onUserCancelledPaymentFlow() { - findNavController().popBackStack(R.id.giftFlowConfirmationFragment, false) - } + + override fun showSepaEuroMaximumDialog(sepaEuroMaximum: FiatMoney) = error("Unsupported operation") + + override fun onUserLaunchedAnExternalApplication() = Unit + + override fun navigateToDonationPending(gatewayRequest: GatewayRequest) = error("Unsupported operation") } diff --git a/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowViewModel.kt b/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowViewModel.kt index 93c19b1b..f9691e08 100644 --- a/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowViewModel.kt +++ b/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftFlowViewModel.kt @@ -39,6 +39,7 @@ class GiftFlowViewModel( val state: Flowable = store.stateFlowable val events: Observable = eventPublisher val snapshot: GiftFlowState get() = store.state + val uiSessionKey: Long = System.currentTimeMillis() init { refresh() diff --git a/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftRowItem.kt b/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftRowItem.kt index 3788137d..5f409b4a 100644 --- a/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftRowItem.kt +++ b/app/src/main/java/org/tm/archive/badges/gifts/flow/GiftRowItem.kt @@ -34,7 +34,7 @@ object GiftRowItem { override fun bind(model: Model) { binding.check.visible = false binding.badge.setBadge(model.giftBadge) - binding.tagline.visible = false + binding.tagline.visible = true val price = FiatMoneyUtil.format( context.resources, @@ -46,7 +46,8 @@ object GiftRowItem { val duration = TimeUnit.MILLISECONDS.toDays(model.giftBadge.duration) - binding.title.text = context.resources.getQuantityString(R.plurals.GiftRowItem_s_dot_d_day_duration, duration.toInt(), price, duration) + binding.title.text = model.giftBadge.name + binding.tagline.text = context.resources.getQuantityString(R.plurals.GiftRowItem_s_dot_d_day_duration, duration.toInt(), price, duration) } } } diff --git a/app/src/main/java/org/tm/archive/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt b/app/src/main/java/org/tm/archive/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt index 736e1096..04efd31b 100644 --- a/app/src/main/java/org/tm/archive/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt +++ b/app/src/main/java/org/tm/archive/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt @@ -63,7 +63,7 @@ class ViewReceivedGiftBottomSheet : DSLSettingsBottomSheetFragment() { ViewReceivedGiftBottomSheet().apply { arguments = Bundle().apply { putParcelable(ARG_SENT_FROM, messageRecord.fromRecipient.id) - putByteArray(ARG_GIFT_BADGE, messageRecord.giftBadge!!.toByteArray()) + putByteArray(ARG_GIFT_BADGE, messageRecord.giftBadge!!.encode()) putLong(ARG_MESSAGE_ID, messageRecord.id) } show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) diff --git a/app/src/main/java/org/tm/archive/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt b/app/src/main/java/org/tm/archive/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt index 7519c521..638ac108 100644 --- a/app/src/main/java/org/tm/archive/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt +++ b/app/src/main/java/org/tm/archive/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt @@ -34,7 +34,7 @@ class ViewSentGiftBottomSheet : DSLSettingsBottomSheetFragment() { ViewSentGiftBottomSheet().apply { arguments = Bundle().apply { putParcelable(ARG_SENT_TO, messageRecord.toRecipient.id) - putByteArray(ARG_GIFT_BADGE, messageRecord.giftBadge!!.toByteArray()) + putByteArray(ARG_GIFT_BADGE, messageRecord.giftBadge!!.encode()) } show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) } @@ -45,7 +45,7 @@ class ViewSentGiftBottomSheet : DSLSettingsBottomSheetFragment() { get() = requireArguments().getParcelableCompat(ARG_SENT_TO, RecipientId::class.java)!! private val giftBadge: GiftBadge - get() = GiftBadge.parseFrom(requireArguments().getByteArray(ARG_GIFT_BADGE)) + get() = GiftBadge.ADAPTER.decode(requireArguments().getByteArray(ARG_GIFT_BADGE)!!) private val lifecycleDisposable = LifecycleDisposable() diff --git a/app/src/main/java/org/tm/archive/badges/models/Badge.kt b/app/src/main/java/org/tm/archive/badges/models/Badge.kt index 6495cf6b..2042312d 100644 --- a/app/src/main/java/org/tm/archive/badges/models/Badge.kt +++ b/app/src/main/java/org/tm/archive/badges/models/Badge.kt @@ -6,6 +6,7 @@ import android.os.Parcelable import android.view.View import android.widget.ImageView import android.widget.TextView +import androidx.compose.runtime.Stable import com.bumptech.glide.load.Key import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy @@ -25,6 +26,7 @@ typealias OnBadgeClicked = (Badge, Boolean, Boolean) -> Unit /** * A Badge that can be collected and displayed by a user. */ +@Stable @Parcelize data class Badge( val id: String, diff --git a/app/src/main/java/org/tm/archive/badges/self/expired/CantProcessSubscriptionPaymentBottomSheetDialogFragment.kt b/app/src/main/java/org/tm/archive/badges/self/expired/CantProcessSubscriptionPaymentBottomSheetDialogFragment.kt deleted file mode 100644 index 25322d5f..00000000 --- a/app/src/main/java/org/tm/archive/badges/self/expired/CantProcessSubscriptionPaymentBottomSheetDialogFragment.kt +++ /dev/null @@ -1,52 +0,0 @@ -package org.tm.archive.badges.self.expired - -import androidx.core.content.ContextCompat -import org.tm.archive.R -import org.tm.archive.components.settings.DSLConfiguration -import org.tm.archive.components.settings.DSLSettingsAdapter -import org.tm.archive.components.settings.DSLSettingsBottomSheetFragment -import org.tm.archive.components.settings.DSLSettingsText -import org.tm.archive.components.settings.configure -import org.tm.archive.components.settings.models.SplashImage -import org.tm.archive.keyvalue.SignalStore -import org.tm.archive.util.CommunicationActions - -class CantProcessSubscriptionPaymentBottomSheetDialogFragment : DSLSettingsBottomSheetFragment() { - override fun bindAdapter(adapter: DSLSettingsAdapter) { - SplashImage.register(adapter) - adapter.submitList(getConfiguration().toMappingModelList()) - } - - private fun getConfiguration(): DSLConfiguration { - return configure { - customPref(SplashImage.Model(R.drawable.ic_card_process)) - - sectionHeaderPref( - title = DSLSettingsText.from(R.string.CantProcessSubscriptionPaymentBottomSheetDialogFragment__cant_process_subscription_payment, DSLSettingsText.CenterModifier) - ) - - textPref( - summary = DSLSettingsText.from( - requireContext().getString(R.string.CantProcessSubscriptionPaymentBottomSheetDialogFragment__were_having_trouble), - DSLSettingsText.LearnMoreModifier(ContextCompat.getColor(requireContext(), R.color.signal_accent_primary)) { - CommunicationActions.openBrowserLink(requireContext(), requireContext().getString(R.string.donation_decline_code_error_url)) - }, - DSLSettingsText.CenterModifier - ) - ) - - primaryButton( - text = DSLSettingsText.from(android.R.string.ok) - ) { - dismissAllowingStateLoss() - } - - secondaryButtonNoOutline( - text = DSLSettingsText.from(R.string.CantProcessSubscriptionPaymentBottomSheetDialogFragment__dont_show_this_again) - ) { - SignalStore.donationsValues().showCantProcessDialog = false - dismissAllowingStateLoss() - } - } - } -} diff --git a/app/src/main/java/org/tm/archive/badges/self/expired/ExpiredBadgeBottomSheetDialogFragment.kt b/app/src/main/java/org/tm/archive/badges/self/expired/ExpiredOneTimeBadgeBottomSheetDialogFragment.kt similarity index 50% rename from app/src/main/java/org/tm/archive/badges/self/expired/ExpiredBadgeBottomSheetDialogFragment.kt rename to app/src/main/java/org/tm/archive/badges/self/expired/ExpiredOneTimeBadgeBottomSheetDialogFragment.kt index 4fa6a18d..048d7a3f 100644 --- a/app/src/main/java/org/tm/archive/badges/self/expired/ExpiredBadgeBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/tm/archive/badges/self/expired/ExpiredOneTimeBadgeBottomSheetDialogFragment.kt @@ -3,7 +3,6 @@ package org.tm.archive.badges.self.expired import androidx.fragment.app.FragmentManager import org.signal.core.util.DimensionUnit import org.signal.core.util.logging.Log -import org.signal.donations.StripeDeclineCode import org.tm.archive.R import org.tm.archive.badges.models.Badge import org.tm.archive.badges.models.ExpiredBadge @@ -13,18 +12,15 @@ import org.tm.archive.components.settings.DSLSettingsBottomSheetFragment import org.tm.archive.components.settings.DSLSettingsText import org.tm.archive.components.settings.app.AppSettingsActivity import org.tm.archive.components.settings.app.subscription.errors.UnexpectedSubscriptionCancellation -import org.tm.archive.components.settings.app.subscription.errors.mapToErrorStringResource -import org.tm.archive.components.settings.app.subscription.errors.shouldRouteToGooglePay import org.tm.archive.components.settings.configure import org.tm.archive.keyvalue.SignalStore import org.tm.archive.util.BottomSheetUtil -import org.tm.archive.util.CommunicationActions import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription /** * Bottom sheet displaying a fading badge with a notice and action for becoming a subscriber again. */ -class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( +class ExpiredOneTimeBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( peekHeightPercentage = 1f ) { override fun bindAdapter(adapter: DSLSettingsAdapter) { @@ -34,12 +30,9 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( } private fun getConfiguration(): DSLConfiguration { - val args = ExpiredBadgeBottomSheetDialogFragmentArgs.fromBundle(requireArguments()) + val args = ExpiredOneTimeBadgeBottomSheetDialogFragmentArgs.fromBundle(requireArguments()) val badge: Badge = args.badge - val cancellationReason = UnexpectedSubscriptionCancellation.fromStatus(args.cancelationReason) - val declineCode: StripeDeclineCode? = args.chargeFailure?.let { StripeDeclineCode.getFromCode(it) } val isLikelyASustainer = SignalStore.donationsValues().isLikelyASustainer() - val inactive = cancellationReason == UnexpectedSubscriptionCancellation.INACTIVE Log.d(TAG, "Displaying Expired Badge Fragment with bundle: ${requireArguments()}", true) @@ -61,63 +54,32 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( noPadTextPref( DSLSettingsText.from( - if (badge.isBoost()) { - getString(R.string.ExpiredBadgeBottomSheetDialogFragment__your_boost_badge_has_expired_and) - } else if (declineCode != null) { - getString( - R.string.ExpiredBadgeBottomSheetDialogFragment__your_recurring_monthly_donation_was_canceled_s, - getString(declineCode.mapToErrorStringResource()), - badge.name - ) - } else if (inactive) { - getString(R.string.ExpiredBadgeBottomSheetDialogFragment__your_recurring_monthly_donation_was_automatically, badge.name) - } else { - getString(R.string.ExpiredBadgeBottomSheetDialogFragment__your_recurring_monthly_donation_was_canceled) - }, + getString(R.string.ExpiredBadgeBottomSheetDialogFragment__your_boost_badge_has_expired_and), DSLSettingsText.CenterModifier ) ) space(DimensionUnit.DP.toPixels(16f).toInt()) - if (badge.isSubscription() && declineCode?.shouldRouteToGooglePay() == true) { - space(DimensionUnit.DP.toPixels(68f).toInt()) - - secondaryButtonNoOutline( - text = DSLSettingsText.from(R.string.ExpiredBadgeBottomSheetDialogFragment__go_to_google_pay), - onClick = { - CommunicationActions.openBrowserLink(requireContext(), getString(R.string.google_pay_url)) - } - ) - } else { - noPadTextPref( - DSLSettingsText.from( - if (badge.isBoost()) { - if (isLikelyASustainer) { - R.string.ExpiredBadgeBottomSheetDialogFragment__you_can_reactivate - } else { - R.string.ExpiredBadgeBottomSheetDialogFragment__you_can_keep - } - } else { - R.string.ExpiredBadgeBottomSheetDialogFragment__you_can - }, - DSLSettingsText.CenterModifier - ) + noPadTextPref( + DSLSettingsText.from( + if (isLikelyASustainer) { + R.string.ExpiredBadgeBottomSheetDialogFragment__you_can_reactivate + } else { + R.string.ExpiredBadgeBottomSheetDialogFragment__you_can_keep + }, + DSLSettingsText.CenterModifier ) + ) - space(DimensionUnit.DP.toPixels(92f).toInt()) - } + space(DimensionUnit.DP.toPixels(92f).toInt()) primaryButton( text = DSLSettingsText.from( - if (badge.isBoost()) { - if (isLikelyASustainer) { - R.string.ExpiredBadgeBottomSheetDialogFragment__add_a_boost - } else { - R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_sustainer - } + if (isLikelyASustainer) { + R.string.ExpiredBadgeBottomSheetDialogFragment__add_a_boost } else { - R.string.ExpiredBadgeBottomSheetDialogFragment__renew_subscription + R.string.ExpiredBadgeBottomSheetDialogFragment__become_a_sustainer } ), onClick = { @@ -140,7 +102,7 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( } companion object { - private val TAG = Log.tag(ExpiredBadgeBottomSheetDialogFragment::class.java) + private val TAG = Log.tag(ExpiredOneTimeBadgeBottomSheetDialogFragment::class.java) @JvmStatic fun show( @@ -149,8 +111,8 @@ class ExpiredBadgeBottomSheetDialogFragment : DSLSettingsBottomSheetFragment( chargeFailure: ActiveSubscription.ChargeFailure?, fragmentManager: FragmentManager ) { - val args = ExpiredBadgeBottomSheetDialogFragmentArgs.Builder(badge, cancellationReason?.status, chargeFailure?.code).build() - val fragment = ExpiredBadgeBottomSheetDialogFragment() + val args = ExpiredOneTimeBadgeBottomSheetDialogFragmentArgs.Builder(badge, cancellationReason?.status, chargeFailure?.code).build() + val fragment = ExpiredOneTimeBadgeBottomSheetDialogFragment() fragment.arguments = args.toBundle() fragment.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) diff --git a/app/src/main/java/org/tm/archive/badges/self/expired/MonthlyDonationCanceledBottomSheetDialogFragment.kt b/app/src/main/java/org/tm/archive/badges/self/expired/MonthlyDonationCanceledBottomSheetDialogFragment.kt new file mode 100644 index 00000000..a85b2372 --- /dev/null +++ b/app/src/main/java/org/tm/archive/badges/self/expired/MonthlyDonationCanceledBottomSheetDialogFragment.kt @@ -0,0 +1,191 @@ +package org.tm.archive.badges.self.expired + +import android.content.res.Configuration +import android.net.Uri +import androidx.annotation.StringRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.fragment.app.FragmentManager +import org.signal.core.ui.BottomSheets +import org.signal.core.ui.Buttons +import org.signal.core.ui.Texts +import org.signal.core.ui.theme.SignalTheme +import org.signal.donations.StripeDeclineCode +import org.signal.donations.StripeFailureCode +import org.tm.archive.R +import org.tm.archive.badges.models.Badge +import org.tm.archive.components.settings.app.AppSettingsActivity +import org.tm.archive.components.settings.app.subscription.BadgeImage112 +import org.tm.archive.components.settings.app.subscription.errors.mapToErrorStringResource +import org.tm.archive.components.settings.app.subscription.manage.ManageDonationsFragment +import org.tm.archive.compose.ComposeBottomSheetDialogFragment +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.util.BottomSheetUtil +import org.tm.archive.util.CommunicationActions +import org.tm.archive.util.SpanUtil +import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription + +class MonthlyDonationCanceledBottomSheetDialogFragment : ComposeBottomSheetDialogFragment() { + + override val peekHeightPercentage: Float = 1f + + @Composable + override fun SheetContent() { + val chargeFailure: ActiveSubscription.ChargeFailure? = SignalStore.donationsValues().getUnexpectedSubscriptionCancelationChargeFailure() + val declineCode: StripeDeclineCode = StripeDeclineCode.getFromCode(chargeFailure?.outcomeNetworkReason) + val failureCode: StripeFailureCode = StripeFailureCode.getFromCode(chargeFailure?.code) + + val errorMessage = if (declineCode.isKnown()) { + declineCode.mapToErrorStringResource() + } else if (failureCode.isKnown) { + failureCode.mapToErrorStringResource() + } else { + declineCode.mapToErrorStringResource() + } + + MonthlyDonationCanceled( + badge = SignalStore.donationsValues().getExpiredBadge(), + errorMessageRes = errorMessage, + onRenewClicked = { + startActivity(AppSettingsActivity.subscriptions(requireContext())) + dismissAllowingStateLoss() + }, + onNotNowClicked = { + SignalStore.donationsValues().showMonthlyDonationCanceledDialog = false + dismissAllowingStateLoss() + } + ) + } + + companion object { + @JvmStatic + fun show(fragmentManager: FragmentManager) { + val fragment = MonthlyDonationCanceledBottomSheetDialogFragment() + + fragment.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + } + } +} + +@Preview(name = "Light Theme", group = "ShortName", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "ShortName", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun MonthlyDonationCanceledPreview() { + SignalTheme { + Surface { + MonthlyDonationCanceled( + badge = Badge( + id = "", + category = Badge.Category.Donor, + name = "Signal Star", + description = "", + imageUrl = Uri.EMPTY, + imageDensity = "", + expirationTimestamp = 0L, + visible = true, + duration = 0L + ), + errorMessageRes = R.string.StripeFailureCode__verify_your_bank_details_are_correct, + onRenewClicked = {}, + onNotNowClicked = {} + ) + } + } +} + +@Composable +private fun MonthlyDonationCanceled( + badge: Badge?, + @StringRes errorMessageRes: Int, + onRenewClicked: () -> Unit, + onNotNowClicked: () -> Unit +) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(horizontal = 34.dp) + ) { + BottomSheets.Handle() + + if (badge != null) { + Box(modifier = Modifier.padding(top = 21.dp, bottom = 16.dp)) { + BadgeImage112( + badge = badge, + modifier = Modifier + .size(80.dp) + ) + + Image( + imageVector = ImageVector.vectorResource(id = R.drawable.symbol_error_circle_fill_24), + contentScale = ContentScale.Inside, + contentDescription = null, + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.error), + modifier = Modifier + .size(24.dp) + .align(Alignment.TopEnd) + .background( + color = SignalTheme.colors.colorSurface1, + shape = CircleShape + ) + ) + } + } + + Text( + text = stringResource(id = R.string.MonthlyDonationCanceled__title), + style = MaterialTheme.typography.titleLarge.copy(textAlign = TextAlign.Center, color = MaterialTheme.colorScheme.onSurface), + modifier = Modifier.padding(bottom = 20.dp) + ) + + val context = LocalContext.current + val learnMore = stringResource(id = R.string.MonthlyDonationCanceled__learn_more) + val errorMessage = stringResource(id = errorMessageRes) + val fullString = stringResource(id = R.string.MonthlyDonationCanceled__message, errorMessage, learnMore) + val spanned = SpanUtil.urlSubsequence(fullString, learnMore, ManageDonationsFragment.DONATE_TROUBLESHOOTING_URL) + Texts.LinkifiedText( + textWithUrlSpans = spanned, + onUrlClick = { CommunicationActions.openBrowserLink(context, it) }, + style = MaterialTheme.typography.bodyLarge.copy(textAlign = TextAlign.Center, color = MaterialTheme.colorScheme.onSurfaceVariant), + modifier = Modifier.padding(bottom = 36.dp) + ) + + Buttons.LargeTonal( + onClick = onRenewClicked, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(bottom = 16.dp) + ) { + Text(text = stringResource(id = R.string.MonthlyDonationCanceled__renew_button)) + } + + TextButton( + onClick = onNotNowClicked, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(bottom = 56.dp) + ) { + Text(text = stringResource(id = R.string.MonthlyDonationCanceled__not_now_button)) + } + } +} diff --git a/app/src/main/java/org/tm/archive/badges/self/none/BecomeASustainerFragment.kt b/app/src/main/java/org/tm/archive/badges/self/none/BecomeASustainerFragment.kt index 5c3bda1f..7a1782e9 100644 --- a/app/src/main/java/org/tm/archive/badges/self/none/BecomeASustainerFragment.kt +++ b/app/src/main/java/org/tm/archive/badges/self/none/BecomeASustainerFragment.kt @@ -58,7 +58,7 @@ class BecomeASustainerFragment : DSLSettingsBottomSheetFragment() { space(DimensionUnit.DP.toPixels(32f).toInt()) - tonalButton( + tonalWrappedButton( text = DSLSettingsText.from( R.string.BecomeASustainerMegaphone__become_a_sustainer ), diff --git a/app/src/main/java/org/tm/archive/calls/links/CallLinkJoinButton.kt b/app/src/main/java/org/tm/archive/calls/links/CallLinkJoinButton.kt index e3d50527..9c749046 100644 --- a/app/src/main/java/org/tm/archive/calls/links/CallLinkJoinButton.kt +++ b/app/src/main/java/org/tm/archive/calls/links/CallLinkJoinButton.kt @@ -7,12 +7,16 @@ package org.tm.archive.calls.links import android.content.Context import android.util.AttributeSet +import android.view.View import androidx.annotation.ColorRes import androidx.appcompat.widget.LinearLayoutCompat import androidx.core.content.ContextCompat import com.google.android.material.button.MaterialButton import org.tm.archive.R +/** + * ConversationItem action button for joining a call link. + */ class CallLinkJoinButton @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null @@ -22,10 +26,19 @@ class CallLinkJoinButton @JvmOverloads constructor( inflate(context, R.layout.call_link_join_button, this) } + private val joinStroke: View = findViewById(R.id.join_stroke) private val joinButton: MaterialButton = findViewById(R.id.join_button) fun setTextColor(@ColorRes textColorResId: Int) { - joinButton.setTextColor(ContextCompat.getColor(context, textColorResId)) + val color = ContextCompat.getColor(context, textColorResId) + + joinButton.setTextColor(color) + } + + fun setStrokeColor(@ColorRes strokeColorResId: Int) { + val color = ContextCompat.getColor(context, strokeColorResId) + + joinStroke.setBackgroundColor(color) } fun setJoinClickListener(onClickListener: OnClickListener) { diff --git a/app/src/main/java/org/tm/archive/calls/links/CallLinks.kt b/app/src/main/java/org/tm/archive/calls/links/CallLinks.kt index 21699852..a723846e 100644 --- a/app/src/main/java/org/tm/archive/calls/links/CallLinks.kt +++ b/app/src/main/java/org/tm/archive/calls/links/CallLinks.kt @@ -23,7 +23,7 @@ import java.net.URLDecoder object CallLinks { private const val ROOT_KEY = "key" private const val HTTPS_LINK_PREFIX = "https://signal.link/call/#key=" - private const val SNGL_LINK_PREFIX = "sgnl://signal.link/#key=" + private const val SNGL_LINK_PREFIX = "sgnl://signal.link/call/#key=" private val TAG = Log.tag(CallLinks::class.java) @@ -58,8 +58,7 @@ object CallLinks { return false } - if (!url.startsWith(HTTPS_LINK_PREFIX) && !url.startsWith(SNGL_LINK_PREFIX)) { - Log.w(TAG, "Invalid url prefix.") + if (!url.startsWith(HTTPS_LINK_PREFIX) || !url.startsWith(SNGL_LINK_PREFIX)) { return false } diff --git a/app/src/main/java/org/tm/archive/calls/links/SignalCallRow.kt b/app/src/main/java/org/tm/archive/calls/links/SignalCallRow.kt index 3be70ca3..b1dd54f0 100644 --- a/app/src/main/java/org/tm/archive/calls/links/SignalCallRow.kt +++ b/app/src/main/java/org/tm/archive/calls/links/SignalCallRow.kt @@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -118,7 +119,8 @@ fun SignalCallRow( .align(CenterVertically) ) { Text( - text = callLink.state.name.ifEmpty { stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__signal_call) } + text = callLink.state.name.ifEmpty { stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__signal_call) }, + color = MaterialTheme.colorScheme.onSurface ) Text( text = callUrl, @@ -132,6 +134,10 @@ fun SignalCallRow( Buttons.Small( onClick = onJoinClicked, + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.onSurface + ), modifier = Modifier.align(CenterVertically) ) { Text(text = stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__join)) diff --git a/app/src/main/java/org/tm/archive/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt b/app/src/main/java/org/tm/archive/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt index ea20f041..5260f7d8 100644 --- a/app/src/main/java/org/tm/archive/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/tm/archive/calls/links/create/CreateCallLinkBottomSheetDialogFragment.kt @@ -92,6 +92,7 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment Text( text = stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__create_call_link), style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface, textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth() ) @@ -106,7 +107,13 @@ class CreateCallLinkBottomSheetDialogFragment : ComposeBottomSheetDialogFragment Spacer(modifier = Modifier.height(12.dp)) Rows.TextRow( - text = stringResource(id = R.string.CreateCallLinkBottomSheetDialogFragment__add_call_name), + text = stringResource( + id = if (callLink.state.name.isEmpty()) { + R.string.CreateCallLinkBottomSheetDialogFragment__add_call_name + } else { + R.string.CreateCallLinkBottomSheetDialogFragment__edit_call_name + } + ), onClick = this@CreateCallLinkBottomSheetDialogFragment::onAddACallNameClicked ) diff --git a/app/src/main/java/org/tm/archive/calls/links/details/CallLinkDetailsFragment.kt b/app/src/main/java/org/tm/archive/calls/links/details/CallLinkDetailsFragment.kt index 3d77afe6..9767852d 100644 --- a/app/src/main/java/org/tm/archive/calls/links/details/CallLinkDetailsFragment.kt +++ b/app/src/main/java/org/tm/archive/calls/links/details/CallLinkDetailsFragment.kt @@ -246,7 +246,13 @@ private fun CallLinkDetails( if (state.callLink.credentials?.adminPassBytes != null) { Rows.TextRow( - text = stringResource(id = R.string.CallLinkDetailsFragment__add_call_name), + text = stringResource( + id = if (state.callLink.state.name.isEmpty()) { + R.string.CreateCallLinkBottomSheetDialogFragment__add_call_name + } else { + R.string.CreateCallLinkBottomSheetDialogFragment__edit_call_name + } + ), onClick = callback::onEditNameClicked ) diff --git a/app/src/main/java/org/tm/archive/calls/log/CallLogAdapter.kt b/app/src/main/java/org/tm/archive/calls/log/CallLogAdapter.kt index cea0f0ea..8d53270b 100644 --- a/app/src/main/java/org/tm/archive/calls/log/CallLogAdapter.kt +++ b/app/src/main/java/org/tm/archive/calls/log/CallLogAdapter.kt @@ -32,6 +32,11 @@ class CallLogAdapter( callbacks: Callbacks ) : PagingMappingAdapter() { + companion object { + private const val PAYLOAD_SELECTION_STATE = "PAYLOAD_SELECTION_STATE" + private const val PAYLOAD_TIMESTAMP = "PAYLOAD_TIMESTAMP" + } + init { registerFactory( CallModel::class.java, @@ -72,6 +77,10 @@ class CallLogAdapter( ) } + fun onTimestampTick() { + notifyItemRangeChanged(0, itemCount, PAYLOAD_TIMESTAMP) + } + fun submitCallRows( rows: List, selectionState: CallLogSelectionState, @@ -98,9 +107,6 @@ class CallLogAdapter( val selectionState: CallLogSelectionState, val itemCount: Int ) : MappingModel { - companion object { - const val PAYLOAD_SELECTION_STATE = "PAYLOAD_SELECTION_STATE" - } override fun areItemsTheSame(newItem: CallModel): Boolean = call.id == newItem.call.id override fun areContentsTheSame(newItem: CallModel): Boolean { @@ -133,10 +139,6 @@ class CallLogAdapter( val itemCount: Int ) : MappingModel { - companion object { - const val PAYLOAD_SELECTION_STATE = "PAYLOAD_SELECTION_STATE" - } - override fun areItemsTheSame(newItem: CallLinkModel): Boolean { return callLink.record.roomId == newItem.callLink.record.roomId } @@ -149,7 +151,7 @@ class CallLogAdapter( override fun getChangePayload(newItem: CallLinkModel): Any? { return if (callLink == newItem.callLink && (!isSelectionStateTheSame(newItem) || !isItemCountTheSame(newItem))) { - CallModel.PAYLOAD_SELECTION_STATE + PAYLOAD_SELECTION_STATE } else { null } @@ -183,6 +185,10 @@ class CallLogAdapter( private val onStartVideoCallClicked: (Recipient) -> Unit ) : BindingViewHolder(binding) { override fun bind(model: CallLinkModel) { + if (payload.size == 1 && payload.contains(PAYLOAD_TIMESTAMP)) { + return + } + itemView.setOnClickListener { onCallLinkClicked(model.callLink) } @@ -195,7 +201,7 @@ class CallLogAdapter( binding.callSelected.isChecked = model.selectionState.contains(model.callLink.id) binding.callSelected.visible = model.selectionState.isNotEmpty(model.itemCount) - if (payload.contains(CallModel.PAYLOAD_SELECTION_STATE)) { + if (payload.isNotEmpty()) { return } @@ -252,7 +258,11 @@ class CallLogAdapter( binding.callSelected.isChecked = model.selectionState.contains(model.call.id) binding.callSelected.visible = model.selectionState.isNotEmpty(model.itemCount) - if (payload.contains(CallModel.PAYLOAD_SELECTION_STATE)) { + if (payload.contains(PAYLOAD_TIMESTAMP)) { + presentCallInfo(model.call, model.call.date) + } + + if (payload.isNotEmpty()) { return } @@ -295,7 +305,7 @@ class CallLogAdapter( val color = ContextCompat.getColor( context, - if (call.record.event == CallTable.Event.MISSED) { + if (call.record.event.isMissedCall()) { R.color.signal_colorError } else { R.color.signal_colorOnSurfaceVariant @@ -365,7 +375,7 @@ class CallLogAdapter( MessageTypes.OUTGOING_AUDIO_CALL_TYPE, MessageTypes.OUTGOING_VIDEO_CALL_TYPE -> R.drawable.symbol_arrow_upright_compact_16 MessageTypes.GROUP_CALL_TYPE -> when { call.type == CallTable.Type.AD_HOC_CALL -> R.drawable.symbol_link_compact_16 - call.event == CallTable.Event.MISSED -> R.drawable.symbol_missed_incoming_compact_16 + call.event.isMissedCall() -> R.drawable.symbol_missed_incoming_compact_16 call.event == CallTable.Event.GENERIC_GROUP_CALL || call.event == CallTable.Event.JOINED -> R.drawable.symbol_group_compact_16 call.direction == CallTable.Direction.INCOMING -> R.drawable.symbol_arrow_downleft_compact_16 call.direction == CallTable.Direction.OUTGOING -> R.drawable.symbol_arrow_upright_compact_16 @@ -379,8 +389,8 @@ class CallLogAdapter( @StringRes private fun getCallStateStringRes(call: CallTable.Call): Int { return when (call.messageType) { - MessageTypes.MISSED_VIDEO_CALL_TYPE -> R.string.CallLogAdapter__missed - MessageTypes.MISSED_AUDIO_CALL_TYPE -> R.string.CallLogAdapter__missed + MessageTypes.MISSED_VIDEO_CALL_TYPE, + MessageTypes.MISSED_AUDIO_CALL_TYPE -> if (call.event == CallTable.Event.MISSED) R.string.CallLogAdapter__missed else R.string.CallLogAdapter__missed_notification_profile MessageTypes.INCOMING_AUDIO_CALL_TYPE -> R.string.CallLogAdapter__incoming MessageTypes.INCOMING_VIDEO_CALL_TYPE -> R.string.CallLogAdapter__incoming MessageTypes.OUTGOING_AUDIO_CALL_TYPE -> R.string.CallLogAdapter__outgoing @@ -388,6 +398,7 @@ class CallLogAdapter( MessageTypes.GROUP_CALL_TYPE -> when { call.type == CallTable.Type.AD_HOC_CALL -> R.string.CallLogAdapter__call_link call.event == CallTable.Event.MISSED -> R.string.CallLogAdapter__missed + call.event == CallTable.Event.MISSED_NOTIFICATION_PROFILE -> R.string.CallLogAdapter__missed_notification_profile call.event == CallTable.Event.GENERIC_GROUP_CALL || call.event == CallTable.Event.JOINED -> R.string.CallPreference__group_call call.direction == CallTable.Direction.INCOMING -> R.string.CallLogAdapter__incoming call.direction == CallTable.Direction.OUTGOING -> R.string.CallLogAdapter__outgoing diff --git a/app/src/main/java/org/tm/archive/calls/log/CallLogFragment.kt b/app/src/main/java/org/tm/archive/calls/log/CallLogFragment.kt index 4932ffd0..d589c45d 100644 --- a/app/src/main/java/org/tm/archive/calls/log/CallLogFragment.kt +++ b/app/src/main/java/org/tm/archive/calls/log/CallLogFragment.kt @@ -17,6 +17,7 @@ import androidx.core.app.SharedElementCallback import androidx.core.view.MenuProvider import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.transition.TransitionInflater @@ -42,6 +43,7 @@ import org.tm.archive.components.menu.ActionItem import org.tm.archive.components.settings.app.AppSettingsActivity import org.tm.archive.components.settings.app.notifications.manual.NotificationProfileSelectionFragment import org.tm.archive.components.settings.conversation.ConversationSettingsActivity +import org.tm.archive.conversation.ConversationUpdateTick import org.tm.archive.conversation.SignalBottomActionBarController import org.tm.archive.conversationlist.ConversationFilterBehavior import org.tm.archive.conversationlist.chatfilter.ConversationFilterSource @@ -57,6 +59,7 @@ import org.tm.archive.recipients.Recipient import org.tm.archive.stories.tabs.ConversationListTab import org.tm.archive.stories.tabs.ConversationListTabsViewModel import org.tm.archive.util.CommunicationActions +import org.tm.archive.util.FeatureFlags import org.tm.archive.util.ViewUtil import org.tm.archive.util.doAfterNextLayout import org.tm.archive.util.fragments.requireListener @@ -74,11 +77,13 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal private val TAG = Log.tag(CallLogFragment::class.java) } - private val viewModel: CallLogViewModel by viewModels() + private val viewModel: CallLogViewModel by activityViewModels() private val binding: CallLogFragmentBinding by ViewBinderDelegate(CallLogFragmentBinding::bind) private val disposables = LifecycleDisposable() private val callLogContextMenu = CallLogContextMenu(this, this) private val callLogActionMode = CallLogActionMode(CallLogActionModeCallback()) + private val conversationUpdateTick: ConversationUpdateTick = ConversationUpdateTick(this::onTimestampTick) + private var callLogAdapter: CallLogAdapter? = null private lateinit var signalBottomActionBarController: SignalBottomActionBarController @@ -113,20 +118,22 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal requireActivity().addMenuProvider(menuProvider, viewLifecycleOwner) initializeSharedElementTransition() - val adapter = CallLogAdapter(this) + viewLifecycleOwner.lifecycle.addObserver(conversationUpdateTick) + + val callLogAdapter = CallLogAdapter(this) disposables.bindTo(viewLifecycleOwner) - adapter.setPagingController(viewModel.controller) + callLogAdapter.setPagingController(viewModel.controller) val scrollToPositionDelegate = ScrollToPositionDelegate( recyclerView = binding.recycler, - canJumpToPosition = { adapter.isAvailableAround(it) } + canJumpToPosition = { callLogAdapter.isAvailableAround(it) } ) disposables += scrollToPositionDelegate disposables += Flowables.combineLatest(viewModel.data, viewModel.selected) .observeOn(AndroidSchedulers.mainThread()) .subscribe { (data, selected) -> - val filteredCount = adapter.submitCallRows( + val filteredCount = callLogAdapter.submitCallRows( data, selected, scrollToPositionDelegate::notifyListCommitted @@ -145,7 +152,8 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal } } - binding.recycler.adapter = adapter + binding.recycler.adapter = callLogAdapter + this.callLogAdapter = callLogAdapter requireListener().bindScrollHelper(binding.recycler) binding.fab.setOnClickListener { @@ -198,6 +206,10 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal viewModel.markAllCallEventsRead() } + private fun onTimestampTick() { + callLogAdapter?.onTimestampTick() + } + private fun initializeSharedElementTransition() { ViewCompat.setTransitionName(binding.fab, "new_convo_fab") ViewCompat.setTransitionName(binding.fabSharedElementTarget, "camera_fab") @@ -230,6 +242,13 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal val count = callLogActionMode.getCount() MaterialAlertDialogBuilder(requireContext()) .setTitle(resources.getQuantityString(R.plurals.CallLogFragment__delete_d_calls, count, count)) + .setMessage( + if (FeatureFlags.adHocCalling()) { + getString(R.string.CallLogFragment__call_links_youve_created) + } else { + null + } + ) .setPositiveButton(R.string.CallLogFragment__delete) { _, _ -> performDeletion(count, viewModel.stageSelectionDeletion()) callLogActionMode.end() @@ -303,6 +322,12 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal val progress = 1 - verticalOffset.toFloat() / -layout.height binding.pullView.onUserDrag(progress) } + + if (viewModel.filterSnapshot != CallLogFilter.ALL) { + binding.root.doAfterNextLayout { + binding.pullView.openImmediate() + } + } } override fun onCreateACallLinkClicked() { @@ -363,6 +388,13 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal override fun deleteCall(call: CallLogRow) { MaterialAlertDialogBuilder(requireContext()) .setTitle(resources.getQuantityString(R.plurals.CallLogFragment__delete_d_calls, 1, 1)) + .setMessage( + if (FeatureFlags.adHocCalling()) { + getString(R.string.CallLogFragment__call_links_youve_created) + } else { + null + } + ) .setPositiveButton(R.string.CallLogFragment__delete) { _, _ -> performDeletion(1, viewModel.stageCallDeletion(call)) } diff --git a/app/src/main/java/org/tm/archive/calls/log/CallLogPagedDataSource.kt b/app/src/main/java/org/tm/archive/calls/log/CallLogPagedDataSource.kt index 670cfc88..8b5fce40 100644 --- a/app/src/main/java/org/tm/archive/calls/log/CallLogPagedDataSource.kt +++ b/app/src/main/java/org/tm/archive/calls/log/CallLogPagedDataSource.kt @@ -63,7 +63,7 @@ class CallLogPagedDataSource( remaining -= callEvents.size } - if (start <= clearFilterStart && remaining > 0) { + if (hasFilter && start <= clearFilterStart && remaining > 0) { callLogRows.add(CallLogRow.ClearFilter) } diff --git a/app/src/main/java/org/tm/archive/calls/log/CallLogRepository.kt b/app/src/main/java/org/tm/archive/calls/log/CallLogRepository.kt index 9da0bf60..0a13f3f4 100644 --- a/app/src/main/java/org/tm/archive/calls/log/CallLogRepository.kt +++ b/app/src/main/java/org/tm/archive/calls/log/CallLogRepository.kt @@ -86,18 +86,22 @@ class CallLogRepository( /** * Delete all call events / unowned links and enqueue clear history job, and then * emit a clear history message. + * + * This explicitly drops failed call link revocations of call links, and those call links + * will remain visible to the user. This is safe because the clear history sync message should + * only clear local history and then poll link status from the server. */ fun deleteAllCallLogsOnOrBeforeNow(): Single { return Single.fromCallable { SignalDatabase.rawDatabase.withinTransaction { - val now = System.currentTimeMillis() - SignalDatabase.calls.deleteNonAdHocCallEventsOnOrBefore(now) - SignalDatabase.callLinks.deleteNonAdminCallLinksOnOrBefore(now) - ApplicationDependencies.getJobManager().add(CallLogEventSendJob.forClearHistory(now)) + val latestTimestamp = SignalDatabase.calls.getLatestTimestamp() + SignalDatabase.calls.deleteNonAdHocCallEventsOnOrBefore(latestTimestamp) + SignalDatabase.callLinks.deleteNonAdminCallLinksOnOrBefore(latestTimestamp) + ApplicationDependencies.getJobManager().add(CallLogEventSendJob.forClearHistory(latestTimestamp)) } SignalDatabase.callLinks.getAllAdminCallLinksExcept(emptySet()) - }.flatMap(this::revokeAndCollectResults).map { -1 }.subscribeOn(Schedulers.io()) + }.flatMap(this::revokeAndCollectResults).map { 0 }.subscribeOn(Schedulers.io()) } /** diff --git a/app/src/main/java/org/tm/archive/calls/log/CallLogRow.kt b/app/src/main/java/org/tm/archive/calls/log/CallLogRow.kt index 111cfb8e..9381082d 100644 --- a/app/src/main/java/org/tm/archive/calls/log/CallLogRow.kt +++ b/app/src/main/java/org/tm/archive/calls/log/CallLogRow.kt @@ -93,11 +93,11 @@ sealed class CallLogRow { return FULL } - if (groupCallUpdateDetails.inCallUuidsList.contains(Recipient.self().requireAci().rawUuid.toString())) { + if (groupCallUpdateDetails.inCallUuids.contains(Recipient.self().requireAci().rawUuid.toString())) { return LOCAL_USER_JOINED } - return if (groupCallUpdateDetails.inCallUuidsCount > 0) { + return if (groupCallUpdateDetails.inCallUuids.isNotEmpty()) { ACTIVE } else { NONE diff --git a/app/src/main/java/org/tm/archive/components/AlbumThumbnailView.java b/app/src/main/java/org/tm/archive/components/AlbumThumbnailView.java index 153998ab..f149bac1 100644 --- a/app/src/main/java/org/tm/archive/components/AlbumThumbnailView.java +++ b/app/src/main/java/org/tm/archive/components/AlbumThumbnailView.java @@ -1,3 +1,8 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + package org.tm.archive.components; import android.content.Context; @@ -12,10 +17,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.tm.archive.R; +import org.tm.archive.components.transfercontrols.TransferControlView; import org.tm.archive.mms.GlideRequests; import org.tm.archive.mms.Slide; import org.tm.archive.mms.SlideClickListener; import org.tm.archive.mms.SlidesClickedListener; +import org.tm.archive.util.MediaUtil; import org.tm.archive.util.views.Stub; import java.util.List; @@ -23,14 +30,16 @@ import java.util.List; public class AlbumThumbnailView extends FrameLayout { private @Nullable SlideClickListener thumbnailClickListener; - private @Nullable SlidesClickedListener downloadClickListener; + private @Nullable SlidesClickedListener startTransferClickListener; + private @Nullable SlidesClickedListener cancelTransferClickListener; + private @Nullable SlideClickListener playVideoClickListener; private int currentSizeClass; private final int[] corners = new int[4]; - private ViewGroup albumCellContainer; - private Stub transferControls; + private final ViewGroup albumCellContainer; + private final Stub transferControlsStub; private final SlideClickListener defaultThumbnailClickListener = (v, slide) -> { if (thumbnailClickListener != null) { @@ -42,19 +51,18 @@ public class AlbumThumbnailView extends FrameLayout { public AlbumThumbnailView(@NonNull Context context) { super(context); - initialize(); + inflate(getContext(), R.layout.album_thumbnail_view, this); + + albumCellContainer = findViewById(R.id.album_cell_container); + transferControlsStub = new Stub<>(findViewById(R.id.album_transfer_controls_stub)); } public AlbumThumbnailView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); - initialize(); - } - - private void initialize() { inflate(getContext(), R.layout.album_thumbnail_view, this); - albumCellContainer = findViewById(R.id.album_cell_container); - transferControls = new Stub<>(findViewById(R.id.album_transfer_controls_stub)); + albumCellContainer = findViewById(R.id.album_cell_container); + transferControlsStub = new Stub<>(findViewById(R.id.album_transfer_controls_stub)); } public void setSlides(@NonNull GlideRequests glideRequests, @NonNull List slides, boolean showControls) { @@ -63,16 +71,23 @@ public class AlbumThumbnailView extends FrameLayout { } if (showControls) { - transferControls.get().setShowDownloadText(true); - transferControls.get().setSlides(slides); - transferControls.get().setDownloadClickListener(v -> { - if (downloadClickListener != null) { - downloadClickListener.onClick(v, slides); - } - }); + transferControlsStub.get().setShowSecondaryText(true); + transferControlsStub.get().setTransferClickListener( + v -> { + if (startTransferClickListener != null) { + startTransferClickListener.onClick(v, slides); + } + }); + transferControlsStub.get().setCancelClickListener( + v -> { + if (cancelTransferClickListener != null) { + cancelTransferClickListener.onClick(v, slides); + } + }); + transferControlsStub.get().setSlides(slides); } else { - if (transferControls.resolved()) { - transferControls.get().setVisibility(GONE); + if (transferControlsStub.resolved()) { + transferControlsStub.get().setVisibility(GONE); } } @@ -85,6 +100,7 @@ public class AlbumThumbnailView extends FrameLayout { showSlides(glideRequests, slides); applyCorners(); + forceLayout(); } public void setCellBackgroundColor(@ColorInt int color) { @@ -101,10 +117,19 @@ public class AlbumThumbnailView extends FrameLayout { thumbnailClickListener = listener; } - public void setDownloadClickListener(@Nullable SlidesClickedListener listener) { - downloadClickListener = listener; + public void setStartTransferClickListener(SlidesClickedListener listener) { + this.startTransferClickListener = listener; } + public void setCancelTransferClickListener(SlidesClickedListener listener) { + this.cancelTransferClickListener = listener; + } + + public void setPlayVideoClickListener(SlideClickListener listener) { + this.playVideoClickListener = listener; + } + + public void setRadii(int topLeft, int topRight, int bottomRight, int bottomLeft) { corners[0] = topLeft; corners[1] = topRight; @@ -117,23 +142,46 @@ public class AlbumThumbnailView extends FrameLayout { private void inflateLayout(int sizeClass) { albumCellContainer.removeAllViews(); + int resId; switch (sizeClass) { case 2: - inflate(getContext(), R.layout.album_thumbnail_2, albumCellContainer); + resId = R.layout.album_thumbnail_2; break; case 3: - inflate(getContext(), R.layout.album_thumbnail_3, albumCellContainer); + resId = R.layout.album_thumbnail_3; break; case 4: - inflate(getContext(), R.layout.album_thumbnail_4, albumCellContainer); + resId = R.layout.album_thumbnail_4; break; case 5: - inflate(getContext(), R.layout.album_thumbnail_5, albumCellContainer); + resId = R.layout.album_thumbnail_5; break; default: - inflate(getContext(), R.layout.album_thumbnail_many, albumCellContainer); + resId = R.layout.album_thumbnail_many; break; } + + inflate(getContext(), resId, albumCellContainer); + if (transferControlsStub.resolved()) { + int size; + switch (sizeClass) { + case 2: + size = R.dimen.album_2_total_height; + break; + case 3: + size = R.dimen.album_3_total_height; + break; + case 4: + size = R.dimen.album_4_total_height; + break; + default: + size = R.dimen.album_5_total_height; + break; + } + ViewGroup.LayoutParams params = transferControlsStub.get().getLayoutParams(); + params.height = getContext().getResources().getDimensionPixelSize(size); + transferControlsStub.get().setLayoutParams(params); + } } private void applyCorners() { @@ -214,19 +262,20 @@ public class AlbumThumbnailView extends FrameLayout { } private void showSlides(@NonNull GlideRequests glideRequests, @NonNull List slides) { - setSlide(glideRequests, slides.get(0), R.id.album_cell_1); - setSlide(glideRequests, slides.get(1), R.id.album_cell_2); + boolean showControls = TransferControlView.containsPlayableSlides(slides); + setSlide(glideRequests, slides.get(0), R.id.album_cell_1, showControls); + setSlide(glideRequests, slides.get(1), R.id.album_cell_2, showControls); if (slides.size() >= 3) { - setSlide(glideRequests, slides.get(2), R.id.album_cell_3); + setSlide(glideRequests, slides.get(2), R.id.album_cell_3, showControls); } if (slides.size() >= 4) { - setSlide(glideRequests, slides.get(3), R.id.album_cell_4); + setSlide(glideRequests, slides.get(3), R.id.album_cell_4, showControls); } if (slides.size() >= 5) { - setSlide(glideRequests, slides.get(4), R.id.album_cell_5); + setSlide(glideRequests, slides.get(4), R.id.album_cell_5, showControls && slides.size() == 5); } if (slides.size() > 5) { @@ -235,11 +284,17 @@ public class AlbumThumbnailView extends FrameLayout { } } - private void setSlide(@NonNull GlideRequests glideRequests, @NonNull Slide slide, @IdRes int id) { + private void setSlide(@NonNull GlideRequests glideRequests, @NonNull Slide slide, @IdRes int id, boolean showControls) { ThumbnailView cell = findViewById(id); - cell.setImageResource(glideRequests, slide, false, false); + cell.showSecondaryText(false); cell.setThumbnailClickListener(defaultThumbnailClickListener); + cell.setStartTransferClickListener(startTransferClickListener); + cell.setCancelTransferClickListener(cancelTransferClickListener); + if (MediaUtil.isInstantVideoSupported(slide)) { + cell.setPlayVideoClickListener(playVideoClickListener); + } cell.setOnLongClickListener(defaultLongClickListener); + cell.setImageResource(glideRequests, slide, showControls, false); } private int sizeClass(int size) { diff --git a/app/src/main/java/org/tm/archive/components/AvatarImageView.java b/app/src/main/java/org/tm/archive/components/AvatarImageView.java index c969a7a5..9874f438 100644 --- a/app/src/main/java/org/tm/archive/components/AvatarImageView.java +++ b/app/src/main/java/org/tm/archive/components/AvatarImageView.java @@ -15,12 +15,16 @@ import androidx.annotation.Px; import androidx.appcompat.widget.AppCompatImageView; import androidx.fragment.app.FragmentActivity; +import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.MultiTransformation; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy; +import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; import org.signal.core.util.logging.Log; @@ -32,6 +36,7 @@ import org.tm.archive.contacts.avatars.ResourceContactPhoto; import org.tm.archive.conversation.colors.AvatarColor; import org.tm.archive.conversation.colors.ChatColors; import org.tm.archive.dependencies.ApplicationDependencies; +import org.tm.archive.jobs.RetrieveProfileAvatarJob; import org.tm.archive.mms.GlideApp; import org.tm.archive.mms.GlideRequest; import org.tm.archive.mms.GlideRequests; @@ -54,6 +59,8 @@ public final class AvatarImageView extends AppCompatImageView { @SuppressWarnings("unused") private static final String TAG = Log.tag(AvatarImageView.class); + private final RequestListener redownloadRequestListener = new RedownloadRequestListener(); + private int size; private boolean inverted; private OnClickListener listener; @@ -198,7 +205,8 @@ public final class AvatarImageView extends AppCompatImageView { .error(fallbackContactPhotoDrawable) .diskCacheStrategy(DiskCacheStrategy.ALL) .downsample(DownsampleStrategy.CENTER_INSIDE) - .transform(new MultiTransformation<>(transforms)); + .transform(new MultiTransformation<>(transforms)) + .addListener(redownloadRequestListener); if (avatarOptions.fixedSize > 0) { fixedSizeTarget = new FixedSizeTarget(avatarOptions.fixedSize); @@ -363,4 +371,19 @@ public final class AvatarImageView extends AppCompatImageView { } } } + + private static class RedownloadRequestListener implements RequestListener { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + if (model instanceof ProfileContactPhoto) { + RetrieveProfileAvatarJob.enqueueForceUpdate(((ProfileContactPhoto) model).getRecipient()); + } + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + } } diff --git a/app/src/main/java/org/tm/archive/components/BorderlessImageView.java b/app/src/main/java/org/tm/archive/components/BorderlessImageView.java index 91a7e620..c517175c 100644 --- a/app/src/main/java/org/tm/archive/components/BorderlessImageView.java +++ b/app/src/main/java/org/tm/archive/components/BorderlessImageView.java @@ -9,9 +9,6 @@ import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.bumptech.glide.load.resource.bitmap.CenterCrop; -import com.bumptech.glide.load.resource.bitmap.CenterInside; - import org.tm.archive.R; import org.tm.archive.mms.GlideRequests; import org.tm.archive.mms.Slide; @@ -63,7 +60,7 @@ public class BorderlessImageView extends FrameLayout { image.setImageResource(glideRequests, slide, showControls, false); } else { image.setScaleType(ImageView.ScaleType.CENTER_CROP); - image.setImageResource(glideRequests, slide, showControls, false, slide.asAttachment().getWidth(), slide.asAttachment().getHeight()); + image.setImageResource(glideRequests, slide, showControls, false, slide.asAttachment().width, slide.asAttachment().height); } missingShade.setVisibility(showControls ? View.VISIBLE : View.GONE); @@ -74,6 +71,6 @@ public class BorderlessImageView extends FrameLayout { } public void setDownloadClickListener(@NonNull SlidesClickedListener listener) { - image.setDownloadClickListener(listener); + image.setStartTransferClickListener(listener); } } diff --git a/app/src/main/java/org/tm/archive/components/ConversationItemFooter.java b/app/src/main/java/org/tm/archive/components/ConversationItemFooter.java index 70c9af78..721ee874 100644 --- a/app/src/main/java/org/tm/archive/components/ConversationItemFooter.java +++ b/app/src/main/java/org/tm/archive/components/ConversationItemFooter.java @@ -29,8 +29,8 @@ import org.signal.core.util.concurrent.SignalExecutors; import org.tm.archive.R; import org.tm.archive.animation.AnimationCompleteListener; import org.tm.archive.conversation.ConversationItemDisplayMode; +import org.tm.archive.conversation.v2.computed.FormattedDate; import org.tm.archive.database.SignalDatabase; -import org.tm.archive.database.model.MediaMmsMessageRecord; import org.tm.archive.database.model.MessageRecord; import org.tm.archive.database.model.MmsMessageRecord; import org.tm.archive.dependencies.ApplicationDependencies; @@ -302,7 +302,9 @@ public class ConversationItemFooter extends ConstraintLayout { private void presentDate(@NonNull MessageRecord messageRecord, @NonNull Locale locale, @NonNull ConversationItemDisplayMode displayMode) { dateView.forceLayout(); - if (messageRecord.isFailed()) { + if (messageRecord.isMediaPending()) { + dateView.setText(null); + } else if (messageRecord.isFailed()) { int errorMsg; if (messageRecord.hasFailedWithNetworkFailures()) { errorMsg = R.string.ConversationItem_error_network_not_delivered; @@ -318,19 +320,26 @@ public class ConversationItemFooter extends ConstraintLayout { } else if (messageRecord.isRateLimited()) { dateView.setText(R.string.ConversationItem_send_paused); } else if (MessageRecordUtil.isScheduled(messageRecord)) { - dateView.setText(DateUtils.getOnlyTimeString(getContext(), locale, ((MediaMmsMessageRecord) messageRecord).getScheduledDate())); + dateView.setText(DateUtils.getOnlyTimeString(getContext(), ((MmsMessageRecord) messageRecord).getScheduledDate())); } else { long timestamp = messageRecord.getTimestamp(); if (messageRecord.isEditMessage()) { - if (displayMode == ConversationItemDisplayMode.EDIT_HISTORY) { + if (displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) { timestamp = messageRecord.getDateSent(); } } - String date = DateUtils.getSimpleRelativeTimeSpanString(getContext(), locale, timestamp); - if (displayMode != ConversationItemDisplayMode.DETAILED && messageRecord.isEditMessage() && messageRecord.isLatestRevision()) { - date = getContext().getString(R.string.ConversationItem_edited_timestamp_footer, date); + FormattedDate date = DateUtils.getDatelessRelativeTimeSpanFormattedDate(getContext(), locale, timestamp); + String dateLabel = date.getValue(); + if (displayMode != ConversationItemDisplayMode.Detailed.INSTANCE && messageRecord.isEditMessage() && messageRecord.isLatestRevision()) { + if (date.isNow()) { + dateLabel = getContext().getString(R.string.ConversationItem_edited_now_timestamp_footer); + } else if (date.isRelative()) { + dateLabel = getContext().getString(R.string.ConversationItem_edited_relative_timestamp_footer, date.getValue()); + } else { + dateLabel = getContext().getString(R.string.ConversationItem_edited_absolute_timestamp_footer, date.getValue()); + } } - dateView.setText(date); + dateView.setText(dateLabel); } } @@ -417,7 +426,7 @@ public class ConversationItemFooter extends ConstraintLayout { deliveryStatusView.setNone(); } else if (messageRecord.isPending()) { deliveryStatusView.setPending(); - } else if (messageRecord.isRemoteRead()) { + } else if (messageRecord.hasReadReceipt()) { deliveryStatusView.setRead(); } else if (messageRecord.isDelivered()) { deliveryStatusView.setDelivered(); @@ -434,7 +443,7 @@ public class ConversationItemFooter extends ConstraintLayout { if (mmsMessageRecord.getSlideDeck().getAudioSlide() != null) { showAudioDurationViews(); - if (messageRecord.getViewedReceiptCount() > 0 || (messageRecord.isOutgoing() && Objects.equals(messageRecord.getToRecipient(), Recipient.self()))) { + if (messageRecord.isViewed() || (messageRecord.isOutgoing() && Objects.equals(messageRecord.getToRecipient(), Recipient.self()))) { revealDot.setProgress(1f); } else { revealDot.setProgress(0f); diff --git a/app/src/main/java/org/tm/archive/components/ConversationItemThumbnail.kt b/app/src/main/java/org/tm/archive/components/ConversationItemThumbnail.kt index 8c639c6b..6ccc7374 100644 --- a/app/src/main/java/org/tm/archive/components/ConversationItemThumbnail.kt +++ b/app/src/main/java/org/tm/archive/components/ConversationItemThumbnail.kt @@ -1,3 +1,8 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + package org.tm.archive.components import android.content.Context @@ -86,7 +91,7 @@ class ConversationItemThumbnail @JvmOverloads constructor( } } - override fun onSaveInstanceState(): Parcelable? { + override fun onSaveInstanceState(): Parcelable { val root = super.onSaveInstanceState() return bundleOf( STATE_ROOT to root, @@ -246,10 +251,28 @@ class ConversationItemThumbnail @JvmOverloads constructor( state.applyState(thumbnail, album) } - fun setDownloadClickListener(listener: SlidesClickedListener?) { + fun setStartTransferClickListener(listener: SlidesClickedListener?) { state = state.copy( - thumbnailViewState = state.thumbnailViewState.copy(downloadClickListener = listener), - albumViewState = state.albumViewState.copy(downloadClickListener = listener) + thumbnailViewState = state.thumbnailViewState.copy(startTransferClickListener = listener), + albumViewState = state.albumViewState.copy(startTransferClickListener = listener) + ) + + state.applyState(thumbnail, album) + } + + fun setPlayVideoClickListener(listener: SlideClickListener?) { + state = state.copy( + thumbnailViewState = state.thumbnailViewState.copy(playVideoClickListener = listener), + albumViewState = state.albumViewState.copy(playVideoClickListener = listener) + ) + + state.applyState(thumbnail, album) + } + + fun setCancelTransferClickListener(listener: SlidesClickedListener?) { + state = state.copy( + thumbnailViewState = state.thumbnailViewState.copy(cancelTransferClickListener = listener), + albumViewState = state.albumViewState.copy(cancelTransferClickListener = listener) ) state.applyState(thumbnail, album) diff --git a/app/src/main/java/org/tm/archive/components/ConversationItemThumbnailState.kt b/app/src/main/java/org/tm/archive/components/ConversationItemThumbnailState.kt index 1402646e..4d51207a 100644 --- a/app/src/main/java/org/tm/archive/components/ConversationItemThumbnailState.kt +++ b/app/src/main/java/org/tm/archive/components/ConversationItemThumbnailState.kt @@ -1,3 +1,8 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + package org.tm.archive.components import android.graphics.Color @@ -29,7 +34,11 @@ data class ConversationItemThumbnailState( @IgnoredOnParcel private val clickListener: SlideClickListener? = null, @IgnoredOnParcel - private val downloadClickListener: SlidesClickedListener? = null, + private val startTransferClickListener: SlidesClickedListener? = null, + @IgnoredOnParcel + private val cancelTransferClickListener: SlidesClickedListener? = null, + @IgnoredOnParcel + private val playVideoClickListener: SlideClickListener? = null, @IgnoredOnParcel private val longClickListener: OnLongClickListener? = null, private val visibility: Int = View.GONE, @@ -54,7 +63,9 @@ data class ConversationItemThumbnailState( thumbnailView.get().isClickable = clickable thumbnailView.get().setRadii(cornerTopLeft, cornerTopRight, cornerBottomRight, cornerBottomLeft) thumbnailView.get().setThumbnailClickListener(clickListener) - thumbnailView.get().setDownloadClickListener(downloadClickListener) + thumbnailView.get().setStartTransferClickListener(startTransferClickListener) + thumbnailView.get().setCancelTransferClickListener(cancelTransferClickListener) + thumbnailView.get().setPlayVideoClickListener(playVideoClickListener) thumbnailView.get().setOnLongClickListener(longClickListener) thumbnailView.get().setBounds(minWidth, maxWidth, minHeight, maxHeight) } @@ -67,7 +78,11 @@ data class ConversationItemThumbnailState( @IgnoredOnParcel private val clickListener: SlideClickListener? = null, @IgnoredOnParcel - private val downloadClickListener: SlidesClickedListener? = null, + private val startTransferClickListener: SlidesClickedListener? = null, + @IgnoredOnParcel + private val cancelTransferClickListener: SlidesClickedListener? = null, + @IgnoredOnParcel + private val playVideoClickListener: SlideClickListener? = null, @IgnoredOnParcel private val longClickListener: OnLongClickListener? = null, private val visibility: Int = View.GONE, @@ -88,7 +103,9 @@ data class ConversationItemThumbnailState( albumView.get().isClickable = clickable albumView.get().setRadii(cornerTopLeft, cornerTopRight, cornerBottomRight, cornerBottomLeft) albumView.get().setThumbnailClickListener(clickListener) - albumView.get().setDownloadClickListener(downloadClickListener) + albumView.get().setStartTransferClickListener(startTransferClickListener) + albumView.get().setCancelTransferClickListener(cancelTransferClickListener) + albumView.get().setPlayVideoClickListener(playVideoClickListener) albumView.get().setOnLongClickListener(longClickListener) albumView.get().setCellBackgroundColor(cellBackgroundColor) } diff --git a/app/src/main/java/org/tm/archive/components/DebugLogsPromptDialogFragment.kt b/app/src/main/java/org/tm/archive/components/DebugLogsPromptDialogFragment.kt index a5fa6c62..67863eef 100644 --- a/app/src/main/java/org/tm/archive/components/DebugLogsPromptDialogFragment.kt +++ b/app/src/main/java/org/tm/archive/components/DebugLogsPromptDialogFragment.kt @@ -5,19 +5,20 @@ package org.tm.archive.components -import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.core.os.bundleOf -import androidx.fragment.app.FragmentManager -import androidx.lifecycle.ViewModelProvider +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle import org.signal.core.util.ResourceUtil import org.signal.core.util.concurrent.LifecycleDisposable import org.tm.archive.R import org.tm.archive.databinding.PromptLogsBottomSheetBinding +import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.keyvalue.SignalStore import org.tm.archive.util.BottomSheetUtil import org.tm.archive.util.CommunicationActions @@ -27,14 +28,25 @@ import org.tm.archive.util.SupportEmailUtil class DebugLogsPromptDialogFragment : FixedRoundedCornerBottomSheetDialogFragment() { companion object { + private const val KEY_PURPOSE = "purpose" @JvmStatic - fun show(context: Context, fragmentManager: FragmentManager) { - if (NetworkUtil.isConnected(context) && fragmentManager.findFragmentByTag(BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) == null) { + fun show(activity: AppCompatActivity, purpose: Purpose) { + if (!activity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { + return + } + + if (NetworkUtil.isConnected(activity) && activity.supportFragmentManager.findFragmentByTag(BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) == null) { DebugLogsPromptDialogFragment().apply { - arguments = bundleOf() - }.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) - SignalStore.uiHints().lastNotificationLogsPrompt = System.currentTimeMillis() + arguments = bundleOf( + KEY_PURPOSE to purpose.serialized + ) + }.show(activity.supportFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + + when (purpose) { + Purpose.NOTIFICATIONS -> SignalStore.uiHints().lastNotificationLogsPrompt = System.currentTimeMillis() + Purpose.CRASH -> SignalStore.uiHints().lastCrashPrompt = System.currentTimeMillis() + } } } } @@ -44,7 +56,12 @@ class DebugLogsPromptDialogFragment : FixedRoundedCornerBottomSheetDialogFragmen private val binding by ViewBinderDelegate(PromptLogsBottomSheetBinding::bind) - private lateinit var viewModel: PromptLogsViewModel + private val viewModel: PromptLogsViewModel by viewModels( + factoryProducer = { + val purpose = Purpose.deserialize(requireArguments().getInt(KEY_PURPOSE)) + PromptLogsViewModel.Factory(ApplicationDependencies.getApplication(), purpose) + } + ) private val disposables: LifecycleDisposable = LifecycleDisposable() @@ -55,43 +72,68 @@ class DebugLogsPromptDialogFragment : FixedRoundedCornerBottomSheetDialogFragmen override fun onViewCreated(view: View, savedInstanceState: Bundle?) { disposables.bindTo(viewLifecycleOwner) - viewModel = ViewModelProvider(this).get(PromptLogsViewModel::class.java) + val purpose = Purpose.deserialize(requireArguments().getInt(KEY_PURPOSE)) + + when (purpose) { + Purpose.NOTIFICATIONS -> { + binding.title.setText(R.string.PromptLogsSlowNotificationsDialog__title) + } + Purpose.CRASH -> { + binding.title.setText(R.string.PromptLogsSlowNotificationsDialog__title_crash) + } + } + binding.submit.setOnClickListener { val progressDialog = SignalProgressDialog.show(requireContext()) disposables += viewModel.submitLogs().subscribe({ result -> - submitLogs(result) + submitLogs(result, purpose) progressDialog.dismiss() - dismiss() + dismissAllowingStateLoss() }, { _ -> Toast.makeText(requireContext(), getString(R.string.HelpFragment__could_not_upload_logs), Toast.LENGTH_LONG).show() progressDialog.dismiss() - dismiss() + dismissAllowingStateLoss() }) } + binding.decline.setOnClickListener { - SignalStore.uiHints().markDeclinedShareNotificationLogs() - dismiss() + if (purpose == Purpose.NOTIFICATIONS) { + SignalStore.uiHints().markDeclinedShareNotificationLogs() + } + + dismissAllowingStateLoss() } } - private fun submitLogs(debugLog: String) { + override fun onStart() { + super.onStart() + viewModel.onVisible() + } + + private fun submitLogs(debugLog: String, purpose: Purpose) { CommunicationActions.openEmail( requireContext(), SupportEmailUtil.getSupportEmailAddress(requireContext()), getString(R.string.DebugLogsPromptDialogFragment__signal_android_support_request), - getEmailBody(debugLog) + getEmailBody(debugLog, purpose) ) } - private fun getEmailBody(debugLog: String?): String { + private fun getEmailBody(debugLog: String?, purpose: Purpose): String { val suffix = StringBuilder() + if (debugLog != null) { suffix.append("\n") suffix.append(getString(R.string.HelpFragment__debug_log)) suffix.append(" ") suffix.append(debugLog) } - val category = ResourceUtil.getEnglishResources(requireContext()).getString(R.string.DebugLogsPromptDialogFragment__slow_notifications_category) + + val category = when (purpose) { + Purpose.NOTIFICATIONS -> ResourceUtil.getEnglishResources(requireContext()).getString(R.string.DebugLogsPromptDialogFragment__slow_notifications_category) + Purpose.CRASH -> ResourceUtil.getEnglishResources(requireContext()).getString(R.string.DebugLogsPromptDialogFragment__crash_category) + } + return SupportEmailUtil.generateSupportEmailBody( requireContext(), R.string.DebugLogsPromptDialogFragment__signal_android_support_request, @@ -100,4 +142,21 @@ class DebugLogsPromptDialogFragment : FixedRoundedCornerBottomSheetDialogFragmen suffix.toString() ) } + + enum class Purpose(val serialized: Int) { + + NOTIFICATIONS(1), CRASH(2); + + companion object { + fun deserialize(serialized: Int): Purpose { + for (value in values()) { + if (value.serialized == serialized) { + return value + } + } + + throw IllegalArgumentException("Invalid value: $serialized") + } + } + } } diff --git a/app/src/main/java/org/tm/archive/components/FixedRoundedCornerBottomSheetDialogFragment.kt b/app/src/main/java/org/tm/archive/components/FixedRoundedCornerBottomSheetDialogFragment.kt index 54c0a526..e386d665 100644 --- a/app/src/main/java/org/tm/archive/components/FixedRoundedCornerBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/tm/archive/components/FixedRoundedCornerBottomSheetDialogFragment.kt @@ -42,7 +42,9 @@ abstract class FixedRoundedCornerBottomSheetDialogFragment : BottomSheetDialogFr override fun onResume() { super.onResume() - WindowUtil.initializeScreenshotSecurity(requireContext(), dialog!!.window!!) + dialog?.window?.let { window -> + WindowUtil.initializeScreenshotSecurity(requireContext(), window) + } } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { diff --git a/app/src/main/java/org/tm/archive/components/FromTextView.java b/app/src/main/java/org/tm/archive/components/FromTextView.java index cb08b5c9..07d18209 100644 --- a/app/src/main/java/org/tm/archive/components/FromTextView.java +++ b/app/src/main/java/org/tm/archive/components/FromTextView.java @@ -5,13 +5,11 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.text.SpannableStringBuilder; -import android.text.style.CharacterStyle; import android.util.AttributeSet; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; -import org.signal.core.util.BreakIteratorCompat; import org.signal.core.util.logging.Log; import org.tm.archive.R; import org.tm.archive.components.emoji.SimpleEmojiTextView; @@ -20,7 +18,6 @@ import org.tm.archive.util.ContextUtil; import org.tm.archive.util.SpanUtil; import org.tm.archive.util.ViewUtil; -import java.util.Iterator; import java.util.Objects; public class FromTextView extends SimpleEmojiTextView { diff --git a/app/src/main/java/org/tm/archive/components/InputAwareConstraintLayout.kt b/app/src/main/java/org/tm/archive/components/InputAwareConstraintLayout.kt index 98432bca..5fc1cac2 100644 --- a/app/src/main/java/org/tm/archive/components/InputAwareConstraintLayout.kt +++ b/app/src/main/java/org/tm/archive/components/InputAwareConstraintLayout.kt @@ -26,12 +26,20 @@ class InputAwareConstraintLayout @JvmOverloads constructor( private var inputId: Int? = null private var input: Fragment? = null private var wasKeyboardVisibleBeforeToggle: Boolean = false + private val listeners: MutableSet = mutableSetOf() val isInputShowing: Boolean get() = input != null lateinit var fragmentManager: FragmentManager - var listener: Listener? = null + + fun addInputListener(listener: Listener) { + listeners.add(listener) + } + + fun remoteInputListener(listener: Listener) { + listeners.remove(listener) + } fun showSoftkey(editText: EditText) { ViewUtil.focusAndShowKeyboard(editText) @@ -44,6 +52,33 @@ class InputAwareConstraintLayout @JvmOverloads constructor( hideInput(resetKeyboardGuideline = true) } + fun runAfterAllHidden(imeTarget: EditText, onHidden: () -> Unit) { + if (isInputShowing || isKeyboardShowing) { + val listener = object : Listener, KeyboardStateListener { + override fun onInputHidden() { + onHidden() + remoteInputListener(this) + removeKeyboardStateListener(this) + } + + override fun onKeyboardHidden() { + onHidden() + remoteInputListener(this) + removeKeyboardStateListener(this) + } + + override fun onInputShown() = Unit + override fun onKeyboardShown() = Unit + } + + addInputListener(listener) + addKeyboardStateListener(listener) + hideAll(imeTarget) + } else { + onHidden() + } + } + fun toggleInput(fragmentCreator: FragmentCreator, imeTarget: EditText, showSoftKeyOnHide: Boolean = wasKeyboardVisibleBeforeToggle) { if (fragmentCreator.id == inputId) { if (showSoftKeyOnHide) { @@ -85,7 +120,7 @@ class InputAwareConstraintLayout @JvmOverloads constructor( overrideKeyboardGuidelineWithPreviousHeight() ViewUtil.hideKeyboard(context, imeTarget) - listener?.onInputShown() + listeners.forEach { it.onInputShown() } } private fun hideInput(resetKeyboardGuideline: Boolean) { @@ -107,7 +142,7 @@ class InputAwareConstraintLayout @JvmOverloads constructor( } if (inputHidden) { - listener?.onInputHidden() + listeners.forEach { it.onInputHidden() } } } diff --git a/app/src/main/java/org/tm/archive/components/InputPanel.java b/app/src/main/java/org/tm/archive/components/InputPanel.java index 91846cf4..57084488 100644 --- a/app/src/main/java/org/tm/archive/components/InputPanel.java +++ b/app/src/main/java/org/tm/archive/components/InputPanel.java @@ -19,7 +19,6 @@ import android.view.animation.Interpolator; import android.view.animation.TranslateAnimation; import android.widget.ImageButton; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; @@ -50,7 +49,7 @@ import org.tm.archive.conversation.ConversationStickerSuggestionAdapter; import org.tm.archive.conversation.MessageStyler; import org.tm.archive.conversation.VoiceNoteDraftView; import org.tm.archive.database.DraftTable; -import org.tm.archive.database.model.MediaMmsMessageRecord; +import org.tm.archive.database.model.MmsMessageRecord; import org.tm.archive.database.model.MessageId; import org.tm.archive.database.model.MessageRecord; import org.tm.archive.database.model.Quote; @@ -141,7 +140,7 @@ public class InputPanel extends ConstraintLayout public void onFinishInflate() { super.onFinishInflate(); - View quoteDismiss = findViewById(R.id.quote_dismiss); + View quoteDismiss = findViewById(R.id.quote_dismiss_stub); this.composeContainer = findViewById(R.id.compose_bubble); this.stickerSuggestion = findViewById(R.id.input_panel_sticker_suggestion); @@ -424,10 +423,10 @@ public class InputPanel extends ConstraintLayout } private void updateEditModeThumbnail(@NonNull GlideRequests glideRequests) { - if (messageToEdit instanceof MediaMmsMessageRecord) { - MediaMmsMessageRecord mediaEditMessage = (MediaMmsMessageRecord) messageToEdit; - SlideDeck slideDeck = mediaEditMessage.getSlideDeck(); - Slide imageVideoSlide = slideDeck.getSlides().stream().filter(s -> s.hasImage() || s.hasVideo() || s.hasSticker()).findFirst().orElse(null); + if (messageToEdit instanceof MmsMessageRecord) { + MmsMessageRecord mediaEditMessage = (MmsMessageRecord) messageToEdit; + SlideDeck slideDeck = mediaEditMessage.getSlideDeck(); + Slide imageVideoSlide = slideDeck.getSlides().stream().filter(s -> s.hasImage() || s.hasVideo() || s.hasSticker()).findFirst().orElse(null); if (imageVideoSlide != null && imageVideoSlide.getUri() != null) { editMessageThumbnail.setVisibility(VISIBLE); diff --git a/app/src/main/java/org/tm/archive/components/InsetAwareConstraintLayout.kt b/app/src/main/java/org/tm/archive/components/InsetAwareConstraintLayout.kt index 080b75f9..97ea8bda 100644 --- a/app/src/main/java/org/tm/archive/components/InsetAwareConstraintLayout.kt +++ b/app/src/main/java/org/tm/archive/components/InsetAwareConstraintLayout.kt @@ -51,13 +51,14 @@ open class InsetAwareConstraintLayout @JvmOverloads constructor( private val windowTypes = WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() } - private val statusBarGuideline: Guideline? by lazy { findViewById(R.id.status_bar_guideline) } + protected val statusBarGuideline: Guideline? by lazy { findViewById(R.id.status_bar_guideline) } private val navigationBarGuideline: Guideline? by lazy { findViewById(R.id.navigation_bar_guideline) } private val parentStartGuideline: Guideline? by lazy { findViewById(R.id.parent_start_guideline) } private val parentEndGuideline: Guideline? by lazy { findViewById(R.id.parent_end_guideline) } private val keyboardGuideline: Guideline? by lazy { findViewById(R.id.keyboard_guideline) } - private val listeners: MutableList = mutableListOf() + private val windowInsetsListeners: MutableSet = mutableSetOf() + private val keyboardStateListeners: MutableSet = mutableSetOf() private val keyboardAnimator = KeyboardInsetAnimator() private val displayMetrics = DisplayMetrics() private var overridingKeyboard: Boolean = false @@ -82,20 +83,35 @@ open class InsetAwareConstraintLayout @JvmOverloads constructor( } fun addKeyboardStateListener(listener: KeyboardStateListener) { - listeners += listener + keyboardStateListeners += listener } fun removeKeyboardStateListener(listener: KeyboardStateListener) { - listeners.remove(listener) + keyboardStateListeners.remove(listener) + } + + fun addWindowInsetsListener(listener: WindowInsetsListener) { + windowInsetsListeners += listener + } + + fun removeWindowInsetsListener(listener: WindowInsetsListener) { + windowInsetsListeners.remove(listener) } private fun applyInsets(windowInsets: Insets, keyboardInsets: Insets) { val isLtr = ViewUtil.isLtr(this) - statusBarGuideline?.setGuidelineBegin(windowInsets.top) - navigationBarGuideline?.setGuidelineEnd(windowInsets.bottom) - parentStartGuideline?.setGuidelineBegin(if (isLtr) windowInsets.left else windowInsets.right) - parentEndGuideline?.setGuidelineEnd(if (isLtr) windowInsets.right else windowInsets.left) + val statusBar = windowInsets.top + val navigationBar = windowInsets.bottom + val parentStart = if (isLtr) windowInsets.left else windowInsets.right + val parentEnd = if (isLtr) windowInsets.right else windowInsets.left + + statusBarGuideline?.setGuidelineBegin(statusBar) + navigationBarGuideline?.setGuidelineEnd(navigationBar) + parentStartGuideline?.setGuidelineBegin(parentStart) + parentEndGuideline?.setGuidelineEnd(parentEnd) + + windowInsetsListeners.forEach { it.onApplyWindowInsets(statusBar, navigationBar, parentStart, parentEnd) } if (keyboardInsets.bottom > 0) { setKeyboardHeight(keyboardInsets.bottom) @@ -113,7 +129,7 @@ open class InsetAwareConstraintLayout @JvmOverloads constructor( } if (previousKeyboardHeight != keyboardInsets.bottom) { - listeners.forEach { + keyboardStateListeners.forEach { if (previousKeyboardHeight <= 0) { it.onKeyboardShown() } else { @@ -191,6 +207,10 @@ open class InsetAwareConstraintLayout @JvmOverloads constructor( fun onKeyboardHidden() } + interface WindowInsetsListener { + fun onApplyWindowInsets(statusBar: Int, navigationBar: Int, parentStart: Int, parentEnd: Int) + } + /** * Adjusts the [keyboardGuideline] to move with the IME keyboard opening or closing. */ diff --git a/app/src/main/java/org/tm/archive/components/KeyboardAwareLinearLayout.java b/app/src/main/java/org/tm/archive/components/KeyboardAwareLinearLayout.java index 512b0caf..2530632c 100644 --- a/app/src/main/java/org/tm/archive/components/KeyboardAwareLinearLayout.java +++ b/app/src/main/java/org/tm/archive/components/KeyboardAwareLinearLayout.java @@ -37,7 +37,6 @@ import org.tm.archive.util.ViewUtil; import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; -import java.util.concurrent.TimeUnit; /** * LinearLayout that, when a view container, will report back when it thinks a soft keyboard diff --git a/app/src/main/java/org/tm/archive/components/LinkPreviewView.java b/app/src/main/java/org/tm/archive/components/LinkPreviewView.java index 418b5ebd..2bf24bc9 100644 --- a/app/src/main/java/org/tm/archive/components/LinkPreviewView.java +++ b/app/src/main/java/org/tm/archive/components/LinkPreviewView.java @@ -163,10 +163,10 @@ public class LinkPreviewView extends FrameLayout { } public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail) { - setLinkPreview(glideRequests, linkPreview, showThumbnail, true); + setLinkPreview(glideRequests, linkPreview, showThumbnail, true, false); } - public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail, boolean showDescription) { + public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail, boolean showDescription, boolean scheduleMessageMode) { spinner.setVisibility(GONE); noPreview.setVisibility(GONE); @@ -216,8 +216,8 @@ public class LinkPreviewView extends FrameLayout { if (showThumbnail && linkPreview.getThumbnail().isPresent()) { thumbnail.setVisibility(VISIBLE); thumbnailState.applyState(thumbnail); - thumbnail.get().setImageResource(glideRequests, new ImageSlide(linkPreview.getThumbnail().get()), type == TYPE_CONVERSATION, false); - thumbnail.get().showDownloadText(false); + thumbnail.get().setImageResource(glideRequests, new ImageSlide(linkPreview.getThumbnail().get()), type == TYPE_CONVERSATION && !scheduleMessageMode, false); + thumbnail.get().showSecondaryText(false); } else if (callLinkRootKey != null) { thumbnail.setVisibility(VISIBLE); thumbnailState.applyState(thumbnail); @@ -228,7 +228,7 @@ public class LinkPreviewView extends FrameLayout { .asDrawable(getContext(), AvatarColorHash.forCallLink(callLinkRootKey.getKeyBytes())) ); - thumbnail.get().showDownloadText(false); + thumbnail.get().showSecondaryText(false); } else { thumbnail.setVisibility(GONE); } diff --git a/app/src/main/java/org/tm/archive/components/LinkPreviewViewThumbnailState.kt b/app/src/main/java/org/tm/archive/components/LinkPreviewViewThumbnailState.kt index ae989079..67728f68 100644 --- a/app/src/main/java/org/tm/archive/components/LinkPreviewViewThumbnailState.kt +++ b/app/src/main/java/org/tm/archive/components/LinkPreviewViewThumbnailState.kt @@ -22,7 +22,7 @@ data class LinkPreviewViewThumbnailState( fun applyState(thumbnail: Stub) { if (thumbnail.resolved()) { thumbnail.get().setCorners(cornerTopLeft, cornerTopRight, cornerBottomRight, cornerBottomLeft) - thumbnail.get().setDownloadClickListener(downloadListener) + thumbnail.get().setStartTransferClickListener(downloadListener) } } } diff --git a/app/src/main/java/org/tm/archive/components/LoggingAdapterDataObserver.kt b/app/src/main/java/org/tm/archive/components/LoggingAdapterDataObserver.kt new file mode 100644 index 00000000..b0a6fa18 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/LoggingAdapterDataObserver.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components + +import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver +import org.signal.core.util.logging.Log + +class LoggingAdapterDataObserver( + private val tag: String +) : AdapterDataObserver() { + override fun onChanged() { + Log.d(tag, "onChanged() called") + } + + override fun onItemRangeChanged(positionStart: Int, itemCount: Int) { + Log.d(tag, "onItemRangeChanged() called with: positionStart = $positionStart, itemCount = $itemCount") + } + + override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) { + Log.d(tag, "onItemRangeChanged() called with: positionStart = $positionStart, itemCount = $itemCount, payload = $payload") + } + + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + Log.d(tag, "onItemRangeInserted() called with: positionStart = $positionStart, itemCount = $itemCount") + } + + override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) { + Log.d(tag, "onItemRangeRemoved() called with: positionStart = $positionStart, itemCount = $itemCount") + } + + override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) { + Log.d(tag, "onItemRangeMoved() called with: fromPosition = $fromPosition, toPosition = $toPosition, itemCount = $itemCount") + } + + override fun onStateRestorationPolicyChanged() { + Log.d(tag, "onStateRestorationPolicyChanged() called") + } +} diff --git a/app/src/main/java/org/tm/archive/components/PromptBatterySaverDialogFragment.kt b/app/src/main/java/org/tm/archive/components/PromptBatterySaverDialogFragment.kt index a8ac662b..bed77506 100644 --- a/app/src/main/java/org/tm/archive/components/PromptBatterySaverDialogFragment.kt +++ b/app/src/main/java/org/tm/archive/components/PromptBatterySaverDialogFragment.kt @@ -12,7 +12,6 @@ import android.view.ViewGroup import androidx.annotation.RequiresApi import androidx.core.os.bundleOf import androidx.fragment.app.FragmentManager -import androidx.lifecycle.ViewModelProvider import org.signal.core.util.concurrent.LifecycleDisposable import org.tm.archive.R import org.tm.archive.databinding.PromptBatterySaverBottomSheetBinding @@ -41,8 +40,6 @@ class PromptBatterySaverDialogFragment : FixedRoundedCornerBottomSheetDialogFrag private val binding by ViewBinderDelegate(PromptBatterySaverBottomSheetBinding::bind) - private lateinit var viewModel: PromptLogsViewModel - private val disposables: LifecycleDisposable = LifecycleDisposable() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { @@ -52,7 +49,6 @@ class PromptBatterySaverDialogFragment : FixedRoundedCornerBottomSheetDialogFrag override fun onViewCreated(view: View, savedInstanceState: Bundle?) { disposables.bindTo(viewLifecycleOwner) - viewModel = ViewModelProvider(this)[PromptLogsViewModel::class.java] binding.continueButton.setOnClickListener { PowerManagerCompat.requestIgnoreBatteryOptimizations(requireContext()) } diff --git a/app/src/main/java/org/tm/archive/components/PromptLogsViewModel.kt b/app/src/main/java/org/tm/archive/components/PromptLogsViewModel.kt index b7c9510b..4f3f0874 100644 --- a/app/src/main/java/org/tm/archive/components/PromptLogsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/PromptLogsViewModel.kt @@ -5,17 +5,37 @@ package org.tm.archive.components +import android.app.Application +import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.SingleSubject +import org.tm.archive.crash.CrashConfig +import org.tm.archive.database.LogDatabase import org.tm.archive.logsubmit.SubmitDebugLogRepository -class PromptLogsViewModel : ViewModel() { +class PromptLogsViewModel(private val context: Application, private val purpose: DebugLogsPromptDialogFragment.Purpose) : AndroidViewModel(context) { private val submitDebugLogRepository = SubmitDebugLogRepository() + private val disposables = CompositeDisposable() + + fun onVisible() { + if (purpose == DebugLogsPromptDialogFragment.Purpose.CRASH) { + disposables += Single + .fromCallable { + LogDatabase.getInstance(context).crashes.markAsPrompted(CrashConfig.patterns, System.currentTimeMillis()) + } + .subscribeOn(Schedulers.io()) + .subscribe() + } + } + fun submitLogs(): Single { val singleSubject = SingleSubject.create() submitDebugLogRepository.buildAndSubmitLog { result -> @@ -28,4 +48,14 @@ class PromptLogsViewModel : ViewModel() { return singleSubject.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) } + + override fun onCleared() { + disposables.clear() + } + + class Factory(private val context: Application, private val purpose: DebugLogsPromptDialogFragment.Purpose) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return modelClass.cast(PromptLogsViewModel(context, purpose))!! + } + } } diff --git a/app/src/main/java/org/tm/archive/components/QuoteView.java b/app/src/main/java/org/tm/archive/components/QuoteView.java index 7e16a3bc..7158ec81 100644 --- a/app/src/main/java/org/tm/archive/components/QuoteView.java +++ b/app/src/main/java/org/tm/archive/components/QuoteView.java @@ -4,18 +4,16 @@ package org.tm.archive.components; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; -import android.os.Build; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; +import androidx.constraintlayout.widget.ConstraintLayout; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.google.android.material.imageview.ShapeableImageView; @@ -45,11 +43,12 @@ import org.tm.archive.stories.StoryTextPostModel; import org.tm.archive.util.MediaUtil; import org.tm.archive.util.Projection; import org.tm.archive.util.Util; +import org.tm.archive.util.views.Stub; import java.io.IOException; import java.util.List; -public class QuoteView extends FrameLayout implements RecipientForeverObserver { +public class QuoteView extends ConstraintLayout implements RecipientForeverObserver { private static final String TAG = Log.tag(QuoteView.class); @@ -79,17 +78,13 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { } } - private View background; - private ViewGroup mainView; - private ViewGroup footerView; private TextView authorView; private EmojiTextView bodyView; private View quoteBarView; private ShapeableImageView thumbnailView; - private View attachmentVideoOverlayView; - private ViewGroup attachmentContainerView; - private TextView attachmentNameView; - private ImageView dismissView; + private Stub attachmentVideoOVerlayStub; + private Stub attachmentNameViewStub; + private Stub dismissStub; private EmojiImageView missingStoryReaction; private EmojiImageView storyReactionEmoji; @@ -97,7 +92,7 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { private LiveRecipient author; private CharSequence body; private TextView mediaDescriptionText; - private TextView missingLinkText; + private Stub missingLinkTextStub; private SlideDeck attachments; private MessageType messageType; private int largeCornerRadius; @@ -124,32 +119,27 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { initialize(attrs); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public QuoteView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); initialize(attrs); } private void initialize(@Nullable AttributeSet attrs) { - inflate(getContext(), R.layout.quote_view, this); + inflate(getContext(), R.layout.v2_quote_view, this); - this.background = findViewById(R.id.quote_background); - this.mainView = findViewById(R.id.quote_main); - this.footerView = findViewById(R.id.quote_missing_footer); - this.authorView = findViewById(R.id.quote_author); - this.bodyView = findViewById(R.id.quote_text); - this.quoteBarView = findViewById(R.id.quote_bar); - this.thumbnailView = findViewById(R.id.quote_thumbnail); - this.attachmentVideoOverlayView = findViewById(R.id.quote_video_overlay); - this.attachmentContainerView = findViewById(R.id.quote_attachment_container); - this.attachmentNameView = findViewById(R.id.quote_attachment_name); - this.dismissView = findViewById(R.id.quote_dismiss); - this.mediaDescriptionText = findViewById(R.id.media_type); - this.missingLinkText = findViewById(R.id.quote_missing_text); - this.missingStoryReaction = findViewById(R.id.quote_missing_story_reaction_emoji); - this.storyReactionEmoji = findViewById(R.id.quote_story_reaction_emoji); - this.largeCornerRadius = getResources().getDimensionPixelSize(R.dimen.quote_corner_radius_large); - this.smallCornerRadius = getResources().getDimensionPixelSize(R.dimen.quote_corner_radius_bottom); + this.authorView = findViewById(R.id.quote_author); + this.bodyView = findViewById(R.id.quote_text); + this.quoteBarView = findViewById(R.id.quote_bar); + this.thumbnailView = findViewById(R.id.quote_thumbnail); + this.attachmentVideoOVerlayStub = new Stub<>(findViewById(R.id.quote_video_overlay_stub)); + this.attachmentNameViewStub = new Stub<>(findViewById(R.id.quote_attachment_name_stub)); + this.dismissStub = new Stub<>(findViewById(R.id.quote_dismiss_stub)); + this.mediaDescriptionText = findViewById(R.id.media_type); + this.missingLinkTextStub = new Stub<>(findViewById(R.id.quote_missing_text_stub)); + this.missingStoryReaction = findViewById(R.id.quote_missing_story_reaction_emoji); + this.storyReactionEmoji = findViewById(R.id.quote_story_reaction_emoji); + this.largeCornerRadius = getResources().getDimensionPixelSize(R.dimen.quote_corner_radius_large); + this.smallCornerRadius = getResources().getDimensionPixelSize(R.dimen.quote_corner_radius_bottom); cornerMask = new CornerMask(this); @@ -159,12 +149,10 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { messageType = MessageType.fromCode(typedArray.getInt(R.styleable.QuoteView_message_type, 0)); typedArray.recycle(); - dismissView.setVisibility(messageType == MessageType.PREVIEW ? VISIBLE : GONE); + dismissStub.setVisibility(messageType == MessageType.PREVIEW ? VISIBLE : GONE); } setMessageType(messageType); - - dismissView.setOnClickListener(view -> setVisibility(GONE)); } @Override @@ -199,7 +187,10 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { params.width = thumbWidth; thumbnailView.setLayoutParams(params); - dismissView.setVisibility(messageType == MessageType.PREVIEW ? View.VISIBLE : View.GONE); + dismissStub.setVisibility(messageType == MessageType.PREVIEW ? View.VISIBLE : View.GONE); + if (dismissStub.resolved()) { + dismissStub.get().setOnClickListener(view -> setVisibility(GONE)); + } } public void setQuote(GlideRequests glideRequests, @@ -255,11 +246,6 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { public void onRecipientChanged(@NonNull Recipient recipient) { setQuoteAuthor(recipient); } - - public @NonNull Projection getProjection(@NonNull ViewGroup parent) { - return Projection.relativeToParent(parent, this, getCorners()); - } - public @NonNull Projection.Corners getCorners() { return new Projection.Corners(cornerMask.getRadii()); } @@ -365,13 +351,13 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { boolean outgoing = messageType != MessageType.INCOMING && messageType != MessageType.STORY_REPLY_INCOMING; boolean preview = messageType == MessageType.PREVIEW || messageType == MessageType.STORY_REPLY_PREVIEW; - mainView.setMinimumHeight(isStoryReply() && originalMissing ? 0 : thumbHeight); + // TODO [alex] -- do we need this? mainView.setMinimumHeight(isStoryReply() && originalMissing ? 0 : thumbHeight); thumbnailView.setPadding(0, 0, 0, 0); StoryTextPostModel model = isStoryReply() ? getStoryTextPost(body) : null; if (model != null) { - attachmentVideoOverlayView.setVisibility(GONE); - attachmentContainerView.setVisibility(GONE); + attachmentVideoOVerlayStub.setVisibility(GONE); + attachmentNameViewStub.setVisibility(GONE); thumbnailView.setVisibility(VISIBLE); glideRequests.load(model) .centerCrop() @@ -388,8 +374,8 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { thumbnailView.setShapeAppearanceModel(buildShapeAppearanceForLayoutDirection()); } - attachmentVideoOverlayView.setVisibility(GONE); - attachmentContainerView.setVisibility(GONE); + attachmentVideoOVerlayStub.setVisibility(GONE); + attachmentNameViewStub.setVisibility(GONE); thumbnailView.setVisibility(VISIBLE); glideRequests.load(R.drawable.ic_gift_thumbnail) .centerCrop() @@ -403,17 +389,20 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { Slide documentSlide = slideDeck.getSlides().stream().filter(Slide::hasDocument).findFirst().orElse(null); Slide viewOnceSlide = slideDeck.getSlides().stream().filter(Slide::hasViewOnce).findFirst().orElse(null); - attachmentVideoOverlayView.setVisibility(GONE); + attachmentVideoOVerlayStub.setVisibility(GONE); if (viewOnceSlide != null) { thumbnailView.setVisibility(GONE); - attachmentContainerView.setVisibility(GONE); + attachmentNameViewStub.setVisibility(GONE); } else if (imageVideoSlide != null && imageVideoSlide.getUri() != null) { thumbnailView.setVisibility(VISIBLE); - attachmentContainerView.setVisibility(GONE); - dismissView.setBackgroundResource(R.drawable.dismiss_background); + attachmentNameViewStub.setVisibility(GONE); + + if (dismissStub.resolved()) { + dismissStub.get().setBackgroundResource(R.drawable.dismiss_background); + } if (imageVideoSlide.hasVideo() && !imageVideoSlide.isVideoGif()) { - attachmentVideoOverlayView.setVisibility(VISIBLE); + attachmentVideoOVerlayStub.setVisibility(VISIBLE); } glideRequests.load(new DecryptableUri(imageVideoSlide.getUri())) .centerCrop() @@ -422,17 +411,20 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { .into(thumbnailView); } else if (documentSlide != null){ thumbnailView.setVisibility(GONE); - attachmentContainerView.setVisibility(VISIBLE); - attachmentNameView.setText(documentSlide.getFileName().orElse("")); + attachmentNameViewStub.setVisibility(VISIBLE); + attachmentNameViewStub.get().setText(documentSlide.getFileName().orElse("")); } else { thumbnailView.setVisibility(GONE); - attachmentContainerView.setVisibility(GONE); - dismissView.setBackgroundDrawable(null); + attachmentNameViewStub.setVisibility(GONE); + + if (dismissStub.resolved()) { + dismissStub.get().setBackground(null); + } } } private void setQuoteMissingFooter(boolean missing) { - footerView.setVisibility(missing && !isStoryReply() ? VISIBLE : GONE); + missingLinkTextStub.setVisibility(missing && !isStoryReply() ? VISIBLE : GONE); } private @Nullable StoryTextPostModel getStoryTextPost(@Nullable CharSequence body) { @@ -501,12 +493,18 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { QuoteViewColorTheme quoteViewColorTheme = QuoteViewColorTheme.resolveTheme(isOutgoing, isPreview, isWallpaperEnabled); quoteBarView.setBackgroundColor(quoteViewColorTheme.getBarColor(getContext())); - background.setBackgroundColor(quoteViewColorTheme.getBackgroundColor(getContext())); + setBackgroundColor(quoteViewColorTheme.getBackgroundColor(getContext())); authorView.setTextColor(quoteViewColorTheme.getForegroundColor(getContext())); bodyView.setTextColor(quoteViewColorTheme.getForegroundColor(getContext())); - attachmentNameView.setTextColor(quoteViewColorTheme.getForegroundColor(getContext())); + + if (attachmentNameViewStub.resolved()) { + attachmentNameViewStub.get().setTextColor(quoteViewColorTheme.getForegroundColor(getContext())); + } mediaDescriptionText.setTextColor(quoteViewColorTheme.getForegroundColor(getContext())); - missingLinkText.setTextColor(quoteViewColorTheme.getForegroundColor(getContext())); - footerView.setBackgroundColor(quoteViewColorTheme.getBackgroundColor(getContext())); + + if (missingLinkTextStub.resolved()) { + missingLinkTextStub.get().setTextColor(quoteViewColorTheme.getForegroundColor(getContext())); + missingLinkTextStub.get().setBackgroundColor(quoteViewColorTheme.getBackgroundColor(getContext())); + } } } diff --git a/app/src/main/java/org/tm/archive/components/RatingManager.java b/app/src/main/java/org/tm/archive/components/RatingManager.java index f7757c1c..3f63727c 100644 --- a/app/src/main/java/org/tm/archive/components/RatingManager.java +++ b/app/src/main/java/org/tm/archive/components/RatingManager.java @@ -22,7 +22,7 @@ public class RatingManager { private static final String TAG = Log.tag(RatingManager.class); public static void showRatingDialogIfNecessary(Context context) { - if (!TextSecurePreferences.isRatingEnabled(context) || BuildConfig.PLAY_STORE_DISABLED) return; + if (!TextSecurePreferences.isRatingEnabled(context) || BuildConfig.MANAGES_APP_UPDATES) return; long daysSinceInstall = VersionTracker.getDaysSinceFirstInstalled(context); long laterTimestamp = TextSecurePreferences.getRatingLaterTimestamp(context); diff --git a/app/src/main/java/org/tm/archive/components/RecentPhotoViewRail.java b/app/src/main/java/org/tm/archive/components/RecentPhotoViewRail.java index 2f4f6f78..6fb57d08 100644 --- a/app/src/main/java/org/tm/archive/components/RecentPhotoViewRail.java +++ b/app/src/main/java/org/tm/archive/components/RecentPhotoViewRail.java @@ -1,7 +1,6 @@ package org.tm.archive.components; -import android.annotation.TargetApi; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; diff --git a/app/src/main/java/org/tm/archive/components/RecyclerViewParentTransitionController.kt b/app/src/main/java/org/tm/archive/components/RecyclerViewParentTransitionController.kt new file mode 100644 index 00000000..e2a7095a --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/RecyclerViewParentTransitionController.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components + +import android.animation.LayoutTransition +import android.view.View +import android.view.View.OnAttachStateChangeListener +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView + +/** + * Helps manage layout transition state inside a RecyclerView. + * + * Because of how RecyclerViews scroll, we need to be very careful about LayoutTransition + * usage inside of them. This class helps wrap up the pattern of finding and listening to + * the scroll events of a parent recycler view, so that we don't need to manually wire + * the scroll state in everywhere. + */ +class RecyclerViewParentTransitionController( + private val child: ViewGroup, + private val transition: LayoutTransition = LayoutTransition() +) : RecyclerView.OnScrollListener(), OnAttachStateChangeListener { + + private var recyclerViewParent: RecyclerView? = null + + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + child.layoutTransition = transition + } else { + child.layoutTransition = null + } + } + + override fun onViewAttachedToWindow(v: View) { + val parent = findRecyclerParent() + + if (parent != null) { + onScrollStateChanged(parent, parent.scrollState) + } + + parent?.addOnScrollListener(this) + recyclerViewParent = parent + } + + override fun onViewDetachedFromWindow(v: View) { + recyclerViewParent?.removeOnScrollListener(this) + child.layoutTransition = null + } + + private fun findRecyclerParent(): RecyclerView? { + var target: ViewGroup? = child.parent as? ViewGroup + while (target != null) { + if (target is RecyclerView) { + return target + } + + target = target.parent as? ViewGroup + } + + return null + } +} diff --git a/app/src/main/java/org/tm/archive/components/TemporaryScreenshotSecurity.kt b/app/src/main/java/org/tm/archive/components/TemporaryScreenshotSecurity.kt new file mode 100644 index 00000000..b3a5cda5 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/TemporaryScreenshotSecurity.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components + +import android.view.WindowManager +import androidx.activity.ComponentActivity +import androidx.fragment.app.Fragment +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import org.tm.archive.util.TextSecurePreferences + +/** + * Applies temporary screenshot security for the given component lifecycle. + */ +object TemporaryScreenshotSecurity { + + @JvmStatic + fun bindToViewLifecycleOwner(fragment: Fragment) { + val observer = LifecycleObserver { fragment.requireActivity() } + + fragment.viewLifecycleOwner.lifecycle.addObserver(observer) + } + + @JvmStatic + fun bind(activity: ComponentActivity) { + val observer = LifecycleObserver { activity } + + activity.lifecycle.addObserver(observer) + } + + private class LifecycleObserver( + private val activityProvider: () -> ComponentActivity + ) : DefaultLifecycleObserver { + override fun onResume(owner: LifecycleOwner) { + val activity = activityProvider() + if (!TextSecurePreferences.isScreenSecurityEnabled(activity)) { + activity.window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + + override fun onPause(owner: LifecycleOwner) { + val activity = activityProvider() + if (!TextSecurePreferences.isScreenSecurityEnabled(activity)) { + activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/ThreadPhotoRailView.java b/app/src/main/java/org/tm/archive/components/ThreadPhotoRailView.java index 434b598a..3e809cf2 100644 --- a/app/src/main/java/org/tm/archive/components/ThreadPhotoRailView.java +++ b/app/src/main/java/org/tm/archive/components/ThreadPhotoRailView.java @@ -17,13 +17,15 @@ import androidx.recyclerview.widget.RecyclerView; import org.signal.core.util.logging.Log; import org.tm.archive.R; -import org.tm.archive.database.CursorRecyclerViewAdapter; import org.tm.archive.database.MediaTable; import org.tm.archive.mediapreview.MediaPreviewCache; import org.tm.archive.mms.GlideRequests; import org.tm.archive.mms.Slide; import org.tm.archive.util.MediaUtil; +import java.util.ArrayList; +import java.util.List; + public class ThreadPhotoRailView extends FrameLayout { @NonNull private final RecyclerView recyclerView; @@ -56,11 +58,11 @@ public class ThreadPhotoRailView extends FrameLayout { } } - public void setCursor(@NonNull GlideRequests glideRequests, @Nullable Cursor cursor) { - this.recyclerView.setAdapter(new ThreadPhotoRailAdapter(getContext(), glideRequests, cursor, this.listener)); + public void setMediaRecords(@NonNull GlideRequests glideRequests, @NonNull List mediaRecords) { + this.recyclerView.setAdapter(new ThreadPhotoRailAdapter(getContext(), glideRequests, mediaRecords, this.listener)); } - private static class ThreadPhotoRailAdapter extends CursorRecyclerViewAdapter { + private static class ThreadPhotoRailAdapter extends RecyclerView.Adapter { @SuppressWarnings("unused") private static final String TAG = Log.tag(ThreadPhotoRailAdapter.class); @@ -69,18 +71,27 @@ public class ThreadPhotoRailView extends FrameLayout { @Nullable private OnItemClickedListener clickedListener; + private final List mediaRecords = new ArrayList<>(); + private ThreadPhotoRailAdapter(@NonNull Context context, @NonNull GlideRequests glideRequests, - @Nullable Cursor cursor, + @NonNull List mediaRecords, @Nullable OnItemClickedListener listener) { - super(context, cursor); this.glideRequests = glideRequests; this.clickedListener = listener; + + this.mediaRecords.clear(); + this.mediaRecords.addAll(mediaRecords); } @Override - public ThreadPhotoViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) { + public int getItemCount() { + return mediaRecords.size(); + } + + @Override + public @NonNull ThreadPhotoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recipient_preference_photo_rail_item, parent, false); @@ -88,18 +99,14 @@ public class ThreadPhotoRailView extends FrameLayout { } @Override - public void onBindItemViewHolder(ThreadPhotoViewHolder viewHolder, @NonNull Cursor cursor) { - ThumbnailView imageView = viewHolder.imageView; - MediaTable.MediaRecord mediaRecord = MediaTable.MediaRecord.from(cursor); - Slide slide = MediaUtil.getSlideForAttachment(getContext(), mediaRecord.getAttachment()); + public void onBindViewHolder(@NonNull ThreadPhotoViewHolder viewHolder, int position) { + MediaTable.MediaRecord mediaRecord = mediaRecords.get(position); + Slide slide = MediaUtil.getSlideForAttachment(mediaRecord.getAttachment()); - if (slide != null) { - imageView.setImageResource(glideRequests, slide, false, false); - } - - imageView.setOnClickListener(v -> { - MediaPreviewCache.INSTANCE.setDrawable(imageView.getImageDrawable()); - if (clickedListener != null) clickedListener.onItemClicked(imageView, mediaRecord); + viewHolder.imageView.setImageResource(glideRequests, slide, false, false); + viewHolder.imageView.setOnClickListener(v -> { + MediaPreviewCache.INSTANCE.setDrawable(viewHolder.imageView.getImageDrawable()); + if (clickedListener != null) clickedListener.onItemClicked(viewHolder.imageView, mediaRecord); }); } diff --git a/app/src/main/java/org/tm/archive/components/ThumbnailView.java b/app/src/main/java/org/tm/archive/components/ThumbnailView.java index 7115456e..088268d9 100644 --- a/app/src/main/java/org/tm/archive/components/ThumbnailView.java +++ b/app/src/main/java/org/tm/archive/components/ThumbnailView.java @@ -1,3 +1,8 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + package org.tm.archive.components; import android.content.Context; @@ -31,6 +36,7 @@ import org.signal.core.util.logging.Log; import org.signal.glide.transforms.SignalDownsampleStrategy; import org.tm.archive.R; import org.tm.archive.blurhash.BlurHash; +import org.tm.archive.components.transfercontrols.TransferControlView; import org.tm.archive.database.AttachmentTable; import org.tm.archive.mms.DecryptableStreamUriLoader.DecryptableUri; import org.tm.archive.mms.GlideRequest; @@ -49,6 +55,7 @@ import org.tm.archive.util.views.Stub; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.concurrent.ExecutionException; @@ -79,11 +86,12 @@ public class ThumbnailView extends FrameLayout { private final CornerMask cornerMask; - private ThumbnailViewTransferControlsState transferControlsState = new ThumbnailViewTransferControlsState(); - private Stub transferControlViewStub; - private SlideClickListener thumbnailClickListener = null; - private SlidesClickedListener downloadClickListener = null; - private Slide slide = null; + private final Stub transferControlViewStub; + private SlideClickListener thumbnailClickListener = null; + private SlidesClickedListener startTransferClickListener = null; + private SlidesClickedListener cancelTransferClickListener = null; + private SlideClickListener playVideoClickListener = null; + private Slide slide = null; public ThumbnailView(Context context) { @@ -276,15 +284,13 @@ public class ThumbnailView extends FrameLayout { @Override public void setFocusable(boolean focusable) { super.setFocusable(focusable); - transferControlsState = transferControlsState.withFocusable(focusable); - transferControlsState.applyState(transferControlViewStub); + transferControlViewStub.get().setFocusable(focusable); } @Override public void setClickable(boolean clickable) { super.setClickable(clickable); - transferControlsState = transferControlsState.withClickable(clickable); - transferControlsState.applyState(transferControlViewStub); + transferControlViewStub.get().setClickable(clickable); } public @Nullable Drawable getImageDrawable() { @@ -357,19 +363,15 @@ public class ThumbnailView extends FrameLayout { } if (showControls) { - int transferState = TransferControlView.getTransferState(Collections.singletonList(slide)); - if (transferState == AttachmentTable.TRANSFER_PROGRESS_DONE || transferState == AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE) { - transferControlViewStub.setVisibility(View.GONE); - } else { - transferControlViewStub.setVisibility(View.VISIBLE); + transferControlViewStub.get().setTransferClickListener(new DownloadClickDispatcher()); + transferControlViewStub.get().setCancelClickListener(new CancelClickDispatcher()); + if (MediaUtil.isInstantVideoSupported(slide)) { + transferControlViewStub.get().setInstantPlaybackClickListener(new InstantVideoClickDispatcher()); } - - transferControlsState = transferControlsState.withSlide(slide) - .withDownloadClickListener(new DownloadClickDispatcher()); - transferControlsState.applyState(transferControlViewStub); - } else { - transferControlViewStub.setVisibility(View.GONE); + transferControlViewStub.get().setSlides(List.of(slide)); } + int transferState = TransferControlView.getTransferState(List.of(slide)); + transferControlViewStub.get().setVisible(showControls && transferState != AttachmentTable.TRANSFER_PROGRESS_DONE && transferState != AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE); if (slide.getUri() != null && slide.hasPlayOverlay() && (slide.getTransferState() == AttachmentTable.TRANSFER_PROGRESS_DONE || isPreview)) @@ -395,7 +397,7 @@ public class ThumbnailView extends FrameLayout { Log.i(TAG, "loading part with id " + slide.asAttachment().getUri() + ", progress " + slide.getTransferState() + ", fast preflight id: " + - slide.asAttachment().getFastPreflightId()); + slide.asAttachment().fastPreflightId); BlurHash previousBlurHash = this.slide != null ? this.slide.getPlaceholderBlur() : null; @@ -514,8 +516,45 @@ public class ThumbnailView extends FrameLayout { this.thumbnailClickListener = listener; } - public void setDownloadClickListener(SlidesClickedListener listener) { - this.downloadClickListener = listener; + public void setStartTransferClickListener(SlidesClickedListener listener) { + this.startTransferClickListener = listener; + } + + public void setCancelTransferClickListener(SlidesClickedListener listener) { + this.cancelTransferClickListener = listener; + } + + public void setPlayVideoClickListener(SlideClickListener listener) { + this.playVideoClickListener = listener; + } + + private static boolean hasSameContents(@Nullable Slide slide, @Nullable Slide other) { + if (Util.equals(slide, other)) { + + if (slide != null && other != null) { + byte[] digestLeft = slide.asAttachment().remoteDigest; + byte[] digestRight = other.asAttachment().remoteDigest; + + return Arrays.equals(digestLeft, digestRight); + } + } + + return false; + } + + private GlideRequest buildThumbnailGlideRequest(@NonNull GlideRequests glideRequests, @NonNull Slide slide) { + GlideRequest request = applySizing(glideRequests.load(new DecryptableUri(Objects.requireNonNull(slide.getUri()))) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE) + .transition(withCrossFade())); + + boolean doNotShowMissingThumbnailImage = Build.VERSION.SDK_INT < 23; + + if (slide.isInProgress() || doNotShowMissingThumbnailImage) { + return request; + } else { + return request.apply(RequestOptions.errorOf(R.drawable.ic_missing_thumbnail_picture)); + } } public void clear(GlideRequests glideRequests) { @@ -532,13 +571,12 @@ public class ThumbnailView extends FrameLayout { slide = null; } - public void showDownloadText(boolean showDownloadText) { - transferControlsState = transferControlsState.withDownloadText(showDownloadText); - transferControlsState.applyState(transferControlViewStub); + public void showSecondaryText(boolean showSecondaryText) { + transferControlViewStub.get().setShowSecondaryText(showSecondaryText); } public void showProgressSpinner() { - transferControlViewStub.get().showProgressSpinner(); + transferControlViewStub.get().setVisible(true); } public void setScaleType(@NonNull ImageView.ScaleType scaleType) { @@ -555,20 +593,6 @@ public class ThumbnailView extends FrameLayout { invalidate(); } - private GlideRequest buildThumbnailGlideRequest(@NonNull GlideRequests glideRequests, @NonNull Slide slide) { - GlideRequest request = applySizing(glideRequests.load(new DecryptableUri(Objects.requireNonNull(slide.getUri()))) - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) - .downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE) - .transition(withCrossFade())); - - boolean doNotShowMissingThumbnailImage = Build.VERSION.SDK_INT < 23; - - if (slide.isInProgress() || doNotShowMissingThumbnailImage) { - return request; - } else { - return request.apply(RequestOptions.errorOf(R.drawable.ic_missing_thumbnail_picture)); - } - } private RequestBuilder buildPlaceholderGlideRequest(@NonNull GlideRequests glideRequests, @NonNull Slide slide) { GlideRequest bitmap = glideRequests.asBitmap(); @@ -580,7 +604,12 @@ public class ThumbnailView extends FrameLayout { bitmap = bitmap.load(slide.getPlaceholderRes(getContext().getTheme())); } - return applySizing(bitmap.diskCacheStrategy(DiskCacheStrategy.NONE)); + final GlideRequest resizedRequest = applySizing(bitmap.diskCacheStrategy(DiskCacheStrategy.NONE)); + if (placeholderBlur != null) { + return resizedRequest.centerCrop(); + } else { + return resizedRequest; + } } private GlideRequest applySizing(@NonNull GlideRequest request) { @@ -610,19 +639,6 @@ public class ThumbnailView extends FrameLayout { return 0; } - private static boolean hasSameContents(@Nullable Slide slide, @Nullable Slide other) { - if (Util.equals(slide, other)) { - - if (slide != null && other != null) { - byte[] digestLeft = slide.asAttachment().getDigest(); - byte[] digestRight = other.asAttachment().getDigest(); - - return Arrays.equals(digestLeft, digestRight); - } - } - - return false; - } public interface ThumbnailRequestListener extends RequestListener { void onLoadCanceled(); @@ -651,10 +667,34 @@ public class ThumbnailView extends FrameLayout { @Override public void onClick(View view) { Log.i(TAG, "onClick() for download button"); - if (downloadClickListener != null && slide != null) { - downloadClickListener.onClick(view, Collections.singletonList(slide)); + if (startTransferClickListener != null && slide != null) { + startTransferClickListener.onClick(view, Collections.singletonList(slide)); } else { - Log.w(TAG, "Received a download button click, but unable to execute it. slide: " + slide + " downloadClickListener: " + downloadClickListener); + Log.w(TAG, "Received a download button click, but unable to execute it. slide: " + slide + " downloadClickListener: " + startTransferClickListener); + } + } + } + + private class CancelClickDispatcher implements View.OnClickListener { + @Override + public void onClick(View view) { + Log.i(TAG, "onClick() for cancel button"); + if (cancelTransferClickListener != null && slide != null) { + cancelTransferClickListener.onClick(view, Collections.singletonList(slide)); + } else { + Log.w(TAG, "Received a cancel button click, but unable to execute it. slide: " + slide + " cancelDownloadClickListener: " + cancelTransferClickListener); + } + } + } + + private class InstantVideoClickDispatcher implements View.OnClickListener { + @Override + public void onClick(View view) { + Log.i(TAG, "onClick() for instant video playback"); + if (playVideoClickListener != null && slide != null) { + playVideoClickListener.onClick(view, slide); + } else { + Log.w(TAG, "Received an instant video click, but unable to execute it. slide: " + slide + " playVideoClickListener: " + playVideoClickListener); } } } diff --git a/app/src/main/java/org/tm/archive/components/ThumbnailViewTransferControlsState.kt b/app/src/main/java/org/tm/archive/components/ThumbnailViewTransferControlsState.kt deleted file mode 100644 index 60577ea9..00000000 --- a/app/src/main/java/org/tm/archive/components/ThumbnailViewTransferControlsState.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.tm.archive.components - -import android.view.View.OnClickListener -import org.tm.archive.mms.Slide -import org.tm.archive.util.views.Stub - -/** - * State object for transfer controls. - */ -data class ThumbnailViewTransferControlsState( - val isFocusable: Boolean = true, - val isClickable: Boolean = true, - val slide: Slide? = null, - val downloadClickedListener: OnClickListener? = null, - val showDownloadText: Boolean = true -) { - - fun withFocusable(isFocusable: Boolean): ThumbnailViewTransferControlsState = copy(isFocusable = isFocusable) - fun withClickable(isClickable: Boolean): ThumbnailViewTransferControlsState = copy(isClickable = isClickable) - fun withSlide(slide: Slide?): ThumbnailViewTransferControlsState = copy(slide = slide) - fun withDownloadClickListener(downloadClickedListener: OnClickListener): ThumbnailViewTransferControlsState = copy(downloadClickedListener = downloadClickedListener) - fun withDownloadText(showDownloadText: Boolean): ThumbnailViewTransferControlsState = copy(showDownloadText = showDownloadText) - - fun applyState(transferControlView: Stub) { - if (transferControlView.resolved()) { - transferControlView.get().isFocusable = isFocusable - transferControlView.get().isClickable = isClickable - if (slide != null) { - transferControlView.get().setSlide(slide) - } - transferControlView.get().setDownloadClickListener(downloadClickedListener) - transferControlView.get().setShowDownloadText(showDownloadText) - } - } -} diff --git a/app/src/main/java/org/tm/archive/components/TooltipPopup.java b/app/src/main/java/org/tm/archive/components/TooltipPopup.java index 6a341c3c..ed6e1907 100644 --- a/app/src/main/java/org/tm/archive/components/TooltipPopup.java +++ b/app/src/main/java/org/tm/archive/components/TooltipPopup.java @@ -2,7 +2,6 @@ package org.tm.archive.components; import android.content.Context; import android.graphics.PorterDuff; -import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -172,21 +171,23 @@ public class TooltipPopup extends PopupWindow { ShapeAppearanceModel.Builder shapeAppearanceModel = ShapeAppearanceModel.builder() .setAllCornerSizes(DimensionUnit.DP.toPixels(18)); - // If the arrow is within the last 20dp of the right hand side, use RIGHT and set corner to 9dp - onLayout(() -> { - if (arrow.getX() > getContentView().getWidth() / 2f) { - arrow.setImageResource(R.drawable.ic_tooltip_arrow_up_right); - } + if (position == POSITION_BELOW) { + // If the arrow is within the last 20dp of the right hand side, use RIGHT and set corner to 9dp + onLayout(() -> { + if (arrow.getX() > getContentView().getWidth() / 2f) { + arrow.setImageResource(R.drawable.ic_tooltip_arrow_up_right); + } - float arrowEnd = arrow.getX() + arrow.getRight(); - if (arrowEnd > getContentView().getRight() - DimensionUnit.DP.toPixels(20)) { - shapeableBubbleBackground.setShapeAppearanceModel(shapeAppearanceModel.setTopRightCornerSize(DimensionUnit.DP.toPixels(9f)).build()); - bubble.setBackground(shapeableBubbleBackground); - } else if (arrowEnd < DimensionUnit.DP.toPixels(20)) { - shapeableBubbleBackground.setShapeAppearanceModel(shapeAppearanceModel.setTopLeftCornerSize(DimensionUnit.DP.toPixels(9f)).build()); - bubble.setBackground(shapeableBubbleBackground); - } - }); + float arrowEnd = arrow.getX() + arrow.getRight(); + if (arrowEnd > getContentView().getRight() - DimensionUnit.DP.toPixels(20)) { + shapeableBubbleBackground.setShapeAppearanceModel(shapeAppearanceModel.setTopRightCornerSize(DimensionUnit.DP.toPixels(9f)).build()); + bubble.setBackground(shapeableBubbleBackground); + } else if (arrowEnd < DimensionUnit.DP.toPixels(20)) { + shapeableBubbleBackground.setShapeAppearanceModel(shapeAppearanceModel.setTopLeftCornerSize(DimensionUnit.DP.toPixels(9f)).build()); + bubble.setBackground(shapeableBubbleBackground); + } + }); + } try { showAsDropDown(anchor, xoffset, yoffset); diff --git a/app/src/main/java/org/tm/archive/components/TransferControlView.java b/app/src/main/java/org/tm/archive/components/TransferControlView.java deleted file mode 100644 index 35b4c199..00000000 --- a/app/src/main/java/org/tm/archive/components/TransferControlView.java +++ /dev/null @@ -1,262 +0,0 @@ -package org.tm.archive.components; - -import android.animation.LayoutTransition; -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; - -import com.annimon.stream.Stream; -import com.pnikosis.materialishprogress.ProgressWheel; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; -import org.tm.archive.R; -import org.tm.archive.attachments.Attachment; -import org.tm.archive.database.AttachmentTable; -import org.tm.archive.events.PartProgressEvent; -import org.tm.archive.mms.Slide; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public final class TransferControlView extends FrameLayout { - - private static final int UPLOAD_TASK_WEIGHT = 1; - - /** - * A weighting compared to {@link #UPLOAD_TASK_WEIGHT} - */ - private static final int COMPRESSION_TASK_WEIGHT = 3; - - @Nullable private List slides; - @Nullable private View current; - - private final ProgressWheel progressWheel; - private final View downloadDetails; - private final TextView downloadDetailsText; - - private final Map networkProgress; - private final Map compresssionProgress; - - public TransferControlView(Context context) { - this(context, null); - } - - public TransferControlView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public TransferControlView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - inflate(context, R.layout.transfer_controls_view, this); - - setLongClickable(false); - setBackground(ContextCompat.getDrawable(context, R.drawable.transfer_controls_background)); - setVisibility(GONE); - setLayoutTransition(new LayoutTransition()); - - this.networkProgress = new HashMap<>(); - this.compresssionProgress = new HashMap<>(); - - this.progressWheel = findViewById(R.id.progress_wheel); - this.downloadDetails = findViewById(R.id.download_details); - this.downloadDetailsText = findViewById(R.id.download_details_text); - } - - @Override - public void setFocusable(boolean focusable) { - super.setFocusable(focusable); - downloadDetails.setFocusable(focusable); - } - - @Override - public void setClickable(boolean clickable) { - super.setClickable(clickable); - downloadDetails.setClickable(clickable); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - EventBus.getDefault().unregister(this); - } - - public void setSlide(final @NonNull Slide slides) { - setSlides(Collections.singletonList(slides)); - } - - public void setSlides(final @NonNull List slides) { - if (slides.isEmpty()) { - throw new IllegalArgumentException("Must provide at least one slide."); - } - - this.slides = slides; - - if (!isUpdateToExistingSet(slides)) { - networkProgress.clear(); - compresssionProgress.clear(); - Stream.of(slides).forEach(s -> networkProgress.put(s.asAttachment(), 0f)); - } - - for (Slide slide : slides) { - if (slide.asAttachment().getTransferState() == AttachmentTable.TRANSFER_PROGRESS_DONE) { - networkProgress.put(slide.asAttachment(), 1f); - } - } - - switch (getTransferState(slides)) { - case AttachmentTable.TRANSFER_PROGRESS_STARTED: - showProgressSpinner(calculateProgress(networkProgress, compresssionProgress)); - break; - case AttachmentTable.TRANSFER_PROGRESS_PENDING: - case AttachmentTable.TRANSFER_PROGRESS_FAILED: - downloadDetailsText.setText(getDownloadText(this.slides)); - display(downloadDetails); - break; - default: - display(null); - break; - } - } - - public void showProgressSpinner() { - showProgressSpinner(calculateProgress(networkProgress, compresssionProgress)); - } - - public void showProgressSpinner(float progress) { - if (progress == 0) { - progressWheel.spin(); - } else { - progressWheel.setInstantProgress(progress); - } - - display(progressWheel); - } - - public void setDownloadClickListener(final @Nullable OnClickListener listener) { - downloadDetails.setOnClickListener(listener); - } - - public void clear() { - clearAnimation(); - setVisibility(GONE); - if (current != null) { - current.clearAnimation(); - current.setVisibility(GONE); - } - current = null; - slides = null; - } - - public void setShowDownloadText(boolean showDownloadText) { - downloadDetailsText.setVisibility(showDownloadText ? VISIBLE : GONE); - forceLayout(); - } - - private boolean isUpdateToExistingSet(@NonNull List slides) { - if (slides.size() != networkProgress.size()) { - return false; - } - - for (Slide slide : slides) { - if (!networkProgress.containsKey(slide.asAttachment())) { - return false; - } - } - - return true; - } - - static int getTransferState(@NonNull List slides) { - int transferState = AttachmentTable.TRANSFER_PROGRESS_DONE; - boolean allFailed = true; - - for (Slide slide : slides) { - if (slide.getTransferState() != AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE) { - allFailed = false; - if (slide.getTransferState() == AttachmentTable.TRANSFER_PROGRESS_PENDING && transferState == AttachmentTable.TRANSFER_PROGRESS_DONE) { - transferState = slide.getTransferState(); - } else { - transferState = Math.max(transferState, slide.getTransferState()); - } - } - } - return allFailed ? AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE : transferState; - } - - private String getDownloadText(@NonNull List slides) { - if (slides.size() == 1) { - return slides.get(0).getContentDescription(getContext()); - } else { - int downloadCount = Stream.of(slides).reduce(0, (count, slide) -> slide.getTransferState() != AttachmentTable.TRANSFER_PROGRESS_DONE ? count + 1 : count); - return getContext().getResources().getQuantityString(R.plurals.TransferControlView_n_items, downloadCount, downloadCount); - } - } - - private void display(@Nullable final View view) { - if (current == view) { - return; - } - - if (current != null) { - current.setVisibility(GONE); - } - - if (view != null) { - view.setVisibility(VISIBLE); - setVisibility(VISIBLE); - } else { - setVisibility(GONE); - } - - current = view; - } - - private static float calculateProgress(@NonNull Map uploadDownloadProgress, Map compresssionProgress) { - float totalDownloadProgress = 0; - float totalCompressionProgress = 0; - - for (float progress : uploadDownloadProgress.values()) { - totalDownloadProgress += progress; - } - - for (float progress : compresssionProgress.values()) { - totalCompressionProgress += progress; - } - - float weightedProgress = UPLOAD_TASK_WEIGHT * totalDownloadProgress + COMPRESSION_TASK_WEIGHT * totalCompressionProgress; - float weightedTotal = UPLOAD_TASK_WEIGHT * uploadDownloadProgress.size() + COMPRESSION_TASK_WEIGHT * compresssionProgress.size(); - - return weightedProgress / weightedTotal; - } - - @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onEventAsync(final PartProgressEvent event) { - if (networkProgress.containsKey(event.attachment)) { - float proportionCompleted = ((float) event.progress) / event.total; - - if (event.type == PartProgressEvent.Type.COMPRESSION) { - compresssionProgress.put(event.attachment, proportionCompleted); - } else { - networkProgress.put(event.attachment, proportionCompleted); - } - - progressWheel.setInstantProgress(calculateProgress(networkProgress, compresssionProgress)); - } - } -} diff --git a/app/src/main/java/org/tm/archive/components/ZoomingImageView.java b/app/src/main/java/org/tm/archive/components/ZoomingImageView.java index bb4485dd..74db08ea 100644 --- a/app/src/main/java/org/tm/archive/components/ZoomingImageView.java +++ b/app/src/main/java/org/tm/archive/components/ZoomingImageView.java @@ -2,7 +2,6 @@ package org.tm.archive.components; import android.annotation.SuppressLint; import android.content.Context; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.AttributeSet; import android.view.MotionEvent; @@ -10,13 +9,9 @@ import android.view.View; import android.widget.FrameLayout; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.exifinterface.media.ExifInterface; -import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.davemorrissey.labs.subscaleview.ImageSource; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; diff --git a/app/src/main/java/org/tm/archive/components/emoji/EmojiTextView.java b/app/src/main/java/org/tm/archive/components/emoji/EmojiTextView.java index 5b9900f9..de4edf07 100644 --- a/app/src/main/java/org/tm/archive/components/emoji/EmojiTextView.java +++ b/app/src/main/java/org/tm/archive/components/emoji/EmojiTextView.java @@ -32,7 +32,6 @@ import androidx.core.view.GestureDetectorCompat; import androidx.core.view.ViewKt; import androidx.core.widget.TextViewCompat; -import org.signal.core.util.StringUtil; import org.tm.archive.R; import org.tm.archive.components.emoji.parsing.EmojiParser; import org.tm.archive.components.mention.MentionAnnotation; @@ -312,13 +311,6 @@ public class EmojiTextView extends AppCompatTextView { setText(previousText, BufferType.SPANNABLE); } - public void setForceCustomEmoji(boolean forceCustom) { - if (this.forceCustom != forceCustom) { - this.forceCustom = forceCustom; - setText(previousText, BufferType.SPANNABLE); - } - } - @SuppressLint("ClickableViewAccessibility") public void bindGestureListener() { GestureDetectorCompat gestureDetectorCompat = new GestureDetectorCompat(getContext(), new OnGestureListener()); @@ -362,10 +354,10 @@ public class EmojiTextView extends AppCompatTextView { return; } - int overflowEnd = getLayout().getLineEnd(maxLines - 1); - CharSequence overflow = getText().subSequence(overflowStart, overflowEnd); + int overflowEnd = getLayout().getLineEnd(maxLines); + CharSequence overflow = new SpannableString(getText().subSequence(overflowStart, overflowEnd).toString()); float adjust = overflowText != null ? getPaint().measureText(overflowText, 0, overflowText.length()) : 0f; - CharSequence ellipsized = StringUtil.trim(TextUtils.ellipsize(overflow, getPaint(), getWidth() - adjust, TextUtils.TruncateAt.END)); + CharSequence ellipsized = TextUtils.ellipsize(overflow, getPaint(), getWidth() - adjust, TextUtils.TruncateAt.END); SpannableStringBuilder newContent = new SpannableStringBuilder(); newContent.append(getText().subSequence(0, overflowStart).toString()) diff --git a/app/src/main/java/org/tm/archive/components/recyclerview/NoTouchingRecyclerView.kt b/app/src/main/java/org/tm/archive/components/recyclerview/NoTouchingRecyclerView.kt new file mode 100644 index 00000000..4f87465a --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/recyclerview/NoTouchingRecyclerView.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.recyclerview + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import androidx.recyclerview.widget.RecyclerView + +/** + * Ignores all touch events, purely for rendering views in a recyclable manner. + */ +class NoTouchingRecyclerView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RecyclerView(context, attrs, defStyleAttr) { + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(e: MotionEvent?): Boolean { + return false + } + + override fun onInterceptTouchEvent(e: MotionEvent?): Boolean { + return false + } +} diff --git a/app/src/main/java/org/tm/archive/components/reminder/OutdatedBuildReminder.java b/app/src/main/java/org/tm/archive/components/reminder/OutdatedBuildReminder.java index 58d9a307..49d063f8 100644 --- a/app/src/main/java/org/tm/archive/components/reminder/OutdatedBuildReminder.java +++ b/app/src/main/java/org/tm/archive/components/reminder/OutdatedBuildReminder.java @@ -37,11 +37,9 @@ public class OutdatedBuildReminder extends Reminder { return false; } - //**TM_SA**// start public static boolean isEligible() { - return false;//getDaysUntilExpiry() <= 10; + return getDaysUntilExpiry() <= 10; } - //**TM_SA**// End private static int getDaysUntilExpiry() { return (int) TimeUnit.MILLISECONDS.toDays(Util.getTimeUntilBuildExpiry()); diff --git a/app/src/main/java/org/tm/archive/components/reminder/UsernameOutOfSyncReminder.kt b/app/src/main/java/org/tm/archive/components/reminder/UsernameOutOfSyncReminder.kt index 1063b4c7..8c31e969 100644 --- a/app/src/main/java/org/tm/archive/components/reminder/UsernameOutOfSyncReminder.kt +++ b/app/src/main/java/org/tm/archive/components/reminder/UsernameOutOfSyncReminder.kt @@ -1,6 +1,8 @@ package org.tm.archive.components.reminder +import android.content.Context import org.tm.archive.R +import org.tm.archive.keyvalue.AccountValues.UsernameSyncState import org.tm.archive.keyvalue.SignalStore import org.tm.archive.util.FeatureFlags @@ -8,17 +10,31 @@ import org.tm.archive.util.FeatureFlags * Displays a reminder message when the local username gets out of sync with * what the server thinks our username is. */ -class UsernameOutOfSyncReminder : Reminder(R.string.UsernameOutOfSyncReminder__something_went_wrong) { +class UsernameOutOfSyncReminder : Reminder(NO_RESOURCE) { init { + val action = if (SignalStore.account().usernameSyncState == UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) { + R.id.reminder_action_fix_username_and_link + } else { + R.id.reminder_action_fix_username_link + } + addAction( Action( R.string.UsernameOutOfSyncReminder__fix_now, - R.id.reminder_action_fix_username + action ) ) } + override fun getText(context: Context): CharSequence { + return if (SignalStore.account().usernameSyncState == UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) { + context.getString(R.string.UsernameOutOfSyncReminder__username_and_link_corrupt) + } else { + context.getString(R.string.UsernameOutOfSyncReminder__link_corrupt) + } + } + override fun isDismissable(): Boolean { return false } @@ -26,7 +42,15 @@ class UsernameOutOfSyncReminder : Reminder(R.string.UsernameOutOfSyncReminder__s companion object { @JvmStatic fun isEligible(): Boolean { - return FeatureFlags.usernames() && SignalStore.phoneNumberPrivacy().isUsernameOutOfSync + return if (FeatureFlags.usernames()) { + when (SignalStore.account().usernameSyncState) { + UsernameSyncState.USERNAME_AND_LINK_CORRUPTED -> true + UsernameSyncState.LINK_CORRUPTED -> true + UsernameSyncState.IN_SYNC -> false + } + } else { + false + } } } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsActivity.kt b/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsActivity.kt index 7240cad4..881b2389 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsActivity.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsActivity.kt @@ -65,6 +65,7 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent { ) StartLocation.PRIVACY -> AppSettingsFragmentDirections.actionDirectToPrivacy() StartLocation.LINKED_DEVICES -> AppSettingsFragmentDirections.actionDirectToDevices() + StartLocation.USERNAME_LINK -> AppSettingsFragmentDirections.actionDirectToUsernameLinkSettings() } } @@ -188,6 +189,9 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent { @JvmStatic fun linkedDevices(context: Context): Intent = getIntentForStartLocation(context, StartLocation.LINKED_DEVICES) + @JvmStatic + fun usernameLinkSettings(context: Context): Intent = getIntentForStartLocation(context, StartLocation.USERNAME_LINK) + private fun getIntentForStartLocation(context: Context, startLocation: StartLocation): Intent { return Intent(context, AppSettingsActivity::class.java) .putExtra(ARG_NAV_GRAPH, R.navigation.app_settings) @@ -209,7 +213,8 @@ class AppSettingsActivity : DSLSettingsActivity(), DonationPaymentComponent { CREATE_NOTIFICATION_PROFILE(10), NOTIFICATION_PROFILE_DETAILS(11), PRIVACY(12), - LINKED_DEVICES(13); + LINKED_DEVICES(13), + USERNAME_LINK(14); companion object { fun fromCode(code: Int?): StartLocation { diff --git a/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsFragment.kt index e4f3f5bc..ee713ac2 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/AppSettingsFragment.kt @@ -1,7 +1,5 @@ package org.tm.archive.components.settings.app -import android.app.AlertDialog -import android.app.Dialog import android.os.Bundle import android.view.View import android.widget.TextView @@ -9,14 +7,9 @@ import android.widget.Toast import androidx.annotation.IdRes import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController -import com.tm.androidcopysdk.AndroidCopySDK -import com.tm.androidcopysdk.ISendLogCallback -import com.tm.androidcopysdk.utils.PrefManager -import org.archiver.ArchivePreferenceConstants import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode -import org.selfAuthentication.ProgressDialog import org.tm.archive.R import org.tm.archive.badges.BadgeImageView import org.tm.archive.components.AvatarImageView @@ -31,12 +24,15 @@ import org.tm.archive.components.settings.DSLSettingsIcon import org.tm.archive.components.settings.DSLSettingsText import org.tm.archive.components.settings.PreferenceModel import org.tm.archive.components.settings.PreferenceViewHolder +import org.tm.archive.components.settings.app.subscription.completed.TerminalDonationDelegate import org.tm.archive.components.settings.configure import org.tm.archive.events.ReminderUpdateEvent +import org.tm.archive.keyvalue.AccountValues import org.tm.archive.keyvalue.SignalStore import org.tm.archive.phonenumbers.PhoneNumberFormatter import org.tm.archive.recipients.Recipient import org.tm.archive.registration.RegistrationNavigationActivity +import org.tm.archive.util.Environment import org.tm.archive.util.FeatureFlags import org.tm.archive.util.PlayStoreUtil import org.tm.archive.util.Util @@ -50,16 +46,15 @@ import org.tm.archive.util.views.Stub class AppSettingsFragment : DSLSettingsFragment( titleId = R.string.text_secure_normal__menu_settings, layoutId = R.layout.dsl_settings_fragment_with_reminder -) , - ISendLogCallback { //**TM_SA**// add ISendLogCallback{ +) { private val viewModel: AppSettingsViewModel by viewModels() private lateinit var reminderView: Stub - lateinit var mProgressDialog : Dialog //**TM_SA**// - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + viewLifecycleOwner.lifecycle.addObserver(TerminalDonationDelegate(childFragmentManager, viewLifecycleOwner)) + super.onViewCreated(view, savedInstanceState) reminderView = ViewUtil.findStubById(view, R.id.reminder_stub) @@ -141,7 +136,7 @@ class AppSettingsFragment : DSLSettingsFragment( findNavController().safeNavigate(R.id.action_appSettingsFragment_to_manageProfileActivity) }, onQrButtonClicked = { - if (Recipient.self().username.isPresent && Recipient.self().username.get().isNotEmpty()) { + if (SignalStore.account().username != null) { findNavController().safeNavigate(R.id.action_appSettingsFragment_to_usernameLinkSettingsFragment) } else { findNavController().safeNavigate(R.id.action_appSettingsFragment_to_usernameEducationFragment) @@ -167,9 +162,8 @@ class AppSettingsFragment : DSLSettingsFragment( isEnabled = state.isDeprecatedOrUnregistered() ) - //**TM_SA**// Start - Comment all the Signal mention and put our about and sending logs logic. - if (false/*state.allowUserToGoToDonationManagementScreen*/) { - /*clickPref( + if (state.allowUserToGoToDonationManagementScreen) { + clickPref( title = DSLSettingsText.from(R.string.preferences__donate_to_signal), icon = DSLSettingsIcon.from(R.drawable.symbol_heart_24), iconEnd = if (state.hasExpiredGiftBadge) DSLSettingsIcon.from(R.drawable.symbol_info_fill_24, R.color.signal_accent_primary) else null, @@ -177,31 +171,14 @@ class AppSettingsFragment : DSLSettingsFragment( findNavController().safeNavigate(AppSettingsFragmentDirections.actionAppSettingsFragmentToManageDonationsFragment()) }, onLongClick = this@AppSettingsFragment::copySubscriberIdToClipboard - )*/ + ) } else { - /*externalLinkPref( + externalLinkPref( title = DSLSettingsText.from(R.string.preferences__donate_to_signal), icon = DSLSettingsIcon.from(R.drawable.symbol_heart_24), linkId = R.string.donate_url ) - }*/ - - clickPref( - title = DSLSettingsText.from(R.string.preferences__send_logs_to_telemessage), - icon = DSLSettingsIcon.from(R.drawable.ic_settings_logs_icon), - onClick = { - doSendLogsClicked() - }) - - clickPref( - title = DSLSettingsText.from(R.string.EditAboutFragment_about), - icon = DSLSettingsIcon.from(R.drawable.ic_about_icon), - onClick = { - findNavController().safeNavigate(R.id.action_appSettingsFragment_to_tmAboutSettings) - } - ) - - //**TM_SA**// End + } dividerPref() @@ -257,10 +234,19 @@ class AppSettingsFragment : DSLSettingsFragment( } ) + if (Environment.IS_NIGHTLY) { + clickPref( + title = DSLSettingsText.from("App updates"), + icon = DSLSettingsIcon.from(R.drawable.symbol_calendar_24), + onClick = { + findNavController().safeNavigate(R.id.action_appSettingsFragment_to_appUpdatesSettingsFragment) + } + ) + } + dividerPref() - //**TM_SA**// Mark this part - /*if (SignalStore.paymentsValues().paymentsAvailability.showPaymentsMenu()) { + if (SignalStore.paymentsValues().paymentsAvailability.showPaymentsMenu()) { customPref( PaymentsPreference( unreadCount = state.unreadPaymentsCount @@ -270,16 +256,15 @@ class AppSettingsFragment : DSLSettingsFragment( ) dividerPref() - }*/ + } - /*clickPref( + clickPref( title = DSLSettingsText.from(R.string.preferences__help), icon = DSLSettingsIcon.from(R.drawable.symbol_help_24), onClick = { findNavController().safeNavigate(R.id.action_appSettingsFragment_to_helpSettingsFragment) } - )*/ - //**TM_SA**// + ) clickPref( title = DSLSettingsText.from(R.string.AppSettingsFragment__invite_your_friends), @@ -299,60 +284,9 @@ class AppSettingsFragment : DSLSettingsFragment( } ) } - } - } - } - //**TM_SA**// start - - - override fun sendLogSucceed() { - mProgressDialog.hide() - com.tm.logger.Log.d("sendLog", "sendLogSucceed") - } - - override fun sendLogFailure() { - mProgressDialog.hide() - com.tm.logger.Log.d("sendLog", "sendLogFailure") - } - - - private fun doSendLogsClicked() { - - val builder = AlertDialog.Builder(context) - - mProgressDialog = ProgressDialog.progressDialog(requireContext()) - - builder.setTitle(R.string.issue_report_list_title) - builder.setMessage(getString(R.string.issue_report_list_summery) + "?") - - builder.setPositiveButton(R.string.ShareActivity__send) { dialog, which -> - - mProgressDialog.show() - - AndroidCopySDK.getInstance(context).sentLogs( - activity, - this, - PrefManager.getStringPref(context, ArchivePreferenceConstants.PREF_KEY_DEVICE_PHONE_NUMBER, ""), - "Signal Archiver logs", - PrefManager.getStringPref(context, ArchivePreferenceConstants.PREF_KEY_DEVICE_NAME, ""), - "", - "", - "", - "", - ArchivePreferenceConstants.GENERATE_TOK_NAME, - ArchivePreferenceConstants.GENERATE_TOK_PASS - ) - } - builder.setNegativeButton(R.string.CommunicationActions_cancel, null) - builder.show() - - } - - //**TM_SA**// End - private fun copySubscriberIdToClipboard(): Boolean { val subscriber = SignalStore.donationsValues().getSubscriber() return if (subscriber == null) { @@ -425,7 +359,7 @@ class AppSettingsFragment : DSLSettingsFragment( summaryView.visibility = View.VISIBLE avatarView.visibility = View.VISIBLE - if (FeatureFlags.usernames()) { + if (FeatureFlags.usernames() && SignalStore.account().usernameSyncState == AccountValues.UsernameSyncState.IN_SYNC) { qrButton.visibility = View.VISIBLE qrButton.isClickable = true qrButton.setOnClickListener { model.onQrButtonClicked() } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/about/AboutPreferenceFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/about/AboutPreferenceFragment.kt deleted file mode 100644 index 6737c4c3..00000000 --- a/app/src/main/java/org/tm/archive/components/settings/app/about/AboutPreferenceFragment.kt +++ /dev/null @@ -1,97 +0,0 @@ -package org.tm.archive.components.settings.app.about - -import android.content.Context -import android.os.Bundle -import android.os.Handler -import android.text.Html -import android.text.method.LinkMovementMethod -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.TextView -import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar -import androidx.fragment.app.Fragment -import org.tm.archive.BuildConfig -import org.tm.archive.R - - -//**TM_SA**//Add this class -class AboutPreferenceFragment : Fragment() { - private var fullAppName: TextView? = null - private var version: TextView? = null - private val doNotSell: TextView? = null - private val policy: TextView? = null - private var center: TextView? = null - private var terms: TextView? = null - private var supportCenter: TextView? = null - private val contactUs: LinearLayout? = null - private val issueR: LinearLayout? = null - protected var mHandler = Handler() - private val LOG_NAME = "log.zip" - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val view = inflater.inflate(R.layout.settings_about_custom_layout, container, false) - //name = (TextView)view.view.findViewById(R.id.Name); - //location = (TextView)view.view.findViewById(R.id.Location); - - initializeAppBar(view) - initResources(view) - return view - } - - private fun initializeAppBar(view: View) { - val primaryToolbar: Toolbar = view.findViewById(R.id.toolbar) - (activity as AppCompatActivity?)!!.setSupportActionBar(primaryToolbar) - assert((activity as AppCompatActivity?)!!.supportActionBar != null) - (activity as AppCompatActivity?)!!.supportActionBar!!.setDisplayHomeAsUpEnabled(true) - (activity as AppCompatActivity?)!!.supportActionBar!!.setTitle(R.string.EditAboutFragment_about) - - primaryToolbar.setNavigationOnClickListener { - requireActivity().onBackPressed() - } - - } - - private fun initResources(view: View) { - fullAppName = view.findViewById(R.id.full_app_name) - version = view.findViewById(R.id.version) - terms = view.findViewById(R.id.terms) - center = view.findViewById(R.id.privacy_center) - supportCenter = view.findViewById(R.id.TVSupportCenter) - version!!.setText( - "version" + " " + getVersionString( - activity - ) - ) - setString(fullAppName, R.string.settings_about_title, null) - setString(terms, R.string.terms_about, null) - setString(center, R.string.privacy_center_about, null) - setString(supportCenter, R.string.support_about, null) - } - - private fun setString(TextView: TextView?, strId: Int, str: String?) { - val text = if (strId > 0) getString(strId) else str!! - TextView!!.text = Html.fromHtml(text) - TextView.movementMethod = LinkMovementMethod.getInstance() - // stripUnderlines(view); - } - - companion object { - private val TAG = AboutPreferenceFragment::class.java.simpleName - fun getVersionString(context: Context?): String { - val versionName: String - - // versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; - versionName = BuildConfig.VERSION_NAME - return versionName - } - } - - -} \ No newline at end of file diff --git a/app/src/main/java/org/tm/archive/components/settings/app/changenumber/ChangeNumberRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/changenumber/ChangeNumberRepository.kt index 0920863b..efb07475 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/changenumber/ChangeNumberRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/changenumber/ChangeNumberRepository.kt @@ -4,6 +4,7 @@ import androidx.annotation.WorkerThread import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers +import okio.ByteString.Companion.toByteString import org.signal.core.util.logging.Log import org.signal.libsignal.protocol.IdentityKeyPair import org.signal.libsignal.protocol.SignalProtocolAddress @@ -17,7 +18,6 @@ import org.tm.archive.crypto.PreKeyUtil import org.tm.archive.database.IdentityTable import org.tm.archive.database.SignalDatabase import org.tm.archive.database.model.databaseprotos.PendingChangeNumberMetadata -import org.tm.archive.database.model.toProtoByteString import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.jobs.RefreshAttributesJob import org.tm.archive.keyvalue.CertificateType @@ -42,7 +42,7 @@ import org.whispersystems.signalservice.internal.ServiceResponse import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity import org.whispersystems.signalservice.internal.push.OutgoingPushMessage import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataResponse -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.SyncMessage +import org.whispersystems.signalservice.internal.push.SyncMessage import org.whispersystems.signalservice.internal.push.VerifyAccountResponse import org.whispersystems.signalservice.internal.push.WhoAmIResponse import org.whispersystems.signalservice.internal.push.exceptions.MismatchedDevicesException @@ -264,7 +264,6 @@ class ChangeNumberRepository( accountManager.setPreKeys( PreKeyUpload( serviceIdType = ServiceIdType.PNI, - identityKey = pniProtocolStore.identityKeyPair.publicKey, signedPreKey = signedPreKey, oneTimeEcPreKeys = oneTimePreKeys, lastResortKyberPreKey = null, @@ -307,8 +306,8 @@ class ChangeNumberRepository( return Single.fromCallable { for (certificateType in certificateTypes) { val certificate: ByteArray? = when (certificateType) { - CertificateType.UUID_AND_E164 -> accountManager.getSenderCertificate() - CertificateType.UUID_ONLY -> accountManager.getSenderCertificateForPhoneNumberPrivacy() + CertificateType.ACI_AND_E164 -> accountManager.getSenderCertificate() + CertificateType.ACI_ONLY -> accountManager.getSenderCertificateForPhoneNumberPrivacy() else -> throw AssertionError() } @@ -367,13 +366,13 @@ class ChangeNumberRepository( // Device Messages if (deviceId != primaryDeviceId) { - val pniChangeNumber = SyncMessage.PniChangeNumber.newBuilder() - .setIdentityKeyPair(pniIdentity.serialize().toProtoByteString()) - .setSignedPreKey(signedPreKeyRecord.serialize().toProtoByteString()) - .setLastResortKyberPreKey(lastResortKyberPreKeyRecord.serialize().toProtoByteString()) - .setRegistrationId(pniRegistrationId) - .setNewE164(newE164) - .build() + val pniChangeNumber = SyncMessage.PniChangeNumber( + identityKeyPair = pniIdentity.serialize().toByteString(), + signedPreKey = signedPreKeyRecord.serialize().toByteString(), + lastResortKyberPreKey = lastResortKyberPreKeyRecord.serialize().toByteString(), + registrationId = pniRegistrationId, + newE164 = newE164 + ) deviceMessages += messageSender.getEncryptedSyncPniInitializeDeviceMessage(deviceId, pniChangeNumber) } @@ -391,12 +390,12 @@ class ChangeNumberRepository( pniRegistrationIds.mapKeys { it.key.toString() } ) - val metadata = PendingChangeNumberMetadata.newBuilder() - .setPreviousPni(SignalStore.account().pni!!.toByteString()) - .setPniIdentityKeyPair(pniIdentity.serialize().toProtoByteString()) - .setPniRegistrationId(pniRegistrationIds[primaryDeviceId]!!) - .setPniSignedPreKeyId(devicePniSignedPreKeys[primaryDeviceId]!!.keyId) - .build() + val metadata = PendingChangeNumberMetadata( + previousPni = SignalStore.account().pni!!.toByteString(), + pniIdentityKeyPair = pniIdentity.serialize().toByteString(), + pniRegistrationId = pniRegistrationIds[primaryDeviceId]!!, + pniSignedPreKeyId = devicePniSignedPreKeys[primaryDeviceId]!!.keyId + ) return ChangeNumberRequestData(request, metadata) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/help/HelpSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/help/HelpSettingsFragment.kt index 02147633..297e3584 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/help/HelpSettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/help/HelpSettingsFragment.kt @@ -37,14 +37,12 @@ class HelpSettingsFragment : DSLSettingsFragment(R.string.preferences__help) { summary = DSLSettingsText.from(BuildConfig.VERSION_NAME) ) - //**TM_SA**// - /*clickPref( + clickPref( title = DSLSettingsText.from(R.string.HelpSettingsFragment__debug_log), onClick = { Navigation.findNavController(requireView()).safeNavigate(R.id.action_helpSettingsFragment_to_submitDebugLogActivity) } - )*/ - //**TM_SA**// + ) clickPref( title = DSLSettingsText.from(R.string.HelpSettingsFragment__licenses), diff --git a/app/src/main/java/org/tm/archive/components/settings/app/help/LicenseFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/help/LicenseFragment.kt index 296bd0b4..331be0f8 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/help/LicenseFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/help/LicenseFragment.kt @@ -5,11 +5,10 @@ package org.tm.archive.components.settings.app.help -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.State @@ -33,40 +32,45 @@ class LicenseFragment : ComposeFragment() { @Composable override fun FragmentContent() { - val textState: State = Single.fromCallable { - requireContext().resources.openRawResource(R.raw.third_party_licenses).bufferedReader().use { it.readText() } - } + val textState: State> = Single + .fromCallable { + requireContext().resources.openRawResource(R.raw.third_party_licenses).bufferedReader().use { + it.readText().split("\n") + } + } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribeAsState(initial = "") + .subscribeAsState(initial = emptyList()) + Scaffolds.Settings( title = stringResource(id = R.string.HelpSettingsFragment__licenses), onNavigationClick = findNavController()::popBackStack, navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close) ) { - LicenseScreen(licenseText = textState.value, modifier = Modifier.padding(it)) + LicenseScreen(licenseTextLines = textState.value, modifier = Modifier.padding(it)) } } } @Composable -fun LicenseScreen(licenseText: String, modifier: Modifier = Modifier) { - Column( - modifier = modifier - .padding(horizontal = 24.dp) - .verticalScroll(rememberScrollState()) - ) { - Text( - text = licenseText, - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(vertical = 16.dp) - ) +fun LicenseScreen(licenseTextLines: List, modifier: Modifier = Modifier) { + Surface(modifier = modifier) { + LazyColumn(modifier = Modifier.padding(horizontal = 4.dp)) { + licenseTextLines.forEach { line -> + item { + Text( + text = line, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } } } @Preview @Composable fun LicenseFragmentPreview() { - LicenseScreen("Lorem ipsum") + LicenseScreen(listOf("Lorem ipsum", "Delor")) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalPendingOneTimeDonationConfigurationFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalPendingOneTimeDonationConfigurationFragment.kt new file mode 100644 index 00000000..541e793d --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalPendingOneTimeDonationConfigurationFragment.kt @@ -0,0 +1,199 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.internal + +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController +import org.signal.core.ui.Buttons +import org.signal.core.ui.Rows +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.theme.SignalTheme +import org.tm.archive.R +import org.tm.archive.components.settings.app.internal.donor.DonationErrorValueCodeSelector +import org.tm.archive.components.settings.app.internal.donor.DonationErrorValueTypeSelector +import org.tm.archive.compose.ComposeFragment +import org.tm.archive.database.model.databaseprotos.DonationErrorValue +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import org.tm.archive.keyvalue.SignalStore + +/** + * Allows configuration of a PendingOneTimeDonation object to display different + * states in the donation settings screen. + */ +class InternalPendingOneTimeDonationConfigurationFragment : ComposeFragment() { + + private val viewModel: InternalPendingOneTimeDonationConfigurationViewModel by viewModels() + + @Composable + override fun FragmentContent() { + val state by viewModel.state + Content( + state, + onNavigationClick = { + findNavController().popBackStack() + }, + onAddError = { + viewModel.state.value = viewModel.state.value.copy(error = DonationErrorValue()) + }, + onClearError = { + viewModel.state.value = viewModel.state.value.copy(error = null) + }, + onPaymentMethodTypeSelected = { + viewModel.state.value = viewModel.state.value.copy(paymentMethodType = it, error = null) + }, + onErrorTypeSelected = { + viewModel.state.value = viewModel.state.value.copy(error = viewModel.state.value.error!!.copy(type = it)) + }, + onErrorCodeChanged = { + viewModel.state.value = viewModel.state.value.copy(error = viewModel.state.value.error!!.copy(code = it)) + }, + onSave = { + SignalStore.donationsValues().setPendingOneTimeDonation(viewModel.state.value) + findNavController().popBackStack() + } + ) + } +} + +@Preview +@Composable +private fun ContentPreview() { + SignalTheme { + Surface { + Content( + state = PendingOneTimeDonation.Builder().error(DonationErrorValue()).build(), + onNavigationClick = {}, + onClearError = {}, + onAddError = {}, + onPaymentMethodTypeSelected = {}, + onErrorTypeSelected = {}, + onErrorCodeChanged = {}, + onSave = {} + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun Content( + state: PendingOneTimeDonation, + onNavigationClick: () -> Unit, + onAddError: () -> Unit, + onClearError: () -> Unit, + onPaymentMethodTypeSelected: (PendingOneTimeDonation.PaymentMethodType) -> Unit, + onErrorTypeSelected: (DonationErrorValue.Type) -> Unit, + onErrorCodeChanged: (String) -> Unit, + onSave: () -> Unit +) { + Scaffolds.Settings( + title = "One-time donation state", + navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24), + navigationContentDescription = null, + onNavigationClick = onNavigationClick + ) { + LazyColumn( + horizontalAlignment = CenterHorizontally, + modifier = Modifier.padding(it) + ) { + item { + var expanded by remember { + mutableStateOf(false) + } + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + expanded = !expanded + } + ) { + TextField( + value = state.paymentMethodType.name, + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor() + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + PendingOneTimeDonation.PaymentMethodType.values().forEach { item -> + DropdownMenuItem( + text = { Text(text = item.name) }, + onClick = { + onPaymentMethodTypeSelected(item) + expanded = false + } + ) + } + } + } + } + + item { + Rows.ToggleRow( + checked = state.error != null, + text = "Enable error", + onCheckChanged = { + if (it) { + onAddError() + } else { + onClearError() + } + } + ) + } + + if (state.error != null) { + item { + DonationErrorValueTypeSelector( + selectedPaymentMethodType = state.paymentMethodType, + selectedErrorType = state.error.type, + onErrorTypeSelected = onErrorTypeSelected + ) + } + + item { + DonationErrorValueCodeSelector( + selectedPaymentMethodType = state.paymentMethodType, + selectedErrorType = state.error.type, + selectedErrorCode = state.error.code, + onErrorCodeSelected = onErrorCodeChanged + ) + } + } + + item { + Buttons.LargeTonal( + enabled = state.badge != null, + onClick = onSave + ) { + Text(text = "Save") + } + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalPendingOneTimeDonationConfigurationViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalPendingOneTimeDonationConfigurationViewModel.kt new file mode 100644 index 00000000..3e98fef0 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalPendingOneTimeDonationConfigurationViewModel.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.internal + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.disposables.Disposable +import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.util.money.FiatMoney +import org.tm.archive.badges.Badges +import org.tm.archive.components.settings.app.subscription.DonationSerializationHelper.toFiatValue +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import org.tm.archive.dependencies.ApplicationDependencies +import java.math.BigDecimal +import java.util.Currency +import java.util.Locale + +/** + * Fetches a badge for our pending donation, which requires downloading the donation config. + */ +class InternalPendingOneTimeDonationConfigurationViewModel : ViewModel() { + + val state: MutableState = mutableStateOf( + PendingOneTimeDonation( + timestamp = System.currentTimeMillis(), + amount = FiatMoney(BigDecimal.valueOf(20), Currency.getInstance("EUR")).toFiatValue() + ) + ) + + val disposable: Disposable = Single + .fromCallable { + ApplicationDependencies.getDonationsService() + .getDonationsConfiguration(Locale.getDefault()) + } + .flatMap { it.flattenResult() } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { config -> + val badge = Badges.fromServiceBadge(config.levels.values.first().badge) + state.value = state.value.copy(badge = Badges.toDatabaseBadge(badge)) + } + + override fun onCleared() { + super.onCleared() + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsFragment.kt index 1d1b6d4f..dbc4bbf9 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsFragment.kt @@ -14,6 +14,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.signal.core.util.AppUtil import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.concurrent.SimpleTask +import org.signal.core.util.logging.Log +import org.signal.core.util.readToList +import org.signal.core.util.requireLong +import org.signal.core.util.requireString import org.signal.ringrtc.CallManager import org.tm.archive.BuildConfig import org.tm.archive.R @@ -21,10 +25,13 @@ import org.tm.archive.components.settings.DSLConfiguration import org.tm.archive.components.settings.DSLSettingsFragment import org.tm.archive.components.settings.DSLSettingsText import org.tm.archive.components.settings.configure +import org.tm.archive.database.JobDatabase import org.tm.archive.database.LocalMetricsDatabase import org.tm.archive.database.LogDatabase import org.tm.archive.database.MegaphoneDatabase +import org.tm.archive.database.OneTimePreKeyTable import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.model.databaseprotos.TerminalDonationQueue import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.jobmanager.JobTracker import org.tm.archive.jobs.DownloadLatestEmojiDataJob @@ -42,17 +49,27 @@ import org.tm.archive.keyvalue.SignalStore import org.tm.archive.megaphone.MegaphoneRepository import org.tm.archive.megaphone.Megaphones import org.tm.archive.payments.DataExportUtil +import org.tm.archive.recipients.Recipient import org.tm.archive.storage.StorageSyncHelper import org.tm.archive.util.ConversationUtil +import org.tm.archive.util.Util import org.tm.archive.util.adapter.mapping.MappingAdapter import org.tm.archive.util.navigation.safeNavigate +import org.whispersystems.signalservice.api.push.UsernameLinkComponents import java.util.Optional +import java.util.UUID import java.util.concurrent.TimeUnit import kotlin.math.max +import kotlin.random.Random +import kotlin.random.nextInt import kotlin.time.Duration.Companion.seconds class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__internal_preferences) { + companion object { + private val TAG = Log.tag(InternalSettingsFragment::class.java) + } + private lateinit var viewModel: InternalSettingsViewModel private var scrollToPosition: Int = 0 @@ -143,6 +160,14 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Backup Playground"), + summary = DSLSettingsText.from("Test backup import/export."), + onClick = { + findNavController().safeNavigate(InternalSettingsFragmentDirections.actionInternalSettingsFragmentToInternalBackupPlaygroundFragment()) + } + ) + switchPref( title = DSLSettingsText.from("'Internal Details' button"), summary = DSLSettingsText.from("Show a button in conversation settings that lets you see more information about a user."), @@ -161,6 +186,17 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Clear all logs"), + onClick = { + SimpleTask.run({ + LogDatabase.getInstance(requireActivity().application).logs.clearAll() + }) { + Toast.makeText(requireContext(), "Cleared all logs", Toast.LENGTH_SHORT).show() + } + } + ) + clickPref( title = DSLSettingsText.from("Clear keep longer logs"), onClick = { @@ -168,6 +204,47 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Clear all crashes"), + onClick = { + SimpleTask.run({ + LogDatabase.getInstance(requireActivity().application).crashes.clear() + }) { + Toast.makeText(requireContext(), "Cleared crashes", Toast.LENGTH_SHORT).show() + } + } + ) + + clickPref( + title = DSLSettingsText.from("Clear all ANRs"), + onClick = { + SimpleTask.run({ + LogDatabase.getInstance(requireActivity().application).anrs.clear() + }) { + Toast.makeText(requireContext(), "Cleared ANRs", Toast.LENGTH_SHORT).show() + } + } + ) + + clickPref( + title = DSLSettingsText.from("Log dump PreKey ServiceId-KeyIds"), + onClick = { + logPreKeyIds() + } + ) + + clickPref( + title = DSLSettingsText.from("Retry all jobs now"), + summary = DSLSettingsText.from("Clear backoff intervals, app will restart"), + onClick = { + SimpleTask.run({ + JobDatabase.getInstance(ApplicationDependencies.getApplication()).debugResetBackoffInterval() + }) { + AppUtil.restart(requireContext()) + } + } + ) + dividerPref() sectionHeaderPref(DSLSettingsText.from("Payments")) @@ -422,9 +499,17 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) - if (SignalStore.donationsValues().getSubscriber() != null) { - dividerPref() + switchPref( + title = DSLSettingsText.from("Disable LBRed"), + isChecked = state.callingDisableLBRed, + onClick = { + viewModel.setInternalCallingDisableLBRed(!state.callingDisableLBRed) + } + ) + dividerPref() + + if (SignalStore.donationsValues().getSubscriber() != null) { sectionHeaderPref(DSLSettingsText.from("Badges")) clickPref( @@ -457,8 +542,33 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter Toast.makeText(context, "Cleared", Toast.LENGTH_SHORT).show() } ) + + dividerPref() } + if (state.hasPendingOneTimeDonation) { + clickPref( + title = DSLSettingsText.from("Clear pending one-time donation."), + onClick = { + SignalStore.donationsValues().setPendingOneTimeDonation(null) + } + ) + } else { + clickPref( + title = DSLSettingsText.from("Set pending one-time donation."), + onClick = { + findNavController().safeNavigate(InternalSettingsFragmentDirections.actionInternalSettingsFragmentToOneTimeDonationConfigurationFragment()) + } + ) + } + + clickPref( + title = DSLSettingsText.from("Enqueue terminal donation"), + onClick = { + findNavController().safeNavigate(InternalSettingsFragmentDirections.actionInternalSettingsFragmentToTerminalDonationConfigurationFragment()) + } + ) + dividerPref() sectionHeaderPref(DSLSettingsText.from("Release channel")) @@ -498,6 +608,20 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Add remote donate megaphone"), + onClick = { + viewModel.addRemoteDonateMegaphone() + } + ) + + clickPref( + title = DSLSettingsText.from("Add donate_friend remote megaphone"), + onClick = { + viewModel.addRemoteDonateFriendMegaphone() + } + ) + dividerPref() sectionHeaderPref(DSLSettingsText.from("CDS")) @@ -599,6 +723,47 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) + clickPref( + title = DSLSettingsText.from("Corrupt username"), + summary = DSLSettingsText.from("Changes our local username without telling the server so it falls out of sync. Refresh profile afterwards to trigger corruption."), + onClick = { + MaterialAlertDialogBuilder(requireContext()) + .setTitle("Corrupt your username?") + .setMessage("Are you sure? You might not be able to get your original username back.") + .setPositiveButton(android.R.string.ok) { _, _ -> + val random = "${(1..5).map { ('a'..'z').random() }.joinToString(separator = "") }.${Random.nextInt(1, 100)}" + + SignalStore.account().username = random + SignalDatabase.recipients.setUsername(Recipient.self().id, random) + StorageSyncHelper.scheduleSyncForDataChange() + + Toast.makeText(context, "Done", Toast.LENGTH_SHORT).show() + } + .setNegativeButton(android.R.string.cancel) { d, _ -> d.dismiss() } + .show() + } + ) + + clickPref( + title = DSLSettingsText.from("Corrupt username link"), + summary = DSLSettingsText.from("Changes our local username link without telling the server so it falls out of sync. Refresh profile afterwards to trigger corruption."), + onClick = { + MaterialAlertDialogBuilder(requireContext()) + .setTitle("Corrupt your username link?") + .setMessage("Are you sure? You'll have to reset your link.") + .setPositiveButton(android.R.string.ok) { _, _ -> + SignalStore.account().usernameLink = UsernameLinkComponents( + entropy = Util.getSecretBytes(32), + serverId = SignalStore.account().usernameLink?.serverId ?: UUID.randomUUID() + ) + StorageSyncHelper.scheduleSyncForDataChange() + Toast.makeText(context, "Done", Toast.LENGTH_SHORT).show() + } + .setNegativeButton(android.R.string.cancel) { d, _ -> d.dismiss() } + .show() + } + ) + dividerPref() sectionHeaderPref(DSLSettingsText.from("Chat Filters")) clickPref( @@ -617,10 +782,10 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter ) switchPref( - title = DSLSettingsText.from("Use V2 ConversationItem"), - isChecked = state.useConversationItemV2, + title = DSLSettingsText.from("Use V2 ConversationItem for Media"), + isChecked = state.useConversationItemV2ForMedia, onClick = { - viewModel.setUseConversationItemV2(!state.useConversationItemV2) + viewModel.setUseConversationItemV2Media(!state.useConversationItemV2ForMedia) } ) } @@ -725,7 +890,12 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } private fun enqueueSubscriptionRedemption() { - SubscriptionReceiptRequestResponseJob.createSubscriptionContinuationJobChain().enqueue() + SubscriptionReceiptRequestResponseJob.createSubscriptionContinuationJobChain( + -1L, + TerminalDonationQueue.TerminalDonation( + level = 1000 + ) + ).enqueue() } private fun enqueueSubscriptionKeepAlive() { @@ -768,9 +938,24 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter private fun clearKeepLongerLogs() { SimpleTask.run({ - LogDatabase.getInstance(requireActivity().application).clearKeepLonger() + LogDatabase.getInstance(requireActivity().application).logs.clearKeepLonger() }) { Toast.makeText(requireContext(), "Cleared keep longer logs", Toast.LENGTH_SHORT).show() } } + + private fun logPreKeyIds() { + SimpleTask.run({ + val oneTimePreKeys = SignalDatabase.rawDatabase + .query("SELECT * FROM ${OneTimePreKeyTable.TABLE_NAME}") + .readToList { c -> + c.requireString(OneTimePreKeyTable.ACCOUNT_ID) to c.requireLong(OneTimePreKeyTable.KEY_ID) + } + .joinToString() + + Log.i(TAG, "One-Time Prekeys\n$oneTimePreKeys") + }) { + Toast.makeText(requireContext(), "Dumped to logs", Toast.LENGTH_SHORT).show() + } + } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsRepository.kt index 2da8bebf..1eb2c753 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsRepository.kt @@ -1,19 +1,24 @@ package org.tm.archive.components.settings.app.internal import android.content.Context +import org.json.JSONObject import org.signal.core.util.concurrent.SignalExecutors import org.tm.archive.database.MessageTable import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.model.RemoteMegaphoneRecord import org.tm.archive.database.model.addStyle import org.tm.archive.database.model.databaseprotos.BodyRangeList import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.emoji.EmojiFiles import org.tm.archive.jobs.AttachmentDownloadJob import org.tm.archive.jobs.CreateReleaseChannelJob +import org.tm.archive.jobs.FetchRemoteMegaphoneImageJob import org.tm.archive.keyvalue.SignalStore import org.tm.archive.notifications.v2.ConversationId import org.tm.archive.recipients.Recipient import org.tm.archive.releasechannel.ReleaseChannel +import java.util.UUID +import kotlin.time.Duration.Companion.days class InternalSettingsRepository(context: Context) { @@ -32,7 +37,7 @@ class InternalSettingsRepository(context: Context) { val title = "Release Note Title" val bodyText = "Release note body. Aren't I awesome?" val body = "$title\n\n$bodyText" - val bodyRangeList = BodyRangeList.newBuilder() + val bodyRangeList = BodyRangeList.Builder() .addStyle(BodyRangeList.BodyRange.Style.BOLD, 0, title.length) val recipientId = SignalStore.releaseChannelValues().releaseChannelRecipientId!! @@ -58,4 +63,34 @@ class InternalSettingsRepository(context: Context) { } } } + + fun addRemoteMegaphone(actionId: RemoteMegaphoneRecord.ActionId) { + SignalExecutors.UNBOUNDED.execute { + val record = RemoteMegaphoneRecord( + uuid = UUID.randomUUID().toString(), + priority = 100, + countries = "*:1000000", + minimumVersion = 1, + doNotShowBefore = System.currentTimeMillis() - 2.days.inWholeMilliseconds, + doNotShowAfter = System.currentTimeMillis() + 28.days.inWholeMilliseconds, + showForNumberOfDays = 30, + conditionalId = null, + primaryActionId = actionId, + secondaryActionId = RemoteMegaphoneRecord.ActionId.SNOOZE, + imageUrl = "/static/release-notes/donate-heart.png", + title = "Donate Test", + body = "Donate body test.", + primaryActionText = "Donate", + secondaryActionText = "Snooze", + primaryActionData = null, + secondaryActionData = JSONObject("{ \"snoozeDurationDays\": [5, 7, 100] }") + ) + + SignalDatabase.remoteMegaphones.insert(record) + + if (record.imageUrl != null) { + ApplicationDependencies.getJobManager().add(FetchRemoteMegaphoneImageJob(record.uuid, record.imageUrl)) + } + } + } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsState.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsState.kt index 5af547f1..470313d5 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsState.kt @@ -15,6 +15,7 @@ data class InternalSettingsState( val callingAudioProcessingMethod: CallManager.AudioProcessingMethod, val callingDataMode: CallManager.DataMode, val callingDisableTelecom: Boolean, + val callingDisableLBRed: Boolean, val useBuiltInEmojiSet: Boolean, val emojiVersion: EmojiFiles.Version?, val removeSenderKeyMinimium: Boolean, @@ -22,5 +23,6 @@ data class InternalSettingsState( val disableStorageService: Boolean, val canClearOnboardingState: Boolean, val pnpInitialized: Boolean, - val useConversationItemV2: Boolean + val useConversationItemV2ForMedia: Boolean, + val hasPendingOneTimeDonation: Boolean ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsViewModel.kt index 4a1752b2..76b01da4 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalSettingsViewModel.kt @@ -3,7 +3,9 @@ package org.tm.archive.components.settings.app.internal import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import io.reactivex.rxjava3.core.Observable import org.signal.ringrtc.CallManager +import org.tm.archive.database.model.RemoteMegaphoneRecord import org.tm.archive.jobs.StoryOnboardingDownloadJob import org.tm.archive.keyvalue.InternalValues import org.tm.archive.keyvalue.SignalStore @@ -20,6 +22,14 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito repository.getEmojiVersionInfo { version -> store.update { it.copy(emojiVersion = version) } } + + val pendingOneTimeDonation: Observable = SignalStore.donationsValues().observablePendingOneTimeDonation + .distinctUntilChanged() + .map { it.isPresent } + + store.update(pendingOneTimeDonation) { pending, state -> + state.copy(hasPendingOneTimeDonation = pending) + } } val state: LiveData = store.stateLiveData @@ -104,8 +114,13 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito refresh() } - fun setUseConversationItemV2(enabled: Boolean) { - SignalStore.internalValues().setUseConversationItemV2(enabled) + fun setInternalCallingDisableLBRed(enabled: Boolean) { + preferenceDataStore.putBoolean(InternalValues.CALLING_DISABLE_LBRED, enabled) + refresh() + } + + fun setUseConversationItemV2Media(enabled: Boolean) { + SignalStore.internalValues().setUseConversationItemV2Media(enabled) refresh() } @@ -113,6 +128,14 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito repository.addSampleReleaseNote() } + fun addRemoteDonateMegaphone() { + repository.addRemoteMegaphone(RemoteMegaphoneRecord.ActionId.DONATE) + } + + fun addRemoteDonateFriendMegaphone() { + repository.addRemoteMegaphone(RemoteMegaphoneRecord.ActionId.DONATE_FOR_FRIEND) + } + fun refresh() { store.update { getState().copy(emojiVersion = it.emojiVersion) } } @@ -129,6 +152,7 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito callingAudioProcessingMethod = SignalStore.internalValues().callingAudioProcessingMethod(), callingDataMode = SignalStore.internalValues().callingDataMode(), callingDisableTelecom = SignalStore.internalValues().callingDisableTelecom(), + callingDisableLBRed = SignalStore.internalValues().callingDisableLBRed(), useBuiltInEmojiSet = SignalStore.internalValues().forceBuiltInEmoji(), emojiVersion = null, removeSenderKeyMinimium = SignalStore.internalValues().removeSenderKeyMinimum(), @@ -136,7 +160,8 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito disableStorageService = SignalStore.internalValues().storageServiceDisabled(), canClearOnboardingState = SignalStore.storyValues().hasDownloadedOnboardingStory && Stories.isFeatureEnabled(), pnpInitialized = SignalStore.misc().hasPniInitializedDevices(), - useConversationItemV2 = SignalStore.internalValues().useConversationItemV2() + useConversationItemV2ForMedia = SignalStore.internalValues().useConversationItemV2Media(), + hasPendingOneTimeDonation = SignalStore.donationsValues().getPendingOneTimeDonation() != null ) fun onClearOnboardingState() { diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalTerminalDonationConfigurationFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalTerminalDonationConfigurationFragment.kt new file mode 100644 index 00000000..f297df01 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/InternalTerminalDonationConfigurationFragment.kt @@ -0,0 +1,148 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.internal + +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.fragment.findNavController +import org.signal.core.ui.Buttons +import org.signal.core.ui.Rows +import org.signal.core.ui.theme.SignalTheme +import org.tm.archive.components.settings.app.internal.donor.DonationErrorValueCodeSelector +import org.tm.archive.components.settings.app.internal.donor.DonationErrorValueTypeSelector +import org.tm.archive.compose.ComposeFragment +import org.tm.archive.database.model.databaseprotos.DonationErrorValue +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import org.tm.archive.database.model.databaseprotos.TerminalDonationQueue +import org.tm.archive.keyvalue.SignalStore + +/** + * Configuration fragment for [TerminalDonationQueue.TerminalDonation] + */ +class InternalTerminalDonationConfigurationFragment : ComposeFragment() { + + @Composable + override fun FragmentContent() { + InternalTerminalDonationConfigurationContent( + onAddClick = { + SignalStore.donationsValues().appendToTerminalDonationQueue(it) + findNavController().popBackStack() + } + ) + } +} + +@Preview +@Composable +private fun InternalTerminalDonationConfigurationContentPreview() { + SignalTheme { + Surface { + InternalTerminalDonationConfigurationContent( + onAddClick = {} + ) + } + } +} + +@Composable +private fun InternalTerminalDonationConfigurationContent( + onAddClick: (TerminalDonationQueue.TerminalDonation) -> Unit +) { + val terminalDonationState: MutableState = remember { + mutableStateOf( + TerminalDonationQueue.TerminalDonation( + level = 1000L, + isLongRunningPaymentMethod = true + ) + ) + } + + val paymentMethodType = remember(terminalDonationState.value.isLongRunningPaymentMethod) { + if (terminalDonationState.value.isLongRunningPaymentMethod) PendingOneTimeDonation.PaymentMethodType.SEPA_DEBIT else PendingOneTimeDonation.PaymentMethodType.CARD + } + + LazyColumn( + horizontalAlignment = Alignment.CenterHorizontally + ) { + item { + Rows.ToggleRow( + checked = terminalDonationState.value.isLongRunningPaymentMethod, + text = "Long-running payment method", + onCheckChanged = { + terminalDonationState.value = terminalDonationState.value.copy(isLongRunningPaymentMethod = it) + } + ) + } + + item { + Rows.ToggleRow( + checked = terminalDonationState.value.error != null, + text = "Enable error", + onCheckChanged = { + val error = if (it) { + DonationErrorValue() + } else { + null + } + + terminalDonationState.value = terminalDonationState.value.copy(error = error) + } + ) + } + + val error = terminalDonationState.value.error + if (error != null) { + item { + DonationErrorValueTypeSelector( + selectedPaymentMethodType = paymentMethodType, + selectedErrorType = error.type, + onErrorTypeSelected = { + terminalDonationState.value = terminalDonationState.value.copy( + error = error.copy( + type = it, + code = "" + ) + ) + } + ) + } + + item { + DonationErrorValueCodeSelector( + selectedPaymentMethodType = paymentMethodType, + selectedErrorType = error.type, + selectedErrorCode = error.code, + onErrorCodeSelected = { + terminalDonationState.value = terminalDonationState.value.copy( + error = error.copy( + code = it + ) + ) + } + ) + } + } + + item { + Buttons.LargeTonal( + onClick = { onAddClick(terminalDonationState.value) }, + modifier = Modifier.defaultMinSize(minWidth = 220.dp) + ) { + Text(text = "Confirm") + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt new file mode 100644 index 00000000..37f84304 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt @@ -0,0 +1,307 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.internal.backup + +import android.app.Activity.RESULT_OK +import android.content.Intent +import android.content.res.Configuration +import android.os.Bundle +import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.fragment.app.viewModels +import org.signal.core.ui.Buttons +import org.signal.core.ui.Dividers +import org.signal.core.ui.theme.SignalTheme +import org.signal.core.util.bytes +import org.signal.core.util.getLength +import org.signal.core.util.roundedString +import org.tm.archive.components.settings.app.internal.backup.InternalBackupPlaygroundViewModel.BackupState +import org.tm.archive.components.settings.app.internal.backup.InternalBackupPlaygroundViewModel.BackupUploadState +import org.tm.archive.components.settings.app.internal.backup.InternalBackupPlaygroundViewModel.ScreenState +import org.tm.archive.compose.ComposeFragment + +class InternalBackupPlaygroundFragment : ComposeFragment() { + + private val viewModel: InternalBackupPlaygroundViewModel by viewModels() + private lateinit var exportFileLauncher: ActivityResultLauncher + private lateinit var importFileLauncher: ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + exportFileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> + requireContext().contentResolver.openOutputStream(uri)?.use { outputStream -> + outputStream.write(viewModel.backupData!!) + Toast.makeText(requireContext(), "Saved successfully", Toast.LENGTH_SHORT).show() + } ?: Toast.makeText(requireContext(), "Failed to open output stream", Toast.LENGTH_SHORT).show() + } ?: Toast.makeText(requireContext(), "No URI selected", Toast.LENGTH_SHORT).show() + } + } + + importFileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + result.data?.data?.let { uri -> + requireContext().contentResolver.getLength(uri)?.let { length -> + viewModel.import(length) { requireContext().contentResolver.openInputStream(uri)!! } + } + } ?: Toast.makeText(requireContext(), "No URI selected", Toast.LENGTH_SHORT).show() + } + } + } + + @Composable + override fun FragmentContent() { + val state by viewModel.state + + Screen( + state = state, + onExportClicked = { viewModel.export() }, + onImportMemoryClicked = { viewModel.import() }, + onImportFileClicked = { + val intent = Intent().apply { + action = Intent.ACTION_GET_CONTENT + type = "application/octet-stream" + addCategory(Intent.CATEGORY_OPENABLE) + } + + importFileLauncher.launch(intent) + }, + onPlaintextClicked = { viewModel.onPlaintextToggled() }, + onSaveToDiskClicked = { + val intent = Intent().apply { + action = Intent.ACTION_CREATE_DOCUMENT + type = "application/octet-stream" + addCategory(Intent.CATEGORY_OPENABLE) + putExtra(Intent.EXTRA_TITLE, "backup-${if (state.plaintext) "plaintext" else "encrypted"}-${System.currentTimeMillis()}.bin") + } + + exportFileLauncher.launch(intent) + }, + onUploadToRemoteClicked = { viewModel.uploadBackupToRemote() }, + onCheckRemoteBackupStateClicked = { viewModel.checkRemoteBackupState() } + ) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + } +} + +@Composable +fun Screen( + state: ScreenState, + onExportClicked: () -> Unit = {}, + onImportMemoryClicked: () -> Unit = {}, + onImportFileClicked: () -> Unit = {}, + onPlaintextClicked: () -> Unit = {}, + onSaveToDiskClicked: () -> Unit = {}, + onUploadToRemoteClicked: () -> Unit = {}, + onCheckRemoteBackupStateClicked: () -> Unit = {} +) { + Surface { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(16.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + StateLabel(text = "Plaintext?") + Spacer(modifier = Modifier.width(8.dp)) + Switch( + checked = state.plaintext, + onCheckedChange = { onPlaintextClicked() } + ) + } + + Spacer(modifier = Modifier.height(8.dp)) + + Buttons.LargePrimary( + onClick = onExportClicked, + enabled = !state.backupState.inProgress + ) { + Text("Export") + } + + Dividers.Default() + + Buttons.LargeTonal( + onClick = onImportMemoryClicked, + enabled = state.backupState == BackupState.EXPORT_DONE + ) { + Text("Import from memory") + } + Buttons.LargeTonal( + onClick = onImportFileClicked + ) { + Text("Import from file") + } + + Spacer(modifier = Modifier.height(16.dp)) + + when (state.backupState) { + BackupState.NONE -> { + StateLabel("") + } + BackupState.EXPORT_IN_PROGRESS -> { + StateLabel("Export in progress...") + } + BackupState.EXPORT_DONE -> { + StateLabel("Export complete. Sitting in memory. You can click 'Import' to import that data, save it to a file, or upload it to remote.") + + Spacer(modifier = Modifier.height(8.dp)) + + Buttons.MediumTonal(onClick = onSaveToDiskClicked) { + Text("Save to file") + } + } + BackupState.IMPORT_IN_PROGRESS -> { + StateLabel("Import in progress...") + } + } + + Dividers.Default() + + Buttons.LargeTonal( + onClick = onCheckRemoteBackupStateClicked + ) { + Text("Check remote backup state") + } + + Spacer(modifier = Modifier.height(8.dp)) + + when (state.remoteBackupState) { + is InternalBackupPlaygroundViewModel.RemoteBackupState.Available -> { + StateLabel("Exists/allocated. Space used by media: ${state.remoteBackupState.response.usedSpace ?: 0} bytes (${state.remoteBackupState.response.usedSpace?.bytes?.inMebiBytes?.roundedString(3) ?: 0} MiB)") + } + InternalBackupPlaygroundViewModel.RemoteBackupState.GeneralError -> { + StateLabel("Hit an unknown error. Check the logs.") + } + InternalBackupPlaygroundViewModel.RemoteBackupState.NotFound -> { + StateLabel("Not found.") + } + InternalBackupPlaygroundViewModel.RemoteBackupState.Unknown -> { + StateLabel("Hit the button above to check the state.") + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + Buttons.LargePrimary( + onClick = onUploadToRemoteClicked, + enabled = state.backupState == BackupState.EXPORT_DONE + ) { + Text("Upload to remote") + } + + Spacer(modifier = Modifier.height(8.dp)) + + when (state.uploadState) { + BackupUploadState.NONE -> { + StateLabel("") + } + BackupUploadState.UPLOAD_IN_PROGRESS -> { + StateLabel("Upload in progress...") + } + BackupUploadState.UPLOAD_DONE -> { + StateLabel("Upload complete.") + } + BackupUploadState.UPLOAD_FAILED -> { + StateLabel("Upload failed.") + } + } + } + } +} + +@Composable +private fun StateLabel(text: String) { + Text( + text = text, + style = MaterialTheme.typography.labelSmall, + textAlign = TextAlign.Center + ) +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun PreviewScreen() { + SignalTheme { + Surface { + Screen(state = ScreenState(backupState = BackupState.NONE, plaintext = false)) + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun PreviewScreenExportInProgress() { + SignalTheme { + Surface { + Screen(state = ScreenState(backupState = BackupState.EXPORT_IN_PROGRESS, plaintext = false)) + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun PreviewScreenExportDone() { + SignalTheme { + Surface { + Screen(state = ScreenState(backupState = BackupState.EXPORT_DONE, plaintext = false)) + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun PreviewScreenImportInProgress() { + SignalTheme { + Surface { + Screen(state = ScreenState(backupState = BackupState.IMPORT_IN_PROGRESS, plaintext = false)) + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun PreviewScreenUploadInProgress() { + SignalTheme { + Surface { + Screen(state = ScreenState(uploadState = BackupUploadState.UPLOAD_IN_PROGRESS, plaintext = false)) + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt new file mode 100644 index 00000000..a09eeaf4 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt @@ -0,0 +1,142 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.internal.backup + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.libsignal.zkgroup.profiles.ProfileKey +import org.tm.archive.backup.v2.BackupRepository +import org.tm.archive.recipients.Recipient +import org.whispersystems.signalservice.api.NetworkResult +import org.whispersystems.signalservice.api.archive.ArchiveGetBackupInfoResponse +import java.io.ByteArrayInputStream +import java.io.InputStream + +class InternalBackupPlaygroundViewModel : ViewModel() { + + var backupData: ByteArray? = null + + val disposables = CompositeDisposable() + + private val _state: MutableState = mutableStateOf(ScreenState(backupState = BackupState.NONE, uploadState = BackupUploadState.NONE, plaintext = false)) + val state: State = _state + + fun export() { + _state.value = _state.value.copy(backupState = BackupState.EXPORT_IN_PROGRESS) + val plaintext = _state.value.plaintext + + disposables += Single.fromCallable { BackupRepository.export(plaintext = plaintext) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { data -> + backupData = data + _state.value = _state.value.copy(backupState = BackupState.EXPORT_DONE) + } + } + + fun import() { + backupData?.let { + _state.value = _state.value.copy(backupState = BackupState.IMPORT_IN_PROGRESS) + val plaintext = _state.value.plaintext + + val self = Recipient.self() + val selfData = BackupRepository.SelfData(self.aci.get(), self.pni.get(), self.e164.get(), ProfileKey(self.profileKey)) + + disposables += Single.fromCallable { BackupRepository.import(it.size.toLong(), { ByteArrayInputStream(it) }, selfData, plaintext = plaintext) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { nothing -> + backupData = null + _state.value = _state.value.copy(backupState = BackupState.NONE) + } + } + } + + fun import(length: Long, inputStreamFactory: () -> InputStream) { + _state.value = _state.value.copy(backupState = BackupState.IMPORT_IN_PROGRESS) + val plaintext = _state.value.plaintext + + val self = Recipient.self() + val selfData = BackupRepository.SelfData(self.aci.get(), self.pni.get(), self.e164.get(), ProfileKey(self.profileKey)) + + disposables += Single.fromCallable { BackupRepository.import(length, inputStreamFactory, selfData, plaintext = plaintext) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { nothing -> + backupData = null + _state.value = _state.value.copy(backupState = BackupState.NONE) + } + } + + fun onPlaintextToggled() { + _state.value = _state.value.copy(plaintext = !_state.value.plaintext) + } + + fun uploadBackupToRemote() { + _state.value = _state.value.copy(uploadState = BackupUploadState.UPLOAD_IN_PROGRESS) + + disposables += Single + .fromCallable { BackupRepository.uploadBackupFile(backupData!!.inputStream(), backupData!!.size.toLong()) } + .subscribeOn(Schedulers.io()) + .subscribe { success -> + _state.value = _state.value.copy(uploadState = if (success) BackupUploadState.UPLOAD_DONE else BackupUploadState.UPLOAD_FAILED) + } + } + + fun checkRemoteBackupState() { + _state.value = _state.value.copy(remoteBackupState = RemoteBackupState.Unknown) + + disposables += Single + .fromCallable { BackupRepository.getRemoteBackupState() } + .subscribeOn(Schedulers.io()) + .subscribe { result -> + when { + result is NetworkResult.Success -> { + _state.value = _state.value.copy(remoteBackupState = RemoteBackupState.Available(result.result)) + } + result is NetworkResult.StatusCodeError && result.code == 404 -> { + _state.value = _state.value.copy(remoteBackupState = RemoteBackupState.NotFound) + } + else -> { + _state.value = _state.value.copy(remoteBackupState = RemoteBackupState.GeneralError) + } + } + } + } + + override fun onCleared() { + disposables.clear() + } + + data class ScreenState( + val backupState: BackupState = BackupState.NONE, + val uploadState: BackupUploadState = BackupUploadState.NONE, + val remoteBackupState: RemoteBackupState = RemoteBackupState.Unknown, + val plaintext: Boolean + ) + + enum class BackupState(val inProgress: Boolean = false) { + NONE, EXPORT_IN_PROGRESS(true), EXPORT_DONE, IMPORT_IN_PROGRESS(true) + } + + enum class BackupUploadState(val inProgress: Boolean = false) { + NONE, UPLOAD_IN_PROGRESS(true), UPLOAD_DONE, UPLOAD_FAILED + } + + sealed class RemoteBackupState { + object Unknown : RemoteBackupState() + object NotFound : RemoteBackupState() + object GeneralError : RemoteBackupState() + data class Available(val response: ArchiveGetBackupInfoResponse) : RemoteBackupState() + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/donor/InternalDonationErrorValues.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/donor/InternalDonationErrorValues.kt new file mode 100644 index 00000000..5c19c36d --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/donor/InternalDonationErrorValues.kt @@ -0,0 +1,181 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.internal.donor + +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import org.signal.donations.StripeDeclineCode +import org.signal.donations.StripeFailureCode +import org.tm.archive.components.settings.app.subscription.errors.PayPalDeclineCode +import org.tm.archive.database.model.databaseprotos.DonationErrorValue +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation + +/** + * Displays a dropdown widget for selecting an error type. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DonationErrorValueTypeSelector( + selectedPaymentMethodType: PendingOneTimeDonation.PaymentMethodType, + selectedErrorType: DonationErrorValue.Type, + onErrorTypeSelected: (DonationErrorValue.Type) -> Unit +) { + var expanded by remember { + mutableStateOf(false) + } + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + expanded = !expanded + } + ) { + TextField( + value = selectedErrorType.name, + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor() + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + DonationErrorValue.Type.values().filterNot { + selectedPaymentMethodType == PendingOneTimeDonation.PaymentMethodType.PAYPAL && it == DonationErrorValue.Type.FAILURE_CODE + }.forEach { item -> + DropdownMenuItem( + text = { Text(text = item.name) }, + onClick = { + onErrorTypeSelected(item) + expanded = false + } + ) + } + } + } +} + +/** + * Displays a dropdown widget for selecting an error code, if the corresponding type + * allows for such things. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DonationErrorValueCodeSelector( + selectedPaymentMethodType: PendingOneTimeDonation.PaymentMethodType, + selectedErrorType: DonationErrorValue.Type, + selectedErrorCode: String, + onErrorCodeSelected: (String) -> Unit +) { + val isCodedError = remember(selectedErrorType) { + selectedErrorType in setOf(DonationErrorValue.Type.PROCESSOR_CODE, DonationErrorValue.Type.DECLINE_CODE, DonationErrorValue.Type.FAILURE_CODE) + } + + var expanded by remember { + mutableStateOf(false) + } + + if (isCodedError) { + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + expanded = !expanded + } + ) { + TextField( + value = selectedErrorCode, + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor() + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + when (selectedErrorType) { + DonationErrorValue.Type.PROCESSOR_CODE -> { + ProcessorErrorsDropdown(selectedPaymentMethodType, onErrorCodeSelected) + } + + DonationErrorValue.Type.DECLINE_CODE -> { + DeclineCodeErrorsDropdown(selectedPaymentMethodType, onErrorCodeSelected) + } + + DonationErrorValue.Type.FAILURE_CODE -> { + FailureCodeErrorsDropdown(onErrorCodeSelected) + } + + else -> error("This should never happen") + } + } + } + } +} + +@Composable +private fun ProcessorErrorsDropdown( + paymentMethodType: PendingOneTimeDonation.PaymentMethodType, + onErrorCodeSelected: (String) -> Unit +) { + val values = when (paymentMethodType) { + PendingOneTimeDonation.PaymentMethodType.PAYPAL -> arrayOf("2046", "2074") + else -> arrayOf("currency_not_supported", "call_issuer") + } + + ValuesDropdown(values = values, onErrorCodeSelected = onErrorCodeSelected) +} + +@Composable +private fun DeclineCodeErrorsDropdown( + paymentMethodType: PendingOneTimeDonation.PaymentMethodType, + onErrorCodeSelected: (String) -> Unit +) { + val values = remember(paymentMethodType) { + when (paymentMethodType) { + PendingOneTimeDonation.PaymentMethodType.PAYPAL -> PayPalDeclineCode.KnownCode.values() + else -> StripeDeclineCode.Code.values() + }.map { it.name }.toTypedArray() + } + + ValuesDropdown(values = values, onErrorCodeSelected = onErrorCodeSelected) +} + +@Composable +private fun FailureCodeErrorsDropdown( + onErrorCodeSelected: (String) -> Unit +) { + val values = remember { + StripeFailureCode.Code.values().map { it.name }.toTypedArray() + } + + ValuesDropdown(values = values, onErrorCodeSelected = onErrorCodeSelected) +} + +@Composable +private fun ValuesDropdown(values: Array, onErrorCodeSelected: (String) -> Unit) { + values.forEach { item -> + DropdownMenuItem( + text = { Text(text = item) }, + onClick = { + onErrorCodeSelected(item) + } + ) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/donor/InternalDonorErrorConfigurationViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/donor/InternalDonorErrorConfigurationViewModel.kt index 3a1e738d..a4cdac76 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/donor/InternalDonorErrorConfigurationViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/donor/InternalDonorErrorConfigurationViewModel.kt @@ -144,19 +144,21 @@ class InternalDonorErrorConfigurationViewModel : ViewModel() { private fun handleSubscriptionExpiration(state: InternalDonorErrorConfigurationState) { SignalStore.donationsValues().setExpiredBadge(state.selectedBadge) + SignalStore.donationsValues().clearUserManuallyCancelled() handleSubscriptionPaymentFailure(state) } private fun handleSubscriptionPaymentFailure(state: InternalDonorErrorConfigurationState) { SignalStore.donationsValues().unexpectedSubscriptionCancelationReason = state.selectedUnexpectedSubscriptionCancellation?.status SignalStore.donationsValues().unexpectedSubscriptionCancelationTimestamp = System.currentTimeMillis() + SignalStore.donationsValues().showMonthlyDonationCanceledDialog = true SignalStore.donationsValues().setUnexpectedSubscriptionCancelationChargeFailure( state.selectedStripeDeclineCode?.let { ActiveSubscription.ChargeFailure( it.code, "Test Charge Failure", "Test Network Status", - "Test Network Reason", + it.code, "Test" ) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/search/InternalSearchFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/search/InternalSearchFragment.kt index 06c236f9..1a281cc4 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/search/InternalSearchFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/search/InternalSearchFragment.kt @@ -8,17 +8,20 @@ package org.tm.archive.components.settings.app.internal.search import androidx.appcompat.app.AppCompatActivity +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextField +import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -52,15 +55,21 @@ class InternalSearchFragment : ComposeFragment() { @Composable fun InternalSearchFragmentScreen(query: String, results: ImmutableList, onSearchUpdated: (String) -> Unit, modifier: Modifier = Modifier) { - LazyColumn( - modifier = modifier.fillMaxWidth() - ) { - item(key = -1) { - SearchBar(query, onSearchUpdated) - } - results.forEach { recipient -> - item(key = recipient.id) { - ResultItem(recipient) + val backgroundColor = MaterialTheme.colorScheme.surface + + CompositionLocalProvider(LocalContentColor provides contentColorFor(backgroundColor = backgroundColor)) { + LazyColumn( + modifier = modifier + .fillMaxWidth() + .background(backgroundColor) + ) { + item(key = -1) { + SearchBar(query, onSearchUpdated) + } + results.forEach { recipient -> + item(key = recipient.id) { + ResultItem(recipient) + } } } } @@ -85,7 +94,9 @@ fun ResultItem(result: InternalSearchResult, modifier: Modifier = Modifier) { .fillMaxWidth() .clickable { if (activity != null) { - RecipientBottomSheetDialogFragment.create(result.id, result.groupId).show(activity.supportFragmentManager, "TAG") + RecipientBottomSheetDialogFragment + .create(result.id, result.groupId) + .show(activity.supportFragmentManager, "TAG") } } .padding(8.dp) @@ -101,9 +112,7 @@ fun ResultItem(result: InternalSearchResult, modifier: Modifier = Modifier) { @Composable fun InternalSearchScreenPreviewLightTheme() { SignalTheme(isDarkMode = false) { - Surface { - InternalSearchScreenPreview() - } + InternalSearchScreenPreview() } } @@ -111,9 +120,7 @@ fun InternalSearchScreenPreviewLightTheme() { @Composable fun InternalSearchScreenPreviewDarkTheme() { SignalTheme(isDarkMode = true) { - Surface { - InternalSearchScreenPreview() - } + InternalSearchScreenPreview() } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundFragment.kt index ad808e73..852d1766 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundFragment.kt @@ -124,7 +124,7 @@ fun SvrPlaygroundScreenLightTheme() { Surface { SvrPlaygroundScreen( state = InternalSvrPlaygroundState( - options = persistentListOf(SvrImplementation.SVR1, SvrImplementation.SVR2) + options = persistentListOf(SvrImplementation.SVR2) ) ) } @@ -138,7 +138,7 @@ fun SvrPlaygroundScreenDarkTheme() { Surface { SvrPlaygroundScreen( state = InternalSvrPlaygroundState( - options = persistentListOf(SvrImplementation.SVR1, SvrImplementation.SVR2) + options = persistentListOf(SvrImplementation.SVR2) ) ) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundState.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundState.kt index 3737e90a..4745a995 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundState.kt @@ -13,5 +13,5 @@ data class InternalSvrPlaygroundState( enum class SvrImplementation( val title: String ) { - SVR1("KBS"), SVR2("SVR2") + SVR2("SVR2") } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundViewModel.kt index 22779e68..23915f58 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/internal/svr/InternalSvrPlaygroundViewModel.kt @@ -19,13 +19,12 @@ import org.tm.archive.BuildConfig import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.keyvalue.SignalStore import org.whispersystems.signalservice.api.svr.SecureValueRecovery -import org.whispersystems.signalservice.api.svr.SecureValueRecoveryV1 class InternalSvrPlaygroundViewModel : ViewModel() { private val _state: MutableState = mutableStateOf( InternalSvrPlaygroundState( - options = persistentListOf(SvrImplementation.SVR1, SvrImplementation.SVR2) + options = persistentListOf(SvrImplementation.SVR2) ) ) val state: State = _state @@ -104,7 +103,6 @@ class InternalSvrPlaygroundViewModel : ViewModel() { private fun SvrImplementation.toImplementation(): SecureValueRecovery { return when (this) { - SvrImplementation.SVR1 -> SecureValueRecoveryV1(ApplicationDependencies.getKeyBackupService(BuildConfig.KBS_ENCLAVE)) SvrImplementation.SVR2 -> ApplicationDependencies.getSignalServiceAccountManager().getSecureValueRecoveryV2(BuildConfig.SVR2_MRENCLAVE) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsFragment.kt index 3c5b9dd2..3c6e1023 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsFragment.kt @@ -31,8 +31,11 @@ import org.tm.archive.components.settings.PreferenceViewHolder import org.tm.archive.components.settings.RadioListPreference import org.tm.archive.components.settings.RadioListPreferenceViewHolder import org.tm.archive.components.settings.configure +import org.tm.archive.components.settings.models.Banner import org.tm.archive.keyvalue.SignalStore import org.tm.archive.notifications.NotificationChannels +import org.tm.archive.notifications.TurnOnNotificationsBottomSheet +import org.tm.archive.util.BottomSheetUtil import org.tm.archive.util.RingtoneUtil import org.tm.archive.util.ViewUtil import org.tm.archive.util.adapter.mapping.LayoutFactory @@ -62,6 +65,11 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ private lateinit var viewModel: NotificationsSettingsViewModel + override fun onResume() { + super.onResume() + viewModel.refresh() + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == MESSAGE_SOUND_SELECT && resultCode == Activity.RESULT_OK && data != null) { val uri: Uri? = data.getParcelableExtraCompat(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri::class.java) @@ -78,6 +86,8 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ LayoutFactory(::LedColorPreferenceViewHolder, R.layout.dsl_preference_item) ) + Banner.register(adapter) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) val factory = NotificationsSettingsViewModel.Factory(sharedPreferences) @@ -90,10 +100,23 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ private fun getConfiguration(state: NotificationsSettingsState): DSLConfiguration { return configure { + if (!state.messageNotificationsState.canEnableNotifications) { + customPref( + Banner.Model( + textId = R.string.NotificationSettingsFragment__to_enable_notifications, + actionId = R.string.NotificationSettingsFragment__turn_on, + onClick = { + TurnOnNotificationsBottomSheet.turnOnSystemNotificationsFragment(requireContext()).show(childFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + } + ) + ) + } + sectionHeaderPref(R.string.NotificationsSettingsFragment__messages) switchPref( title = DSLSettingsText.from(R.string.preferences__notifications), + isEnabled = state.messageNotificationsState.canEnableNotifications, isChecked = state.messageNotificationsState.notificationsEnabled, onClick = { viewModel.setMessageNotificationsEnabled(!state.messageNotificationsState.notificationsEnabled) @@ -223,6 +246,7 @@ class NotificationsSettingsFragment : DSLSettingsFragment(R.string.preferences__ switchPref( title = DSLSettingsText.from(R.string.preferences__notifications), + isEnabled = state.callNotificationsState.canEnableNotifications, isChecked = state.callNotificationsState.notificationsEnabled, onClick = { viewModel.setCallNotificationsEnabled(!state.callNotificationsState.notificationsEnabled) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsState.kt b/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsState.kt index 849477d0..0c87a92d 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsState.kt @@ -10,6 +10,7 @@ data class NotificationsSettingsState( data class MessageNotificationsState( val notificationsEnabled: Boolean, + val canEnableNotifications: Boolean, val sound: Uri, val vibrateEnabled: Boolean, val ledColor: String, @@ -23,6 +24,7 @@ data class MessageNotificationsState( data class CallNotificationsState( val notificationsEnabled: Boolean, + val canEnableNotifications: Boolean, val ringtone: Uri, val vibrateEnabled: Boolean ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsViewModel.kt index 21ce02ea..45e95dad 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/notifications/NotificationsSettingsViewModel.kt @@ -2,6 +2,7 @@ package org.tm.archive.components.settings.app.notifications import android.content.SharedPreferences import android.net.Uri +import android.os.Build import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider @@ -15,89 +16,101 @@ import org.tm.archive.util.livedata.Store class NotificationsSettingsViewModel(private val sharedPreferences: SharedPreferences) : ViewModel() { + private val store = Store(getState()) + + val state: LiveData = store.stateLiveData + init { if (NotificationChannels.supported()) { SignalStore.settings().messageNotificationSound = NotificationChannels.getInstance().messageRingtone SignalStore.settings().isMessageVibrateEnabled = NotificationChannels.getInstance().messageVibrate } + + store.update { getState(calculateSlowNotifications = true) } } - private val store = Store(getState()) - - val state: LiveData = store.stateLiveData + fun refresh() { + store.update { getState(currentState = it) } + } fun setMessageNotificationsEnabled(enabled: Boolean) { SignalStore.settings().isMessageNotificationsEnabled = enabled - store.update { getState() } + refresh() } fun setMessageNotificationsSound(sound: Uri?) { val messageSound = sound ?: Uri.EMPTY SignalStore.settings().messageNotificationSound = messageSound NotificationChannels.getInstance().updateMessageRingtone(messageSound) - store.update { getState() } + refresh() } fun setMessageNotificationVibration(enabled: Boolean) { SignalStore.settings().isMessageVibrateEnabled = enabled NotificationChannels.getInstance().updateMessageVibrate(enabled) - store.update { getState() } + refresh() } fun setMessageNotificationLedColor(color: String) { SignalStore.settings().messageLedColor = color NotificationChannels.getInstance().updateMessagesLedColor(color) - store.update { getState() } + refresh() } fun setMessageNotificationLedBlink(blink: String) { SignalStore.settings().messageLedBlinkPattern = blink - store.update { getState() } + refresh() } fun setMessageNotificationInChatSoundsEnabled(enabled: Boolean) { SignalStore.settings().isMessageNotificationsInChatSoundsEnabled = enabled - store.update { getState() } + refresh() } fun setMessageRepeatAlerts(repeats: Int) { SignalStore.settings().messageNotificationsRepeatAlerts = repeats - store.update { getState() } + refresh() } fun setMessageNotificationPrivacy(preference: String) { SignalStore.settings().messageNotificationsPrivacy = NotificationPrivacyPreference(preference) - store.update { getState() } + refresh() } fun setMessageNotificationPriority(priority: Int) { sharedPreferences.edit().putString(TextSecurePreferences.NOTIFICATION_PRIORITY_PREF, priority.toString()).apply() - store.update { getState() } + refresh() } fun setCallNotificationsEnabled(enabled: Boolean) { SignalStore.settings().isCallNotificationsEnabled = enabled - store.update { getState() } + refresh() } fun setCallRingtone(ringtone: Uri?) { SignalStore.settings().callRingtone = ringtone ?: Uri.EMPTY - store.update { getState() } + refresh() } fun setCallVibrateEnabled(enabled: Boolean) { SignalStore.settings().isCallVibrateEnabled = enabled - store.update { getState() } + refresh() } fun setNotifyWhenContactJoinsSignal(enabled: Boolean) { SignalStore.settings().isNotifyWhenContactJoinsSignal = enabled - store.update { getState() } + refresh() } - private fun getState(): NotificationsSettingsState = NotificationsSettingsState( + /** + * @param currentState If provided and [calculateSlowNotifications] = false, then we will copy the slow notification state from it + * @param calculateSlowNotifications If true, calculate the true slow notification state (this is not main-thread safe). Otherwise, it will copy from + * [currentState] or default to false. + */ + private fun getState(currentState: NotificationsSettingsState? = null, calculateSlowNotifications: Boolean = false): NotificationsSettingsState = NotificationsSettingsState( messageNotificationsState = MessageNotificationsState( - notificationsEnabled = SignalStore.settings().isMessageNotificationsEnabled, + notificationsEnabled = SignalStore.settings().isMessageNotificationsEnabled && canEnableNotifications(), + canEnableNotifications = canEnableNotifications(), sound = SignalStore.settings().messageNotificationSound, vibrateEnabled = SignalStore.settings().isMessageVibrateEnabled, ledColor = SignalStore.settings().messageLedColor, @@ -106,16 +119,33 @@ class NotificationsSettingsViewModel(private val sharedPreferences: SharedPrefer repeatAlerts = SignalStore.settings().messageNotificationsRepeatAlerts, messagePrivacy = SignalStore.settings().messageNotificationsPrivacy.toString(), priority = TextSecurePreferences.getNotificationPriority(ApplicationDependencies.getApplication()), - troubleshootNotifications = SlowNotificationHeuristics.isPotentiallyCausedByBatteryOptimizations() && SlowNotificationHeuristics.isHavingDelayedNotifications() + troubleshootNotifications = if (calculateSlowNotifications) { + SlowNotificationHeuristics.isPotentiallyCausedByBatteryOptimizations() && SlowNotificationHeuristics.isHavingDelayedNotifications() + } else if (currentState != null) { + currentState.messageNotificationsState.troubleshootNotifications + } else { + false + } ), callNotificationsState = CallNotificationsState( - notificationsEnabled = SignalStore.settings().isCallNotificationsEnabled, + notificationsEnabled = SignalStore.settings().isCallNotificationsEnabled && canEnableNotifications(), + canEnableNotifications = canEnableNotifications(), ringtone = SignalStore.settings().callRingtone, vibrateEnabled = SignalStore.settings().isCallVibrateEnabled ), notifyWhenContactJoinsSignal = SignalStore.settings().isNotifyWhenContactJoinsSignal ) + private fun canEnableNotifications(): Boolean { + val areNotificationsDisabledBySystem = Build.VERSION.SDK_INT >= 26 && ( + !NotificationChannels.getInstance().isMessageChannelEnabled || + !NotificationChannels.getInstance().isMessagesChannelGroupEnabled || + !NotificationChannels.getInstance().areNotificationsEnabled() + ) + + return !areNotificationsDisabledBySystem + } + class Factory(private val sharedPreferences: SharedPreferences) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return requireNotNull(modelClass.cast(NotificationsSettingsViewModel(sharedPreferences))) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt index b10192ca..3061510c 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt @@ -7,9 +7,12 @@ import androidx.navigation.fragment.findNavController import com.google.android.material.snackbar.Snackbar import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.concurrent.LifecycleDisposable +import org.signal.core.util.logging.Log import org.tm.archive.R import org.tm.archive.components.settings.DSLConfiguration import org.tm.archive.components.settings.DSLSettingsFragment +import org.tm.archive.components.settings.DSLSettingsIcon +import org.tm.archive.components.settings.DSLSettingsText import org.tm.archive.components.settings.app.notifications.profiles.models.NotificationProfileAddMembers import org.tm.archive.components.settings.app.notifications.profiles.models.NotificationProfileRecipient import org.tm.archive.components.settings.configure @@ -93,6 +96,32 @@ class AddAllowedMembersFragment : DSLSettingsFragment(layoutId = R.layout.fragme ) ) } + + sectionHeaderPref(R.string.AddAllowedMembers__exceptions) + + switchPref( + title = DSLSettingsText.from(R.string.AddAllowedMembers__allow_all_calls), + icon = DSLSettingsIcon.from(R.drawable.symbol_phone_24), + isChecked = profile.allowAllCalls, + onClick = { + lifecycleDisposable += viewModel.toggleAllowAllCalls() + .subscribeBy( + onError = { Log.w(TAG, "Error updating profile", it) } + ) + } + ) + + switchPref( + title = DSLSettingsText.from(R.string.AddAllowedMembers__notify_for_all_mentions), + icon = DSLSettingsIcon.from(R.drawable.symbol_at_24), + isChecked = profile.allowAllMentions, + onClick = { + lifecycleDisposable += viewModel.toggleAllowAllMentions() + .subscribeBy( + onError = { Log.w(TAG, "Error updating profile", it) } + ) + } + ) } } @@ -100,4 +129,8 @@ class AddAllowedMembersFragment : DSLSettingsFragment(layoutId = R.layout.fragme lifecycleDisposable += viewModel.addMember(id) .subscribe() } + + companion object { + private val TAG = Log.tag(AddAllowedMembersFragment::class.java) + } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersViewModel.kt index c81e5fd9..1bf9aaa7 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/AddAllowedMembersViewModel.kt @@ -30,6 +30,16 @@ class AddAllowedMembersViewModel(private val profileId: Long, private val reposi .observeOn(AndroidSchedulers.mainThread()) } + fun toggleAllowAllMentions(): Single { + return repository.toggleAllowAllMentions(profileId) + .observeOn(AndroidSchedulers.mainThread()) + } + + fun toggleAllowAllCalls(): Single { + return repository.toggleAllowAllCalls(profileId) + .observeOn(AndroidSchedulers.mainThread()) + } + data class NotificationProfileAndRecipients(val profile: NotificationProfile, val recipients: List) class Factory(private val profileId: Long) : ViewModelProvider.Factory { diff --git a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfileDetailsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfileDetailsViewModel.kt index 6393faec..ea97ae01 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfileDetailsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfileDetailsViewModel.kt @@ -9,7 +9,6 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy -import org.tm.archive.database.NotificationProfileDatabase import org.tm.archive.notifications.profiles.NotificationProfile import org.tm.archive.notifications.profiles.NotificationProfiles import org.tm.archive.recipients.Recipient @@ -84,20 +83,12 @@ class NotificationProfileDetailsViewModel(private val profileId: Long, private v } fun toggleAllowAllMentions(): Single { - return repository.getProfile(profileId) - .take(1) - .singleOrError() - .flatMap { repository.updateProfile(it.copy(allowAllMentions = !it.allowAllMentions)) } - .map { (it as NotificationProfileDatabase.NotificationProfileChangeResult.Success).notificationProfile } + return repository.toggleAllowAllMentions(profileId) .observeOn(AndroidSchedulers.mainThread()) } fun toggleAllowAllCalls(): Single { - return repository.getProfile(profileId) - .take(1) - .singleOrError() - .flatMap { repository.updateProfile(it.copy(allowAllCalls = !it.allowAllCalls)) } - .map { (it as NotificationProfileDatabase.NotificationProfileChangeResult.Success).notificationProfile } + return repository.toggleAllowAllCalls(profileId) .observeOn(AndroidSchedulers.mainThread()) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfilesRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfilesRepository.kt index d6118fd0..a8c39e1b 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfilesRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/notifications/profiles/NotificationProfilesRepository.kt @@ -94,6 +94,22 @@ class NotificationProfilesRepository { .subscribeOn(Schedulers.io()) } + fun toggleAllowAllMentions(profileId: Long): Single { + return getProfile(profileId) + .take(1) + .singleOrError() + .flatMap { updateProfile(it.copy(allowAllMentions = !it.allowAllMentions)) } + .map { (it as NotificationProfileDatabase.NotificationProfileChangeResult.Success).notificationProfile } + } + + fun toggleAllowAllCalls(profileId: Long): Single { + return getProfile(profileId) + .take(1) + .singleOrError() + .flatMap { updateProfile(it.copy(allowAllCalls = !it.allowAllCalls)) } + .map { (it as NotificationProfileDatabase.NotificationProfileChangeResult.Success).notificationProfile } + } + fun manuallyToggleProfile(profile: NotificationProfile, now: Long = System.currentTimeMillis()): Completable { return manuallyToggleProfile(profile.id, profile.schedule, now) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/privacy/PrivacySettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/privacy/PrivacySettingsFragment.kt index 45210c0b..32cdfed8 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/privacy/PrivacySettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/privacy/PrivacySettingsFragment.kt @@ -313,8 +313,7 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac dividerPref() - //**TM_SA**//start comment payment - /*sectionHeaderPref(R.string.preferences_app_protection__payments) + sectionHeaderPref(R.string.preferences_app_protection__payments) switchPref( title = DSLSettingsText.from(R.string.preferences__payment_lock), @@ -331,8 +330,7 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac } ) - dividerPref()*/ - //**TM_SA**//end + dividerPref() clickPref( title = DSLSettingsText.from(R.string.preferences__advanced), diff --git a/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt index 12974b6e..81f5e0ff 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt @@ -25,8 +25,6 @@ import org.signal.core.ui.Texts import org.tm.archive.R import org.tm.archive.compose.ComposeFragment import org.tm.archive.compose.StatusBarColorNestedScrollConnection -import org.tm.archive.keyvalue.PhoneNumberPrivacyValues.PhoneNumberListingMode -import org.tm.archive.keyvalue.PhoneNumberPrivacyValues.PhoneNumberSharingMode class PhoneNumberPrivacySettingsFragment : ComposeFragment() { @@ -67,7 +65,7 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() { item { Rows.RadioRow( - selected = state.seeMyPhoneNumber == PhoneNumberSharingMode.EVERYONE, + selected = state.phoneNumberSharing, text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), modifier = Modifier.clickable(onClick = viewModel::setEveryoneCanSeeMyNumber) ) @@ -75,7 +73,7 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() { item { Rows.RadioRow( - selected = state.seeMyPhoneNumber == PhoneNumberSharingMode.NOBODY, + selected = !state.phoneNumberSharing, text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), modifier = Modifier.clickable(onClick = viewModel::setNobodyCanSeeMyNumber) ) @@ -84,10 +82,10 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() { item { Text( text = stringResource( - id = when (state.seeMyPhoneNumber) { - PhoneNumberSharingMode.EVERYONE -> R.string.PhoneNumberPrivacySettingsFragment__your_phone_number - PhoneNumberSharingMode.NOBODY -> R.string.PhoneNumberPrivacySettingsFragment__nobody_will_see - else -> error("Unexpected state $state") + id = if (state.phoneNumberSharing) { + R.string.PhoneNumberPrivacySettingsFragment__your_phone_number + } else { + R.string.PhoneNumberPrivacySettingsFragment__nobody_will_see } ), style = MaterialTheme.typography.bodyMedium, @@ -106,16 +104,16 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() { item { Rows.RadioRow( - selected = state.findMeByPhoneNumber == PhoneNumberListingMode.LISTED, + selected = state.discoverableByPhoneNumber, text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), modifier = Modifier.clickable(onClick = viewModel::setEveryoneCanFindMeByMyNumber) ) } - if (state.seeMyPhoneNumber == PhoneNumberSharingMode.NOBODY) { + if (!state.phoneNumberSharing) { item { Rows.RadioRow( - selected = state.findMeByPhoneNumber == PhoneNumberListingMode.UNLISTED, + selected = !state.discoverableByPhoneNumber, text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), modifier = Modifier.clickable(onClick = viewModel::setNobodyCanFindMeByMyNumber) ) @@ -125,9 +123,10 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() { item { Text( text = stringResource( - id = when (state.findMeByPhoneNumber) { - PhoneNumberListingMode.UNLISTED -> R.string.WhoCanSeeMyPhoneNumberFragment__nobody_on_signal - PhoneNumberListingMode.LISTED -> R.string.WhoCanSeeMyPhoneNumberFragment__anyone_who_has + id = if (state.discoverableByPhoneNumber) { + R.string.WhoCanSeeMyPhoneNumberFragment__anyone_who_has + } else { + R.string.WhoCanSeeMyPhoneNumberFragment__nobody_on_signal } ), style = MaterialTheme.typography.bodyMedium, diff --git a/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsState.kt b/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsState.kt index f873d794..6c30b7a3 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsState.kt @@ -1,8 +1,6 @@ package org.tm.archive.components.settings.app.privacy.pnp -import org.tm.archive.keyvalue.PhoneNumberPrivacyValues - data class PhoneNumberPrivacySettingsState( - val seeMyPhoneNumber: PhoneNumberPrivacyValues.PhoneNumberSharingMode, - val findMeByPhoneNumber: PhoneNumberPrivacyValues.PhoneNumberListingMode + val phoneNumberSharing: Boolean, + val discoverableByPhoneNumber: Boolean ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt index 57273f45..8993dd32 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import org.tm.archive.database.SignalDatabase import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.jobs.ProfileUploadJob import org.tm.archive.jobs.RefreshAttributesJob import org.tm.archive.jobs.RefreshOwnProfileJob import org.tm.archive.keyvalue.PhoneNumberPrivacyValues.PhoneNumberListingMode @@ -17,39 +18,40 @@ class PhoneNumberPrivacySettingsViewModel : ViewModel() { private val _state = mutableStateOf( PhoneNumberPrivacySettingsState( - seeMyPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberSharingMode, - findMeByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberListingMode + phoneNumberSharing = SignalStore.phoneNumberPrivacy().isPhoneNumberSharingEnabled, + discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().isDiscoverableByPhoneNumber ) ) val state: State = _state fun setNobodyCanSeeMyNumber() { - setPhoneNumberSharingMode(PhoneNumberSharingMode.NOBODY) + setPhoneNumberSharingEnabled(false) } fun setEveryoneCanSeeMyNumber() { - setPhoneNumberSharingMode(PhoneNumberSharingMode.EVERYONE) - setPhoneNumberListingMode(PhoneNumberListingMode.LISTED) + setPhoneNumberSharingEnabled(true) + setDiscoverableByPhoneNumber(true) } fun setNobodyCanFindMeByMyNumber() { - setPhoneNumberListingMode(PhoneNumberListingMode.UNLISTED) + setDiscoverableByPhoneNumber(false) } fun setEveryoneCanFindMeByMyNumber() { - setPhoneNumberListingMode(PhoneNumberListingMode.LISTED) + setDiscoverableByPhoneNumber(true) } - private fun setPhoneNumberSharingMode(phoneNumberSharingMode: PhoneNumberSharingMode) { - SignalStore.phoneNumberPrivacy().phoneNumberSharingMode = phoneNumberSharingMode + private fun setPhoneNumberSharingEnabled(phoneNumberSharingEnabled: Boolean) { + SignalStore.phoneNumberPrivacy().phoneNumberSharingMode = if (phoneNumberSharingEnabled) PhoneNumberSharingMode.EVERYBODY else PhoneNumberSharingMode.NOBODY SignalDatabase.recipients.markNeedsSync(Recipient.self().id) StorageSyncHelper.scheduleSyncForDataChange() + ApplicationDependencies.getJobManager().add(ProfileUploadJob()) refresh() } - private fun setPhoneNumberListingMode(phoneNumberListingMode: PhoneNumberListingMode) { - SignalStore.phoneNumberPrivacy().phoneNumberListingMode = phoneNumberListingMode + private fun setDiscoverableByPhoneNumber(discoverable: Boolean) { + SignalStore.phoneNumberPrivacy().phoneNumberListingMode = if (discoverable) PhoneNumberListingMode.LISTED else PhoneNumberListingMode.UNLISTED StorageSyncHelper.scheduleSyncForDataChange() ApplicationDependencies.getJobManager().startChain(RefreshAttributesJob()).then(RefreshOwnProfileJob()).enqueue() refresh() @@ -57,8 +59,8 @@ class PhoneNumberPrivacySettingsViewModel : ViewModel() { fun refresh() { _state.value = PhoneNumberPrivacySettingsState( - seeMyPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberSharingMode, - findMeByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberListingMode + phoneNumberSharing = SignalStore.phoneNumberPrivacy().isPhoneNumberSharingEnabled, + discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().isDiscoverableByPhoneNumber ) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/BadgeImage.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/BadgeImage.kt new file mode 100644 index 00000000..9f187c96 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/BadgeImage.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.viewinterop.AndroidView +import org.tm.archive.badges.BadgeImageView +import org.tm.archive.badges.models.Badge + +enum class BadgeImageSize(val sizeCode: Int) { + SMALL(0), + MEDIUM(1), + LARGE(2), + X_LARGE(3), + BADGE_64(4), + BADGE_112(5) +} + +@Composable +fun BadgeImage112( + badge: Badge?, + modifier: Modifier = Modifier +) { + if (LocalInspectionMode.current) { + Box(modifier = modifier.background(color = Color.Black, shape = CircleShape)) + } else { + AndroidView( + factory = { + BadgeImageView(it, BadgeImageSize.BADGE_112) + }, + update = { + it.setBadge(badge) + }, + modifier = modifier + ) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationPendingBottomSheet.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationPendingBottomSheet.kt new file mode 100644 index 00000000..848ab32f --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationPendingBottomSheet.kt @@ -0,0 +1,153 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription + +import android.content.DialogInterface +import android.net.Uri +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import org.signal.core.ui.BottomSheets +import org.signal.core.ui.Buttons +import org.signal.core.ui.Texts +import org.signal.core.ui.theme.SignalTheme +import org.tm.archive.R +import org.tm.archive.badges.models.Badge +import org.tm.archive.components.settings.app.AppSettingsActivity +import org.tm.archive.components.settings.app.subscription.donate.DonateToSignalType +import org.tm.archive.compose.ComposeBottomSheetDialogFragment +import org.tm.archive.util.CommunicationActions +import org.tm.archive.util.SpanUtil + +/** + * Displayed after the user completes the donation flow for a bank transfer. + */ +class DonationPendingBottomSheet : ComposeBottomSheetDialogFragment() { + + private val args: DonationPendingBottomSheetArgs by navArgs() + + @Composable + override fun SheetContent() { + DonationPendingBottomSheetContent( + badge = args.request.badge, + onDoneClick = this::onDoneClick + ) + } + + private fun onDoneClick() { + dismissAllowingStateLoss() + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + + if (args.request.donateToSignalType == DonateToSignalType.ONE_TIME) { + findNavController().popBackStack() + } else { + requireActivity().finish() + requireActivity().startActivity(AppSettingsActivity.manageSubscriptions(requireContext())) + } + } +} + +@Preview +@Composable +fun DonationPendingBottomSheetContentPreview() { + SignalTheme { + Surface { + DonationPendingBottomSheetContent( + badge = Badge( + id = "", + category = Badge.Category.Donor, + name = "Signal Star", + description = "", + imageUrl = Uri.EMPTY, + imageDensity = "", + expirationTimestamp = 0L, + visible = true, + duration = 0L + ), + onDoneClick = {} + ) + } + } +} + +@Composable +private fun DonationPendingBottomSheetContent( + badge: Badge, + onDoneClick: () -> Unit +) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(horizontal = 44.dp) + ) { + BottomSheets.Handle() + + BadgeImage112( + badge = badge, + modifier = Modifier + .padding(top = 21.dp, bottom = 16.dp) + .size(80.dp) + ) + + Text( + text = stringResource(id = R.string.DonationPendingBottomSheet__donation_pending), + textAlign = TextAlign.Center, + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.padding(bottom = 8.dp) + ) + + val textResource = if (badge.isSubscription()) { + R.string.DonationPendingBottomSheet__your_monthly_donation_is_pending + } else { + R.string.DonationPendingBottomSheet__your_one_time_donation_is_pending + } + + Text( + text = stringResource(id = textResource, badge.name), + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = 20.dp) + ) + + val context = LocalContext.current + val learnMore = stringResource(id = R.string.DonationPendingBottomSheet__learn_more) + val fullString = stringResource(id = R.string.DonationPendingBottomSheet__bank_transfers_usually_take, learnMore) + val spanned = SpanUtil.urlSubsequence(fullString, learnMore, stringResource(id = R.string.pending_transfer_url)) + Texts.LinkifiedText( + textWithUrlSpans = spanned, + onUrlClick = { CommunicationActions.openBrowserLink(context, it) }, + style = LocalTextStyle.current.copy(textAlign = TextAlign.Center, color = MaterialTheme.colorScheme.onSurfaceVariant), + modifier = Modifier.padding(bottom = 48.dp) + ) + + Buttons.LargeTonal( + onClick = onDoneClick, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(bottom = 56.dp) + ) { + Text(text = stringResource(id = R.string.DonationPendingBottomSheet__done)) + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationSerializationHelper.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationSerializationHelper.kt new file mode 100644 index 00000000..3f5a1876 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationSerializationHelper.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription + +import okio.ByteString +import org.signal.core.util.money.FiatMoney +import org.signal.donations.PaymentSourceType +import org.tm.archive.badges.Badges +import org.tm.archive.badges.models.Badge +import org.tm.archive.database.model.databaseprotos.DecimalValue +import org.tm.archive.database.model.databaseprotos.FiatValue +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import java.math.BigDecimal +import java.math.BigInteger +import java.math.MathContext +import java.util.Currency + +object DonationSerializationHelper { + fun createPendingOneTimeDonationProto( + badge: Badge, + paymentSourceType: PaymentSourceType, + amount: FiatMoney + ): PendingOneTimeDonation { + return PendingOneTimeDonation( + badge = Badges.toDatabaseBadge(badge), + paymentMethodType = when (paymentSourceType) { + PaymentSourceType.PayPal -> PendingOneTimeDonation.PaymentMethodType.PAYPAL + PaymentSourceType.Stripe.CreditCard, PaymentSourceType.Stripe.GooglePay, PaymentSourceType.Unknown -> PendingOneTimeDonation.PaymentMethodType.CARD + PaymentSourceType.Stripe.SEPADebit -> PendingOneTimeDonation.PaymentMethodType.SEPA_DEBIT + PaymentSourceType.Stripe.IDEAL -> PendingOneTimeDonation.PaymentMethodType.IDEAL + }, + amount = amount.toFiatValue(), + timestamp = System.currentTimeMillis() + ) + } + + fun FiatValue.toFiatMoney(): FiatMoney { + return FiatMoney( + amount!!.toBigDecimal(), + Currency.getInstance(currencyCode) + ) + } + + fun DecimalValue.toBigDecimal(): BigDecimal { + return BigDecimal( + BigInteger(value_.toByteArray()), + scale, + MathContext(precision) + ) + } + + fun FiatMoney.toFiatValue(): FiatValue { + return FiatValue( + currencyCode = currency.currencyCode, + amount = amount.toDecimalValue() + ) + } + + fun BigDecimal.toDecimalValue(): DecimalValue { + return DecimalValue( + scale = scale(), + precision = precision(), + value_ = ByteString.of(*this.unscaledValue().toByteArray()) + ) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationsConfigurationExtensions.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationsConfigurationExtensions.kt index 9fb31d6f..1f54422e 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationsConfigurationExtensions.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/DonationsConfigurationExtensions.kt @@ -14,6 +14,7 @@ import java.util.Currency private const val CARD = "CARD" private const val PAYPAL = "PAYPAL" +private const val SEPA_DEBIT = "SEPA_DEBIT" /** * Transforms the DonationsConfiguration into a Set which has been properly filtered @@ -116,6 +117,7 @@ private fun DonationsConfiguration.getFilteredCurrencies(paymentMethodAvailabili interface PaymentMethodAvailability { fun isPayPalAvailable(): Boolean fun isGooglePayOrCreditCardAvailable(): Boolean + fun isSEPADebitAvailable(): Boolean fun toSet(): Set { val set = mutableSetOf() @@ -127,6 +129,10 @@ interface PaymentMethodAvailability { set.add(CARD) } + if (isSEPADebitAvailable()) { + set.add(SEPA_DEBIT) + } + return set } } @@ -134,4 +140,5 @@ interface PaymentMethodAvailability { private object DefaultPaymentMethodAvailability : PaymentMethodAvailability { override fun isPayPalAvailable(): Boolean = InAppDonations.isPayPalAvailable() override fun isGooglePayOrCreditCardAvailable(): Boolean = InAppDonations.isCreditCardAvailable() || InAppDonations.isGooglePayAvailable() + override fun isSEPADebitAvailable(): Boolean = InAppDonations.isSEPADebitAvailable() } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/InAppDonations.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/InAppDonations.kt index 223ad92f..3b9b7870 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/InAppDonations.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/InAppDonations.kt @@ -3,6 +3,7 @@ package org.tm.archive.components.settings.app.subscription import org.signal.donations.PaymentSourceType import org.tm.archive.components.settings.app.subscription.donate.DonateToSignalType import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.util.Environment import org.tm.archive.util.FeatureFlags import org.tm.archive.util.LocaleFeatureFlags @@ -16,10 +17,11 @@ object InAppDonations { * * - Able to use Credit Cards and is in a region where they are able to be accepted. * - Able to access Google Play services (and thus possibly able to use Google Pay). + * - Able to use SEPA Debit and is in a region where they are able to be accepted. * - Able to use PayPal and is in a region where it is able to be accepted. */ fun hasAtLeastOnePaymentMethodAvailable(): Boolean { - return isCreditCardAvailable() || isPayPalAvailable() || isGooglePayAvailable() + return isCreditCardAvailable() || isPayPalAvailable() || isGooglePayAvailable() || isSEPADebitAvailable() || isIDEALAvailable() } fun isPaymentSourceAvailable(paymentSourceType: PaymentSourceType, donateToSignalType: DonateToSignalType): Boolean { @@ -27,6 +29,8 @@ object InAppDonations { PaymentSourceType.PayPal -> isPayPalAvailableForDonateToSignalType(donateToSignalType) PaymentSourceType.Stripe.CreditCard -> isCreditCardAvailable() PaymentSourceType.Stripe.GooglePay -> isGooglePayAvailable() + PaymentSourceType.Stripe.SEPADebit -> isSEPADebitAvailableForDonateToSignalType(donateToSignalType) + PaymentSourceType.Stripe.IDEAL -> isIDEALAvailbleForDonateToSignalType(donateToSignalType) PaymentSourceType.Unknown -> false } } @@ -42,7 +46,7 @@ object InAppDonations { * Whether the user is in a region that supports credit cards, based off local phone number. */ fun isCreditCardAvailable(): Boolean { - return /*!LocaleFeatureFlags.isCreditCardDisabled()*/false //**TM_SA**// + return !LocaleFeatureFlags.isCreditCardDisabled() } /** @@ -58,4 +62,34 @@ object InAppDonations { fun isGooglePayAvailable(): Boolean { return SignalStore.donationsValues().isGooglePayReady && !LocaleFeatureFlags.isGooglePayDisabled() } + + /** + * Whether the user is in a region which supports SEPA Debit transfers, based off local phone number. + */ + fun isSEPADebitAvailable(): Boolean { + return Environment.IS_STAGING || (FeatureFlags.sepaDebitDonations() && LocaleFeatureFlags.isSepaEnabled()) + } + + /** + * Whether the user is in a region which supports IDEAL transfers, based off local phone number. + */ + fun isIDEALAvailable(): Boolean { + return Environment.IS_STAGING || (FeatureFlags.idealDonations() && LocaleFeatureFlags.isIdealEnabled()) + } + + /** + * Whether the user is in a region which supports SEPA Debit transfers, based off local phone number + * and donation type. + */ + fun isSEPADebitAvailableForDonateToSignalType(donateToSignalType: DonateToSignalType): Boolean { + return donateToSignalType != DonateToSignalType.GIFT && isSEPADebitAvailable() + } + + /** + * Whether the user is in a region which suports IDEAL transfers, based off local phone number and + * donation type + */ + fun isIDEALAvailbleForDonateToSignalType(donateToSignalType: DonateToSignalType): Boolean { + return donateToSignalType != DonateToSignalType.GIFT && isIDEALAvailable() + } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/MonthlyDonationRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/MonthlyDonationRepository.kt index ffbaab14..b8b76e67 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/MonthlyDonationRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/MonthlyDonationRepository.kt @@ -5,9 +5,11 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.logging.Log import org.tm.archive.badges.Badges +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest import org.tm.archive.components.settings.app.subscription.errors.DonationError import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource import org.tm.archive.database.SignalDatabase +import org.tm.archive.database.model.databaseprotos.TerminalDonationQueue import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.jobmanager.JobTracker import org.tm.archive.jobs.MultiDeviceSubscriptionSyncRequestJob @@ -79,9 +81,29 @@ class MonthlyDonationRepository(private val donationsService: DonationsService) }.subscribeOn(Schedulers.io()) } - fun ensureSubscriberId(): Completable { - Log.d(TAG, "Ensuring SubscriberId exists on Signal service...", true) - val subscriberId = SignalStore.donationsValues().getSubscriber()?.subscriberId ?: SubscriberId.generate() + /** + * Since PayPal and Stripe can't interoperate, we need to be able to rotate the subscriber ID + * in case of failures. + */ + fun rotateSubscriberId(): Completable { + Log.d(TAG, "Rotating SubscriberId due to alternate payment processor...", true) + val cancelCompletable: Completable = if (SignalStore.donationsValues().getSubscriber() != null) { + cancelActiveSubscription().andThen(updateLocalSubscriptionStateAndScheduleDataSync()) + } else { + Completable.complete() + } + + return cancelCompletable.andThen(ensureSubscriberId(isRotation = true)) + } + + fun ensureSubscriberId(isRotation: Boolean = false): Completable { + Log.d(TAG, "Ensuring SubscriberId exists on Signal service {isRotation?$isRotation}...", true) + val subscriberId: SubscriberId = if (isRotation) { + SubscriberId.generate() + } else { + SignalStore.donationsValues().getSubscriber()?.subscriberId ?: SubscriberId.generate() + } + return Single .fromCallable { donationsService.putSubscription(subscriberId) @@ -127,7 +149,10 @@ class MonthlyDonationRepository(private val donationsService: DonationsService) } } - fun setSubscriptionLevel(subscriptionLevel: String): Completable { + fun setSubscriptionLevel(gatewayRequest: GatewayRequest, isLongRunning: Boolean): Completable { + val subscriptionLevel = gatewayRequest.level.toString() + val uiSessionKey = gatewayRequest.uiSessionKey + return getOrCreateLevelUpdateOperation(subscriptionLevel) .flatMapCompletable { levelUpdateOperation -> val subscriber = SignalStore.donationsValues().requireSubscriber() @@ -166,13 +191,24 @@ class MonthlyDonationRepository(private val donationsService: DonationsService) val countDownLatch = CountDownLatch(1) var finalJobState: JobTracker.JobState? = null - SubscriptionReceiptRequestResponseJob.createSubscriptionContinuationJobChain().enqueue { _, jobState -> + val terminalDonation = TerminalDonationQueue.TerminalDonation( + level = gatewayRequest.level, + isLongRunningPaymentMethod = isLongRunning + ) + + SubscriptionReceiptRequestResponseJob.createSubscriptionContinuationJobChain(uiSessionKey, terminalDonation).enqueue { _, jobState -> if (jobState.isComplete) { finalJobState = jobState countDownLatch.countDown() } } + val timeoutError: DonationError = if (isLongRunning) { + DonationError.donationPending(DonationErrorSource.MONTHLY, gatewayRequest) + } else { + DonationError.timeoutWaitingForToken(DonationErrorSource.MONTHLY) + } + try { if (countDownLatch.await(10, TimeUnit.SECONDS)) { when (finalJobState) { @@ -182,20 +218,20 @@ class MonthlyDonationRepository(private val donationsService: DonationsService) } JobTracker.JobState.FAILURE -> { Log.d(TAG, "Subscription request response job chain failed permanently.", true) - it.onError(DonationError.genericBadgeRedemptionFailure(DonationErrorSource.SUBSCRIPTION)) + it.onError(DonationError.genericBadgeRedemptionFailure(DonationErrorSource.MONTHLY)) } else -> { Log.d(TAG, "Subscription request response job chain ignored due to in-progress jobs.", true) - it.onError(DonationError.timeoutWaitingForToken(DonationErrorSource.SUBSCRIPTION)) + it.onError(timeoutError) } } } else { Log.d(TAG, "Subscription request response job timed out.", true) - it.onError(DonationError.timeoutWaitingForToken(DonationErrorSource.SUBSCRIPTION)) + it.onError(timeoutError) } } catch (e: InterruptedException) { Log.w(TAG, "Subscription request response interrupted.", e, true) - it.onError(DonationError.timeoutWaitingForToken(DonationErrorSource.SUBSCRIPTION)) + it.onError(timeoutError) } } }.doOnError { @@ -204,22 +240,42 @@ class MonthlyDonationRepository(private val donationsService: DonationsService) } private fun getOrCreateLevelUpdateOperation(subscriptionLevel: String): Single = Single.fromCallable { - Log.d(TAG, "Retrieving level update operation for $subscriptionLevel") - val levelUpdateOperation = SignalStore.donationsValues().getLevelOperation(subscriptionLevel) - if (levelUpdateOperation == null) { - val newOperation = LevelUpdateOperation( - idempotencyKey = IdempotencyKey.generate(), - level = subscriptionLevel - ) + getOrCreateLevelUpdateOperation(TAG, subscriptionLevel) + } - SignalStore.donationsValues().setLevelOperation(newOperation) - LevelUpdate.updateProcessingState(true) - Log.d(TAG, "Created a new operation for $subscriptionLevel") - newOperation - } else { - LevelUpdate.updateProcessingState(true) - Log.d(TAG, "Reusing operation for $subscriptionLevel") - levelUpdateOperation + companion object { + fun getOrCreateLevelUpdateOperation(tag: String, subscriptionLevel: String): LevelUpdateOperation { + Log.d(tag, "Retrieving level update operation for $subscriptionLevel") + val levelUpdateOperation = SignalStore.donationsValues().getLevelOperation(subscriptionLevel) + return if (levelUpdateOperation == null) { + val newOperation = LevelUpdateOperation( + idempotencyKey = IdempotencyKey.generate(), + level = subscriptionLevel + ) + + SignalStore.donationsValues().setLevelOperation(newOperation) + LevelUpdate.updateProcessingState(true) + Log.d(tag, "Created a new operation for $subscriptionLevel") + newOperation + } else { + LevelUpdate.updateProcessingState(true) + Log.d(tag, "Reusing operation for $subscriptionLevel") + levelUpdateOperation + } + } + } + + /** + * Update local state information and schedule a storage sync for the change. This method + * assumes you've already properly called the DELETE method for the stored ID on the server. + */ + private fun updateLocalSubscriptionStateAndScheduleDataSync(): Completable { + return Completable.fromAction { + Log.d(TAG, "Marking subscription cancelled...", true) + SignalStore.donationsValues().updateLocalStateForManualCancellation() + MultiDeviceSubscriptionSyncRequestJob.enqueue() + SignalDatabase.recipients.markNeedsSync(Recipient.self().id) + StorageSyncHelper.scheduleSyncForDataChange() } } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/OneTimeDonationRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/OneTimeDonationRepository.kt index d028a623..e818b350 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/OneTimeDonationRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/OneTimeDonationRepository.kt @@ -8,14 +8,17 @@ import org.signal.core.util.money.FiatMoney import org.signal.donations.PaymentSourceType import org.tm.archive.badges.models.Badge import org.tm.archive.components.settings.app.subscription.boost.Boost +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest import org.tm.archive.components.settings.app.subscription.errors.DonationError import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource import org.tm.archive.database.RecipientTable import org.tm.archive.database.SignalDatabase import org.tm.archive.database.model.DonationReceiptRecord +import org.tm.archive.database.model.databaseprotos.TerminalDonationQueue import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.jobmanager.JobTracker import org.tm.archive.jobs.BoostReceiptRequestResponseJob +import org.tm.archive.keyvalue.SignalStore import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientId import org.tm.archive.util.ProfileUtil @@ -38,7 +41,7 @@ class OneTimeDonationRepository(private val donationsService: DonationsService) Single.error(throwable) } else { val recipient = Recipient.resolved(badgeRecipient) - val errorSource = if (recipient.isSelf) DonationErrorSource.BOOST else DonationErrorSource.GIFT + val errorSource = if (recipient.isSelf) DonationErrorSource.ONE_TIME else DonationErrorSource.GIFT Single.error(DonationError.getPaymentSetupError(errorSource, throwable, paymentSourceType)) } } @@ -106,21 +109,20 @@ class OneTimeDonationRepository(private val donationsService: DonationsService) } fun waitForOneTimeRedemption( - price: FiatMoney, + gatewayRequest: GatewayRequest, paymentIntentId: String, - badgeRecipient: RecipientId, - additionalMessage: String?, - badgeLevel: Long, - donationProcessor: DonationProcessor + donationProcessor: DonationProcessor, + paymentSourceType: PaymentSourceType ): Completable { - val isBoost = badgeRecipient == Recipient.self().id - val donationErrorSource: DonationErrorSource = if (isBoost) DonationErrorSource.BOOST else DonationErrorSource.GIFT + val isLongRunning = paymentSourceType == PaymentSourceType.Stripe.SEPADebit + val isBoost = gatewayRequest.recipientId == Recipient.self().id + val donationErrorSource: DonationErrorSource = if (isBoost) DonationErrorSource.ONE_TIME else DonationErrorSource.GIFT val waitOnRedemption = Completable.create { val donationReceiptRecord = if (isBoost) { - DonationReceiptRecord.createForBoost(price) + DonationReceiptRecord.createForBoost(gatewayRequest.fiat) } else { - DonationReceiptRecord.createForGift(price) + DonationReceiptRecord.createForGift(gatewayRequest.fiat) } val donationTypeLabel = donationReceiptRecord.type.code.replaceFirstChar { c -> if (c.isLowerCase()) c.titlecase(Locale.US) else c.toString() } @@ -128,12 +130,25 @@ class OneTimeDonationRepository(private val donationsService: DonationsService) Log.d(TAG, "Confirmed payment intent. Recording $donationTypeLabel receipt and submitting badge reimbursement job chain.", true) SignalDatabase.donationReceipts.addReceipt(donationReceiptRecord) + SignalStore.donationsValues().setPendingOneTimeDonation( + DonationSerializationHelper.createPendingOneTimeDonationProto( + gatewayRequest.badge, + paymentSourceType, + gatewayRequest.fiat + ) + ) + + val terminalDonation = TerminalDonationQueue.TerminalDonation( + level = gatewayRequest.level, + isLongRunningPaymentMethod = isLongRunning + ) + val countDownLatch = CountDownLatch(1) var finalJobState: JobTracker.JobState? = null val chain = if (isBoost) { - BoostReceiptRequestResponseJob.createJobChainForBoost(paymentIntentId, donationProcessor) + BoostReceiptRequestResponseJob.createJobChainForBoost(paymentIntentId, donationProcessor, gatewayRequest.uiSessionKey, terminalDonation) } else { - BoostReceiptRequestResponseJob.createJobChainForGift(paymentIntentId, badgeRecipient, additionalMessage, badgeLevel, donationProcessor) + BoostReceiptRequestResponseJob.createJobChainForGift(paymentIntentId, gatewayRequest.recipientId, gatewayRequest.additionalMessage, gatewayRequest.level, donationProcessor, gatewayRequest.uiSessionKey, terminalDonation) } chain.enqueue { _, jobState -> @@ -143,6 +158,12 @@ class OneTimeDonationRepository(private val donationsService: DonationsService) } } + val timeoutError: DonationError = if (isLongRunning) { + DonationError.donationPending(donationErrorSource, gatewayRequest) + } else { + DonationError.timeoutWaitingForToken(donationErrorSource) + } + try { if (countDownLatch.await(10, TimeUnit.SECONDS)) { when (finalJobState) { @@ -156,16 +177,16 @@ class OneTimeDonationRepository(private val donationsService: DonationsService) } else -> { Log.d(TAG, "$donationTypeLabel request response job chain ignored due to in-progress jobs.", true) - it.onError(DonationError.timeoutWaitingForToken(donationErrorSource)) + it.onError(timeoutError) } } } else { Log.d(TAG, "$donationTypeLabel job chain timed out waiting for job completion.", true) - it.onError(DonationError.timeoutWaitingForToken(donationErrorSource)) + it.onError(timeoutError) } } catch (e: InterruptedException) { Log.d(TAG, "$donationTypeLabel job chain interrupted", e, true) - it.onError(DonationError.timeoutWaitingForToken(donationErrorSource)) + it.onError(timeoutError) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/PayPalRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/PayPalRepository.kt index ac0306d5..99e50dcf 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/PayPalRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/PayPalRepository.kt @@ -29,6 +29,8 @@ class PayPalRepository(private val donationsService: DonationsService) { private val TAG = Log.tag(PayPalRepository::class.java) } + private val monthlyDonationRepository = MonthlyDonationRepository(donationsService) + fun createOneTimePaymentIntent( amount: FiatMoney, badgeRecipient: RecipientId, @@ -69,7 +71,12 @@ class PayPalRepository(private val donationsService: DonationsService) { }.flatMap { it.flattenResult() }.subscribeOn(Schedulers.io()) } - fun createPaymentMethod(): Single { + /** + * Creates the PaymentMethod via the Signal Service. Note that if the operation fails with a 409, + * it means that the PaymentMethod is already tied to a Stripe account. We can retry in this + * situation by simply deleting the old subscriber id on the service and replacing it. + */ + fun createPaymentMethod(retryOn409: Boolean = true): Single { return Single.fromCallable { donationsService.createPayPalPaymentMethod( Locale.getDefault(), @@ -77,7 +84,13 @@ class PayPalRepository(private val donationsService: DonationsService) { MONTHLY_RETURN_URL, CANCEL_URL ) - }.flatMap { it.flattenResult() }.subscribeOn(Schedulers.io()) + }.flatMap { serviceResponse -> + if (retryOn409 && serviceResponse.status == 409) { + monthlyDonationRepository.rotateSubscriberId().andThen(createPaymentMethod(retryOn409 = false)) + } else { + serviceResponse.flattenResult() + } + }.subscribeOn(Schedulers.io()) } fun setDefaultPaymentMethod(paymentMethodId: String): Completable { diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/StripeRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/StripeRepository.kt index bbe048d7..8d3ab69d 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/StripeRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/StripeRepository.kt @@ -47,6 +47,7 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str private val googlePayApi = GooglePayApi(activity, StripeApi.Gateway(Environment.Donations.STRIPE_CONFIGURATION), Environment.Donations.GOOGLE_PAY_CONFIGURATION) private val stripeApi = StripeApi(Environment.Donations.STRIPE_CONFIGURATION, this, this, ApplicationDependencies.getOkHttpClient()) + private val monthlyDonationRepository = MonthlyDonationRepository(ApplicationDependencies.getDonationsService()) fun isGooglePayAvailable(): Completable { return googlePayApi.queryIsReadyToPay() @@ -89,15 +90,17 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str badgeLevel: Long, paymentSourceType: PaymentSourceType ): Single { + check(paymentSourceType is PaymentSourceType.Stripe) + Log.d(TAG, "Creating payment intent for $price...", true) - return stripeApi.createPaymentIntent(price, badgeLevel) + return stripeApi.createPaymentIntent(price, badgeLevel, paymentSourceType) .onErrorResumeNext { OneTimeDonationRepository.handleCreatePaymentIntentError(it, badgeRecipient, paymentSourceType) } .flatMap { result -> val recipient = Recipient.resolved(badgeRecipient) - val errorSource = if (recipient.isSelf) DonationErrorSource.BOOST else DonationErrorSource.GIFT + val errorSource = if (recipient.isSelf) DonationErrorSource.ONE_TIME else DonationErrorSource.GIFT Log.d(TAG, "Created payment intent for $price.", true) when (result) { @@ -109,9 +112,12 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str }.subscribeOn(Schedulers.io()) } - fun createAndConfirmSetupIntent(paymentSource: StripeApi.PaymentSource): Single { + fun createAndConfirmSetupIntent( + paymentSource: StripeApi.PaymentSource, + paymentSourceType: PaymentSourceType.Stripe + ): Single { Log.d(TAG, "Continuing subscription setup...", true) - return stripeApi.createSetupIntent() + return stripeApi.createSetupIntent(paymentSourceType) .flatMap { result -> Log.d(TAG, "Retrieved SetupIntent, confirming...", true) stripeApi.confirmSetupIntent(paymentSource, result.setupIntent) @@ -124,7 +130,7 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str badgeRecipient: RecipientId ): Single { val isBoost = badgeRecipient == Recipient.self().id - val donationErrorSource: DonationErrorSource = if (isBoost) DonationErrorSource.BOOST else DonationErrorSource.GIFT + val donationErrorSource: DonationErrorSource = if (isBoost) DonationErrorSource.ONE_TIME else DonationErrorSource.GIFT Log.d(TAG, "Confirming payment intent...", true) return stripeApi.confirmPaymentIntent(paymentSource, paymentIntent) @@ -133,13 +139,13 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str } } - override fun fetchPaymentIntent(price: FiatMoney, level: Long): Single { + override fun fetchPaymentIntent(price: FiatMoney, level: Long, sourceType: PaymentSourceType.Stripe): Single { Log.d(TAG, "Fetching payment intent from Signal service for $price... (Locale.US minimum precision: ${price.minimumUnitPrecisionString})") return Single .fromCallable { ApplicationDependencies .getDonationsService() - .createDonationIntentWithAmount(price.minimumUnitPrecisionString, price.currency.currencyCode, level) + .createDonationIntentWithAmount(price.minimumUnitPrecisionString, price.currency.currencyCode, level, sourceType.paymentMethod) } .flatMap(ServiceResponse::flattenResult) .map { @@ -153,17 +159,32 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str } } - override fun fetchSetupIntent(): Single { - Log.d(TAG, "Fetching setup intent from Signal service...") + /** + * Creates the PaymentMethod via the Signal Service. Note that if the operation fails with a 409, + * it means that the PaymentMethod is already tied to a PayPal account. We can retry in this + * situation by simply deleting the old subscriber id on the service and replacing it. + */ + private fun createPaymentMethod(paymentSourceType: PaymentSourceType.Stripe, retryOn409: Boolean = true): Single { return Single.fromCallable { SignalStore.donationsValues().requireSubscriber() } .flatMap { Single.fromCallable { ApplicationDependencies .getDonationsService() - .createStripeSubscriptionPaymentMethod(it.subscriberId) + .createStripeSubscriptionPaymentMethod(it.subscriberId, paymentSourceType.paymentMethod) } } - .flatMap(ServiceResponse::flattenResult) + .flatMap { serviceResponse -> + if (retryOn409 && serviceResponse.status == 409) { + monthlyDonationRepository.rotateSubscriberId().andThen(createPaymentMethod(paymentSourceType, retryOn409 = false)) + } else { + serviceResponse.flattenResult() + } + } + } + + override fun fetchSetupIntent(sourceType: PaymentSourceType.Stripe): Single { + Log.d(TAG, "Fetching setup intent from Signal service...") + return createPaymentMethod(sourceType) .map { StripeIntentAccessor( objectType = StripeIntentAccessor.ObjectType.SETUP_INTENT, @@ -181,18 +202,22 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str * that we are successful and proceed as normal. If the payment didn't actually succeed, then we * expect an error later in the chain to inform us of this. */ - fun getStatusAndPaymentMethodId(stripeIntentAccessor: StripeIntentAccessor): Single { + fun getStatusAndPaymentMethodId( + stripeIntentAccessor: StripeIntentAccessor, + paymentMethodId: String? + ): Single { return Single.fromCallable { when (stripeIntentAccessor.objectType) { - StripeIntentAccessor.ObjectType.NONE -> StatusAndPaymentMethodId(StripeIntentStatus.SUCCEEDED, null) + StripeIntentAccessor.ObjectType.NONE -> StatusAndPaymentMethodId(stripeIntentAccessor.intentId, StripeIntentStatus.SUCCEEDED, paymentMethodId) StripeIntentAccessor.ObjectType.PAYMENT_INTENT -> stripeApi.getPaymentIntent(stripeIntentAccessor).let { if (it.status == null) { Log.d(TAG, "Returned payment intent had a null status.", true) } - StatusAndPaymentMethodId(it.status ?: StripeIntentStatus.SUCCEEDED, it.paymentMethod) + StatusAndPaymentMethodId(stripeIntentAccessor.intentId, it.status ?: StripeIntentStatus.SUCCEEDED, it.paymentMethod) } + StripeIntentAccessor.ObjectType.SETUP_INTENT -> stripeApi.getSetupIntent(stripeIntentAccessor).let { - StatusAndPaymentMethodId(it.status, it.paymentMethod) + StatusAndPaymentMethodId(stripeIntentAccessor.intentId, it.status, it.paymentMethod) } } } @@ -200,6 +225,7 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str fun setDefaultPaymentMethod( paymentMethodId: String, + setupIntentId: String, paymentSourceType: PaymentSourceType ): Completable { return Single.fromCallable { @@ -208,9 +234,15 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str }.flatMap { Log.d(TAG, "Setting default payment method via Signal service...") Single.fromCallable { - ApplicationDependencies - .getDonationsService() - .setDefaultStripePaymentMethod(it.subscriberId, paymentMethodId) + if (paymentSourceType == PaymentSourceType.Stripe.IDEAL) { + ApplicationDependencies + .getDonationsService() + .setDefaultIdealPaymentMethod(it.subscriberId, setupIntentId) + } else { + ApplicationDependencies + .getDonationsService() + .setDefaultStripePaymentMethod(it.subscriberId, paymentMethodId) + } } }.flatMap(ServiceResponse::flattenResult).ignoreElement().doOnComplete { Log.d(TAG, "Set default payment method via Signal service!") @@ -229,7 +261,18 @@ class StripeRepository(activity: Activity) : StripeApi.PaymentIntentFetcher, Str } } + fun createSEPADebitPaymentSource(sepaDebitData: StripeApi.SEPADebitData): Single { + Log.d(TAG, "Creating SEPA Debit payment source via Stripe api...") + return stripeApi.createPaymentSourceFromSEPADebitData(sepaDebitData) + } + + fun createIdealPaymentSource(idealData: StripeApi.IDEALData): Single { + Log.d(TAG, "Creating iDEAL payment source via Stripe api...") + return stripeApi.createPaymentSourceFromIDEALData(idealData) + } + data class StatusAndPaymentMethodId( + val intentId: String, val status: StripeIntentStatus, val paymentMethod: String? ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationBottomSheet.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationBottomSheet.kt new file mode 100644 index 00000000..b06a06c0 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationBottomSheet.kt @@ -0,0 +1,337 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.completed + +import android.content.DialogInterface +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.os.bundleOf +import androidx.fragment.app.FragmentManager +import org.signal.core.ui.BottomSheets +import org.signal.core.ui.Buttons +import org.signal.core.ui.theme.SignalTheme +import org.tm.archive.R +import org.tm.archive.badges.BadgeRepository +import org.tm.archive.badges.models.Badge +import org.tm.archive.components.settings.app.AppSettingsActivity +import org.tm.archive.components.settings.app.subscription.BadgeImage112 +import org.tm.archive.compose.ComposeBottomSheetDialogFragment +import org.tm.archive.database.model.databaseprotos.TerminalDonationQueue +import org.tm.archive.util.viewModel + +/** + * Bottom Sheet displayed when the app notices that a long-running donation has + * completed. + */ +class TerminalDonationBottomSheet : ComposeBottomSheetDialogFragment() { + + companion object { + + private const val ARG_DONATION_COMPLETED = "arg.donation.completed" + + @JvmStatic + fun show(fragmentManager: FragmentManager, terminalDonation: TerminalDonationQueue.TerminalDonation) { + TerminalDonationBottomSheet().apply { + arguments = bundleOf( + ARG_DONATION_COMPLETED to terminalDonation.encode() + ) + + show(fragmentManager, null) + } + } + } + + override val peekHeightPercentage: Float = 1f + + private val terminalDonation: TerminalDonationQueue.TerminalDonation by lazy(LazyThreadSafetyMode.NONE) { + TerminalDonationQueue.TerminalDonation.ADAPTER.decode(requireArguments().getByteArray(ARG_DONATION_COMPLETED)!!) + } + + private val viewModel: TerminalDonationViewModel by viewModel { + TerminalDonationViewModel(terminalDonation, badgeRepository = BadgeRepository(requireContext())) + } + + @Composable + override fun SheetContent() { + if (terminalDonation.error != null) { + PaymentFailureBottomSheet() + } else { + CompletedSheet() + } + } + + @Composable + private fun PaymentFailureBottomSheet() { + val badge by viewModel.badge + + DonationPaymentFailureBottomSheet( + badge = badge, + onTryAgainClick = { + startActivity(AppSettingsActivity.manageSubscriptions(requireContext())) + }, + onNotNowClick = { + dismissAllowingStateLoss() + } + ) + } + + @Composable + private fun CompletedSheet() { + val badge by viewModel.badge + val isToggleChecked by viewModel.isToggleChecked + val toggleType by viewModel.toggleType + + DonationCompletedSheetContent( + badge = badge, + isToggleChecked = isToggleChecked, + toggleType = toggleType, + onCheckChanged = viewModel::onToggleCheckChanged, + onDoneClick = { dismissAllowingStateLoss() } + ) + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + + viewModel.commitToggleState() + } +} + +@Preview +@Composable +private fun DonationPaymentFailureBottomSheet() { + SignalTheme { + Surface { + DonationPaymentFailureBottomSheet( + badge = null, + onTryAgainClick = {}, + onNotNowClick = {} + ) + } + } +} + +@Composable +private fun DonationPaymentFailureBottomSheet( + badge: Badge?, + onTryAgainClick: () -> Unit, + onNotNowClick: () -> Unit +) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + BottomSheets.Handle() + + Box( + modifier = Modifier + .padding(top = 21.dp, bottom = 16.dp) + ) { + BadgeImage112( + badge = badge, + modifier = Modifier + .size(80.dp) + ) + + Box( + modifier = Modifier + .size(24.dp) + .padding(2.dp) + .background( + color = MaterialTheme.colorScheme.background, + shape = CircleShape + ) + .align(Alignment.TopEnd) + ) + + Icon( + painter = painterResource(id = R.drawable.symbol_error_circle_fill_24), + tint = MaterialTheme.colorScheme.error, + contentDescription = null, + modifier = Modifier.align(Alignment.TopEnd) + ) + } + + Text( + text = stringResource(id = R.string.DonationErrorBottomSheet__donation_couldnt_be_processed), + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 45.dp) + ) + + Text( + text = stringResource(id = R.string.DonationErrorBottomSheet__were_having_trouble), + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp, bottom = 24.dp) + .padding(horizontal = 45.dp) + ) + + Buttons.LargeTonal( + onClick = onTryAgainClick, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(top = 32.dp, bottom = 16.dp) + ) { + Text( + text = stringResource(id = R.string.DonationErrorBottomSheet__try_again) + ) + } + + TextButton( + onClick = onNotNowClick, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(bottom = 56.dp) + ) { + Text( + text = stringResource(id = R.string.DonationErrorBottomSheet__not_now) + ) + } + } +} + +@Preview +@Composable +private fun DonationCompletedSheetContentPreview() { + SignalTheme { + Surface { + DonationCompletedSheetContent( + badge = null, + isToggleChecked = false, + toggleType = TerminalDonationViewModel.ToggleType.NONE, + onCheckChanged = {}, + onDoneClick = {} + ) + } + } +} + +@Composable +private fun DonationCompletedSheetContent( + badge: Badge?, + isToggleChecked: Boolean, + toggleType: TerminalDonationViewModel.ToggleType, + onCheckChanged: (Boolean) -> Unit, + onDoneClick: () -> Unit +) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + BottomSheets.Handle() + + BadgeImage112( + badge = badge, + modifier = Modifier + .padding(top = 21.dp, bottom = 16.dp) + .size(80.dp) + ) + + Text( + text = stringResource(id = R.string.DonationCompletedBottomSheet__donation_complete), + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 45.dp) + ) + + Text( + text = stringResource(id = R.string.DonationCompleteBottomSheet__your_bank_transfer_was_received), + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp, bottom = 24.dp) + .padding(horizontal = 45.dp) + ) + + if (toggleType == TerminalDonationViewModel.ToggleType.NONE) { + CircularProgressIndicator() + } else { + DonationToggleRow( + checked = isToggleChecked, + text = stringResource(id = toggleType.copyId), + onCheckChanged = onCheckChanged + ) + } + + Buttons.LargeTonal( + onClick = onDoneClick, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(top = 48.dp, bottom = 56.dp) + ) { + Text( + text = stringResource(id = R.string.DonationPendingBottomSheet__done) + ) + } + } +} + +@Composable +private fun DonationToggleRow( + checked: Boolean, + text: String, + onCheckChanged: (Boolean) -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.outlineVariant, + shape = RoundedCornerShape(12.dp) + ) + .padding(horizontal = 16.dp) + ) { + Text( + text = text, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .weight(1f) + .align(Alignment.CenterVertically) + .padding(vertical = 16.dp) + ) + + Switch( + checked = checked, + onCheckedChange = onCheckChanged, + modifier = Modifier.align(Alignment.CenterVertically) + ) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationDelegate.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationDelegate.kt new file mode 100644 index 00000000..880f5591 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationDelegate.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.completed + +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import org.signal.core.util.concurrent.LifecycleDisposable +import org.tm.archive.components.settings.app.subscription.DonationPendingBottomSheet +import org.tm.archive.components.settings.app.subscription.DonationPendingBottomSheetArgs +import org.tm.archive.components.settings.app.subscription.donate.stripe.Stripe3DSData +import org.tm.archive.components.settings.app.subscription.thanks.ThanksForYourSupportBottomSheetDialogFragment +import org.tm.archive.components.settings.app.subscription.thanks.ThanksForYourSupportBottomSheetDialogFragmentArgs +import org.tm.archive.database.model.databaseprotos.DonationErrorValue +import org.tm.archive.keyvalue.SignalStore + +/** + * Handles displaying the "Thank You" or "Donation completed" sheet when the user navigates to an appropriate screen. + * These sheets are one-shot. + */ +class TerminalDonationDelegate( + private val fragmentManager: FragmentManager, + private val lifecycleOwner: LifecycleOwner +) : DefaultLifecycleObserver { + + private val lifecycleDisposable = LifecycleDisposable().apply { + bindTo(lifecycleOwner) + } + + private val badgeRepository = TerminalDonationRepository() + + override fun onResume(owner: LifecycleOwner) { + val donations = SignalStore.donationsValues().consumeTerminalDonations() + for (donation in donations) { + if (donation.isLongRunningPaymentMethod && (donation.error == null || donation.error.type != DonationErrorValue.Type.REDEMPTION)) { + TerminalDonationBottomSheet.show(fragmentManager, donation) + } else if (donation.error != null) { + lifecycleDisposable += badgeRepository.getBadge(donation).observeOn(AndroidSchedulers.mainThread()).subscribe { badge -> + val args = ThanksForYourSupportBottomSheetDialogFragmentArgs.Builder(badge).build().toBundle() + val sheet = ThanksForYourSupportBottomSheetDialogFragment() + + sheet.arguments = args + sheet.show(fragmentManager, null) + } + } + } + + val verifiedMonthlyDonation: Stripe3DSData? = SignalStore.donationsValues().consumeVerifiedSubscription3DSData() + if (verifiedMonthlyDonation != null) { + DonationPendingBottomSheet().apply { + arguments = DonationPendingBottomSheetArgs.Builder(verifiedMonthlyDonation.gatewayRequest).build().toBundle() + }.show(fragmentManager, null) + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationRepository.kt new file mode 100644 index 00000000..e466ba58 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationRepository.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.completed + +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.schedulers.Schedulers +import org.tm.archive.badges.Badges +import org.tm.archive.badges.models.Badge +import org.tm.archive.database.model.databaseprotos.TerminalDonationQueue +import org.tm.archive.dependencies.ApplicationDependencies +import org.whispersystems.signalservice.api.services.DonationsService +import java.util.Locale + +class TerminalDonationRepository( + private val donationsService: DonationsService = ApplicationDependencies.getDonationsService() +) { + fun getBadge(terminalDonation: TerminalDonationQueue.TerminalDonation): Single { + return Single + .fromCallable { donationsService.getDonationsConfiguration(Locale.getDefault()) } + .flatMap { it.flattenResult() } + .map { it.levels[terminalDonation.level.toInt()]!! } + .map { Badges.fromServiceBadge(it.badge) } + .subscribeOn(Schedulers.io()) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationViewModel.kt new file mode 100644 index 00000000..c53bb1ad --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/completed/TerminalDonationViewModel.kt @@ -0,0 +1,111 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.completed + +import android.annotation.SuppressLint +import androidx.annotation.StringRes +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.core.util.logging.Log +import org.tm.archive.R +import org.tm.archive.badges.BadgeRepository +import org.tm.archive.badges.models.Badge +import org.tm.archive.database.model.databaseprotos.TerminalDonationQueue +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.recipients.Recipient + +class TerminalDonationViewModel( + donationCompleted: TerminalDonationQueue.TerminalDonation, + repository: TerminalDonationRepository = TerminalDonationRepository(), + private val badgeRepository: BadgeRepository +) : ViewModel() { + + companion object { + private val TAG = Log.tag(TerminalDonationViewModel::class.java) + } + + private val disposables = CompositeDisposable() + + private val internalBadge = mutableStateOf(null) + private val internalToggleChecked = mutableStateOf(false) + private val internalToggleType = mutableStateOf(ToggleType.NONE) + + val badge: State = internalBadge + val isToggleChecked: State = internalToggleChecked + val toggleType: State = internalToggleType + + init { + disposables += repository.getBadge(donationCompleted) + .map { badge -> + val hasOtherBadges = Recipient.self().badges.filterNot { it.id == badge.id }.isNotEmpty() + val isDisplayingBadges = SignalStore.donationsValues().getDisplayBadgesOnProfile() + + val toggleType = when { + hasOtherBadges && isDisplayingBadges -> ToggleType.MAKE_FEATURED_BADGE + else -> ToggleType.DISPLAY_ON_PROFILE + } + + badge to toggleType + } + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy( + onSuccess = { (badge, toggleType) -> + internalBadge.value = badge + internalToggleType.value = toggleType + } + ) + } + + fun onToggleCheckChanged(isChecked: Boolean) { + internalToggleChecked.value = isChecked + } + + /** + * Note that the intention here is that these are able to complete outside of the scope of the ViewModel's lifecycle. + */ + @SuppressLint("CheckResult") + fun commitToggleState() { + when (toggleType.value) { + ToggleType.NONE -> Unit + ToggleType.MAKE_FEATURED_BADGE -> { + badgeRepository.setVisibilityForAllBadges(isToggleChecked.value).subscribeBy( + onError = { + Log.w(TAG, "Failure while updating badge visibility", it) + } + ) + } + + ToggleType.DISPLAY_ON_PROFILE -> { + val badge = this.badge.value + if (badge == null) { + Log.w(TAG, "No badge!") + return + } + + badgeRepository.setFeaturedBadge(badge).subscribeBy( + onError = { + Log.w(TAG, "Failure while updating featured badge", it) + } + ) + } + } + } + + override fun onCleared() { + disposables.clear() + } + + enum class ToggleType(@StringRes val copyId: Int) { + NONE(-1), + MAKE_FEATURED_BADGE(R.string.SubscribeThanksForYourSupportBottomSheetDialogFragment__make_featured_badge), + DISPLAY_ON_PROFILE(R.string.SubscribeThanksForYourSupportBottomSheetDialogFragment__display_on_profile) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalAction.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalAction.kt index f4045859..a883b0c8 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalAction.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalAction.kt @@ -6,5 +6,5 @@ sealed class DonateToSignalAction { data class DisplayCurrencySelectionDialog(val donateToSignalType: DonateToSignalType, val supportedCurrencies: List) : DonateToSignalAction() data class DisplayGatewaySelectorDialog(val gatewayRequest: GatewayRequest) : DonateToSignalAction() data class CancelSubscription(val gatewayRequest: GatewayRequest) : DonateToSignalAction() - data class UpdateSubscription(val gatewayRequest: GatewayRequest) : DonateToSignalAction() + data class UpdateSubscription(val gatewayRequest: GatewayRequest, val isLongRunning: Boolean) : DonateToSignalAction() } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalFragment.kt index b296de5e..17bd5969 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalFragment.kt @@ -28,6 +28,7 @@ import org.tm.archive.components.settings.DSLSettingsFragment import org.tm.archive.components.settings.DSLSettingsText import org.tm.archive.components.settings.app.subscription.boost.Boost import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayResponse import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource import org.tm.archive.components.settings.app.subscription.models.CurrencySelection import org.tm.archive.components.settings.app.subscription.models.NetworkFailure @@ -40,6 +41,7 @@ import org.tm.archive.util.Projection import org.tm.archive.util.SpanUtil import org.tm.archive.util.adapter.mapping.MappingAdapter import org.tm.archive.util.navigation.safeNavigate +import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription import java.util.Currency /** @@ -106,7 +108,7 @@ class DonateToSignalFragment : } override fun bindAdapter(adapter: MappingAdapter) { - donationCheckoutDelegate = DonationCheckoutDelegate(this, this, DonationErrorSource.BOOST, DonationErrorSource.SUBSCRIPTION) + donationCheckoutDelegate = DonationCheckoutDelegate(this, this, viewModel.uiSessionKey, DonationErrorSource.ONE_TIME, DonationErrorSource.MONTHLY) val recyclerView = this.recyclerView!! recyclerView.overScrollMode = RecyclerView.OVER_SCROLL_IF_CONTENT_SCROLLS @@ -141,12 +143,14 @@ class DonateToSignalFragment : findNavController().safeNavigate(navAction) } + is DonateToSignalAction.DisplayGatewaySelectorDialog -> { Log.d(TAG, "Presenting gateway selector for ${action.gatewayRequest}") val navAction = DonateToSignalFragmentDirections.actionDonateToSignalFragmentToGatewaySelectorBottomSheetDialog(action.gatewayRequest) findNavController().safeNavigate(navAction) } + is DonateToSignalAction.CancelSubscription -> { findNavController().safeNavigate( DonateToSignalFragmentDirections.actionDonateToSignalFragmentToStripePaymentInProgressFragment( @@ -155,6 +159,7 @@ class DonateToSignalFragment : ) ) } + is DonateToSignalAction.UpdateSubscription -> { findNavController().safeNavigate( DonateToSignalFragmentDirections.actionDonateToSignalFragmentToStripePaymentInProgressFragment( @@ -229,7 +234,6 @@ class DonateToSignalFragment : customPref( DonationPillToggle.Model( - isEnabled = state.areFieldsEnabled, selected = state.donateToSignalType, onClick = { viewModel.toggleDonationType() @@ -252,23 +256,27 @@ class DonateToSignalFragment : text = DSLSettingsText.from(R.string.SubscribeFragment__update_subscription), isEnabled = state.canUpdate, onClick = { - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.SubscribeFragment__update_subscription_question) - .setMessage( - getString( - R.string.SubscribeFragment__you_will_be_charged_the_full_amount_s_of, - FiatMoneyUtil.format( - requireContext().resources, - viewModel.getSelectedSubscriptionCost(), - FiatMoneyUtil.formatOptions().trimZerosAfterDecimal() + if (state.monthlyDonationState.transactionState.isTransactionJobPending) { + showDonationPendingDialog(state) + } else { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.SubscribeFragment__update_subscription_question) + .setMessage( + getString( + R.string.SubscribeFragment__you_will_be_charged_the_full_amount_s_of, + FiatMoneyUtil.format( + requireContext().resources, + viewModel.getSelectedSubscriptionCost(), + FiatMoneyUtil.formatOptions().trimZerosAfterDecimal() + ) ) ) - ) - .setPositiveButton(R.string.SubscribeFragment__update) { _, _ -> - viewModel.updateSubscription() - } - .setNegativeButton(android.R.string.cancel) { _, _ -> } - .show() + .setPositiveButton(R.string.SubscribeFragment__update) { _, _ -> + viewModel.updateSubscription() + } + .setNegativeButton(android.R.string.cancel) { _, _ -> } + .show() + } } ) @@ -278,28 +286,62 @@ class DonateToSignalFragment : text = DSLSettingsText.from(R.string.SubscribeFragment__cancel_subscription), isEnabled = state.areFieldsEnabled, onClick = { - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.SubscribeFragment__confirm_cancellation) - .setMessage(R.string.SubscribeFragment__you_wont_be_charged_again) - .setPositiveButton(R.string.SubscribeFragment__confirm) { _, _ -> - viewModel.cancelSubscription() - } - .setNegativeButton(R.string.SubscribeFragment__not_now) { _, _ -> } - .show() + if (state.monthlyDonationState.transactionState.isTransactionJobPending) { + showDonationPendingDialog(state) + } else { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.SubscribeFragment__confirm_cancellation) + .setMessage(R.string.SubscribeFragment__you_wont_be_charged_again) + .setPositiveButton(R.string.SubscribeFragment__confirm) { _, _ -> + viewModel.cancelSubscription() + } + .setNegativeButton(R.string.SubscribeFragment__not_now) { _, _ -> } + .show() + } } ) } else { primaryButton( text = DSLSettingsText.from(R.string.DonateToSignalFragment__continue), - isEnabled = state.canContinue, + isEnabled = state.continueEnabled, onClick = { - viewModel.requestSelectGateway() + if (state.canContinue) { + viewModel.requestSelectGateway() + } else { + showDonationPendingDialog(state) + } } ) } } } + private fun showDonationPendingDialog(state: DonateToSignalState) { + val message = if (state.donateToSignalType == DonateToSignalType.ONE_TIME) { + if (state.oneTimeDonationState.isOneTimeDonationLongRunning) { + R.string.DonateToSignalFragment__bank_transfers_usually_take_1_business_day_to_process_onetime + } else if (state.oneTimeDonationState.isNonVerifiedIdeal) { + R.string.DonateToSignalFragment__your_ideal_payment_is_still_processing + } else { + R.string.DonateToSignalFragment__your_payment_is_still_being_processed_onetime + } + } else { + if (state.monthlyDonationState.activeSubscription?.paymentMethod == ActiveSubscription.PAYMENT_METHOD_SEPA_DEBIT) { + R.string.DonateToSignalFragment__bank_transfers_usually_take_1_business_day_to_process_monthly + } else if (state.monthlyDonationState.nonVerifiedMonthlyDonation != null) { + R.string.DonateToSignalFragment__your_ideal_payment_is_still_processing + } else { + R.string.DonateToSignalFragment__your_payment_is_still_being_processed_monthly + } + } + + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.DonateToSignalFragment__you_have_a_donation_pending) + .setMessage(message) + .setPositiveButton(android.R.string.ok, null) + .show() + } + private fun DSLConfiguration.displayOneTimeSelection(areFieldsEnabled: Boolean, state: DonateToSignalState.OneTimeDonationState) { when (state.donationStage) { DonateToSignalState.DonationStage.INIT -> customPref(Boost.LoadingModel()) @@ -333,11 +375,6 @@ class DonateToSignalFragment : } private fun DSLConfiguration.displayMonthlySelection(areFieldsEnabled: Boolean, state: DonateToSignalState.MonthlyDonationState) { - if (state.transactionState.isTransactionJobPending) { - customPref(Subscription.LoaderModel()) - return - } - when (state.donationStage) { DonateToSignalState.DonationStage.INIT -> customPref(Subscription.LoaderModel()) DonateToSignalState.DonationStage.FAILURE -> customPref(NetworkFailure.Model { viewModel.retryMonthlyDonationState() }) @@ -417,6 +454,14 @@ class DonateToSignalFragment : findNavController().safeNavigate(DonateToSignalFragmentDirections.actionDonateToSignalFragmentToCreditCardFragment(gatewayRequest)) } + override fun navigateToIdealDetailsFragment(gatewayRequest: GatewayRequest) { + findNavController().safeNavigate(DonateToSignalFragmentDirections.actionDonateToSignalFragmentToIdealTransferDetailsFragment(gatewayRequest)) + } + + override fun navigateToBankTransferMandate(gatewayResponse: GatewayResponse) { + findNavController().safeNavigate(DonateToSignalFragmentDirections.actionDonateToSignalFragmentToBankTransferMandateFragment(gatewayResponse)) + } + override fun onPaymentComplete(gatewayRequest: GatewayRequest) { findNavController().safeNavigate(DonateToSignalFragmentDirections.actionDonateToSignalFragmentToThanksForYourSupportBottomSheetDialog(gatewayRequest.badge)) } @@ -425,7 +470,18 @@ class DonateToSignalFragment : viewModel.refreshActiveSubscription() } - override fun onUserCancelledPaymentFlow() { - findNavController().popBackStack(R.id.donateToSignalFragment, false) + override fun showSepaEuroMaximumDialog(sepaEuroMaximum: FiatMoney) { + val max = FiatMoneyUtil.format(resources, sepaEuroMaximum, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.DonateToSignal__donation_amount_too_high) + .setMessage(getString(R.string.DonateToSignalFragment__you_can_send_up_to_s_via_bank_transfer, max)) + .setPositiveButton(android.R.string.ok, null) + .show() + } + + override fun onUserLaunchedAnExternalApplication() = Unit + + override fun navigateToDonationPending(gatewayRequest: GatewayRequest) { + findNavController().safeNavigate(DonateToSignalFragmentDirections.actionDonateToSignalFragmentToDonationPendingBottomSheet(gatewayRequest)) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalState.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalState.kt index 9d02e614..794f736d 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalState.kt @@ -4,6 +4,10 @@ import org.signal.core.util.money.FiatMoney import org.tm.archive.badges.models.Badge import org.tm.archive.components.settings.app.subscription.InAppDonations import org.tm.archive.components.settings.app.subscription.boost.Boost +import org.tm.archive.components.settings.app.subscription.manage.NonVerifiedMonthlyDonation +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import org.tm.archive.database.model.isLongRunning +import org.tm.archive.database.model.isPending import org.tm.archive.keyvalue.SignalStore import org.tm.archive.subscription.Subscription import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription @@ -20,7 +24,7 @@ data class DonateToSignalState( val areFieldsEnabled: Boolean get() = when (donateToSignalType) { DonateToSignalType.ONE_TIME -> oneTimeDonationState.donationStage == DonationStage.READY - DonateToSignalType.MONTHLY -> monthlyDonationState.donationStage == DonationStage.READY && !monthlyDonationState.transactionState.isInProgress + DonateToSignalType.MONTHLY -> monthlyDonationState.donationStage == DonationStage.READY DonateToSignalType.GIFT -> error("This flow does not support gifts") } @@ -33,7 +37,7 @@ data class DonateToSignalState( val canSetCurrency: Boolean get() = when (donateToSignalType) { - DonateToSignalType.ONE_TIME -> areFieldsEnabled + DonateToSignalType.ONE_TIME -> areFieldsEnabled && !oneTimeDonationState.isOneTimeDonationPending DonateToSignalType.MONTHLY -> areFieldsEnabled && !monthlyDonationState.isSubscriptionActive DonateToSignalType.GIFT -> error("This flow does not support gifts") } @@ -59,13 +63,20 @@ data class DonateToSignalState( DonateToSignalType.GIFT -> error("This flow does not support gifts") } - val canContinue: Boolean + val continueEnabled: Boolean get() = when (donateToSignalType) { DonateToSignalType.ONE_TIME -> areFieldsEnabled && oneTimeDonationState.isSelectionValid && InAppDonations.hasAtLeastOnePaymentMethodAvailable() DonateToSignalType.MONTHLY -> areFieldsEnabled && monthlyDonationState.isSelectionValid && InAppDonations.hasAtLeastOnePaymentMethodAvailable() DonateToSignalType.GIFT -> error("This flow does not support gifts") } + val canContinue: Boolean + get() = when (donateToSignalType) { + DonateToSignalType.ONE_TIME -> continueEnabled && !oneTimeDonationState.isOneTimeDonationPending + DonateToSignalType.MONTHLY -> continueEnabled && !monthlyDonationState.isSubscriptionActive && !monthlyDonationState.transactionState.isInProgress + DonateToSignalType.GIFT -> error("This flow does not support gifts") + } + val canUpdate: Boolean get() = when (donateToSignalType) { DonateToSignalType.ONE_TIME -> false @@ -73,6 +84,9 @@ data class DonateToSignalState( DonateToSignalType.GIFT -> error("This flow does not support gifts") } + val isUpdateLongRunning: Boolean + get() = monthlyDonationState.activeSubscription?.paymentMethod == ActiveSubscription.PAYMENT_METHOD_SEPA_DEBIT + data class OneTimeDonationState( val badge: Badge? = null, val selectedCurrency: Currency = SignalStore.donationsValues().getOneTimeCurrency(), @@ -82,8 +96,13 @@ data class DonateToSignalState( val isCustomAmountFocused: Boolean = false, val donationStage: DonationStage = DonationStage.INIT, val selectableCurrencyCodes: List = emptyList(), + private val pendingOneTimeDonation: PendingOneTimeDonation? = null, private val minimumDonationAmounts: Map = emptyMap() ) { + val isOneTimeDonationPending: Boolean = pendingOneTimeDonation.isPending() + val isOneTimeDonationLongRunning: Boolean = pendingOneTimeDonation.isLongRunning() + val isNonVerifiedIdeal = pendingOneTimeDonation?.pendingVerification == true + val minimumDonationAmountOfSelectedCurrency: FiatMoney = minimumDonationAmounts[selectedCurrency] ?: FiatMoney(BigDecimal.ZERO, selectedCurrency) private val isCustomAmountTooSmall: Boolean = if (isCustomAmountFocused) customAmount.amount < minimumDonationAmountOfSelectedCurrency.amount else false private val isCustomAmountZero: Boolean = customAmount.amount == BigDecimal.ZERO @@ -99,6 +118,7 @@ data class DonateToSignalState( val selectedSubscription: Subscription? = null, val donationStage: DonationStage = DonationStage.INIT, val selectableCurrencyCodes: List = emptyList(), + val nonVerifiedMonthlyDonation: NonVerifiedMonthlyDonation? = null, val transactionState: TransactionState = TransactionState() ) { val isSubscriptionActive: Boolean = _activeSubscription?.isActive == true diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalType.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalType.kt index 57e6887d..b27dc650 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalType.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalType.kt @@ -12,8 +12,8 @@ enum class DonateToSignalType(val requestCode: Short) : Parcelable { fun toErrorSource(): DonationErrorSource { return when (this) { - ONE_TIME -> DonationErrorSource.BOOST - MONTHLY -> DonationErrorSource.SUBSCRIPTION + ONE_TIME -> DonationErrorSource.ONE_TIME + MONTHLY -> DonationErrorSource.MONTHLY GIFT -> DonationErrorSource.GIFT } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalViewModel.kt index 2af9ca33..1daf21d4 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonateToSignalViewModel.kt @@ -13,13 +13,16 @@ import org.signal.core.util.StringUtil import org.signal.core.util.logging.Log import org.signal.core.util.money.FiatMoney import org.signal.core.util.money.PlatformCurrencyUtil +import org.signal.core.util.orNull import org.tm.archive.components.settings.app.subscription.MonthlyDonationRepository import org.tm.archive.components.settings.app.subscription.OneTimeDonationRepository import org.tm.archive.components.settings.app.subscription.boost.Boost import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest -import org.tm.archive.components.settings.app.subscription.manage.SubscriptionRedemptionJobWatcher +import org.tm.archive.components.settings.app.subscription.manage.DonationRedemptionJobStatus +import org.tm.archive.components.settings.app.subscription.manage.DonationRedemptionJobWatcher +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import org.tm.archive.database.model.isExpired import org.tm.archive.dependencies.ApplicationDependencies -import org.tm.archive.jobmanager.JobTracker import org.tm.archive.keyvalue.SignalStore import org.tm.archive.recipients.Recipient import org.tm.archive.subscription.LevelUpdate @@ -33,6 +36,7 @@ import java.math.BigDecimal import java.text.DecimalFormat import java.text.DecimalFormatSymbols import java.util.Currency +import java.util.Optional /** * Contains the logic to manage the UI of the unified donations screen. @@ -58,6 +62,7 @@ class DonateToSignalViewModel( val state = store.stateFlowable.observeOn(AndroidSchedulers.mainThread()) val actions: Observable = _actions.observeOn(AndroidSchedulers.mainThread()) + val uiSessionKey: Long = System.currentTimeMillis() init { initializeOneTimeDonationState(oneTimeDonationRepository) @@ -105,7 +110,7 @@ class DonateToSignalViewModel( fun updateSubscription() { val snapshot = store.state if (snapshot.areFieldsEnabled) { - _actions.onNext(DonateToSignalAction.UpdateSubscription(createGatewayRequest(snapshot))) + _actions.onNext(DonateToSignalAction.UpdateSubscription(createGatewayRequest(snapshot), snapshot.isUpdateLongRunning)) } } @@ -178,6 +183,7 @@ class DonateToSignalViewModel( private fun createGatewayRequest(snapshot: DonateToSignalState): GatewayRequest { val amount = getAmount(snapshot) return GatewayRequest( + uiSessionKey = uiSessionKey, donateToSignalType = snapshot.donateToSignalType, badge = snapshot.badge!!, label = snapshot.badge!!.description, @@ -205,6 +211,33 @@ class DonateToSignalViewModel( } private fun initializeOneTimeDonationState(oneTimeDonationRepository: OneTimeDonationRepository) { + val oneTimeDonationFromJob: Observable> = DonationRedemptionJobWatcher.watchOneTimeRedemption().map { + when (it) { + is DonationRedemptionJobStatus.PendingExternalVerification -> Optional.ofNullable(it.pendingOneTimeDonation) + + DonationRedemptionJobStatus.PendingReceiptRedemption, + DonationRedemptionJobStatus.PendingReceiptRequest, + DonationRedemptionJobStatus.FailedSubscription, + DonationRedemptionJobStatus.None -> Optional.empty() + } + }.distinctUntilChanged() + + val oneTimeDonationFromStore: Observable> = SignalStore.donationsValues().observablePendingOneTimeDonation + .map { pending -> pending.filter { !it.isExpired } } + .distinctUntilChanged() + + oneTimeDonationDisposables += Observable + .combineLatest(oneTimeDonationFromJob, oneTimeDonationFromStore) { job, store -> + if (store.isPresent) { + store + } else { + job + } + } + .subscribe { pendingOneTimeDonation: Optional -> + store.update { it.copy(oneTimeDonationState = it.oneTimeDonationState.copy(pendingOneTimeDonation = pendingOneTimeDonation.orNull())) } + } + oneTimeDonationDisposables += oneTimeDonationRepository.getBoostBadge().subscribeBy( onSuccess = { badge -> store.update { it.copy(oneTimeDonationState = it.oneTimeDonationState.copy(badge = badge)) } @@ -272,23 +305,16 @@ class DonateToSignalViewModel( } private fun monitorLevelUpdateProcessing() { - val isTransactionJobInProgress: Observable = SubscriptionRedemptionJobWatcher.watch().map { - it.map { jobState -> - when (jobState) { - JobTracker.JobState.PENDING -> true - JobTracker.JobState.RUNNING -> true - else -> false - } - }.orElse(false) - } + val redemptionJobStatus: Observable = DonationRedemptionJobWatcher.watchSubscriptionRedemption() monthlyDonationDisposables += Observable - .combineLatest(isTransactionJobInProgress, LevelUpdate.isProcessing, DonateToSignalState::TransactionState) - .subscribeBy { transactionState -> + .combineLatest(redemptionJobStatus, LevelUpdate.isProcessing, ::Pair) + .subscribeBy { (jobStatus, levelUpdateProcessing) -> store.update { state -> state.copy( monthlyDonationState = state.monthlyDonationState.copy( - transactionState = transactionState + nonVerifiedMonthlyDonation = if (jobStatus is DonationRedemptionJobStatus.PendingExternalVerification) jobStatus.nonVerifiedMonthlyDonation else null, + transactionState = DonateToSignalState.TransactionState(jobStatus.isInProgress(), levelUpdateProcessing) ) ) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt index b82a93de..ee7d55fa 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationCheckoutDelegate.kt @@ -30,11 +30,15 @@ import org.tm.archive.components.settings.app.subscription.donate.gateway.Gatewa import org.tm.archive.components.settings.app.subscription.donate.paypal.PayPalPaymentInProgressFragment import org.tm.archive.components.settings.app.subscription.donate.stripe.StripePaymentInProgressFragment import org.tm.archive.components.settings.app.subscription.donate.stripe.StripePaymentInProgressViewModel +import org.tm.archive.components.settings.app.subscription.donate.transfer.BankTransferRequestKeys import org.tm.archive.components.settings.app.subscription.errors.DonationError import org.tm.archive.components.settings.app.subscription.errors.DonationErrorDialogs import org.tm.archive.components.settings.app.subscription.errors.DonationErrorParams import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.payments.currency.CurrencyUtil import org.tm.archive.util.fragments.requireListener +import java.math.BigDecimal import java.util.Currency /** @@ -43,6 +47,7 @@ import java.util.Currency class DonationCheckoutDelegate( private val fragment: Fragment, private val callback: Callback, + private val uiSessionKey: Long, errorSource: DonationErrorSource, vararg additionalSources: DonationErrorSource ) : DefaultLifecycleObserver { @@ -65,7 +70,7 @@ class DonationCheckoutDelegate( init { fragment.viewLifecycleOwner.lifecycle.addObserver(this) - ErrorHandler().attach(fragment, callback, errorSource, *additionalSources) + ErrorHandler().attach(fragment, callback, uiSessionKey, errorSource, *additionalSources) } override fun onCreate(owner: LifecycleOwner) { @@ -74,8 +79,12 @@ class DonationCheckoutDelegate( registerGooglePayCallback() fragment.setFragmentResultListener(GatewaySelectorBottomSheet.REQUEST_KEY) { _, bundle -> - val response: GatewayResponse = bundle.getParcelableCompat(GatewaySelectorBottomSheet.REQUEST_KEY, GatewayResponse::class.java)!! - handleGatewaySelectionResponse(response) + if (bundle.containsKey(GatewaySelectorBottomSheet.FAILURE_KEY)) { + callback.showSepaEuroMaximumDialog(FiatMoney(bundle.getSerializable(GatewaySelectorBottomSheet.SEPA_EURO_MAX) as BigDecimal, CurrencyUtil.EURO)) + } else { + val response: GatewayResponse = bundle.getParcelableCompat(GatewaySelectorBottomSheet.REQUEST_KEY, GatewayResponse::class.java)!! + handleGatewaySelectionResponse(response) + } } fragment.setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle -> @@ -88,6 +97,16 @@ class DonationCheckoutDelegate( handleDonationProcessorActionResult(result) } + fragment.setFragmentResultListener(BankTransferRequestKeys.REQUEST_KEY) { _, bundle -> + val result: DonationProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! + handleDonationProcessorActionResult(result) + } + + fragment.setFragmentResultListener(BankTransferRequestKeys.PENDING_KEY) { _, bundle -> + val request: GatewayRequest = bundle.getParcelableCompat(BankTransferRequestKeys.PENDING_KEY, GatewayRequest::class.java)!! + callback.navigateToDonationPending(gatewayRequest = request) + } + fragment.setFragmentResultListener(PayPalPaymentInProgressFragment.REQUEST_KEY) { _, bundle -> val result: DonationProcessorActionResult = bundle.getParcelableCompat(PayPalPaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! handleDonationProcessorActionResult(result) @@ -100,6 +119,8 @@ class DonationCheckoutDelegate( GatewayResponse.Gateway.GOOGLE_PAY -> launchGooglePay(gatewayResponse) GatewayResponse.Gateway.PAYPAL -> launchPayPal(gatewayResponse) GatewayResponse.Gateway.CREDIT_CARD -> launchCreditCard(gatewayResponse) + GatewayResponse.Gateway.SEPA_DEBIT -> launchBankTransfer(gatewayResponse) + GatewayResponse.Gateway.IDEAL -> launchBankTransfer(gatewayResponse) } } else { error("Unsupported combination! ${gatewayResponse.gateway} ${gatewayResponse.request.donateToSignalType}") @@ -119,6 +140,7 @@ class DonationCheckoutDelegate( if (result.action == DonationProcessorAction.CANCEL_SUBSCRIPTION) { Snackbar.make(fragment.requireView(), R.string.SubscribeFragment__your_subscription_has_been_cancelled, Snackbar.LENGTH_LONG).show() } else { + SignalStore.donationsValues().removeTerminalDonation(result.request.level) callback.onPaymentComplete(result.request) } } @@ -154,6 +176,14 @@ class DonationCheckoutDelegate( callback.navigateToCreditCardForm(gatewayResponse.request) } + private fun launchBankTransfer(gatewayResponse: GatewayResponse) { + if (gatewayResponse.request.donateToSignalType != DonateToSignalType.MONTHLY && gatewayResponse.gateway == GatewayResponse.Gateway.IDEAL) { + callback.navigateToIdealDetailsFragment(gatewayResponse.request) + } else { + callback.navigateToBankTransferMandate(gatewayResponse) + } + } + private fun registerGooglePayCallback() { disposables += donationPaymentComponent.googlePayResultPublisher.subscribeBy( onNext = { paymentResult -> @@ -182,8 +212,8 @@ class DonationCheckoutDelegate( val error = DonationError.getGooglePayRequestTokenError( source = when (request.donateToSignalType) { - DonateToSignalType.MONTHLY -> DonationErrorSource.SUBSCRIPTION - DonateToSignalType.ONE_TIME -> DonationErrorSource.BOOST + DonateToSignalType.MONTHLY -> DonationErrorSource.MONTHLY + DonateToSignalType.ONE_TIME -> DonationErrorSource.ONE_TIME DonateToSignalType.GIFT -> DonationErrorSource.GIFT }, throwable = googlePayException @@ -204,11 +234,11 @@ class DonationCheckoutDelegate( private var fragment: Fragment? = null private var errorDialog: DialogInterface? = null - private var userCancelledFlowCallback: UserCancelledFlowCallback? = null + private var errorHandlerCallback: ErrorHandlerCallback? = null - fun attach(fragment: Fragment, userCancelledFlowCallback: UserCancelledFlowCallback?, errorSource: DonationErrorSource, vararg additionalSources: DonationErrorSource) { + fun attach(fragment: Fragment, errorHandlerCallback: ErrorHandlerCallback?, uiSessionKey: Long, errorSource: DonationErrorSource, vararg additionalSources: DonationErrorSource) { this.fragment = fragment - this.userCancelledFlowCallback = userCancelledFlowCallback + this.errorHandlerCallback = errorHandlerCallback val disposables = LifecycleDisposable() fragment.viewLifecycleOwner.lifecycle.addObserver(this) @@ -218,12 +248,14 @@ class DonationCheckoutDelegate( additionalSources.forEach { source -> disposables += registerErrorSource(source) } + + disposables += registerUiSession(uiSessionKey) } override fun onDestroy(owner: LifecycleOwner) { errorDialog?.dismiss() fragment = null - userCancelledFlowCallback = null + errorHandlerCallback = null } private fun registerErrorSource(errorSource: DonationErrorSource): Disposable { @@ -234,6 +266,14 @@ class DonationCheckoutDelegate( } } + private fun registerUiSession(uiSessionKey: Long): Disposable { + return DonationError.getErrorsForUiSessionKey(uiSessionKey) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + showErrorDialog(it) + } + } + private fun showErrorDialog(throwable: Throwable) { if (errorDialog != null) { Log.d(TAG, "Already displaying an error dialog. Skipping.", throwable, true) @@ -246,26 +286,48 @@ class DonationCheckoutDelegate( return } + if (throwable is DonationError.UserLaunchedExternalApplication) { + Log.d(TAG, "User launched an external application.", true) + errorHandlerCallback?.onUserLaunchedAnExternalApplication() + return + } + + if (throwable is DonationError.BadgeRedemptionError.DonationPending) { + Log.d(TAG, "Long-running donation is still pending.", true) + errorHandlerCallback?.navigateToDonationPending(throwable.gatewayRequest) + return + } + Log.d(TAG, "Displaying donation error dialog.", true) errorDialog = DonationErrorDialogs.show( fragment!!.requireContext(), throwable, object : DonationErrorDialogs.DialogCallback() { - var tryCCAgain = false + var tryAgain = false override fun onTryCreditCardAgain(context: Context): DonationErrorParams.ErrorAction { return DonationErrorParams.ErrorAction( label = R.string.DeclineCode__try, action = { - tryCCAgain = true + tryAgain = true + } + ) + } + + override fun onTryBankTransferAgain(context: Context): DonationErrorParams.ErrorAction { + return DonationErrorParams.ErrorAction( + label = R.string.DeclineCode__try, + action = { + tryAgain = true } ) } override fun onDialogDismissed() { errorDialog = null - if (!tryCCAgain) { - fragment!!.findNavController().popBackStack() + if (!tryAgain) { + tryAgain = false + fragment?.findNavController()?.popBackStack() } } } @@ -273,15 +335,19 @@ class DonationCheckoutDelegate( } } - interface UserCancelledFlowCallback { - fun onUserCancelledPaymentFlow() + interface ErrorHandlerCallback { + fun onUserLaunchedAnExternalApplication() + fun navigateToDonationPending(gatewayRequest: GatewayRequest) } - interface Callback : UserCancelledFlowCallback { + interface Callback : ErrorHandlerCallback { fun navigateToStripePaymentInProgress(gatewayRequest: GatewayRequest) fun navigateToPayPalPaymentInProgress(gatewayRequest: GatewayRequest) fun navigateToCreditCardForm(gatewayRequest: GatewayRequest) + fun navigateToIdealDetailsFragment(gatewayRequest: GatewayRequest) + fun navigateToBankTransferMandate(gatewayResponse: GatewayResponse) fun onPaymentComplete(gatewayRequest: GatewayRequest) fun onProcessorActionProcessed() + fun showSepaEuroMaximumDialog(sepaEuroMaximum: FiatMoney) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationPillToggle.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationPillToggle.kt index d37e44cc..b9682a47 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationPillToggle.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/DonationPillToggle.kt @@ -15,14 +15,13 @@ object DonationPillToggle { } class Model( - val isEnabled: Boolean, val selected: DonateToSignalType, val onClick: () -> Unit ) : MappingModel { override fun areItemsTheSame(newItem: Model): Boolean = true override fun areContentsTheSame(newItem: Model): Boolean { - return isEnabled == newItem.isEnabled && selected == newItem.selected + return selected == newItem.selected } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFormState.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFormState.kt index ecb2b98b..fc3b5d31 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFormState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFormState.kt @@ -20,7 +20,7 @@ data class CreditCardFormState( number, expiration.month.toInt(), expiration.year.toInt(), - code.toInt() + code ) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFragment.kt index 7172ae91..360000f1 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/card/CreditCardFragment.kt @@ -3,7 +3,6 @@ package org.tm.archive.components.settings.app.subscription.donate.card import android.content.Context import android.os.Bundle import android.view.View -import android.view.WindowManager import android.view.inputmethod.EditorInfo import androidx.annotation.StringRes import androidx.core.content.ContextCompat @@ -18,6 +17,7 @@ import androidx.navigation.navGraphViewModels import org.signal.core.util.concurrent.LifecycleDisposable import org.signal.core.util.getParcelableCompat import org.tm.archive.R +import org.tm.archive.components.TemporaryScreenshotSecurity import org.tm.archive.components.ViewBinderDelegate import org.tm.archive.components.settings.app.subscription.DonationPaymentComponent import org.tm.archive.components.settings.app.subscription.donate.DonateToSignalType @@ -29,7 +29,6 @@ import org.tm.archive.components.settings.app.subscription.donate.stripe.StripeP import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource import org.tm.archive.databinding.CreditCardFragmentBinding import org.tm.archive.payments.FiatMoneyUtil -import org.tm.archive.util.TextSecurePreferences import org.tm.archive.util.ViewUtil import org.tm.archive.util.fragments.requireListener import org.tm.archive.util.navigation.safeNavigate @@ -48,13 +47,15 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { ) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + TemporaryScreenshotSecurity.bindToViewLifecycleOwner(this) + val errorSource: DonationErrorSource = when (args.request.donateToSignalType) { - DonateToSignalType.ONE_TIME -> DonationErrorSource.BOOST - DonateToSignalType.MONTHLY -> DonationErrorSource.SUBSCRIPTION + DonateToSignalType.ONE_TIME -> DonationErrorSource.ONE_TIME + DonateToSignalType.MONTHLY -> DonationErrorSource.MONTHLY DonateToSignalType.GIFT -> DonationErrorSource.GIFT } - DonationCheckoutDelegate.ErrorHandler().attach(this, null, errorSource) + DonationCheckoutDelegate.ErrorHandler().attach(this, null, args.request.uiSessionKey, errorSource) setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle -> val result: DonationProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! @@ -64,13 +65,13 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { } } - binding.title.text = if (args.request.donateToSignalType == DonateToSignalType.MONTHLY) { + binding.continueButton.text = if (args.request.donateToSignalType == DonateToSignalType.MONTHLY) { getString( - R.string.CreditCardFragment__donation_amount_s_per_month, + R.string.CreditCardFragment__donate_s_month, FiatMoneyUtil.format(resources, args.request.fiat, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) ) } else { - getString(R.string.CreditCardFragment__donation_amount_s, FiatMoneyUtil.format(resources, args.request.fiat)) + getString(R.string.CreditCardFragment__donate_s, FiatMoneyUtil.format(resources, args.request.fiat)) } binding.description.setLinkColor(ContextCompat.getColor(requireContext(), R.color.signal_colorPrimary)) @@ -140,13 +141,6 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { } } - override fun onStart() { - super.onStart() - if (!TextSecurePreferences.isScreenSecurityEnabled(requireContext())) { - requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) - } - } - override fun onResume() { super.onResume() @@ -158,13 +152,6 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment) { } } - override fun onStop() { - super.onStop() - if (!TextSecurePreferences.isScreenSecurityEnabled(requireContext())) { - requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) - } - } - private fun presentContinue(state: CreditCardValidationState) { binding.continueButton.isEnabled = state.isValid } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayOrderStrategy.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayOrderStrategy.kt new file mode 100644 index 00000000..31fa14ba --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayOrderStrategy.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.gateway + +import com.google.i18n.phonenumbers.PhoneNumberUtil +import org.signal.core.util.orNull +import org.tm.archive.components.settings.app.subscription.InAppDonations +import org.tm.archive.recipients.Recipient + +sealed interface GatewayOrderStrategy { + + val orderedGateways: Set + + private object Default : GatewayOrderStrategy { + override val orderedGateways: Set = setOf( + GatewayResponse.Gateway.CREDIT_CARD, + GatewayResponse.Gateway.PAYPAL, + GatewayResponse.Gateway.GOOGLE_PAY, + GatewayResponse.Gateway.SEPA_DEBIT, + GatewayResponse.Gateway.IDEAL + ) + } + + private object NorthAmerica : GatewayOrderStrategy { + override val orderedGateways: Set = setOf( + GatewayResponse.Gateway.GOOGLE_PAY, + GatewayResponse.Gateway.PAYPAL, + GatewayResponse.Gateway.CREDIT_CARD, + GatewayResponse.Gateway.SEPA_DEBIT, + GatewayResponse.Gateway.IDEAL + ) + } + + private object Netherlands : GatewayOrderStrategy { + override val orderedGateways: Set = setOf( + GatewayResponse.Gateway.IDEAL, + GatewayResponse.Gateway.PAYPAL, + GatewayResponse.Gateway.GOOGLE_PAY, + GatewayResponse.Gateway.CREDIT_CARD, + GatewayResponse.Gateway.SEPA_DEBIT + ) + } + + companion object { + fun getStrategy(): GatewayOrderStrategy { + val self = Recipient.self() + val e164 = self.e164.orNull() ?: return Default + + return if (PhoneNumberUtil.getInstance().parse(e164, "").countryCode == 1) { + NorthAmerica + } else if (InAppDonations.isIDEALAvailable()) { + Netherlands + } else { + Default + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayRequest.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayRequest.kt index b6813a8c..152edcb7 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayRequest.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayRequest.kt @@ -12,6 +12,7 @@ import java.util.Currency @Parcelize data class GatewayRequest( + val uiSessionKey: Long, val donateToSignalType: DonateToSignalType, val badge: Badge, val label: String, diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayResponse.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayResponse.kt index b0dea2c9..28b6fde9 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayResponse.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewayResponse.kt @@ -9,13 +9,17 @@ data class GatewayResponse(val gateway: Gateway, val request: GatewayRequest) : enum class Gateway { GOOGLE_PAY, PAYPAL, - CREDIT_CARD; + CREDIT_CARD, + SEPA_DEBIT, + IDEAL; fun toPaymentSourceType(): PaymentSourceType { return when (this) { GOOGLE_PAY -> PaymentSourceType.Stripe.GooglePay PAYPAL -> PaymentSourceType.PayPal CREDIT_CARD -> PaymentSourceType.Stripe.CreditCard + SEPA_DEBIT -> PaymentSourceType.Stripe.SEPADebit + IDEAL -> PaymentSourceType.Stripe.IDEAL } } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorBottomSheet.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorBottomSheet.kt index 14a348cd..44e654e2 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorBottomSheet.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorBottomSheet.kt @@ -24,6 +24,7 @@ import org.tm.archive.components.settings.app.subscription.models.PayPalButton import org.tm.archive.components.settings.configure import org.tm.archive.components.settings.models.IndeterminateLoadingCircle import org.tm.archive.payments.FiatMoneyUtil +import org.tm.archive.payments.currency.CurrencyUtil import org.tm.archive.util.fragments.requireListener /** @@ -65,62 +66,124 @@ class GatewaySelectorBottomSheet : DSLSettingsBottomSheetFragment() { presentTitleAndSubtitle(requireContext(), args.request) - space(66.dp) + space(16.dp) if (state.loading) { + space(16.dp) customPref(IndeterminateLoadingCircle) space(16.dp) return@configure } - if (state.isGooglePayAvailable) { - customPref( - GooglePayButton.Model( - isEnabled = true, - onClick = { - findNavController().popBackStack() - val response = GatewayResponse(GatewayResponse.Gateway.GOOGLE_PAY, args.request) - setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) - } - ) - ) - } - - if (state.isPayPalAvailable) { - space(8.dp) - - customPref( - PayPalButton.Model( - onClick = { - findNavController().popBackStack() - val response = GatewayResponse(GatewayResponse.Gateway.PAYPAL, args.request) - setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) - }, - isEnabled = true - ) - ) - } - - if (state.isCreditCardAvailable) { - space(8.dp) - - primaryButton( - text = DSLSettingsText.from(R.string.GatewaySelectorBottomSheet__credit_or_debit_card), - icon = DSLSettingsIcon.from(R.drawable.credit_card, NO_TINT), - onClick = { - findNavController().popBackStack() - val response = GatewayResponse(GatewayResponse.Gateway.CREDIT_CARD, args.request) - setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) - } - ) + state.gatewayOrderStrategy.orderedGateways.forEachIndexed { index, gateway -> + when (gateway) { + GatewayResponse.Gateway.GOOGLE_PAY -> renderGooglePayButton(state) + GatewayResponse.Gateway.PAYPAL -> renderPayPalButton(state) + GatewayResponse.Gateway.CREDIT_CARD -> renderCreditCardButton(state) + GatewayResponse.Gateway.SEPA_DEBIT -> renderSEPADebitButton(state) + GatewayResponse.Gateway.IDEAL -> renderIDEALButton(state) + } } space(16.dp) } } + private fun DSLConfiguration.renderGooglePayButton(state: GatewaySelectorState) { + if (state.isGooglePayAvailable) { + space(16.dp) + + customPref( + GooglePayButton.Model( + isEnabled = true, + onClick = { + findNavController().popBackStack() + val response = GatewayResponse(GatewayResponse.Gateway.GOOGLE_PAY, args.request) + setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) + } + ) + ) + } + } + + private fun DSLConfiguration.renderPayPalButton(state: GatewaySelectorState) { + if (state.isPayPalAvailable) { + space(16.dp) + + customPref( + PayPalButton.Model( + onClick = { + findNavController().popBackStack() + val response = GatewayResponse(GatewayResponse.Gateway.PAYPAL, args.request) + setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) + }, + isEnabled = true + ) + ) + } + } + + private fun DSLConfiguration.renderCreditCardButton(state: GatewaySelectorState) { + if (state.isCreditCardAvailable) { + space(16.dp) + + primaryButton( + text = DSLSettingsText.from(R.string.GatewaySelectorBottomSheet__credit_or_debit_card), + icon = DSLSettingsIcon.from(R.drawable.credit_card, R.color.signal_colorOnCustom), + onClick = { + findNavController().popBackStack() + val response = GatewayResponse(GatewayResponse.Gateway.CREDIT_CARD, args.request) + setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) + } + ) + } + } + + private fun DSLConfiguration.renderSEPADebitButton(state: GatewaySelectorState) { + if (state.isSEPADebitAvailable) { + space(16.dp) + + tonalButton( + text = DSLSettingsText.from(R.string.GatewaySelectorBottomSheet__bank_transfer), + icon = DSLSettingsIcon.from(R.drawable.bank_transfer), + onClick = { + if (state.sepaEuroMaximum != null && + args.request.fiat.currency == CurrencyUtil.EURO && + args.request.fiat.amount > state.sepaEuroMaximum.amount + ) { + findNavController().popBackStack() + + setFragmentResult(REQUEST_KEY, bundleOf(FAILURE_KEY to true, SEPA_EURO_MAX to state.sepaEuroMaximum.amount)) + } else { + findNavController().popBackStack() + val response = GatewayResponse(GatewayResponse.Gateway.SEPA_DEBIT, args.request) + setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) + } + } + ) + } + } + + private fun DSLConfiguration.renderIDEALButton(state: GatewaySelectorState) { + if (state.isIDEALAvailable) { + space(16.dp) + + tonalButton( + text = DSLSettingsText.from(R.string.GatewaySelectorBottomSheet__ideal), + icon = DSLSettingsIcon.from(R.drawable.logo_ideal, NO_TINT), + onClick = { + findNavController().popBackStack() + val response = GatewayResponse(GatewayResponse.Gateway.IDEAL, args.request) + setFragmentResult(REQUEST_KEY, bundleOf(REQUEST_KEY to response)) + } + ) + } + } + companion object { const val REQUEST_KEY = "payment_checkout_mode" + const val FAILURE_KEY = "gateway_failure" + const val SEPA_EURO_MAX = "sepa_euro_max" fun DSLConfiguration.presentTitleAndSubtitle(context: Context, request: GatewayRequest) { when (request.donateToSignalType) { diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorRepository.kt index cb50a775..a04e5155 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorRepository.kt @@ -1,25 +1,40 @@ package org.tm.archive.components.settings.app.subscription.donate.gateway import io.reactivex.rxjava3.core.Single +import org.signal.core.util.money.FiatMoney import org.tm.archive.components.settings.app.subscription.getAvailablePaymentMethods +import org.tm.archive.payments.currency.CurrencyUtil import org.whispersystems.signalservice.api.services.DonationsService +import org.whispersystems.signalservice.internal.push.DonationsConfiguration import java.util.Locale class GatewaySelectorRepository( private val donationsService: DonationsService ) { - fun getAvailableGateways(currencyCode: String): Single> { + fun getAvailableGatewayConfiguration(currencyCode: String): Single { return Single.fromCallable { donationsService.getDonationsConfiguration(Locale.getDefault()) }.flatMap { it.flattenResult() } .map { configuration -> - configuration.getAvailablePaymentMethods(currencyCode).map { + val available = configuration.getAvailablePaymentMethods(currencyCode).map { when (it) { - "PAYPAL" -> listOf(GatewayResponse.Gateway.PAYPAL) - "CARD" -> listOf(GatewayResponse.Gateway.CREDIT_CARD, GatewayResponse.Gateway.GOOGLE_PAY) + DonationsConfiguration.PAYPAL -> listOf(GatewayResponse.Gateway.PAYPAL) + DonationsConfiguration.CARD -> listOf(GatewayResponse.Gateway.CREDIT_CARD, GatewayResponse.Gateway.GOOGLE_PAY) + DonationsConfiguration.SEPA_DEBIT -> listOf(GatewayResponse.Gateway.SEPA_DEBIT) + DonationsConfiguration.IDEAL -> listOf(GatewayResponse.Gateway.IDEAL) else -> listOf() } }.flatten().toSet() + + GatewayConfiguration( + availableGateways = available, + sepaEuroMaximum = if (configuration.sepaMaximumEuros != null) FiatMoney(configuration.sepaMaximumEuros, CurrencyUtil.EURO) else null + ) } } + + data class GatewayConfiguration( + val availableGateways: Set, + val sepaEuroMaximum: FiatMoney? + ) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorState.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorState.kt index dab6230f..c6253344 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorState.kt @@ -1,11 +1,16 @@ package org.tm.archive.components.settings.app.subscription.donate.gateway +import org.signal.core.util.money.FiatMoney import org.tm.archive.badges.models.Badge data class GatewaySelectorState( + val gatewayOrderStrategy: GatewayOrderStrategy, val loading: Boolean = true, val badge: Badge, val isGooglePayAvailable: Boolean = false, val isPayPalAvailable: Boolean = false, - val isCreditCardAvailable: Boolean = false + val isCreditCardAvailable: Boolean = false, + val isSEPADebitAvailable: Boolean = false, + val isIDEALAvailable: Boolean = false, + val sepaEuroMaximum: FiatMoney? = null ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorViewModel.kt index eb4be27c..3a4c5d81 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/gateway/GatewaySelectorViewModel.kt @@ -21,10 +21,13 @@ class GatewaySelectorViewModel( private val store = RxStore( GatewaySelectorState( + gatewayOrderStrategy = GatewayOrderStrategy.getStrategy(), badge = args.request.badge, isGooglePayAvailable = InAppDonations.isPaymentSourceAvailable(PaymentSourceType.Stripe.GooglePay, args.request.donateToSignalType), isCreditCardAvailable = InAppDonations.isPaymentSourceAvailable(PaymentSourceType.Stripe.CreditCard, args.request.donateToSignalType), - isPayPalAvailable = InAppDonations.isPaymentSourceAvailable(PaymentSourceType.PayPal, args.request.donateToSignalType) + isPayPalAvailable = InAppDonations.isPaymentSourceAvailable(PaymentSourceType.PayPal, args.request.donateToSignalType), + isSEPADebitAvailable = InAppDonations.isPaymentSourceAvailable(PaymentSourceType.Stripe.SEPADebit, args.request.donateToSignalType), + isIDEALAvailable = InAppDonations.isPaymentSourceAvailable(PaymentSourceType.Stripe.IDEAL, args.request.donateToSignalType) ) ) private val disposables = CompositeDisposable() @@ -33,15 +36,18 @@ class GatewaySelectorViewModel( init { val isGooglePayAvailable = repository.isGooglePayAvailable().toSingleDefault(true).onErrorReturnItem(false) - val availabilitySet = gatewaySelectorRepository.getAvailableGateways(currencyCode = args.request.currencyCode) - disposables += Single.zip(isGooglePayAvailable, availabilitySet, ::Pair).subscribeBy { (googlePayAvailable, gatewaysAvailable) -> + val gatewayConfiguration = gatewaySelectorRepository.getAvailableGatewayConfiguration(currencyCode = args.request.currencyCode) + disposables += Single.zip(isGooglePayAvailable, gatewayConfiguration, ::Pair).subscribeBy { (googlePayAvailable, gatewayConfiguration) -> SignalStore.donationsValues().isGooglePayReady = googlePayAvailable store.update { it.copy( loading = false, - isCreditCardAvailable = it.isCreditCardAvailable && gatewaysAvailable.contains(GatewayResponse.Gateway.CREDIT_CARD), - isGooglePayAvailable = it.isGooglePayAvailable && googlePayAvailable && gatewaysAvailable.contains(GatewayResponse.Gateway.GOOGLE_PAY), - isPayPalAvailable = it.isPayPalAvailable && gatewaysAvailable.contains(GatewayResponse.Gateway.PAYPAL) + isCreditCardAvailable = it.isCreditCardAvailable && gatewayConfiguration.availableGateways.contains(GatewayResponse.Gateway.CREDIT_CARD), + isGooglePayAvailable = it.isGooglePayAvailable && googlePayAvailable && gatewayConfiguration.availableGateways.contains(GatewayResponse.Gateway.GOOGLE_PAY), + isPayPalAvailable = it.isPayPalAvailable && gatewayConfiguration.availableGateways.contains(GatewayResponse.Gateway.PAYPAL), + isSEPADebitAvailable = it.isSEPADebitAvailable && gatewayConfiguration.availableGateways.contains(GatewayResponse.Gateway.SEPA_DEBIT), + isIDEALAvailable = it.isIDEALAvailable && gatewayConfiguration.availableGateways.contains(GatewayResponse.Gateway.IDEAL), + sepaEuroMaximum = gatewayConfiguration.sepaEuroMaximum ) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt index 64917924..25c029ac 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressFragment.kt @@ -67,6 +67,7 @@ class PayPalPaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog DonationProcessorAction.CANCEL_SUBSCRIPTION -> { viewModel.cancelSubscription() } + else -> error("Unsupported action: ${args.action}") } } @@ -121,7 +122,7 @@ class PayPalPaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog } private fun routeToOneTimeConfirmation(createPaymentIntentResponse: PayPalCreatePaymentIntentResponse): Single { - return Single.create { emitter -> + return Single.create { emitter -> val listener = FragmentResultListener { _, bundle -> val result: PayPalConfirmationResult? = bundle.getParcelableCompat(PayPalConfirmationDialogFragment.REQUEST_KEY, PayPalConfirmationResult::class.java) if (result != null) { @@ -149,7 +150,7 @@ class PayPalPaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog } private fun routeToMonthlyConfirmation(createPaymentIntentResponse: PayPalCreatePaymentMethodResponse): Single { - return Single.create { emitter -> + return Single.create { emitter -> val listener = FragmentResultListener { _, bundle -> val result: Boolean = bundle.getBoolean(PayPalConfirmationDialogFragment.REQUEST_KEY) if (result) { @@ -175,31 +176,4 @@ class PayPalPaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog } }.subscribeOn(AndroidSchedulers.mainThread()).observeOn(Schedulers.io()) } - - private fun displayCompleteOrderSheet(confirmationData: T): Single { - return Single.create { emitter -> - val listener = FragmentResultListener { _, bundle -> - val result: Boolean = bundle.getBoolean(PayPalCompleteOrderBottomSheet.REQUEST_KEY) - if (result) { - Log.d(TAG, "User confirmed order. Continuing...") - emitter.onSuccess(confirmationData) - } else { - emitter.onError(DonationError.UserCancelledPaymentError(args.request.donateToSignalType.toErrorSource())) - } - } - - parentFragmentManager.clearFragmentResult(PayPalCompleteOrderBottomSheet.REQUEST_KEY) - parentFragmentManager.setFragmentResultListener(PayPalCompleteOrderBottomSheet.REQUEST_KEY, this, listener) - - findNavController().safeNavigate( - PayPalPaymentInProgressFragmentDirections.actionPaypalPaymentInProgressFragmentToPaypalCompleteOrderBottomSheet(args.request) - ) - - emitter.setCancellable { - Log.d(TAG, "Clearing complete order result listener.") - parentFragmentManager.clearFragmentResult(PayPalCompleteOrderBottomSheet.REQUEST_KEY) - parentFragmentManager.clearFragmentResultListener(PayPalCompleteOrderBottomSheet.REQUEST_KEY) - } - }.subscribeOn(AndroidSchedulers.mainThread()).observeOn(Schedulers.io()) - } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressViewModel.kt index 3b41bc60..f043d783 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/paypal/PayPalPaymentInProgressViewModel.kt @@ -20,6 +20,7 @@ import org.tm.archive.components.settings.app.subscription.donate.DonationProces import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest import org.tm.archive.components.settings.app.subscription.errors.DonationError import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource +import org.tm.archive.components.settings.app.subscription.errors.toDonationError import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.jobs.MultiDeviceSubscriptionSyncRequestJob import org.tm.archive.keyvalue.SignalStore @@ -28,6 +29,7 @@ import org.whispersystems.signalservice.api.subscriptions.PayPalCreatePaymentInt import org.whispersystems.signalservice.api.subscriptions.PayPalCreatePaymentMethodResponse import org.whispersystems.signalservice.api.util.Preconditions import org.whispersystems.signalservice.internal.push.DonationProcessor +import org.whispersystems.signalservice.internal.push.exceptions.DonationProcessorError class PayPalPaymentInProgressViewModel( private val payPalRepository: PayPalRepository, @@ -43,7 +45,6 @@ class PayPalPaymentInProgressViewModel( val state: Flowable = store.stateFlowable.observeOn(AndroidSchedulers.mainThread()) private val disposables = CompositeDisposable() - override fun onCleared() { store.dispose() disposables.clear() @@ -82,7 +83,7 @@ class PayPalPaymentInProgressViewModel( Log.d(TAG, "Beginning subscription update...", true) store.update { DonationProcessorStage.PAYMENT_PIPELINE } - disposables += monthlyDonationRepository.cancelActiveSubscriptionIfNecessary().andThen(monthlyDonationRepository.setSubscriptionLevel(request.level.toString())) + disposables += monthlyDonationRepository.cancelActiveSubscriptionIfNecessary().andThen(monthlyDonationRepository.setSubscriptionLevel(request, false)) .subscribeBy( onComplete = { Log.w(TAG, "Completed subscription update", true) @@ -90,10 +91,10 @@ class PayPalPaymentInProgressViewModel( }, onError = { throwable -> Log.w(TAG, "Failed to update subscription", throwable, true) - val donationError: DonationError = if (throwable is DonationError) { - throwable - } else { - DonationError.genericBadgeRedemptionFailure(DonationErrorSource.SUBSCRIPTION) + val donationError: DonationError = when (throwable) { + is DonationError -> throwable + is DonationProcessorError -> throwable.toDonationError(DonationErrorSource.MONTHLY, PaymentSourceType.PayPal) + else -> DonationError.genericBadgeRedemptionFailure(DonationErrorSource.MONTHLY) } DonationError.routeDonationError(ApplicationDependencies.getApplication(), donationError) @@ -152,12 +153,10 @@ class PayPalPaymentInProgressViewModel( } .flatMapCompletable { response -> oneTimeDonationRepository.waitForOneTimeRedemption( - price = request.fiat, + gatewayRequest = request, paymentIntentId = response.paymentId, - badgeRecipient = request.recipientId, - additionalMessage = request.additionalMessage, - badgeLevel = request.level, - donationProcessor = DonationProcessor.PAYPAL + donationProcessor = DonationProcessor.PAYPAL, + paymentSourceType = PaymentSourceType.PayPal ) } .subscribeOn(Schedulers.io()) @@ -166,10 +165,10 @@ class PayPalPaymentInProgressViewModel( Log.w(TAG, "Failure in one-time payment pipeline...", throwable, true) store.update { DonationProcessorStage.FAILED } - val donationError: DonationError = if (throwable is DonationError) { - throwable - } else { - DonationError.genericBadgeRedemptionFailure(DonationErrorSource.BOOST) + val donationError: DonationError = when (throwable) { + is DonationError -> throwable + is DonationProcessorError -> throwable.toDonationError(request.donateToSignalType.toErrorSource(), PaymentSourceType.PayPal) + else -> DonationError.genericBadgeRedemptionFailure(request.donateToSignalType.toErrorSource()) } DonationError.routeDonationError(ApplicationDependencies.getApplication(), donationError) }, @@ -188,18 +187,18 @@ class PayPalPaymentInProgressViewModel( .andThen(payPalRepository.createPaymentMethod()) .flatMap(routeToPaypalConfirmation) .flatMapCompletable { payPalRepository.setDefaultPaymentMethod(it.paymentId) } - .onErrorResumeNext { Completable.error(DonationError.getPaymentSetupError(DonationErrorSource.SUBSCRIPTION, it, PaymentSourceType.PayPal)) } + .onErrorResumeNext { Completable.error(DonationError.getPaymentSetupError(DonationErrorSource.MONTHLY, it, PaymentSourceType.PayPal)) } - disposables += setup.andThen(monthlyDonationRepository.setSubscriptionLevel(request.level.toString())) + disposables += setup.andThen(monthlyDonationRepository.setSubscriptionLevel(request, false)) .subscribeBy( onError = { throwable -> Log.w(TAG, "Failure in monthly payment pipeline...", throwable, true) store.update { DonationProcessorStage.FAILED } - val donationError: DonationError = if (throwable is DonationError) { - throwable - } else { - DonationError.genericBadgeRedemptionFailure(DonationErrorSource.SUBSCRIPTION) + val donationError: DonationError = when (throwable) { + is DonationError -> throwable + is DonationProcessorError -> throwable.toDonationError(DonationErrorSource.MONTHLY, PaymentSourceType.PayPal) + else -> DonationError.genericBadgeRedemptionFailure(DonationErrorSource.MONTHLY) } DonationError.routeDonationError(ApplicationDependencies.getApplication(), donationError) }, diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/ExternalNavigationHelper.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/ExternalNavigationHelper.kt new file mode 100644 index 00000000..925bf269 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/ExternalNavigationHelper.kt @@ -0,0 +1,101 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.stripe + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.widget.Toast +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.signal.donations.StripeApi +import org.tm.archive.R + +/** + * Encapsulates the logic for navigating a user to a deeplink from within a webview or parsing out the fallback + * or play store parameters to launch them into the market. + */ +object ExternalNavigationHelper { + + fun maybeLaunchExternalNavigationIntent(context: Context, webRequestUri: Uri?, launchIntent: (Intent) -> Unit): Boolean { + val url = webRequestUri ?: return false + if (url.scheme?.startsWith("http") == true || url.scheme == StripeApi.RETURN_URL_SCHEME) { + return false + } + + MaterialAlertDialogBuilder(context) + .setTitle(R.string.ExternalNavigationHelper__leave_signal_to_confirm_payment) + .setMessage(R.string.ExternalNavigationHelper__once_this_payment_is_confirmed) + .setPositiveButton(android.R.string.ok) { _, _ -> attemptIntentLaunch(context, url, launchIntent) } + .setNegativeButton(android.R.string.cancel, null) + .show() + + return true + } + + private fun attemptIntentLaunch(context: Context, url: Uri, launchIntent: (Intent) -> Unit) { + val intent = Intent(Intent.ACTION_VIEW, url) + try { + launchIntent(intent) + } catch (e: ActivityNotFoundException) { + // Parses intent:// schema uris according to https://developer.chrome.com/docs/multidevice/android/intents/ + + if (url.scheme?.equals("intent") == true) { + val fragmentParts: Map = url.fragment + ?.split(";") + ?.associate { + val parts = it.split('=', limit = 2) + + if (parts.size > 1) { + parts[0] to parts[1] + } else { + parts[0] to null + } + } ?: emptyMap() + + val fallbackUri = fragmentParts["S.browser_fallback_url"]?.let { Uri.parse(it) } + + val packageId: String? = if (looksLikeAMarketLink(fallbackUri)) { + fallbackUri!!.getQueryParameter("id") + } else { + fragmentParts["package"] + } + + if (!packageId.isNullOrBlank()) { + try { + launchIntent( + Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=$packageId") + ) + ) + } catch (e: ActivityNotFoundException) { + toastOnActivityNotFound(context) + } + } else if (fallbackUri != null) { + try { + launchIntent( + Intent( + Intent.ACTION_VIEW, + fallbackUri + ) + ) + } catch (e: ActivityNotFoundException) { + toastOnActivityNotFound(context) + } + } + } + } + } + + private fun toastOnActivityNotFound(context: Context) { + Toast.makeText(context, R.string.CommunicationActions_no_browser_found, Toast.LENGTH_SHORT).show() + } + + private fun looksLikeAMarketLink(uri: Uri?): Boolean { + return uri != null && uri.host == "play.google.com" && uri.getQueryParameter("id") != null + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/Stripe3DSData.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/Stripe3DSData.kt new file mode 100644 index 00000000..921d7a71 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/Stripe3DSData.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ +package org.tm.archive.components.settings.app.subscription.donate.stripe + +import android.os.Parcelable +import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parcelize +import org.signal.donations.PaymentSourceType +import org.signal.donations.StripeIntentAccessor +import org.tm.archive.badges.Badges +import org.tm.archive.components.settings.app.subscription.DonationSerializationHelper.toBigDecimal +import org.tm.archive.components.settings.app.subscription.DonationSerializationHelper.toDecimalValue +import org.tm.archive.components.settings.app.subscription.donate.DonateToSignalType +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest +import org.tm.archive.database.model.databaseprotos.ExternalLaunchTransactionState +import org.tm.archive.recipients.RecipientId + +/** + * Encapsulates the data required to complete a pending external transaction + */ +@Parcelize +data class Stripe3DSData( + val stripeIntentAccessor: StripeIntentAccessor, + val gatewayRequest: GatewayRequest, + private val rawPaymentSourceType: String +) : Parcelable { + @IgnoredOnParcel + val paymentSourceType: PaymentSourceType = PaymentSourceType.fromCode(rawPaymentSourceType) + + @IgnoredOnParcel + val isLongRunning: Boolean = paymentSourceType == PaymentSourceType.Stripe.SEPADebit || (gatewayRequest.donateToSignalType == DonateToSignalType.MONTHLY && paymentSourceType.isBankTransfer) + + fun toProtoBytes(): ByteArray { + return ExternalLaunchTransactionState( + stripeIntentAccessor = ExternalLaunchTransactionState.StripeIntentAccessor( + type = when (stripeIntentAccessor.objectType) { + StripeIntentAccessor.ObjectType.NONE, StripeIntentAccessor.ObjectType.PAYMENT_INTENT -> ExternalLaunchTransactionState.StripeIntentAccessor.Type.PAYMENT_INTENT + StripeIntentAccessor.ObjectType.SETUP_INTENT -> ExternalLaunchTransactionState.StripeIntentAccessor.Type.SETUP_INTENT + }, + intentId = stripeIntentAccessor.intentId, + intentClientSecret = stripeIntentAccessor.intentClientSecret + ), + gatewayRequest = ExternalLaunchTransactionState.GatewayRequest( + donateToSignalType = when (gatewayRequest.donateToSignalType) { + DonateToSignalType.ONE_TIME -> ExternalLaunchTransactionState.GatewayRequest.DonateToSignalType.ONE_TIME + DonateToSignalType.MONTHLY -> ExternalLaunchTransactionState.GatewayRequest.DonateToSignalType.MONTHLY + DonateToSignalType.GIFT -> ExternalLaunchTransactionState.GatewayRequest.DonateToSignalType.GIFT + }, + badge = Badges.toDatabaseBadge(gatewayRequest.badge), + label = gatewayRequest.label, + price = gatewayRequest.price.toDecimalValue(), + currencyCode = gatewayRequest.currencyCode, + level = gatewayRequest.level, + recipient_id = gatewayRequest.recipientId.toLong(), + additionalMessage = gatewayRequest.additionalMessage ?: "" + ), + paymentSourceType = paymentSourceType.code + ).encode() + } + + companion object { + fun fromProtoBytes(byteArray: ByteArray, uiSessionKey: Long): Stripe3DSData { + val proto = ExternalLaunchTransactionState.ADAPTER.decode(byteArray) + return Stripe3DSData( + stripeIntentAccessor = StripeIntentAccessor( + objectType = when (proto.stripeIntentAccessor!!.type) { + ExternalLaunchTransactionState.StripeIntentAccessor.Type.PAYMENT_INTENT -> StripeIntentAccessor.ObjectType.PAYMENT_INTENT + ExternalLaunchTransactionState.StripeIntentAccessor.Type.SETUP_INTENT -> StripeIntentAccessor.ObjectType.SETUP_INTENT + }, + intentId = proto.stripeIntentAccessor.intentId, + intentClientSecret = proto.stripeIntentAccessor.intentClientSecret + ), + gatewayRequest = GatewayRequest( + uiSessionKey = uiSessionKey, + donateToSignalType = when (proto.gatewayRequest!!.donateToSignalType) { + ExternalLaunchTransactionState.GatewayRequest.DonateToSignalType.MONTHLY -> DonateToSignalType.MONTHLY + ExternalLaunchTransactionState.GatewayRequest.DonateToSignalType.ONE_TIME -> DonateToSignalType.ONE_TIME + ExternalLaunchTransactionState.GatewayRequest.DonateToSignalType.GIFT -> DonateToSignalType.GIFT + }, + badge = Badges.fromDatabaseBadge(proto.gatewayRequest.badge!!), + label = proto.gatewayRequest.label, + price = proto.gatewayRequest.price!!.toBigDecimal(), + currencyCode = proto.gatewayRequest.currencyCode, + level = proto.gatewayRequest.level, + recipientId = RecipientId.from(proto.gatewayRequest.recipient_id), + additionalMessage = proto.gatewayRequest.additionalMessage.takeIf { it.isNotBlank() } + ), + rawPaymentSourceType = proto.paymentSourceType + ) + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt index 62ca00c5..37e9f122 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/Stripe3DSDialogFragment.kt @@ -2,22 +2,32 @@ package org.tm.archive.components.settings.app.subscription.donate.stripe import android.annotation.SuppressLint import android.content.DialogInterface +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle +import android.view.Gravity import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.webkit.WebResourceRequest import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient +import android.widget.FrameLayout import androidx.activity.ComponentDialog import androidx.core.os.bundleOf import androidx.fragment.app.DialogFragment import androidx.fragment.app.setFragmentResult import androidx.navigation.fragment.navArgs +import com.google.android.material.button.MaterialButton +import org.signal.donations.PaymentSourceType import org.signal.donations.StripeIntentAccessor import org.tm.archive.R import org.tm.archive.components.ViewBinderDelegate import org.tm.archive.components.settings.app.subscription.donate.DonationWebViewOnBackPressedCallback import org.tm.archive.databinding.DonationWebviewFragmentBinding +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.util.FeatureFlags import org.tm.archive.util.visible /** @@ -27,9 +37,11 @@ class Stripe3DSDialogFragment : DialogFragment(R.layout.donation_webview_fragmen companion object { const val REQUEST_KEY = "stripe_3ds_dialog_fragment" + const val LAUNCHED_EXTERNAL = "stripe_3ds_dialog_fragment.pending" } val binding by ViewBinderDelegate(DonationWebviewFragmentBinding::bind) { + it.webView.webViewClient = WebViewClient() it.webView.clearCache(true) it.webView.clearHistory() } @@ -43,10 +55,16 @@ class Stripe3DSDialogFragment : DialogFragment(R.layout.donation_webview_fragmen setStyle(STYLE_NO_FRAME, R.style.Signal_DayNight_Dialog_FullScreen) } - @SuppressLint("SetJavaScriptEnabled") + @SuppressLint("SetJavaScriptEnabled", "SetTextI18n") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + dialog!!.window!!.setFlags( + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED + ) + binding.webView.webViewClient = Stripe3DSWebClient() binding.webView.settings.javaScriptEnabled = true + binding.webView.settings.domStorageEnabled = true binding.webView.settings.cacheMode = WebSettings.LOAD_NO_CACHE binding.webView.loadUrl(args.uri.toString()) @@ -57,6 +75,19 @@ class Stripe3DSDialogFragment : DialogFragment(R.layout.donation_webview_fragmen binding.webView ) ) + + if (FeatureFlags.internalUser() && args.stripe3DSData.paymentSourceType == PaymentSourceType.Stripe.IDEAL) { + val openApp = MaterialButton(requireContext()).apply { + text = "Open App" + layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply { + gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL + } + setOnClickListener { + handleLaunchExternal(Intent(Intent.ACTION_VIEW, args.uri)) + } + } + binding.root.addView(openApp) + } } override fun onDismiss(dialog: DialogInterface) { @@ -66,8 +97,23 @@ class Stripe3DSDialogFragment : DialogFragment(R.layout.donation_webview_fragmen setFragmentResult(REQUEST_KEY, result ?: Bundle()) } + private fun handleLaunchExternal(intent: Intent) { + SignalStore.donationsValues().setPending3DSData(args.stripe3DSData) + + result = bundleOf( + LAUNCHED_EXTERNAL to true + ) + + startActivity(intent) + dismissAllowingStateLoss() + } + private inner class Stripe3DSWebClient : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { + return ExternalNavigationHelper.maybeLaunchExternalNavigationIntent(requireContext(), request?.url, this@Stripe3DSDialogFragment::handleLaunchExternal) + } + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { binding.progress.visible = true } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripeNextActionHandler.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripeNextActionHandler.kt new file mode 100644 index 00000000..65a5d4c1 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripeNextActionHandler.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.stripe + +import io.reactivex.rxjava3.core.Single +import org.signal.donations.StripeApi +import org.signal.donations.StripeIntentAccessor + +fun interface StripeNextActionHandler { + fun handle( + action: StripeApi.Secure3DSAction, + stripe3DSData: Stripe3DSData + ): Single +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt index 42803784..046d1f38 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressFragment.kt @@ -66,7 +66,7 @@ class StripePaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog viewModel.processNewDonation(args.request, this::handleSecure3dsAction) } DonationProcessorAction.UPDATE_SUBSCRIPTION -> { - viewModel.updateSubscription(args.request) + viewModel.updateSubscription(args.request, args.isLongRunning) } DonationProcessorAction.CANCEL_SUBSCRIPTION -> { viewModel.cancelSubscription() @@ -116,7 +116,7 @@ class StripePaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog } } - private fun handleSecure3dsAction(secure3dsAction: StripeApi.Secure3DSAction): Single { + private fun handleSecure3dsAction(secure3dsAction: StripeApi.Secure3DSAction, stripe3DSData: Stripe3DSData): Single { return when (secure3dsAction) { is StripeApi.Secure3DSAction.NotNeeded -> { Log.d(TAG, "No 3DS action required.") @@ -124,19 +124,24 @@ class StripePaymentInProgressFragment : DialogFragment(R.layout.donation_in_prog } is StripeApi.Secure3DSAction.ConfirmRequired -> { Log.d(TAG, "3DS action required. Displaying dialog...") - Single.create { emitter -> + Single.create { emitter -> val listener = FragmentResultListener { _, bundle -> val result: StripeIntentAccessor? = bundle.getParcelableCompat(Stripe3DSDialogFragment.REQUEST_KEY, StripeIntentAccessor::class.java) if (result != null) { emitter.onSuccess(result) } else { - emitter.onError(DonationError.UserCancelledPaymentError(args.request.donateToSignalType.toErrorSource())) + val didLaunchExternal = bundle.getBoolean(Stripe3DSDialogFragment.LAUNCHED_EXTERNAL, false) + if (didLaunchExternal) { + emitter.onError(DonationError.UserLaunchedExternalApplication(args.request.donateToSignalType.toErrorSource())) + } else { + emitter.onError(DonationError.UserCancelledPaymentError(args.request.donateToSignalType.toErrorSource())) + } } } parentFragmentManager.setFragmentResultListener(Stripe3DSDialogFragment.REQUEST_KEY, this, listener) - findNavController().safeNavigate(StripePaymentInProgressFragmentDirections.actionStripePaymentInProgressFragmentToStripe3dsDialogFragment(secure3dsAction.uri, secure3dsAction.returnUri)) + findNavController().safeNavigate(StripePaymentInProgressFragmentDirections.actionStripePaymentInProgressFragmentToStripe3dsDialogFragment(secure3dsAction.uri, secure3dsAction.returnUri, stripe3DSData)) emitter.setCancellable { parentFragmentManager.clearFragmentResultListener(Stripe3DSDialogFragment.REQUEST_KEY) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressViewModel.kt index d546071c..f1c308e4 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/stripe/StripePaymentInProgressViewModel.kt @@ -23,12 +23,14 @@ import org.tm.archive.components.settings.app.subscription.donate.DonationProces import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest import org.tm.archive.components.settings.app.subscription.errors.DonationError import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource +import org.tm.archive.components.settings.app.subscription.errors.toDonationError import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.jobs.MultiDeviceSubscriptionSyncRequestJob import org.tm.archive.keyvalue.SignalStore import org.tm.archive.util.rx.RxStore import org.whispersystems.signalservice.api.util.Preconditions import org.whispersystems.signalservice.internal.push.DonationProcessor +import org.whispersystems.signalservice.internal.push.exceptions.DonationProcessorError class StripePaymentInProgressViewModel( private val stripeRepository: StripeRepository, @@ -44,8 +46,7 @@ class StripePaymentInProgressViewModel( val state: Flowable = store.stateFlowable.observeOn(AndroidSchedulers.mainThread()) private val disposables = CompositeDisposable() - private var paymentData: PaymentData? = null - private var cardData: StripeApi.CardData? = null + private var stripePaymentData: StripePaymentData? = null override fun onCleared() { disposables.clear() @@ -68,12 +69,12 @@ class StripePaymentInProgressViewModel( disposables.clear() } - fun processNewDonation(request: GatewayRequest, nextActionHandler: (StripeApi.Secure3DSAction) -> Single) { + fun processNewDonation(request: GatewayRequest, nextActionHandler: StripeNextActionHandler) { Log.d(TAG, "Proceeding with donation...", true) val errorSource = when (request.donateToSignalType) { - DonateToSignalType.ONE_TIME -> DonationErrorSource.BOOST - DonateToSignalType.MONTHLY -> DonationErrorSource.SUBSCRIPTION + DonateToSignalType.ONE_TIME -> DonationErrorSource.ONE_TIME + DonateToSignalType.MONTHLY -> DonationErrorSource.MONTHLY DonateToSignalType.GIFT -> DonationErrorSource.GIFT } @@ -87,49 +88,67 @@ class StripePaymentInProgressViewModel( } private fun resolvePaymentSourceProvider(errorSource: DonationErrorSource): PaymentSourceProvider { - val paymentData = this.paymentData - val cardData = this.cardData - - return when { - paymentData == null && cardData == null -> error("No payment provider available.") - paymentData != null && cardData != null -> error("Too many providers available") - paymentData != null -> PaymentSourceProvider( + return when (val data = stripePaymentData) { + is StripePaymentData.GooglePay -> PaymentSourceProvider( PaymentSourceType.Stripe.GooglePay, - Single.just(GooglePayPaymentSource(paymentData)).doAfterTerminate { clearPaymentInformation() } + Single.just(GooglePayPaymentSource(data.paymentData)).doAfterTerminate { clearPaymentInformation() } ) - cardData != null -> PaymentSourceProvider( + + is StripePaymentData.CreditCard -> PaymentSourceProvider( PaymentSourceType.Stripe.CreditCard, - stripeRepository.createCreditCardPaymentSource(errorSource, cardData).doAfterTerminate { clearPaymentInformation() } + stripeRepository.createCreditCardPaymentSource(errorSource, data.cardData).doAfterTerminate { clearPaymentInformation() } ) + + is StripePaymentData.SEPADebit -> PaymentSourceProvider( + PaymentSourceType.Stripe.SEPADebit, + stripeRepository.createSEPADebitPaymentSource(data.sepaDebitData).doAfterTerminate { clearPaymentInformation() } + ) + + is StripePaymentData.IDEAL -> PaymentSourceProvider( + PaymentSourceType.Stripe.IDEAL, + stripeRepository.createIdealPaymentSource(data.idealData).doAfterTerminate { clearPaymentInformation() } + ) + else -> error("This should never happen.") } } fun providePaymentData(paymentData: PaymentData) { requireNoPaymentInformation() - this.paymentData = paymentData + this.stripePaymentData = StripePaymentData.GooglePay(paymentData) } fun provideCardData(cardData: StripeApi.CardData) { requireNoPaymentInformation() - this.cardData = cardData + this.stripePaymentData = StripePaymentData.CreditCard(cardData) + } + + fun provideSEPADebitData(bankData: StripeApi.SEPADebitData) { + requireNoPaymentInformation() + this.stripePaymentData = StripePaymentData.SEPADebit(bankData) + } + + fun provideIDEALData(bankData: StripeApi.IDEALData) { + requireNoPaymentInformation() + this.stripePaymentData = StripePaymentData.IDEAL(bankData) } private fun requireNoPaymentInformation() { - require(paymentData == null) - require(cardData == null) + require(stripePaymentData == null) } private fun clearPaymentInformation() { Log.d(TAG, "Cleared payment information.", true) - paymentData = null - cardData = null + stripePaymentData = null } - private fun proceedMonthly(request: GatewayRequest, paymentSourceProvider: PaymentSourceProvider, nextActionHandler: (StripeApi.Secure3DSAction) -> Single) { + private fun proceedMonthly(request: GatewayRequest, paymentSourceProvider: PaymentSourceProvider, nextActionHandler: StripeNextActionHandler) { val ensureSubscriberId: Completable = monthlyDonationRepository.ensureSubscriberId() - val createAndConfirmSetupIntent: Single = paymentSourceProvider.paymentSource.flatMap { stripeRepository.createAndConfirmSetupIntent(it) } - val setLevel: Completable = monthlyDonationRepository.setSubscriptionLevel(request.level.toString()) + val createAndConfirmSetupIntent: Single = paymentSourceProvider.paymentSource.flatMap { + stripeRepository.createAndConfirmSetupIntent(it, paymentSourceProvider.paymentSourceType as PaymentSourceType.Stripe) + } + + val setLevel: Completable = monthlyDonationRepository.setSubscriptionLevel(request, paymentSourceProvider.paymentSourceType.isBankTransfer) Log.d(TAG, "Starting subscription payment pipeline...", true) store.update { DonationProcessorStage.PAYMENT_PIPELINE } @@ -138,16 +157,22 @@ class StripePaymentInProgressViewModel( .andThen(monthlyDonationRepository.cancelActiveSubscriptionIfNecessary()) .andThen(createAndConfirmSetupIntent) .flatMap { secure3DSAction -> - nextActionHandler(secure3DSAction) - .flatMap { secure3DSResult -> stripeRepository.getStatusAndPaymentMethodId(secure3DSResult) } - .map { (_, paymentMethod) -> paymentMethod ?: secure3DSAction.paymentMethodId!! } + nextActionHandler.handle( + action = secure3DSAction, + Stripe3DSData( + secure3DSAction.stripeIntentAccessor, + request, + paymentSourceProvider.paymentSourceType.code + ) + ) + .flatMap { secure3DSResult -> stripeRepository.getStatusAndPaymentMethodId(secure3DSResult, secure3DSAction.paymentMethodId) } } - .flatMapCompletable { stripeRepository.setDefaultPaymentMethod(it, paymentSourceProvider.paymentSourceType) } + .flatMapCompletable { stripeRepository.setDefaultPaymentMethod(it.paymentMethod!!, it.intentId, paymentSourceProvider.paymentSourceType) } .onErrorResumeNext { - if (it is DonationError) { - Completable.error(it) - } else { - Completable.error(DonationError.getPaymentSetupError(DonationErrorSource.SUBSCRIPTION, it, paymentSourceProvider.paymentSourceType)) + when (it) { + is DonationError -> Completable.error(it) + is DonationProcessorError -> Completable.error(it.toDonationError(DonationErrorSource.MONTHLY, paymentSourceProvider.paymentSourceType)) + else -> Completable.error(DonationError.getPaymentSetupError(DonationErrorSource.MONTHLY, it, paymentSourceProvider.paymentSourceType)) } } @@ -159,7 +184,7 @@ class StripePaymentInProgressViewModel( val donationError: DonationError = if (throwable is DonationError) { throwable } else { - DonationError.genericBadgeRedemptionFailure(DonationErrorSource.SUBSCRIPTION) + DonationError.genericBadgeRedemptionFailure(DonationErrorSource.MONTHLY) } DonationError.routeDonationError(ApplicationDependencies.getApplication(), donationError) }, @@ -173,7 +198,7 @@ class StripePaymentInProgressViewModel( private fun proceedOneTime( request: GatewayRequest, paymentSourceProvider: PaymentSourceProvider, - nextActionHandler: (StripeApi.Secure3DSAction) -> Single + nextActionHandler: StripeNextActionHandler ) { Log.w(TAG, "Beginning one-time payment pipeline...", true) @@ -189,16 +214,24 @@ class StripePaymentInProgressViewModel( disposables += intentAndSource.flatMapCompletable { (paymentIntent, paymentSource) -> stripeRepository.confirmPayment(paymentSource, paymentIntent, request.recipientId) - .flatMap { nextActionHandler(it) } - .flatMap { stripeRepository.getStatusAndPaymentMethodId(it) } + .flatMap { action -> + nextActionHandler + .handle( + action, + Stripe3DSData( + action.stripeIntentAccessor, + request, + paymentSourceProvider.paymentSourceType.code + ) + ) + .flatMap { stripeRepository.getStatusAndPaymentMethodId(it, action.paymentMethodId) } + } .flatMapCompletable { oneTimeDonationRepository.waitForOneTimeRedemption( - price = amount, + gatewayRequest = request, paymentIntentId = paymentIntent.intentId, - badgeRecipient = request.recipientId, - additionalMessage = request.additionalMessage, - badgeLevel = request.level, - donationProcessor = DonationProcessor.STRIPE + donationProcessor = DonationProcessor.STRIPE, + paymentSourceType = paymentSource.type ) } }.subscribeBy( @@ -206,10 +239,10 @@ class StripePaymentInProgressViewModel( Log.w(TAG, "Failure in one-time payment pipeline...", throwable, true) store.update { DonationProcessorStage.FAILED } - val donationError: DonationError = if (throwable is DonationError) { - throwable - } else { - DonationError.genericBadgeRedemptionFailure(DonationErrorSource.BOOST) + val donationError: DonationError = when (throwable) { + is DonationError -> throwable + is DonationProcessorError -> throwable.toDonationError(request.donateToSignalType.toErrorSource(), paymentSourceProvider.paymentSourceType) + else -> DonationError.genericBadgeRedemptionFailure(request.donateToSignalType.toErrorSource()) } DonationError.routeDonationError(ApplicationDependencies.getApplication(), donationError) }, @@ -239,11 +272,10 @@ class StripePaymentInProgressViewModel( ) } - fun updateSubscription(request: GatewayRequest) { + fun updateSubscription(request: GatewayRequest, isLongRunning: Boolean) { Log.d(TAG, "Beginning subscription update...", true) - store.update { DonationProcessorStage.PAYMENT_PIPELINE } - disposables += monthlyDonationRepository.cancelActiveSubscriptionIfNecessary().andThen(monthlyDonationRepository.setSubscriptionLevel(request.level.toString())) + disposables += monthlyDonationRepository.cancelActiveSubscriptionIfNecessary().andThen(monthlyDonationRepository.setSubscriptionLevel(request, isLongRunning)) .subscribeBy( onComplete = { Log.w(TAG, "Completed subscription update", true) @@ -251,10 +283,10 @@ class StripePaymentInProgressViewModel( }, onError = { throwable -> Log.w(TAG, "Failed to update subscription", throwable, true) - val donationError: DonationError = if (throwable is DonationError) { - throwable - } else { - DonationError.genericBadgeRedemptionFailure(DonationErrorSource.SUBSCRIPTION) + val donationError: DonationError = when (throwable) { + is DonationError -> throwable + is DonationProcessorError -> throwable.toDonationError(DonationErrorSource.MONTHLY, PaymentSourceType.Stripe.GooglePay) + else -> DonationError.genericBadgeRedemptionFailure(DonationErrorSource.MONTHLY) } DonationError.routeDonationError(ApplicationDependencies.getApplication(), donationError) @@ -268,6 +300,13 @@ class StripePaymentInProgressViewModel( val paymentSource: Single ) + private sealed interface StripePaymentData { + class GooglePay(val paymentData: PaymentData) : StripePaymentData + class CreditCard(val cardData: StripeApi.CardData) : StripePaymentData + class SEPADebit(val sepaDebitData: StripeApi.SEPADebitData) : StripePaymentData + class IDEAL(val idealData: StripeApi.IDEALData) : StripePaymentData + } + class Factory( private val stripeRepository: StripeRepository, private val monthlyDonationRepository: MonthlyDonationRepository = MonthlyDonationRepository(ApplicationDependencies.getDonationsService()), diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/BankDetailsValidator.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/BankDetailsValidator.kt new file mode 100644 index 00000000..2166f811 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/BankDetailsValidator.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer + +object BankDetailsValidator { + + private val EMAIL_REGEX: Regex = ".+@.+\\..+".toRegex() + + fun validName(name: String): Boolean { + return name.length >= 2 + } + + fun validEmail(email: String): Boolean { + return email.length >= 3 && email.matches(EMAIL_REGEX) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/BankTransferRequestKeys.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/BankTransferRequestKeys.kt new file mode 100644 index 00000000..3a49ea2c --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/BankTransferRequestKeys.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer + +object BankTransferRequestKeys { + const val REQUEST_KEY = "bank.transfer.result" + const val PENDING_KEY = "bank.transfer.pending" +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt new file mode 100644 index 00000000..86b93291 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsFragment.kt @@ -0,0 +1,375 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.details + +import android.os.Bundle +import android.view.View +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment.Companion.Center +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.os.bundleOf +import androidx.fragment.app.setFragmentResult +import androidx.fragment.app.setFragmentResultListener +import androidx.fragment.app.viewModels +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import androidx.navigation.navGraphViewModels +import org.signal.core.ui.Buttons +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.Texts +import org.signal.core.ui.theme.SignalTheme +import org.signal.core.util.getParcelableCompat +import org.tm.archive.R +import org.tm.archive.components.TemporaryScreenshotSecurity +import org.tm.archive.components.settings.app.subscription.DonationPaymentComponent +import org.tm.archive.components.settings.app.subscription.donate.DonateToSignalType +import org.tm.archive.components.settings.app.subscription.donate.DonationCheckoutDelegate +import org.tm.archive.components.settings.app.subscription.donate.DonationProcessorAction +import org.tm.archive.components.settings.app.subscription.donate.DonationProcessorActionResult +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest +import org.tm.archive.components.settings.app.subscription.donate.stripe.StripePaymentInProgressFragment +import org.tm.archive.components.settings.app.subscription.donate.stripe.StripePaymentInProgressViewModel +import org.tm.archive.components.settings.app.subscription.donate.transfer.BankTransferRequestKeys +import org.tm.archive.components.settings.app.subscription.donate.transfer.details.BankTransferDetailsViewModel.Field +import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource +import org.tm.archive.compose.ComposeFragment +import org.tm.archive.payments.FiatMoneyUtil +import org.tm.archive.util.SpanUtil +import org.tm.archive.util.fragments.requireListener +import org.tm.archive.util.navigation.safeNavigate + +/** + * Collects SEPA Debit bank transfer details from the user to proceed with donation. + */ +class BankTransferDetailsFragment : ComposeFragment(), DonationCheckoutDelegate.ErrorHandlerCallback { + + private val args: BankTransferDetailsFragmentArgs by navArgs() + private val viewModel: BankTransferDetailsViewModel by viewModels() + + private val stripePaymentViewModel: StripePaymentInProgressViewModel by navGraphViewModels( + R.id.donate_to_signal, + factoryProducer = { + StripePaymentInProgressViewModel.Factory(requireListener().stripeRepository) + } + ) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + TemporaryScreenshotSecurity.bindToViewLifecycleOwner(this) + + val errorSource: DonationErrorSource = when (args.request.donateToSignalType) { + DonateToSignalType.ONE_TIME -> DonationErrorSource.ONE_TIME + DonateToSignalType.MONTHLY -> DonationErrorSource.MONTHLY + DonateToSignalType.GIFT -> DonationErrorSource.GIFT + } + + DonationCheckoutDelegate.ErrorHandler().attach(this, this, args.request.uiSessionKey, errorSource) + + setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle -> + val result: DonationProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! + if (result.status == DonationProcessorActionResult.Status.SUCCESS) { + findNavController().popBackStack(R.id.donateToSignalFragment, false) + setFragmentResult(BankTransferRequestKeys.REQUEST_KEY, bundle) + } + } + } + + @Composable + override fun FragmentContent() { + val state: BankTransferDetailsState by viewModel.state + + val donateLabel = remember(args.request) { + if (args.request.donateToSignalType == DonateToSignalType.MONTHLY) { + getString( + R.string.BankTransferDetailsFragment__donate_s_month, + FiatMoneyUtil.format(resources, args.request.fiat, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + ) + } else { + getString( + R.string.BankTransferDetailsFragment__donate_s, + FiatMoneyUtil.format(resources, args.request.fiat) + ) + } + } + + BankTransferDetailsContent( + state = state, + onNavigationClick = this::onNavigationClick, + onNameChanged = viewModel::onNameChanged, + onIBANChanged = viewModel::onIBANChanged, + onEmailChanged = viewModel::onEmailChanged, + setDisplayFindAccountInfoSheet = viewModel::setDisplayFindAccountInfoSheet, + onLearnMoreClick = this::onLearnMoreClick, + onDonateClick = this::onDonateClick, + onFocusChanged = viewModel::onFocusChanged, + donateLabel = donateLabel + ) + } + + private fun onNavigationClick() { + findNavController().popBackStack() + } + + private fun onLearnMoreClick() { + findNavController().safeNavigate( + BankTransferDetailsFragmentDirections.actionBankTransferDetailsFragmentToYourInformationIsPrivateBottomSheet() + ) + } + + private fun onDonateClick() { + stripePaymentViewModel.provideSEPADebitData(viewModel.state.value.asSEPADebitData()) + findNavController().safeNavigate( + BankTransferDetailsFragmentDirections.actionBankTransferDetailsFragmentToStripePaymentInProgressFragment( + DonationProcessorAction.PROCESS_NEW_DONATION, + args.request + ) + ) + } + + override fun onUserLaunchedAnExternalApplication() = Unit + + override fun navigateToDonationPending(gatewayRequest: GatewayRequest) { + setFragmentResult(BankTransferRequestKeys.PENDING_KEY, bundleOf(BankTransferRequestKeys.PENDING_KEY to gatewayRequest)) + viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onResume(owner: LifecycleOwner) { + findNavController().popBackStack(R.id.donateToSignalFragment, false) + } + }) + } +} + +@Preview +@Composable +private fun BankTransferDetailsContentPreview() { + SignalTheme { + BankTransferDetailsContent( + state = BankTransferDetailsState( + name = "Miles Morales", + displayFindAccountInfoSheet = true + ), + onNavigationClick = {}, + onNameChanged = {}, + onIBANChanged = {}, + onEmailChanged = {}, + setDisplayFindAccountInfoSheet = {}, + onLearnMoreClick = {}, + onDonateClick = {}, + onFocusChanged = { _, _ -> }, + donateLabel = "Donate $5/month" + ) + } +} + +@Composable +private fun BankTransferDetailsContent( + state: BankTransferDetailsState, + onNavigationClick: () -> Unit, + onNameChanged: (String) -> Unit, + onIBANChanged: (String) -> Unit, + onEmailChanged: (String) -> Unit, + setDisplayFindAccountInfoSheet: (Boolean) -> Unit, + onLearnMoreClick: () -> Unit, + onDonateClick: () -> Unit, + onFocusChanged: (Field, Boolean) -> Unit, + donateLabel: String +) { + Scaffolds.Settings( + title = "Bank transfer", + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24) + ) { + Column( + horizontalAlignment = CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight() + .padding(it) + ) { + val focusManager = LocalFocusManager.current + val focusRequester = remember { FocusRequester() } + + LazyColumn( + modifier = Modifier + .weight(1f) + .padding(horizontal = 24.dp) + ) { + item { + val learnMore = stringResource(id = R.string.BankTransferDetailsFragment__learn_more) + val fullString = stringResource(id = R.string.BankTransferDetailsFragment__enter_your_bank_details, learnMore) + + Texts.LinkifiedText( + textWithUrlSpans = SpanUtil.urlSubsequence(fullString, learnMore, stringResource(id = R.string.donate_faq_url)), + onUrlClick = { + onLearnMoreClick() + }, + style = MaterialTheme.typography.bodyMedium.copy( + color = MaterialTheme.colorScheme.onSurfaceVariant + ), + modifier = Modifier.padding(vertical = 12.dp) + ) + } + + item { + TextField( + value = state.iban, + onValueChange = onIBANChanged, + label = { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__iban)) + }, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.Characters, + imeAction = ImeAction.Next + ), + keyboardActions = KeyboardActions( + onNext = { focusManager.moveFocus(FocusDirection.Down) } + ), + isError = state.ibanValidity.isError, + supportingText = { + if (state.ibanValidity.isError) { + Text( + text = when (state.ibanValidity) { + IBANValidator.Validity.TOO_SHORT -> stringResource(id = R.string.BankTransferDetailsFragment__iban_is_too_short) + IBANValidator.Validity.TOO_LONG -> stringResource(id = R.string.BankTransferDetailsFragment__iban_is_too_long) + IBANValidator.Validity.INVALID_COUNTRY -> stringResource(id = R.string.BankTransferDetailsFragment__iban_country_code_is_not_supported) + IBANValidator.Validity.INVALID_CHARACTERS -> stringResource(id = R.string.BankTransferDetailsFragment__invalid_iban) + IBANValidator.Validity.INVALID_MOD_97 -> stringResource(id = R.string.BankTransferDetailsFragment__invalid_iban) + else -> error("Unexpected error.") + } + ) + } + }, + visualTransformation = IBANVisualTransformation, + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp) + .defaultMinSize(minHeight = 78.dp) + .onFocusChanged { onFocusChanged(Field.IBAN, it.hasFocus) } + .focusRequester(focusRequester) + ) + } + + item { + TextField( + value = state.name, + onValueChange = onNameChanged, + label = { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__name_on_bank_account)) + }, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.Words, + imeAction = ImeAction.Next + ), + keyboardActions = KeyboardActions( + onNext = { focusManager.moveFocus(FocusDirection.Down) } + ), + isError = state.showNameError(), + supportingText = { + if (state.showNameError()) { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__minimum_2_characters)) + } + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .defaultMinSize(minHeight = 78.dp) + .onFocusChanged { onFocusChanged(Field.NAME, it.hasFocus) } + ) + } + + item { + TextField( + value = state.email, + onValueChange = onEmailChanged, + label = { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__email)) + }, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Email, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { onDonateClick() } + ), + isError = state.showEmailError(), + supportingText = { + if (state.showEmailError()) { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__invalid_email_address)) + } + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .defaultMinSize(minHeight = 78.dp) + .onFocusChanged { onFocusChanged(Field.EMAIL, it.hasFocus) } + ) + } + + item { + Box( + contentAlignment = Center, + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp) + ) { + TextButton( + onClick = { setDisplayFindAccountInfoSheet(true) } + ) { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__find_account_info)) + } + } + } + } + + Buttons.LargeTonal( + enabled = state.canProceed, + onClick = onDonateClick, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(vertical = 16.dp) + ) { + Text(text = donateLabel) + } + + if (state.displayFindAccountInfoSheet) { + FindAccountInfoSheet { setDisplayFindAccountInfoSheet(false) } + } + + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsState.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsState.kt new file mode 100644 index 00000000..179a9482 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsState.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.details + +import org.signal.donations.StripeApi +import org.tm.archive.components.settings.app.subscription.donate.transfer.BankDetailsValidator + +data class BankTransferDetailsState( + val name: String = "", + val nameFocusState: FocusState = FocusState.NOT_FOCUSED, + val iban: String = "", + val email: String = "", + val emailFocusState: FocusState = FocusState.NOT_FOCUSED, + val ibanValidity: IBANValidator.Validity = IBANValidator.Validity.POTENTIALLY_VALID, + val displayFindAccountInfoSheet: Boolean = false +) { + val canProceed = BankDetailsValidator.validName(name) && BankDetailsValidator.validEmail(email) && ibanValidity == IBANValidator.Validity.COMPLETELY_VALID + + fun showNameError(): Boolean { + return nameFocusState == FocusState.LOST_FOCUS && !BankDetailsValidator.validName(name) + } + + fun showEmailError(): Boolean { + return emailFocusState == FocusState.LOST_FOCUS && !BankDetailsValidator.validEmail(email) + } + + fun asSEPADebitData(): StripeApi.SEPADebitData { + return StripeApi.SEPADebitData( + iban = iban.trim(), + name = name.trim(), + email = email.trim() + ) + } + + enum class FocusState { + NOT_FOCUSED, + FOCUSED, + LOST_FOCUS + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsViewModel.kt new file mode 100644 index 00000000..53d8d665 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/BankTransferDetailsViewModel.kt @@ -0,0 +1,78 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.details + +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import org.tm.archive.components.settings.app.subscription.donate.transfer.details.BankTransferDetailsState.FocusState + +class BankTransferDetailsViewModel : ViewModel() { + + companion object { + private const val IBAN_MAX_CHARACTER_COUNT = 34 + } + + private val internalState = mutableStateOf(BankTransferDetailsState()) + val state: State = internalState + + fun setDisplayFindAccountInfoSheet(displayFindAccountInfoSheet: Boolean) { + internalState.value = internalState.value.copy( + displayFindAccountInfoSheet = displayFindAccountInfoSheet + ) + } + + fun onNameChanged(name: String) { + internalState.value = internalState.value.copy( + name = name + ) + } + + fun onFocusChanged(field: Field, isFocused: Boolean) { + when (field) { + Field.IBAN -> { + internalState.value = internalState.value.copy( + ibanValidity = IBANValidator.validate(internalState.value.iban, isFocused) + ) + } + + Field.NAME -> { + if (isFocused && internalState.value.nameFocusState == FocusState.NOT_FOCUSED) { + internalState.value = internalState.value.copy(nameFocusState = FocusState.FOCUSED) + } else if (!isFocused && internalState.value.nameFocusState == FocusState.FOCUSED) { + internalState.value = internalState.value.copy(nameFocusState = FocusState.LOST_FOCUS) + } + } + + Field.EMAIL -> { + if (isFocused && internalState.value.emailFocusState == FocusState.NOT_FOCUSED) { + internalState.value = internalState.value.copy(emailFocusState = FocusState.FOCUSED) + } else if (!isFocused && internalState.value.emailFocusState == FocusState.FOCUSED) { + internalState.value = internalState.value.copy(emailFocusState = FocusState.LOST_FOCUS) + } + } + } + } + + fun onIBANChanged(iban: String) { + internalState.value = internalState.value.copy( + iban = iban.take(IBAN_MAX_CHARACTER_COUNT).uppercase(), + ibanValidity = IBANValidator.validate(internalState.value.iban, true) + ) + } + + fun onEmailChanged(email: String) { + internalState.value = internalState.value.copy( + email = email + ) + } + + enum class Field { + IBAN, + NAME, + EMAIL + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/FindAccountInfoSheet.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/FindAccountInfoSheet.kt new file mode 100644 index 00000000..27017855 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/FindAccountInfoSheet.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.details + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import org.signal.core.ui.BottomSheets +import org.tm.archive.R + +/** + * Displays a modal bottom sheet that explains where to find the information necessary to perform + * a bank transfer. + */ +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun FindAccountInfoSheet( + onDismissRequest: () -> Unit +) { + ModalBottomSheet( + onDismissRequest = onDismissRequest, + dragHandle = { BottomSheets.Handle() } + ) { + Image( + painter = painterResource(id = R.drawable.find_account_info), + contentDescription = null, + modifier = Modifier + .align(CenterHorizontally) + .padding(vertical = 32.dp) + ) + + Text( + text = stringResource(id = R.string.FindAccountInfoSheet__find_your_account_information), + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 60.dp) + .align(CenterHorizontally) + ) + + Text( + text = stringResource(id = R.string.FindAccountInfoSheet__look_for_your_iban_at), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp, bottom = 48.dp, start = 60.dp, end = 60.dp) + .align(CenterHorizontally) + ) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/IBANValidator.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/IBANValidator.kt new file mode 100644 index 00000000..8be9dfbc --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/IBANValidator.kt @@ -0,0 +1,163 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.details + +import java.math.BigInteger + +object IBANValidator { + + private val countryCodeToLength: Map by lazy { + mapOf( + "AL" to 28, + "AD" to 24, + "AT" to 20, + "AZ" to 28, + "BH" to 22, + "BY" to 28, + "BE" to 16, + "BA" to 20, + "BR" to 29, + "BG" to 22, + "CR" to 22, + "HR" to 21, + "CY" to 28, + "CZ" to 24, + "DK" to 18, + "DO" to 28, + "TL" to 23, + "EG" to 29, + "SV" to 28, + "EE" to 20, + "FO" to 18, + "FI" to 18, + "FR" to 27, + "GE" to 22, + "DE" to 22, + "GI" to 23, + "GR" to 27, + "GL" to 18, + "GT" to 28, + "HU" to 28, + "IS" to 26, + "IQ" to 23, + "IE" to 22, + "IL" to 23, + "IT" to 27, + "JO" to 30, + "KZ" to 20, + "XK" to 20, + "KW" to 30, + "LV" to 21, + "LB" to 28, + "LY" to 25, + "LI" to 21, + "LT" to 20, + "LU" to 20, + "MT" to 31, + "MR" to 27, + "MU" to 30, + "MC" to 27, + "MD" to 24, + "ME" to 22, + "NL" to 18, + "MK" to 19, + "NO" to 15, + "PK" to 24, + "PS" to 29, + "PL" to 28, + "PT" to 25, + "QA" to 29, + "RO" to 24, + "RU" to 33, + "LC" to 32, + "SM" to 27, + "ST" to 25, + "SA" to 24, + "RS" to 22, + "SC" to 31, + "SK" to 24, + "SI" to 19, + "ES" to 24, + "SD" to 18, + "SE" to 24, + "CH" to 21, + "TN" to 24, + "TR" to 26, + "UA" to 29, + "AE" to 23, + "GB" to 22, + "VA" to 22, + "VG" to 24 + ) + } + + fun validate(iban: String, isIBANFieldFocused: Boolean): Validity { + val trimmedIban = iban.trim() + + if (trimmedIban.isEmpty()) { + return Validity.POTENTIALLY_VALID + } + + val lengthValidity = validateLength(trimmedIban, isIBANFieldFocused) + if (lengthValidity != Validity.COMPLETELY_VALID) { + return lengthValidity + } + + val countryAndCheck = trimmedIban.take(4) + val rearranged = trimmedIban.drop(4) + countryAndCheck + val expanded = rearranged.map { + if (it.isLetter()) { + (it - 'A') + 10 + } else if (it.isDigit()) { + it.digitToInt() + } else { + return Validity.INVALID_CHARACTERS + } + }.joinToString("") + val bigInteger = BigInteger(expanded) + if (bigInteger.mod(BigInteger.valueOf(97L)) == BigInteger.ONE) { + return Validity.COMPLETELY_VALID + } + + return Validity.INVALID_MOD_97 + } + + private fun validateLength(iban: String, isIBANFieldFocused: Boolean): Validity { + if (iban.length < 2) { + return if (isIBANFieldFocused) { + Validity.POTENTIALLY_VALID + } else { + Validity.TOO_SHORT + } + } + + val countryCode = iban.take(2) + val requiredLength = countryCodeToLength[countryCode] ?: -1 + if (requiredLength == -1) { + return Validity.INVALID_COUNTRY + } + + if (requiredLength > iban.length) { + return if (isIBANFieldFocused) Validity.POTENTIALLY_VALID else Validity.TOO_SHORT + } + + if (requiredLength < iban.length) { + return Validity.TOO_LONG + } + + return Validity.COMPLETELY_VALID + } + + enum class Validity(val isError: Boolean) { + TOO_SHORT(true), + TOO_LONG(true), + INVALID_COUNTRY(true), + INVALID_CHARACTERS(true), + INVALID_MOD_97(true), + POTENTIALLY_VALID(false), + COMPLETELY_VALID(false) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/IBANVisualTransformation.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/IBANVisualTransformation.kt new file mode 100644 index 00000000..c3aacb43 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/details/IBANVisualTransformation.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.details + +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.input.OffsetMapping +import androidx.compose.ui.text.input.TransformedText +import androidx.compose.ui.text.input.VisualTransformation + +/** + * Transforms the given input string to an IBAN representative format: + * + * AB1234567890 becomes AB12 3456 7890 + */ +object IBANVisualTransformation : VisualTransformation { + override fun filter(text: AnnotatedString): TransformedText { + var output = "" + for (i in text.take(34).indices) { + output += text[i] + if (i % 4 == 3) { + output += " " + } + } + + return TransformedText( + text = AnnotatedString(output), + offsetMapping = IBANOffsetMapping + ) + } + + private object IBANOffsetMapping : OffsetMapping { + override fun originalToTransformed(offset: Int): Int { + return offset + (offset / 4) + } + + override fun transformedToOriginal(offset: Int): Int { + return offset - (offset / 4) + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealBank.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealBank.kt new file mode 100644 index 00000000..011db016 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealBank.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.ideal + +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import org.tm.archive.R +import java.util.EnumMap + +/** + * Set of banks that are supported for iDEAL transfers, as listed here: + * https://stripe.com/docs/api/payment_methods/object#payment_method_object-ideal-bank + */ +enum class IdealBank( + val code: String +) { + ABN_AMRO("abn_amro"), + ASN_BANK("asn_bank"), + BUNQ("bunq"), + ING("ing"), + KNAB("knab"), + N26("n26"), + RABOBANK("rabobank"), + REGIOBANK("regiobank"), + REVOLUT("revolut"), + SNS_BANK("sns_bank"), + TRIODOS_BANK("triodos_bank"), + VAN_LANSCHOT("van_lanschot"), + YOURSAFE("yoursafe"); + + fun getUIValues(): UIValues = bankToUIValues[this]!! + + companion object { + + private val bankToUIValues: Map by lazy { + EnumMap(IdealBank::class.java).apply { + putAll( + arrayOf( + ABN_AMRO to UIValues( + name = R.string.IdealBank__abn_amro, + icon = R.drawable.ideal_abn_amro + ), + ASN_BANK to UIValues( + name = R.string.IdealBank__asn_bank, + icon = R.drawable.ideal_asn + ), + BUNQ to UIValues( + name = R.string.IdealBank__bunq, + icon = R.drawable.ideal_bunq + ), + ING to UIValues( + name = R.string.IdealBank__ing, + icon = R.drawable.ideal_ing + ), + KNAB to UIValues( + name = R.string.IdealBank__knab, + icon = R.drawable.ideal_knab + ), + N26 to UIValues( + name = R.string.IdealBank__n26, + icon = R.drawable.ideal_n26 + ), + RABOBANK to UIValues( + name = R.string.IdealBank__rabobank, + icon = R.drawable.ideal_rabobank + ), + REGIOBANK to UIValues( + name = R.string.IdealBank__regiobank, + icon = R.drawable.ideal_regiobank + ), + REVOLUT to UIValues( + name = R.string.IdealBank__revolut, + icon = R.drawable.ideal_revolut + ), + SNS_BANK to UIValues( + name = R.string.IdealBank__sns_bank, + icon = R.drawable.ideal_sns + ), + TRIODOS_BANK to UIValues( + name = R.string.IdealBank__triodos_bank, + icon = R.drawable.ideal_triodos_bank + ), + VAN_LANSCHOT to UIValues( + name = R.string.IdealBank__van_lanschot, + icon = R.drawable.ideal_van_lanschot + ), + YOURSAFE to UIValues( + name = R.string.IdealBank__yoursafe, + icon = R.drawable.ideal_yoursafe + ) + ) + ) + } + } + + fun fromCode(code: String): IdealBank { + return values().first { it.code == code } + } + } + + data class UIValues( + @StringRes val name: Int, + @DrawableRes val icon: Int + ) +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsBankSelectionDialogFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsBankSelectionDialogFragment.kt new file mode 100644 index 00000000..f14c4844 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsBankSelectionDialogFragment.kt @@ -0,0 +1,113 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.ideal + +import android.os.Bundle +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment.Companion.CenterVertically +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.os.bundleOf +import androidx.fragment.app.setFragmentResult +import androidx.navigation.fragment.findNavController +import org.signal.core.ui.Scaffolds +import org.tm.archive.R +import org.tm.archive.compose.ComposeDialogFragment + +/** + * Dialog fragment for selecting the bank for the iDEAL donation. + */ +class IdealTransferDetailsBankSelectionDialogFragment : ComposeDialogFragment() { + + companion object { + const val IDEAL_SELECTED_BANK = "ideal.selected.bank" + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setStyle(STYLE_NO_FRAME, R.style.Signal_DayNight_Dialog_FullScreen) + } + + @Composable + override fun DialogContent() { + BankSelectionContent( + onNavigationClick = { findNavController().popBackStack() }, + onBankSelected = { + dismissAllowingStateLoss() + + setFragmentResult( + IDEAL_SELECTED_BANK, + bundleOf( + IDEAL_SELECTED_BANK to it.code + ) + ) + } + ) + } +} + +@Preview +@Composable +private fun BankSelectionContentPreview() { + BankSelectionContent( + onNavigationClick = {}, + onBankSelected = {} + ) +} + +@Composable +private fun BankSelectionContent( + onNavigationClick: () -> Unit, + onBankSelected: (IdealBank) -> Unit +) { + Scaffolds.Settings( + title = stringResource(R.string.IdealTransferDetailsBankSelectionDialogFragment__choose_your_bank), + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.symbol_x_24) + ) { paddingValues -> + LazyColumn(modifier = Modifier.padding(paddingValues)) { + items(IdealBank.values()) { + val uiValues = it.getUIValues() + + Row( + verticalAlignment = CenterVertically, + modifier = Modifier + .clickable { onBankSelected(it) } + .fillMaxWidth() + .defaultMinSize(minHeight = 56.dp) + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 8.dp) + ) { + Image( + painter = painterResource(id = uiValues.icon), + contentDescription = null, + modifier = Modifier + .size(40.dp) + ) + + Text( + text = stringResource(uiValues.name), + modifier = Modifier.padding(start = 24.dp) + ) + } + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsFragment.kt new file mode 100644 index 00000000..87b04c2d --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsFragment.kt @@ -0,0 +1,388 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.ideal + +import android.os.Bundle +import android.view.View +import androidx.annotation.StringRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.core.os.bundleOf +import androidx.fragment.app.setFragmentResult +import androidx.fragment.app.setFragmentResultListener +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import androidx.navigation.navGraphViewModels +import org.signal.core.ui.Buttons +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.Texts +import org.signal.core.util.getParcelableCompat +import org.tm.archive.R +import org.tm.archive.components.TemporaryScreenshotSecurity +import org.tm.archive.components.settings.app.subscription.DonationPaymentComponent +import org.tm.archive.components.settings.app.subscription.donate.DonateToSignalType +import org.tm.archive.components.settings.app.subscription.donate.DonationCheckoutDelegate +import org.tm.archive.components.settings.app.subscription.donate.DonationProcessorAction +import org.tm.archive.components.settings.app.subscription.donate.DonationProcessorActionResult +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest +import org.tm.archive.components.settings.app.subscription.donate.stripe.StripePaymentInProgressFragment +import org.tm.archive.components.settings.app.subscription.donate.stripe.StripePaymentInProgressViewModel +import org.tm.archive.components.settings.app.subscription.donate.transfer.BankTransferRequestKeys +import org.tm.archive.components.settings.app.subscription.donate.transfer.ideal.IdealTransferDetailsViewModel.Field +import org.tm.archive.components.settings.app.subscription.errors.DonationErrorSource +import org.tm.archive.compose.ComposeFragment +import org.tm.archive.payments.FiatMoneyUtil +import org.tm.archive.util.SpanUtil +import org.tm.archive.util.fragments.requireListener +import org.tm.archive.util.navigation.safeNavigate +import org.tm.archive.util.viewModel + +/** + * Fragment for inputting necessary bank transfer information for iDEAL donation + */ +class IdealTransferDetailsFragment : ComposeFragment(), DonationCheckoutDelegate.ErrorHandlerCallback { + + private val args: IdealTransferDetailsFragmentArgs by navArgs() + private val viewModel: IdealTransferDetailsViewModel by viewModel { + IdealTransferDetailsViewModel(args.request.donateToSignalType == DonateToSignalType.MONTHLY) + } + + private val stripePaymentViewModel: StripePaymentInProgressViewModel by navGraphViewModels( + R.id.donate_to_signal, + factoryProducer = { + StripePaymentInProgressViewModel.Factory(requireListener().stripeRepository) + } + ) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + TemporaryScreenshotSecurity.bindToViewLifecycleOwner(this) + + val errorSource: DonationErrorSource = when (args.request.donateToSignalType) { + DonateToSignalType.ONE_TIME -> DonationErrorSource.ONE_TIME + DonateToSignalType.MONTHLY -> DonationErrorSource.MONTHLY + DonateToSignalType.GIFT -> DonationErrorSource.GIFT + } + + DonationCheckoutDelegate.ErrorHandler().attach(this, this, args.request.uiSessionKey, errorSource) + + setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle -> + val result: DonationProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, DonationProcessorActionResult::class.java)!! + if (result.status == DonationProcessorActionResult.Status.SUCCESS) { + findNavController().popBackStack(R.id.donateToSignalFragment, false) + setFragmentResult(BankTransferRequestKeys.REQUEST_KEY, bundle) + } + } + + setFragmentResultListener(IdealTransferDetailsBankSelectionDialogFragment.IDEAL_SELECTED_BANK) { _, bundle -> + val bankCode = bundle.getString(IdealTransferDetailsBankSelectionDialogFragment.IDEAL_SELECTED_BANK)!! + viewModel.onBankSelected(IdealBank.fromCode(bankCode)) + } + } + + @Composable + override fun FragmentContent() { + val state by viewModel.state + + val donateLabel = remember(args.request) { + if (args.request.donateToSignalType == DonateToSignalType.MONTHLY) { + getString( + R.string.BankTransferDetailsFragment__donate_s_month, + FiatMoneyUtil.format(resources, args.request.fiat, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + ) + } else { + getString( + R.string.BankTransferDetailsFragment__donate_s, + FiatMoneyUtil.format(resources, args.request.fiat) + ) + } + } + + val idealDirections = remember(args.request) { + if (args.request.donateToSignalType == DonateToSignalType.MONTHLY) { + R.string.IdealTransferDetailsFragment__enter_your_bank + } else { + R.string.IdealTransferDetailsFragment__enter_your_bank_details_one_time + } + } + + IdealTransferDetailsContent( + state = state, + idealDirections = idealDirections, + donateLabel = donateLabel, + onNavigationClick = { findNavController().popBackStack() }, + onLearnMoreClick = { findNavController().navigate(IdealTransferDetailsFragmentDirections.actionBankTransferDetailsFragmentToYourInformationIsPrivateBottomSheet()) }, + onSelectBankClick = { findNavController().navigate(IdealTransferDetailsFragmentDirections.actionIdealTransferDetailsFragmentToIdealTransferBankSelectionDialogFragment()) }, + onNameChanged = viewModel::onNameChanged, + onEmailChanged = viewModel::onEmailChanged, + onFocusChanged = viewModel::onFocusChanged, + onDonateClick = this::onDonateClick + ) + } + + private fun onDonateClick() { + stripePaymentViewModel.provideIDEALData(viewModel.state.value.asIDEALData()) + findNavController().safeNavigate( + IdealTransferDetailsFragmentDirections.actionBankTransferDetailsFragmentToStripePaymentInProgressFragment( + DonationProcessorAction.PROCESS_NEW_DONATION, + args.request + ) + ) + } + + override fun onUserLaunchedAnExternalApplication() { + viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onResume(owner: LifecycleOwner) { + findNavController().popBackStack(R.id.donateToSignalFragment, true) + } + }) + } + + override fun navigateToDonationPending(gatewayRequest: GatewayRequest) { + setFragmentResult(BankTransferRequestKeys.PENDING_KEY, bundleOf(BankTransferRequestKeys.PENDING_KEY to gatewayRequest)) + viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onResume(owner: LifecycleOwner) { + findNavController().popBackStack(R.id.donateToSignalFragment, false) + } + }) + } +} + +@Preview +@Composable +private fun IdealTransferDetailsContentPreview() { + IdealTransferDetailsContent( + state = IdealTransferDetailsState(isMonthly = true), + idealDirections = R.string.IdealTransferDetailsFragment__enter_your_bank, + donateLabel = "Donate $5/month", + onNavigationClick = {}, + onLearnMoreClick = {}, + onSelectBankClick = {}, + onNameChanged = {}, + onEmailChanged = {}, + onFocusChanged = { _, _ -> }, + onDonateClick = {} + ) +} + +@Composable +private fun IdealTransferDetailsContent( + state: IdealTransferDetailsState, + @StringRes idealDirections: Int, + donateLabel: String, + onNavigationClick: () -> Unit, + onLearnMoreClick: () -> Unit, + onSelectBankClick: () -> Unit, + onNameChanged: (String) -> Unit, + onEmailChanged: (String) -> Unit, + onFocusChanged: (Field, Boolean) -> Unit, + onDonateClick: () -> Unit +) { + Scaffolds.Settings( + title = stringResource(id = R.string.GatewaySelectorBottomSheet__ideal), + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24) + ) { + val focusManager = LocalFocusManager.current + + Column( + horizontalAlignment = CenterHorizontally, + modifier = Modifier.padding(it) + ) { + LazyColumn( + modifier = Modifier + .weight(1f) + .padding(horizontal = 24.dp) + ) { + item { + val learnMore = stringResource(id = R.string.IdealTransferDetailsFragment__learn_more) + val fullString = stringResource(id = idealDirections, learnMore) + + Texts.LinkifiedText( + textWithUrlSpans = SpanUtil.urlSubsequence(fullString, learnMore, stringResource(id = R.string.donate_faq_url)), + onUrlClick = { + onLearnMoreClick() + }, + style = MaterialTheme.typography.bodyMedium.copy( + color = MaterialTheme.colorScheme.onSurfaceVariant + ), + modifier = Modifier.padding(vertical = 12.dp) + ) + } + + item { + IdealBankSelector( + idealBank = state.idealBank, + onSelectBankClick = onSelectBankClick, + modifier = Modifier + .fillMaxWidth() + ) + } + + item { + TextField( + value = state.name, + onValueChange = onNameChanged, + label = { + Text(text = stringResource(id = R.string.IdealTransferDetailsFragment__name_on_bank_account)) + }, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.Words, + imeAction = ImeAction.Next + ), + keyboardActions = KeyboardActions( + onNext = { focusManager.moveFocus(FocusDirection.Down) } + ), + isError = state.showNameError(), + supportingText = { + if (state.showNameError()) { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__minimum_2_characters)) + } + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .defaultMinSize(minHeight = 78.dp) + .onFocusChanged { onFocusChanged(Field.NAME, it.hasFocus) } + ) + } + + if (state.isMonthly) { + item { + TextField( + value = state.email, + onValueChange = onEmailChanged, + label = { + Text(text = stringResource(id = R.string.IdealTransferDetailsFragment__email)) + }, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Email, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + if (state.canProceed()) { + onDonateClick() + } + } + ), + isError = state.showEmailError(), + supportingText = { + if (state.showEmailError()) { + Text(text = stringResource(id = R.string.BankTransferDetailsFragment__invalid_email_address)) + } + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .defaultMinSize(minHeight = 78.dp) + .onFocusChanged { onFocusChanged(Field.EMAIL, it.hasFocus) } + ) + } + } + } + + Buttons.LargeTonal( + enabled = state.canProceed(), + onClick = onDonateClick, + modifier = Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(bottom = 16.dp) + ) { + Text(text = donateLabel) + } + } + } +} + +@Preview +@Composable +private fun IdealBankSelectorPreview() { + IdealBankSelector( + idealBank = null, + onSelectBankClick = {} + ) +} + +@Composable +private fun IdealBankSelector( + idealBank: IdealBank?, + onSelectBankClick: () -> Unit, + modifier: Modifier = Modifier +) { + val uiValues: IdealBank.UIValues? = remember(idealBank) { idealBank?.getUIValues() } + val imagePadding: Dp = if (idealBank == null) 4.dp else 0.dp + + TextField( + value = stringResource(id = uiValues?.name ?: R.string.IdealTransferDetailsFragment__choose_your_bank), + textStyle = MaterialTheme.typography.bodyLarge, + onValueChange = {}, + enabled = false, + readOnly = true, + leadingIcon = { + Image( + painter = painterResource(id = uiValues?.icon ?: R.drawable.bank_transfer), + contentDescription = null, + colorFilter = if (uiValues?.icon == null) ColorFilter.tint(MaterialTheme.colorScheme.onSurface) else null, + modifier = Modifier + .padding(start = 16.dp, end = 12.dp) + .size(32.dp) + .padding(imagePadding) + ) + }, + trailingIcon = { + Icon( + painter = painterResource(id = R.drawable.symbol_dropdown_triangle_compat_bold_16), + contentDescription = null + ) + }, + colors = TextFieldDefaults.colors( + disabledTextColor = MaterialTheme.colorScheme.onSurface, + disabledTrailingIconColor = MaterialTheme.colorScheme.onSurface, + disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant, + disabledIndicatorColor = MaterialTheme.colorScheme.onSurface + ), + supportingText = {}, + modifier = modifier + .defaultMinSize(minHeight = 78.dp) + .clickable( + onClick = onSelectBankClick, + role = Role.Button + ) + ) +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsState.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsState.kt new file mode 100644 index 00000000..8d775e71 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsState.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.ideal + +import org.signal.donations.StripeApi +import org.tm.archive.components.settings.app.subscription.donate.transfer.BankDetailsValidator + +data class IdealTransferDetailsState( + val isMonthly: Boolean, + val idealBank: IdealBank? = null, + val name: String = "", + val nameFocusState: FocusState = FocusState.NOT_FOCUSED, + val email: String = "", + val emailFocusState: FocusState = FocusState.NOT_FOCUSED +) { + + fun showNameError(): Boolean { + return nameFocusState == FocusState.LOST_FOCUS && !BankDetailsValidator.validName(name) + } + + fun showEmailError(): Boolean { + return emailFocusState == FocusState.LOST_FOCUS && !BankDetailsValidator.validEmail(email) + } + + fun asIDEALData(): StripeApi.IDEALData { + return StripeApi.IDEALData( + bank = idealBank!!.code, + name = name.trim(), + email = email.trim() + ) + } + + fun canProceed(): Boolean { + return idealBank != null && BankDetailsValidator.validName(name) && (!isMonthly || BankDetailsValidator.validEmail(email)) + } + + enum class FocusState { + NOT_FOCUSED, + FOCUSED, + LOST_FOCUS + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsViewModel.kt new file mode 100644 index 00000000..3fc2f8db --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/ideal/IdealTransferDetailsViewModel.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.ideal + +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel + +class IdealTransferDetailsViewModel(isMonthly: Boolean) : ViewModel() { + + private val internalState = mutableStateOf(IdealTransferDetailsState(isMonthly = isMonthly)) + var state: State = internalState + + fun onNameChanged(name: String) { + internalState.value = internalState.value.copy( + name = name + ) + } + + fun onEmailChanged(email: String) { + internalState.value = internalState.value.copy( + email = email + ) + } + + fun onFocusChanged(field: Field, isFocused: Boolean) { + when (field) { + Field.NAME -> { + if (isFocused && internalState.value.nameFocusState == IdealTransferDetailsState.FocusState.NOT_FOCUSED) { + internalState.value = internalState.value.copy(nameFocusState = IdealTransferDetailsState.FocusState.FOCUSED) + } else if (!isFocused && internalState.value.nameFocusState == IdealTransferDetailsState.FocusState.FOCUSED) { + internalState.value = internalState.value.copy(nameFocusState = IdealTransferDetailsState.FocusState.LOST_FOCUS) + } + } + + Field.EMAIL -> { + if (isFocused && internalState.value.emailFocusState == IdealTransferDetailsState.FocusState.NOT_FOCUSED) { + internalState.value = internalState.value.copy(emailFocusState = IdealTransferDetailsState.FocusState.FOCUSED) + } else if (!isFocused && internalState.value.emailFocusState == IdealTransferDetailsState.FocusState.FOCUSED) { + internalState.value = internalState.value.copy(emailFocusState = IdealTransferDetailsState.FocusState.LOST_FOCUS) + } + } + } + } + + fun onBankSelected(idealBank: IdealBank) { + internalState.value = internalState.value.copy( + idealBank = idealBank + ) + } + + enum class Field { + NAME, + EMAIL + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt new file mode 100644 index 00000000..cb9853a0 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt @@ -0,0 +1,276 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.mandate + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.View +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.animateScrollBy +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import kotlinx.coroutines.launch +import org.signal.core.ui.Buttons +import org.signal.core.ui.Dividers +import org.signal.core.ui.Texts +import org.signal.core.ui.theme.SignalTheme +import org.signal.donations.PaymentSourceType +import org.tm.archive.R +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayResponse +import org.tm.archive.compose.ComposeFragment +import org.tm.archive.compose.StatusBarColorAnimator +import org.tm.archive.util.SpanUtil +import org.tm.archive.util.navigation.safeNavigate +import org.tm.archive.util.viewModel + +/** + * Displays Bank Transfer legal mandate users must agree to to move forward. + */ +class BankTransferMandateFragment : ComposeFragment() { + + private val args: BankTransferMandateFragmentArgs by navArgs() + private val viewModel: BankTransferMandateViewModel by viewModel { + BankTransferMandateViewModel(PaymentSourceType.Stripe.SEPADebit) + } + + private lateinit var statusBarColorAnimator: StatusBarColorAnimator + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + statusBarColorAnimator = StatusBarColorAnimator(requireActivity()) + } + + override fun onResume() { + super.onResume() + statusBarColorAnimator.setColorImmediate() + } + + @Composable + override fun FragmentContent() { + val mandate by viewModel.mandate + val failedToLoadMandate by viewModel.failedToLoadMandate + + BankTransferScreen( + bankMandate = mandate, + failedToLoadMandate = failedToLoadMandate, + onNavigationClick = this::onNavigationClick, + onContinueClick = this::onContinueClick, + onLearnMoreClick = this::onLearnMoreClick, + onCanScrollUp = statusBarColorAnimator::setCanScrollUp + ) + } + + private fun onLearnMoreClick() { + findNavController().safeNavigate( + BankTransferMandateFragmentDirections.actionBankTransferMandateFragmentToYourInformationIsPrivateBottomSheet() + ) + } + + private fun onNavigationClick() { + findNavController().popBackStack() + } + + private fun onContinueClick() { + if (args.response.gateway == GatewayResponse.Gateway.SEPA_DEBIT) { + findNavController().safeNavigate( + BankTransferMandateFragmentDirections.actionBankTransferMandateFragmentToBankTransferDetailsFragment(args.response.request) + ) + } else { + findNavController().safeNavigate( + BankTransferMandateFragmentDirections.actionBankTransferMandateFragmentToIdealTransferDetailsFragment(args.response.request) + ) + } + } +} + +@Preview +@Composable +fun BankTransferScreenPreview() { + SignalTheme { + BankTransferScreen( + bankMandate = "Test ".repeat(500), + failedToLoadMandate = false, + onNavigationClick = {}, + onContinueClick = {}, + onLearnMoreClick = {}, + onCanScrollUp = {} + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@Composable +fun BankTransferScreen( + bankMandate: String, + failedToLoadMandate: Boolean, + onNavigationClick: () -> Unit, + onContinueClick: () -> Unit, + onLearnMoreClick: () -> Unit, + onCanScrollUp: (Boolean) -> Unit +) { + val listState = rememberLazyListState() + val scope = rememberCoroutineScope() + + Scaffold( + topBar = { + TopAppBar( + title = { + AnimatedVisibility( + visible = listState.canScrollBackward, + enter = fadeIn(), + exit = fadeOut() + ) { + Text(text = stringResource(id = R.string.BankTransferMandateFragment__bank_transfer), style = MaterialTheme.typography.titleLarge) + } + }, + navigationIcon = { + IconButton( + onClick = onNavigationClick, + Modifier.padding(end = 16.dp) + ) { + Icon( + painter = rememberVectorPainter(ImageVector.vectorResource(id = R.drawable.symbol_arrow_left_24)), + contentDescription = null + ) + } + }, + colors = if (listState.canScrollBackward) TopAppBarDefaults.topAppBarColors(containerColor = SignalTheme.colors.colorSurface2) else TopAppBarDefaults.topAppBarColors() + ) + } + ) { + onCanScrollUp(listState.canScrollBackward) + + Column(horizontalAlignment = CenterHorizontally, modifier = Modifier.fillMaxSize()) { + LazyColumn( + state = listState, + horizontalAlignment = CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .weight(1f, true) + .padding(top = 64.dp) + ) { + item { + Image( + painter = painterResource(id = R.drawable.bank_transfer), + contentScale = ContentScale.FillBounds, + contentDescription = null, + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface), + modifier = Modifier + .size(72.dp) + .background( + SignalTheme.colors.colorSurface2, + CircleShape + ) + .padding(18.dp) + ) + } + + item { + Text( + text = stringResource(id = R.string.BankTransferMandateFragment__bank_transfer), + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.padding(top = 12.dp, bottom = 15.dp) + ) + } + + item { + val learnMore = stringResource(id = R.string.BankTransferMandateFragment__learn_more) + val fullString = stringResource(id = R.string.BankTransferMandateFragment__stripe_processes_donations, learnMore) + + Texts.LinkifiedText( + textWithUrlSpans = SpanUtil.urlSubsequence(fullString, learnMore, ""), + onUrlClick = { + onLearnMoreClick() + }, + style = MaterialTheme.typography.bodyLarge.copy( + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center + ), + modifier = Modifier + .padding(bottom = 12.dp) + .padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter)) + ) + } + + item { + Dividers.Default() + } + + item { + Text( + text = if (failedToLoadMandate) stringResource(id = R.string.BankTransferMandateFragment__failed_to_load_mandate) else bankMandate, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter), vertical = 16.dp) + ) + } + } + + if (!failedToLoadMandate) { + Surface( + shadowElevation = if (listState.canScrollForward) 8.dp else 0.dp, + modifier = Modifier.fillMaxWidth() + ) { + Buttons.LargeTonal( + onClick = { + if (!listState.canScrollForward) { + onContinueClick() + } else { + scope.launch { + listState.animateScrollBy(value = 1000f) + } + } + }, + modifier = Modifier + .wrapContentWidth() + .padding(top = 16.dp, bottom = 16.dp) + .defaultMinSize(minWidth = 220.dp) + ) { + Text(text = if (listState.canScrollForward) stringResource(id = R.string.BankTransferMandateFragment__read_more) else stringResource(id = R.string.BankTransferMandateFragment__agree)) + } + } + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateRepository.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateRepository.kt new file mode 100644 index 00000000..f01a4dda --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateRepository.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.mandate + +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.donations.PaymentSourceType +import org.tm.archive.dependencies.ApplicationDependencies +import java.util.Locale + +class BankTransferMandateRepository { + + fun getMandate(paymentSourceType: PaymentSourceType.Stripe): Single { + return Single + .fromCallable { ApplicationDependencies.getDonationsService().getBankMandate(Locale.getDefault(), paymentSourceType.paymentMethod) } + .flatMap { it.flattenResult() } + .map { it.mandate } + .subscribeOn(Schedulers.io()) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateViewModel.kt new file mode 100644 index 00000000..e90b718a --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateViewModel.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.donate.transfer.mandate + +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.donations.PaymentSourceType + +class BankTransferMandateViewModel( + paymentSourceType: PaymentSourceType, + repository: BankTransferMandateRepository = BankTransferMandateRepository() +) : ViewModel() { + + private val disposables = CompositeDisposable() + private val internalMandate = mutableStateOf("") + private val internalFailedToLoadMandate = mutableStateOf(false) + + val mandate: State = internalMandate + val failedToLoadMandate: State = internalFailedToLoadMandate + + init { + disposables += repository.getMandate(paymentSourceType as PaymentSourceType.Stripe) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy( + onSuccess = { internalMandate.value = it }, + onError = { internalFailedToLoadMandate.value = true } + ) + } + + override fun onCleared() { + disposables.clear() + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationError.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationError.kt index f0aa8e3a..a1629836 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationError.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationError.kt @@ -8,6 +8,9 @@ import org.signal.core.util.logging.Log import org.signal.donations.PaymentSourceType import org.signal.donations.StripeDeclineCode import org.signal.donations.StripeError +import org.signal.donations.StripeFailureCode +import org.tm.archive.components.settings.app.subscription.donate.gateway.GatewayRequest +import org.tm.archive.database.model.databaseprotos.DonationErrorValue sealed class DonationError(val source: DonationErrorSource, cause: Throwable) : Exception(cause) { @@ -24,6 +27,12 @@ sealed class DonationError(val source: DonationErrorSource, cause: Throwable) : */ class UserCancelledPaymentError(source: DonationErrorSource) : DonationError(source, Exception("User cancelled payment.")) + /** + * Utilized when the user launches into an external application while viewing the WebView. This should kick us back to the donations + * screen and await user processing. + */ + class UserLaunchedExternalApplication(source: DonationErrorSource) : DonationError(source, Exception("User launched external application.")) + /** * Gifting recipient validation errors, which occur before the user could be charged for a gift. */ @@ -63,6 +72,11 @@ sealed class DonationError(val source: DonationErrorSource, cause: Throwable) : */ class StripeDeclinedError(source: DonationErrorSource, cause: Throwable, val declineCode: StripeDeclineCode, val method: PaymentSourceType.Stripe) : PaymentSetupError(source, cause) + /** + * Bank Transfer failed, with a specific reason told to us by Stripe + */ + class StripeFailureCodeError(source: DonationErrorSource, cause: Throwable, val failureCode: StripeFailureCode, val method: PaymentSourceType.Stripe) : PaymentSetupError(source, cause) + /** * Payment setup failed in some way, which we are told about by PayPal. */ @@ -88,6 +102,12 @@ sealed class DonationError(val source: DonationErrorSource, cause: Throwable) : * Errors that can occur during the badge redemption process. */ sealed class BadgeRedemptionError(source: DonationErrorSource, cause: Throwable) : DonationError(source, cause) { + /** + * Timeout elapsed while the user was waiting for badge redemption to complete for a long-running payment. + * This is not an indication that redemption failed, just that it could take a few days to process the payment. + */ + class DonationPending(source: DonationErrorSource, val gatewayRequest: GatewayRequest) : BadgeRedemptionError(source, Exception("Long-running donation is still pending.")) + /** * Timeout elapsed while the user was waiting for badge redemption to complete. This is not an indication that * redemption failed, just that it is taking longer than we can reasonably show a spinner. @@ -113,11 +133,80 @@ sealed class DonationError(val source: DonationErrorSource, cause: Throwable) : source to PublishSubject.create() } + private val donationErrorsSubjectUiSessionMap: MutableMap> = mutableMapOf() + @JvmStatic fun getErrorsForSource(donationErrorSource: DonationErrorSource): Observable { return donationErrorSubjectSourceMap[donationErrorSource]!! } + fun getErrorsForUiSessionKey(uiSessionKey: Long): Observable { + val subject: Subject = donationErrorsSubjectUiSessionMap[uiSessionKey] ?: PublishSubject.create() + donationErrorsSubjectUiSessionMap[uiSessionKey] = subject + + return subject + } + + @JvmStatic + fun DonationError.toDonationErrorValue(): DonationErrorValue { + return when (this) { + is PaymentSetupError.GenericError -> DonationErrorValue( + type = DonationErrorValue.Type.PAYMENT, + code = "" + ) + is PaymentSetupError.StripeCodedError -> DonationErrorValue( + type = DonationErrorValue.Type.PROCESSOR_CODE, + code = this.errorCode + ) + is PaymentSetupError.StripeDeclinedError -> DonationErrorValue( + type = DonationErrorValue.Type.DECLINE_CODE, + code = this.declineCode.rawCode + ) + is PaymentSetupError.StripeFailureCodeError -> DonationErrorValue( + type = DonationErrorValue.Type.FAILURE_CODE, + code = this.failureCode.rawCode + ) + is PaymentSetupError.PayPalCodedError -> DonationErrorValue( + type = DonationErrorValue.Type.PROCESSOR_CODE, + code = this.errorCode.toString() + ) + is PaymentSetupError.PayPalDeclinedError -> DonationErrorValue( + type = DonationErrorValue.Type.DECLINE_CODE, + code = this.code.code.toString() + ) + else -> error("Don't know how to convert error $this") + } + } + + @JvmStatic + @JvmOverloads + fun routeBackgroundError( + context: Context, + uiSessionKey: Long, + error: DonationError, + suppressNotification: Boolean = true + ) { + if (error.source == DonationErrorSource.GIFT_REDEMPTION) { + routeDonationError(context, error) + return + } + + val subject: Subject? = donationErrorsSubjectUiSessionMap[uiSessionKey] + when { + subject != null && subject.hasObservers() -> { + Log.i(TAG, "Routing background donation error to uiSessionKey $uiSessionKey dialog", error) + subject.onNext(error) + } + suppressNotification -> { + Log.i(TAG, "Suppressing notification for error.", error) + } + else -> { + Log.i(TAG, "Routing background donation error to uiSessionKey $uiSessionKey notification", error) + DonationErrorNotifications.displayErrorNotification(context, error) + } + } + } + /** * Route a given donation error, which will either pipe it out to an appropriate subject * or, if the subject has no observers, post it as a notification. @@ -149,17 +238,25 @@ sealed class DonationError(val source: DonationErrorSource, cause: Throwable) : */ @JvmStatic fun getPaymentSetupError(source: DonationErrorSource, throwable: Throwable, method: PaymentSourceType): DonationError { - return if (throwable is StripeError.PostError) { - val declineCode: StripeDeclineCode? = throwable.declineCode - val errorCode: String? = throwable.errorCode - - when { - declineCode != null && method is PaymentSourceType.Stripe -> PaymentSetupError.StripeDeclinedError(source, throwable, declineCode, method) - errorCode != null && method is PaymentSourceType.Stripe -> PaymentSetupError.StripeCodedError(source, throwable, errorCode) - else -> PaymentSetupError.GenericError(source, throwable) + return when (throwable) { + is StripeError.PostError.Generic -> { + val errorCode: String? = throwable.errorCode + if (errorCode != null) { + PaymentSetupError.StripeCodedError(source, throwable, errorCode) + } else { + PaymentSetupError.GenericError(source, throwable) + } + } + is StripeError.PostError.Declined -> PaymentSetupError.StripeDeclinedError(source, throwable, throwable.declineCode, method as PaymentSourceType.Stripe) + is StripeError.PostError.Failed -> PaymentSetupError.StripeFailureCodeError(source, throwable, throwable.failureCode, method as PaymentSourceType.Stripe) + + is UserCancelledPaymentError -> { + return throwable + } + + else -> { + PaymentSetupError.GenericError(source, throwable) } - } else { - PaymentSetupError.GenericError(source, throwable) } } @@ -175,6 +272,9 @@ sealed class DonationError(val source: DonationErrorSource, cause: Throwable) : @JvmStatic fun timeoutWaitingForToken(source: DonationErrorSource): DonationError = BadgeRedemptionError.TimeoutWaitingForTokenError(source) + @JvmStatic + fun donationPending(source: DonationErrorSource, gatewayRequest: GatewayRequest) = BadgeRedemptionError.DonationPending(source, gatewayRequest) + @JvmStatic fun genericBadgeRedemptionFailure(source: DonationErrorSource): DonationError = BadgeRedemptionError.GenericError(source) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorDialogs.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorDialogs.kt index 3ad4bb54..7a2f5292 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorDialogs.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorDialogs.kt @@ -68,6 +68,13 @@ object DonationErrorDialogs { ) } + override fun onTryBankTransferAgain(context: Context): DonationErrorParams.ErrorAction? { + return DonationErrorParams.ErrorAction( + label = R.string.DeclineCode__try, + action = {} + ) + } + override fun onLearnMore(context: Context): DonationErrorParams.ErrorAction? { return DonationErrorParams.ErrorAction( label = R.string.DeclineCode__learn_more, diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorNotifications.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorNotifications.kt index 6d6885d2..e6aea2bd 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorNotifications.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorNotifications.kt @@ -64,6 +64,7 @@ object DonationErrorNotifications { } override fun onTryCreditCardAgain(context: Context): DonationErrorParams.ErrorAction? = null + override fun onTryBankTransferAgain(context: Context): DonationErrorParams.ErrorAction? = null override fun onGoToGooglePay(context: Context): DonationErrorParams.ErrorAction { return createAction( diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorParams.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorParams.kt index 3e6ffedc..3f28eb89 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorParams.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorParams.kt @@ -4,6 +4,7 @@ import android.content.Context import androidx.annotation.StringRes import org.signal.donations.PaymentSourceType import org.signal.donations.StripeDeclineCode +import org.signal.donations.StripeFailureCode import org.tm.archive.R class DonationErrorParams private constructor( @@ -25,25 +26,32 @@ class DonationErrorParams private constructor( ): DonationErrorParams { return when (throwable) { is DonationError.GiftRecipientVerificationError -> getVerificationErrorParams(context, throwable, callback) - is DonationError.PaymentSetupError.StripeDeclinedError -> getDeclinedErrorParams(context, throwable, callback) - is DonationError.PaymentSetupError -> DonationErrorParams( - title = R.string.DonationsErrors__error_processing_payment, - message = R.string.DonationsErrors__your_payment, + is DonationError.PaymentSetupError.StripeDeclinedError -> getStripeDeclinedErrorParams(context, throwable, callback) + is DonationError.PaymentSetupError.StripeFailureCodeError -> getStripeFailureCodeErrorParams(context, throwable, callback) + is DonationError.PaymentSetupError.PayPalDeclinedError -> getPayPalDeclinedErrorParams(context, throwable, callback) + is DonationError.PaymentSetupError -> getGenericPaymentSetupErrorParams(context, callback) + + is DonationError.BadgeRedemptionError.DonationPending -> DonationErrorParams( + title = R.string.DonationsErrors__still_processing, + message = R.string.DonationsErrors__your_payment_is_still, positiveAction = callback.onOk(context), negativeAction = null ) + is DonationError.BadgeRedemptionError.TimeoutWaitingForTokenError -> DonationErrorParams( title = R.string.DonationsErrors__still_processing, message = R.string.DonationsErrors__your_payment_is_still, positiveAction = callback.onOk(context), negativeAction = null ) + is DonationError.BadgeRedemptionError.FailedToValidateCredentialError -> DonationErrorParams( title = R.string.DonationsErrors__failed_to_validate_badge, message = R.string.DonationsErrors__could_not_validate, positiveAction = callback.onContactSupport(context), negativeAction = null ) + is DonationError.BadgeRedemptionError.GenericError -> getGenericRedemptionError(context, throwable, callback) else -> DonationErrorParams( title = R.string.DonationsErrors__couldnt_add_badge, @@ -62,6 +70,7 @@ class DonationErrorParams private constructor( positiveAction = callback.onContactSupport(context), negativeAction = null ) + else -> DonationErrorParams( title = R.string.DonationsErrors__couldnt_add_badge, message = R.string.DonationsErrors__your_badge_could_not, @@ -79,6 +88,7 @@ class DonationErrorParams private constructor( positiveAction = callback.onOk(context), negativeAction = null ) + else -> DonationErrorParams( title = R.string.DonationsErrors__cannot_send_donation, message = R.string.DonationsErrors__this_user_cant_receive_donations_until, @@ -88,10 +98,26 @@ class DonationErrorParams private constructor( } } - private fun getDeclinedErrorParams(context: Context, declinedError: DonationError.PaymentSetupError.StripeDeclinedError, callback: Callback): DonationErrorParams { + private fun getPayPalDeclinedErrorParams(context: Context, declinedError: DonationError.PaymentSetupError.PayPalDeclinedError, callback: Callback): DonationErrorParams { + return when (declinedError.code) { + PayPalDeclineCode.KnownCode.DECLINED -> getLearnMoreParams(context, callback, R.string.DeclineCode__try_another_payment_method_or_contact_your_bank_for_more_information_if_this_was_a_paypal) + else -> getLearnMoreParams(context, callback, R.string.DeclineCode__try_another_payment_method_or_contact_your_bank) + } + } + + private fun getStripeDeclinedErrorParams(context: Context, declinedError: DonationError.PaymentSetupError.StripeDeclinedError, callback: Callback): DonationErrorParams { + if (!declinedError.method.hasDeclineCodeSupport()) { + return getGenericPaymentSetupErrorParams(context, callback) + } + + fun unexpectedDeclinedError(declinedError: DonationError.PaymentSetupError.StripeDeclinedError): Nothing { + error("Unexpected declined error: ${declinedError.declineCode} during ${declinedError.method} processing.") + } + val getStripeDeclineCodePositiveActionParams: (Context, Callback, Int) -> DonationErrorParams = when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> this::getTryCreditCardAgainParams PaymentSourceType.Stripe.GooglePay -> this::getGoToGooglePayParams + else -> this::getLearnMoreParams } return when (declinedError.declineCode) { @@ -102,16 +128,20 @@ class DonationErrorParams private constructor( when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__verify_your_card_details_are_correct_and_try_again PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__verify_your_payment_method_is_up_to_date_in_google_pay_and_try_again + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.CALL_ISSUER -> getStripeDeclineCodePositiveActionParams( context, callback, when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__verify_your_card_details_are_correct_and_try_again_if_the_problem_continues PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__verify_your_payment_method_is_up_to_date_in_google_pay_and_try_again_if_the_problem + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.CARD_NOT_SUPPORTED -> getLearnMoreParams(context, callback, R.string.DeclineCode__your_card_does_not_support_this_type_of_purchase) StripeDeclineCode.Code.EXPIRED_CARD -> getStripeDeclineCodePositiveActionParams( context, @@ -119,24 +149,30 @@ class DonationErrorParams private constructor( when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__your_card_has_expired_verify_your_card_details PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__your_card_has_expired + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.INCORRECT_NUMBER -> getStripeDeclineCodePositiveActionParams( context, callback, when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__your_card_number_is_incorrect_verify_your_card_details PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__your_card_number_is_incorrect + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.INCORRECT_CVC -> getStripeDeclineCodePositiveActionParams( context, callback, when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect_verify_your_card_details PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.INSUFFICIENT_FUNDS -> getLearnMoreParams(context, callback, R.string.DeclineCode__your_card_does_not_have_sufficient_funds) StripeDeclineCode.Code.INVALID_CVC -> getStripeDeclineCodePositiveActionParams( context, @@ -144,41 +180,87 @@ class DonationErrorParams private constructor( when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect_verify_your_card_details PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.INVALID_EXPIRY_MONTH -> getStripeDeclineCodePositiveActionParams( context, callback, when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__the_expiration_month_on_your_card_is_incorrect PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__the_expiration_month + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.INVALID_EXPIRY_YEAR -> getStripeDeclineCodePositiveActionParams( context, callback, when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__the_expiration_year_on_your_card_is_incorrect PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__the_expiration_year + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.INVALID_NUMBER -> getStripeDeclineCodePositiveActionParams( context, callback, when (declinedError.method) { PaymentSourceType.Stripe.CreditCard -> R.string.DeclineCode__your_card_number_is_incorrect_verify_your_card_details PaymentSourceType.Stripe.GooglePay -> R.string.DeclineCode__your_card_number_is_incorrect + else -> unexpectedDeclinedError(declinedError) } ) + StripeDeclineCode.Code.ISSUER_NOT_AVAILABLE -> getLearnMoreParams(context, callback, R.string.DeclineCode__try_completing_the_payment_again) StripeDeclineCode.Code.PROCESSING_ERROR -> getLearnMoreParams(context, callback, R.string.DeclineCode__try_again) StripeDeclineCode.Code.REENTER_TRANSACTION -> getLearnMoreParams(context, callback, R.string.DeclineCode__try_again) else -> getLearnMoreParams(context, callback, R.string.DeclineCode__try_another_payment_method_or_contact_your_bank) } + else -> getLearnMoreParams(context, callback, R.string.DeclineCode__try_another_payment_method_or_contact_your_bank) } } + private fun getStripeFailureCodeErrorParams(context: Context, failureCodeError: DonationError.PaymentSetupError.StripeFailureCodeError, callback: Callback): DonationErrorParams { + if (!failureCodeError.method.hasFailureCodeSupport()) { + return getGenericPaymentSetupErrorParams(context, callback) + } + + return when (failureCodeError.failureCode) { + is StripeFailureCode.Known -> { + val errorText = failureCodeError.failureCode.mapToErrorStringResource() + when (failureCodeError.failureCode.code) { + StripeFailureCode.Code.REFER_TO_CUSTOMER -> getTryBankTransferAgainParams(context, callback, errorText) + StripeFailureCode.Code.INSUFFICIENT_FUNDS -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.DEBIT_DISPUTED -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.AUTHORIZATION_REVOKED -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.DEBIT_NOT_AUTHORIZED -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.ACCOUNT_CLOSED -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.BANK_ACCOUNT_RESTRICTED -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.DEBIT_AUTHORIZATION_NOT_MATCH -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.RECIPIENT_DECEASED -> getLearnMoreParams(context, callback, errorText) + StripeFailureCode.Code.BRANCH_DOES_NOT_EXIST -> getTryBankTransferAgainParams(context, callback, errorText) + StripeFailureCode.Code.INCORRECT_ACCOUNT_HOLDER_NAME -> getTryBankTransferAgainParams(context, callback, errorText) + StripeFailureCode.Code.INVALID_ACCOUNT_NUMBER -> getTryBankTransferAgainParams(context, callback, errorText) + StripeFailureCode.Code.GENERIC_COULD_NOT_PROCESS -> getTryBankTransferAgainParams(context, callback, errorText) + } + } + is StripeFailureCode.Unknown -> getGenericPaymentSetupErrorParams(context, callback) + } + } + + private fun getGenericPaymentSetupErrorParams(context: Context, callback: Callback): DonationErrorParams { + return DonationErrorParams( + title = R.string.DonationsErrors__error_processing_payment, + message = R.string.DonationsErrors__your_payment, + positiveAction = callback.onOk(context), + negativeAction = null + ) + } + private fun getLearnMoreParams(context: Context, callback: Callback, message: Int): DonationErrorParams { return DonationErrorParams( title = R.string.DonationsErrors__error_processing_payment, @@ -205,6 +287,15 @@ class DonationErrorParams private constructor( negativeAction = callback.onCancel(context) ) } + + private fun getTryBankTransferAgainParams(context: Context, callback: Callback, message: Int): DonationErrorParams { + return DonationErrorParams( + title = R.string.DonationsErrors__error_processing_payment, + message = message, + positiveAction = callback.onTryBankTransferAgain(context), + negativeAction = callback.onCancel(context) + ) + } } interface Callback { @@ -214,5 +305,6 @@ class DonationErrorParams private constructor( fun onContactSupport(context: Context): ErrorAction? fun onGoToGooglePay(context: Context): ErrorAction? fun onTryCreditCardAgain(context: Context): ErrorAction? + fun onTryBankTransferAgain(context: Context): ErrorAction? } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorSource.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorSource.kt index b20c7a1f..f93a83e9 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorSource.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrorSource.kt @@ -1,11 +1,36 @@ package org.tm.archive.components.settings.app.subscription.errors +/** + * Descriptor of where an error originated from. + */ enum class DonationErrorSource(private val code: String) { - BOOST("boost"), - SUBSCRIPTION("subscription"), + /** + * Refers to a one-time donation where the user paying receives a badge immediately. + */ + ONE_TIME("boost"), + + /** + * Refers to a recurring monthly donation where the user paying receives a badge immediately + * and upon each renewal period. + */ + MONTHLY("subscription"), + + /** + * Refers to a one-time donation where the user pays to send a badge to another individual. + */ GIFT("gift"), + + /** + * Refers to when the individual who received a gift token is redeeming it for a badge. + */ GIFT_REDEMPTION("gift-redemption"), + + /** + * Refers to the monthly keep-alive job for an active monthly subscriber, which is started in + * the background as needed. + */ KEEP_ALIVE("keep-alive"), + UNKNOWN("unknown"); fun serialize(): String = code diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrors.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrors.kt index 5c2d4b29..0963d085 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrors.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationErrors.kt @@ -2,23 +2,46 @@ package org.tm.archive.components.settings.app.subscription.errors import androidx.annotation.StringRes import org.signal.donations.StripeDeclineCode +import org.signal.donations.StripeFailureCode import org.tm.archive.R +@StringRes +fun StripeFailureCode.mapToErrorStringResource(): Int { + return when (this) { + is StripeFailureCode.Known -> when (this.code) { + StripeFailureCode.Code.REFER_TO_CUSTOMER -> R.string.StripeFailureCode__verify_your_bank_details_are_correct + StripeFailureCode.Code.INSUFFICIENT_FUNDS -> R.string.StripeFailureCode__the_bank_account_provided + StripeFailureCode.Code.DEBIT_DISPUTED -> R.string.StripeFailureCode__verify_your_bank_details_are_correct + StripeFailureCode.Code.AUTHORIZATION_REVOKED -> R.string.StripeFailureCode__this_payment_was_revoked + StripeFailureCode.Code.DEBIT_NOT_AUTHORIZED -> R.string.StripeFailureCode__this_payment_was_revoked + StripeFailureCode.Code.ACCOUNT_CLOSED -> R.string.StripeFailureCode__the_bank_details_provided_could_not_be_processed + StripeFailureCode.Code.BANK_ACCOUNT_RESTRICTED -> R.string.StripeFailureCode__the_bank_details_provided_could_not_be_processed + StripeFailureCode.Code.DEBIT_AUTHORIZATION_NOT_MATCH -> R.string.StripeFailureCode__an_error_occurred_while_processing_this_payment + StripeFailureCode.Code.RECIPIENT_DECEASED -> R.string.StripeFailureCode__the_bank_details_provided_could_not_be_processed + StripeFailureCode.Code.BRANCH_DOES_NOT_EXIST -> R.string.StripeFailureCode__verify_your_bank_details_are_correct + StripeFailureCode.Code.INCORRECT_ACCOUNT_HOLDER_NAME -> R.string.StripeFailureCode__verify_your_bank_details_are_correct + StripeFailureCode.Code.INVALID_ACCOUNT_NUMBER -> R.string.StripeFailureCode__verify_your_bank_details_are_correct + StripeFailureCode.Code.GENERIC_COULD_NOT_PROCESS -> R.string.StripeFailureCode__verify_your_bank_details_are_correct + } + is StripeFailureCode.Unknown -> R.string.StripeFailureCode__verify_your_bank_details_are_correct + } +} + @StringRes fun StripeDeclineCode.mapToErrorStringResource(): Int { return when (this) { is StripeDeclineCode.Known -> when (this.code) { - StripeDeclineCode.Code.APPROVE_WITH_ID -> R.string.DeclineCode__verify_your_payment_method_is_up_to_date_in_google_pay_and_try_again - StripeDeclineCode.Code.CALL_ISSUER -> R.string.DeclineCode__verify_your_payment_method_is_up_to_date_in_google_pay_and_try_again_if_the_problem + StripeDeclineCode.Code.APPROVE_WITH_ID -> R.string.DeclineCode__verify_your_card_details_are_correct_and_try_again + StripeDeclineCode.Code.CALL_ISSUER -> R.string.DeclineCode__verify_your_card_details_are_correct_and_try_again_if_the_problem_continues StripeDeclineCode.Code.CARD_NOT_SUPPORTED -> R.string.DeclineCode__your_card_does_not_support_this_type_of_purchase - StripeDeclineCode.Code.EXPIRED_CARD -> R.string.DeclineCode__your_card_has_expired - StripeDeclineCode.Code.INCORRECT_NUMBER -> R.string.DeclineCode__your_card_number_is_incorrect - StripeDeclineCode.Code.INCORRECT_CVC -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect + StripeDeclineCode.Code.EXPIRED_CARD -> R.string.DeclineCode__your_card_has_expired_verify_your_card_details + StripeDeclineCode.Code.INCORRECT_NUMBER -> R.string.DeclineCode__your_card_number_is_incorrect_verify_your_card_details + StripeDeclineCode.Code.INCORRECT_CVC -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect_verify_your_card_details StripeDeclineCode.Code.INSUFFICIENT_FUNDS -> R.string.DeclineCode__your_card_does_not_have_sufficient_funds - StripeDeclineCode.Code.INVALID_CVC -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect - StripeDeclineCode.Code.INVALID_EXPIRY_MONTH -> R.string.DeclineCode__the_expiration_month - StripeDeclineCode.Code.INVALID_EXPIRY_YEAR -> R.string.DeclineCode__the_expiration_year - StripeDeclineCode.Code.INVALID_NUMBER -> R.string.DeclineCode__your_card_number_is_incorrect + StripeDeclineCode.Code.INVALID_CVC -> R.string.DeclineCode__your_cards_cvc_number_is_incorrect_verify_your_card_details + StripeDeclineCode.Code.INVALID_EXPIRY_MONTH -> R.string.DeclineCode__the_expiration_month_on_your_card_is_incorrect + StripeDeclineCode.Code.INVALID_EXPIRY_YEAR -> R.string.DeclineCode__the_expiration_year_on_your_card_is_incorrect + StripeDeclineCode.Code.INVALID_NUMBER -> R.string.DeclineCode__your_card_number_is_incorrect_verify_your_card_details StripeDeclineCode.Code.ISSUER_NOT_AVAILABLE -> R.string.DeclineCode__try_completing_the_payment_again StripeDeclineCode.Code.PROCESSING_ERROR -> R.string.DeclineCode__try_again StripeDeclineCode.Code.REENTER_TRANSACTION -> R.string.DeclineCode__try_again @@ -27,26 +50,3 @@ fun StripeDeclineCode.mapToErrorStringResource(): Int { else -> R.string.DeclineCode__try_another_payment_method_or_contact_your_bank } } - -fun StripeDeclineCode.shouldRouteToGooglePay(): Boolean { - return when (this) { - is StripeDeclineCode.Known -> when (this.code) { - StripeDeclineCode.Code.APPROVE_WITH_ID -> true - StripeDeclineCode.Code.CALL_ISSUER -> true - StripeDeclineCode.Code.CARD_NOT_SUPPORTED -> false - StripeDeclineCode.Code.EXPIRED_CARD -> true - StripeDeclineCode.Code.INCORRECT_NUMBER -> true - StripeDeclineCode.Code.INCORRECT_CVC -> true - StripeDeclineCode.Code.INSUFFICIENT_FUNDS -> false - StripeDeclineCode.Code.INVALID_CVC -> true - StripeDeclineCode.Code.INVALID_EXPIRY_MONTH -> true - StripeDeclineCode.Code.INVALID_EXPIRY_YEAR -> true - StripeDeclineCode.Code.INVALID_NUMBER -> true - StripeDeclineCode.Code.ISSUER_NOT_AVAILABLE -> false - StripeDeclineCode.Code.PROCESSING_ERROR -> false - StripeDeclineCode.Code.REENTER_TRANSACTION -> false - else -> false - } - else -> false - } -} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationProcessorErrorExtensions.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationProcessorErrorExtensions.kt new file mode 100644 index 00000000..317d4910 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/errors/DonationProcessorErrorExtensions.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.errors + +import org.signal.donations.PaymentSourceType +import org.signal.donations.StripeDeclineCode +import org.signal.donations.StripeFailureCode +import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription +import org.whispersystems.signalservice.internal.push.exceptions.DonationProcessorError + +fun DonationProcessorError.toDonationError( + source: DonationErrorSource, + method: PaymentSourceType +): DonationError { + return when (processor) { + ActiveSubscription.Processor.STRIPE -> { + check(method is PaymentSourceType.Stripe) + val declineCode = StripeDeclineCode.getFromCode(chargeFailure.code) + val failureCode = StripeFailureCode.getFromCode(chargeFailure.code) + if (declineCode.isKnown()) { + DonationError.PaymentSetupError.StripeDeclinedError(source, this, declineCode, method) + } else if (failureCode.isKnown) { + DonationError.PaymentSetupError.StripeFailureCodeError(source, this, failureCode, method) + } else if (chargeFailure.code != null) { + DonationError.PaymentSetupError.StripeCodedError(source, this, chargeFailure.code) + } else { + DonationError.PaymentSetupError.GenericError(source, this) + } + } + ActiveSubscription.Processor.BRAINTREE -> { + check(method is PaymentSourceType.PayPal) + val code = chargeFailure.code + if (code == null) { + DonationError.PaymentSetupError.GenericError(source, this) + } else { + val declineCode = PayPalDeclineCode.KnownCode.fromCode(code.toInt()) + if (declineCode != null) { + DonationError.PaymentSetupError.PayPalDeclinedError(source, this, declineCode) + } else { + DonationError.PaymentSetupError.PayPalCodedError(source, this, code.toInt()) + } + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt index c1e658e1..210ec850 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ActiveSubscriptionPreference.kt @@ -1,7 +1,6 @@ package org.tm.archive.components.settings.app.subscription.manage import android.text.method.LinkMovementMethod -import android.view.View import android.widget.ProgressBar import android.widget.TextView import androidx.core.content.ContextCompat @@ -9,14 +8,15 @@ import org.signal.core.util.money.FiatMoney import org.tm.archive.R import org.tm.archive.badges.BadgeImageView import org.tm.archive.components.settings.PreferenceModel +import org.tm.archive.databinding.MySupportPreferenceBinding import org.tm.archive.keyvalue.SignalStore import org.tm.archive.payments.FiatMoneyUtil import org.tm.archive.subscription.Subscription import org.tm.archive.util.DateUtils import org.tm.archive.util.SpanUtil -import org.tm.archive.util.adapter.mapping.LayoutFactory +import org.tm.archive.util.adapter.mapping.BindingFactory +import org.tm.archive.util.adapter.mapping.BindingViewHolder import org.tm.archive.util.adapter.mapping.MappingAdapter -import org.tm.archive.util.adapter.mapping.MappingViewHolder import org.tm.archive.util.visible import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription import java.util.Locale @@ -31,9 +31,10 @@ object ActiveSubscriptionPreference { val price: FiatMoney, val subscription: Subscription, val renewalTimestamp: Long = -1L, - val redemptionState: ManageDonationsState.SubscriptionRedemptionState, - val activeSubscription: ActiveSubscription.Subscription, - val onContactSupport: () -> Unit + val redemptionState: ManageDonationsState.RedemptionState, + val activeSubscription: ActiveSubscription.Subscription?, + val onContactSupport: () -> Unit, + val onPendingClick: (FiatMoney) -> Unit ) : PreferenceModel() { override fun areItemsTheSame(newItem: Model): Boolean { return subscription.id == newItem.subscription.id @@ -49,14 +50,16 @@ object ActiveSubscriptionPreference { } } - class ViewHolder(itemView: View) : MappingViewHolder(itemView) { + class ViewHolder(binding: MySupportPreferenceBinding) : BindingViewHolder(binding) { - val badge: BadgeImageView = itemView.findViewById(R.id.my_support_badge) - val title: TextView = itemView.findViewById(R.id.my_support_title) - val expiry: TextView = itemView.findViewById(R.id.my_support_expiry) - val progress: ProgressBar = itemView.findViewById(R.id.my_support_progress) + val badge: BadgeImageView = binding.mySupportBadge + val title: TextView = binding.mySupportTitle + val expiry: TextView = binding.mySupportExpiry + val progress: ProgressBar = binding.mySupportProgress override fun bind(model: Model) { + itemView.setOnClickListener(null) + badge.setBadge(model.subscription.badge) title.text = context.getString( @@ -71,9 +74,10 @@ object ActiveSubscriptionPreference { expiry.movementMethod = LinkMovementMethod.getInstance() when (model.redemptionState) { - ManageDonationsState.SubscriptionRedemptionState.NONE -> presentRenewalState(model) - ManageDonationsState.SubscriptionRedemptionState.IN_PROGRESS -> presentInProgressState() - ManageDonationsState.SubscriptionRedemptionState.FAILED -> presentFailureState(model) + ManageDonationsState.RedemptionState.NONE -> presentRenewalState(model) + ManageDonationsState.RedemptionState.IS_PENDING_BANK_TRANSFER -> presentPendingBankTransferState(model) + ManageDonationsState.RedemptionState.IN_PROGRESS -> presentInProgressState() + ManageDonationsState.RedemptionState.FAILED -> presentFailureState(model) } } @@ -85,18 +89,22 @@ object ActiveSubscriptionPreference { model.renewalTimestamp ) ) - badge.alpha = 1f progress.visible = false } + private fun presentPendingBankTransferState(model: Model) { + expiry.text = context.getString(R.string.MySupportPreference__payment_pending) + progress.visible = true + itemView.setOnClickListener { model.onPendingClick(model.price) } + } + private fun presentInProgressState() { expiry.text = context.getString(R.string.MySupportPreference__processing_transaction) - badge.alpha = 0.2f progress.visible = true } private fun presentFailureState(model: Model) { - if (model.activeSubscription.isFailedPayment || SignalStore.donationsValues().shouldCancelSubscriptionBeforeNextSubscribeAttempt) { + if (model.activeSubscription?.isFailedPayment == true || SignalStore.donationsValues().shouldCancelSubscriptionBeforeNextSubscribeAttempt) { presentPaymentFailureState(model) } else { presentRedemptionFailureState(model) @@ -114,7 +122,6 @@ object ActiveSubscriptionPreference { }, ContextCompat.getColor(context, R.color.signal_accent_primary) ) - badge.alpha = 0.2f progress.visible = false } @@ -129,12 +136,11 @@ object ActiveSubscriptionPreference { }, ContextCompat.getColor(context, R.color.signal_accent_primary) ) - badge.alpha = 0.2f progress.visible = false } } fun register(adapter: MappingAdapter) { - adapter.registerFactory(Model::class.java, LayoutFactory({ ViewHolder(it) }, R.layout.my_support_preference)) + adapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, MySupportPreferenceBinding::inflate)) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/DonationRedemptionJobStatus.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/DonationRedemptionJobStatus.kt new file mode 100644 index 00000000..0860c81f --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/DonationRedemptionJobStatus.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.manage + +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation + +/** + * Represent the status of a donation as represented in the job system. + */ +sealed class DonationRedemptionJobStatus { + /** + * No pending/running jobs for a donation type. + */ + object None : DonationRedemptionJobStatus() + + /** + * Donation is pending external user verification (e.g., iDEAL). + * + * For one-time, pending donation data is provided via the job data as it is not in the store yet. + */ + class PendingExternalVerification( + val pendingOneTimeDonation: PendingOneTimeDonation? = null, + val nonVerifiedMonthlyDonation: NonVerifiedMonthlyDonation? = null + ) : DonationRedemptionJobStatus() + + /** + * Donation is at the receipt request status. + * + * For one-time donations, pending donation data available via the store. + */ + object PendingReceiptRequest : DonationRedemptionJobStatus() + + /** + * Donation is at the receipt redemption status. + * + * For one-time donations, pending donation data available via the store. + */ + object PendingReceiptRedemption : DonationRedemptionJobStatus() + + /** + * Representation of a failed subscription job chain derived from no pending/running jobs and + * a failure state in the store. + */ + object FailedSubscription : DonationRedemptionJobStatus() + + fun isInProgress(): Boolean { + return when (this) { + is PendingExternalVerification, + PendingReceiptRedemption, + PendingReceiptRequest -> true + + FailedSubscription, + None -> false + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/DonationRedemptionJobWatcher.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/DonationRedemptionJobWatcher.kt new file mode 100644 index 00000000..172b9322 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/DonationRedemptionJobWatcher.kt @@ -0,0 +1,138 @@ +package org.tm.archive.components.settings.app.subscription.manage + +import androidx.annotation.WorkerThread +import io.reactivex.rxjava3.core.Observable +import org.tm.archive.components.settings.app.subscription.DonationSerializationHelper +import org.tm.archive.components.settings.app.subscription.donate.stripe.Stripe3DSData +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.jobmanager.persistence.JobSpec +import org.tm.archive.jobs.BoostReceiptRequestResponseJob +import org.tm.archive.jobs.DonationReceiptRedemptionJob +import org.tm.archive.jobs.ExternalLaunchDonationJob +import org.tm.archive.jobs.SubscriptionReceiptRequestResponseJob +import org.tm.archive.keyvalue.SignalStore +import java.util.concurrent.TimeUnit + +/** + * Allows observer to poll for the status of the latest pending, running, or completed redemption job for subscriptions or one time payments. + */ +object DonationRedemptionJobWatcher { + + enum class RedemptionType { + SUBSCRIPTION, + ONE_TIME + } + + @JvmStatic + @WorkerThread + fun hasPendingRedemptionJob(): Boolean { + return getDonationRedemptionJobStatus(RedemptionType.SUBSCRIPTION).isInProgress() || getDonationRedemptionJobStatus(RedemptionType.ONE_TIME).isInProgress() + } + + fun watchSubscriptionRedemption(): Observable = watch(RedemptionType.SUBSCRIPTION) + + @JvmStatic + @WorkerThread + fun getSubscriptionRedemptionJobStatus(): DonationRedemptionJobStatus { + return getDonationRedemptionJobStatus(RedemptionType.SUBSCRIPTION) + } + + fun watchOneTimeRedemption(): Observable = watch(RedemptionType.ONE_TIME) + + private fun watch(redemptionType: RedemptionType): Observable { + return Observable + .interval(0, 5, TimeUnit.SECONDS) + .map { + getDonationRedemptionJobStatus(redemptionType) + } + .distinctUntilChanged() + } + + private fun getDonationRedemptionJobStatus(redemptionType: RedemptionType): DonationRedemptionJobStatus { + val queue = when (redemptionType) { + RedemptionType.SUBSCRIPTION -> DonationReceiptRedemptionJob.SUBSCRIPTION_QUEUE + RedemptionType.ONE_TIME -> DonationReceiptRedemptionJob.ONE_TIME_QUEUE + } + + val donationJobSpecs = ApplicationDependencies + .getJobManager() + .find { it.queueKey?.startsWith(queue) == true } + .sortedBy { it.createTime } + + val externalLaunchJobSpec: JobSpec? = donationJobSpecs.firstOrNull { + it.factoryKey == ExternalLaunchDonationJob.KEY + } + + val receiptRequestJobKey = when (redemptionType) { + RedemptionType.SUBSCRIPTION -> SubscriptionReceiptRequestResponseJob.KEY + RedemptionType.ONE_TIME -> BoostReceiptRequestResponseJob.KEY + } + + val receiptJobSpec: JobSpec? = donationJobSpecs.firstOrNull { + it.factoryKey == receiptRequestJobKey + } + + val redemptionJobSpec: JobSpec? = donationJobSpecs.firstOrNull { + it.factoryKey == DonationReceiptRedemptionJob.KEY + } + + val jobSpec: JobSpec? = externalLaunchJobSpec ?: redemptionJobSpec ?: receiptJobSpec + + return if (redemptionType == RedemptionType.SUBSCRIPTION && jobSpec == null && SignalStore.donationsValues().getSubscriptionRedemptionFailed()) { + DonationRedemptionJobStatus.FailedSubscription + } else { + jobSpec?.toDonationRedemptionStatus(redemptionType) ?: DonationRedemptionJobStatus.None + } + } + + private fun JobSpec.toDonationRedemptionStatus(redemptionType: RedemptionType): DonationRedemptionJobStatus { + return when (factoryKey) { + ExternalLaunchDonationJob.KEY -> { + val stripe3DSData = ExternalLaunchDonationJob.Factory.parseSerializedData(serializedData!!) + DonationRedemptionJobStatus.PendingExternalVerification( + pendingOneTimeDonation = pendingOneTimeDonation(redemptionType, stripe3DSData), + nonVerifiedMonthlyDonation = nonVerifiedMonthlyDonation(redemptionType, stripe3DSData) + ) + } + + SubscriptionReceiptRequestResponseJob.KEY, + BoostReceiptRequestResponseJob.KEY -> DonationRedemptionJobStatus.PendingReceiptRequest + + DonationReceiptRedemptionJob.KEY -> DonationRedemptionJobStatus.PendingReceiptRedemption + + else -> { + DonationRedemptionJobStatus.None + } + } + } + + private fun JobSpec.pendingOneTimeDonation(redemptionType: RedemptionType, stripe3DSData: Stripe3DSData): PendingOneTimeDonation? { + if (redemptionType != RedemptionType.ONE_TIME) { + return null + } + + return DonationSerializationHelper.createPendingOneTimeDonationProto( + badge = stripe3DSData.gatewayRequest.badge, + paymentSourceType = stripe3DSData.paymentSourceType, + amount = stripe3DSData.gatewayRequest.fiat + ).copy( + timestamp = createTime, + pendingVerification = true, + checkedVerification = runAttempt > 0 + ) + } + + private fun JobSpec.nonVerifiedMonthlyDonation(redemptionType: RedemptionType, stripe3DSData: Stripe3DSData): NonVerifiedMonthlyDonation? { + if (redemptionType != RedemptionType.SUBSCRIPTION) { + return null + } + + return NonVerifiedMonthlyDonation( + timestamp = createTime, + price = stripe3DSData.gatewayRequest.fiat, + level = stripe3DSData.gatewayRequest.level.toInt(), + checkedVerification = runAttempt > 0 + ) + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsFragment.kt index 56d8098d..a44aeddb 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsFragment.kt @@ -1,11 +1,14 @@ package org.tm.archive.components.settings.app.subscription.manage import android.content.Intent +import android.os.Bundle import android.text.SpannableStringBuilder +import android.view.View import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.signal.core.util.dp import org.signal.core.util.money.FiatMoney import org.tm.archive.R @@ -17,15 +20,21 @@ import org.tm.archive.components.settings.DSLSettingsFragment import org.tm.archive.components.settings.DSLSettingsIcon import org.tm.archive.components.settings.DSLSettingsText import org.tm.archive.components.settings.app.AppSettingsActivity +import org.tm.archive.components.settings.app.subscription.DonationSerializationHelper.toFiatMoney import org.tm.archive.components.settings.app.subscription.MonthlyDonationRepository +import org.tm.archive.components.settings.app.subscription.completed.TerminalDonationDelegate import org.tm.archive.components.settings.app.subscription.donate.DonateToSignalType import org.tm.archive.components.settings.app.subscription.models.NetworkFailure import org.tm.archive.components.settings.configure import org.tm.archive.components.settings.models.IndeterminateLoadingCircle +import org.tm.archive.database.model.databaseprotos.DonationErrorValue +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.help.HelpFragment import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.payments.FiatMoneyUtil import org.tm.archive.subscription.Subscription +import org.tm.archive.util.CommunicationActions import org.tm.archive.util.Material3OnScrollHelper import org.tm.archive.util.SpanUtil import org.tm.archive.util.adapter.mapping.MappingAdapter @@ -44,6 +53,11 @@ class ManageDonationsFragment : ), ExpiredGiftSheet.Callback { + companion object { + private val alertedIdealDonations = mutableSetOf() + const val DONATE_TROUBLESHOOTING_URL = "https://support.signal.org/hc/articles/360031949872#fix" + } + private val supportTechSummary: CharSequence by lazy { SpannableStringBuilder(SpanUtil.color(ContextCompat.getColor(requireContext(), R.color.signal_colorOnSurfaceVariant), requireContext().getString(R.string.DonateToSignalFragment__private_messaging))) .append(" ") @@ -60,6 +74,11 @@ class ManageDonationsFragment : } ) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + viewLifecycleOwner.lifecycle.addObserver(TerminalDonationDelegate(childFragmentManager, viewLifecycleOwner)) + super.onViewCreated(view, savedInstanceState) + } + override fun onResume() { super.onResume() viewModel.refresh() @@ -67,6 +86,7 @@ class ManageDonationsFragment : override fun bindAdapter(adapter: MappingAdapter) { ActiveSubscriptionPreference.register(adapter) + OneTimeDonationPreference.register(adapter) IndeterminateLoadingCircle.register(adapter) BadgePreview.register(adapter) NetworkFailure.register(adapter) @@ -79,6 +99,33 @@ class ManageDonationsFragment : viewModel.state.observe(viewLifecycleOwner) { state -> adapter.submitList(getConfiguration(state).toMappingModelList()) + + if (state.nonVerifiedMonthlyDonation?.checkedVerification == true && + !alertedIdealDonations.contains(state.nonVerifiedMonthlyDonation.timestamp) + ) { + alertedIdealDonations += state.nonVerifiedMonthlyDonation.timestamp + + val amount = FiatMoneyUtil.format(resources, state.nonVerifiedMonthlyDonation.price) + + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.ManageDonationsFragment__couldnt_confirm_donation) + .setMessage(getString(R.string.ManageDonationsFragment__your_monthly_s_donation_couldnt_be_confirmed, amount)) + .setPositiveButton(android.R.string.ok, null) + .show() + } else if (state.pendingOneTimeDonation?.pendingVerification == true && + state.pendingOneTimeDonation.checkedVerification && + !alertedIdealDonations.contains(state.pendingOneTimeDonation.timestamp) + ) { + alertedIdealDonations += state.pendingOneTimeDonation.timestamp + + val amount = FiatMoneyUtil.format(resources, state.pendingOneTimeDonation.amount!!.toFiatMoney(), FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.ManageDonationsFragment__couldnt_confirm_donation) + .setMessage(getString(R.string.ManageDonationsFragment__your_one_time_s_donation_couldnt_be_confirmed, amount)) + .setPositiveButton(android.R.string.ok, null) + .show() + } } } @@ -126,33 +173,43 @@ class ManageDonationsFragment : space(16.dp) - if (state.transactionState is ManageDonationsState.TransactionState.NotInTransaction) { - val activeSubscription = state.transactionState.activeSubscription.activeSubscription + if (state.subscriptionTransactionState is ManageDonationsState.TransactionState.NotInTransaction) { + val activeSubscription = state.subscriptionTransactionState.activeSubscription.activeSubscription + if (activeSubscription != null) { val subscription: Subscription? = state.availableSubscriptions.firstOrNull { it.level == activeSubscription.level } if (subscription != null) { - presentSubscriptionSettings(activeSubscription, subscription, state.getMonthlyDonorRedemptionState()) + presentSubscriptionSettings(activeSubscription, subscription, state) } else { customPref(IndeterminateLoadingCircle) } - } else if (state.hasOneTimeBadge) { - presentActiveOneTimeDonorSettings() + } else if (state.nonVerifiedMonthlyDonation != null) { + val subscription: Subscription? = state.availableSubscriptions.firstOrNull { it.level == state.nonVerifiedMonthlyDonation.level } + if (subscription != null) { + presentNonVerifiedSubscriptionSettings(state.nonVerifiedMonthlyDonation, subscription, state) + } else { + customPref(IndeterminateLoadingCircle) + } + } else if (state.hasOneTimeBadge || state.pendingOneTimeDonation != null) { + presentActiveOneTimeDonorSettings(state) } else { presentNotADonorSettings(state.hasReceipts) } - } else if (state.transactionState == ManageDonationsState.TransactionState.NetworkFailure) { - presentNetworkFailureSettings(state.getMonthlyDonorRedemptionState(), state.hasReceipts) + } else if (state.subscriptionTransactionState == ManageDonationsState.TransactionState.NetworkFailure) { + presentNetworkFailureSettings(state, state.hasReceipts) } else { customPref(IndeterminateLoadingCircle) } } } - private fun DSLConfiguration.presentActiveOneTimeDonorSettings() { + private fun DSLConfiguration.presentActiveOneTimeDonorSettings(state: ManageDonationsState) { dividerPref() sectionHeaderPref(R.string.ManageDonationsFragment__my_support) + presentPendingOrProcessingOneTimeDonationState(state) + presentBadges() presentOtherWaysToGive() @@ -160,16 +217,33 @@ class ManageDonationsFragment : presentMore() } - private fun DSLConfiguration.presentNetworkFailureSettings(redemptionState: ManageDonationsState.SubscriptionRedemptionState, hasReceipts: Boolean) { + private fun DSLConfiguration.presentPendingOrProcessingOneTimeDonationState(state: ManageDonationsState) { + val pendingOneTimeDonation = state.pendingOneTimeDonation + if (pendingOneTimeDonation != null) { + customPref( + OneTimeDonationPreference.Model( + pendingOneTimeDonation = pendingOneTimeDonation, + onPendingClick = { + displayPendingDialog(it) + }, + onErrorClick = { + displayPendingOneTimeDonationErrorDialog(it, pendingOneTimeDonation.paymentMethodType == PendingOneTimeDonation.PaymentMethodType.IDEAL) + } + ) + ) + } + } + + private fun DSLConfiguration.presentNetworkFailureSettings(state: ManageDonationsState, hasReceipts: Boolean) { if (SignalStore.donationsValues().isLikelyASustainer()) { - presentSubscriptionSettingsWithNetworkError(redemptionState) + presentSubscriptionSettingsWithNetworkError(state) } else { presentNotADonorSettings(hasReceipts) } } - private fun DSLConfiguration.presentSubscriptionSettingsWithNetworkError(redemptionState: ManageDonationsState.SubscriptionRedemptionState) { - presentSubscriptionSettingsWithState(redemptionState) { + private fun DSLConfiguration.presentSubscriptionSettingsWithNetworkError(state: ManageDonationsState) { + presentSubscriptionSettingsWithState(state) { customPref( NetworkFailure.Model( onRetryClick = { @@ -183,9 +257,9 @@ class ManageDonationsFragment : private fun DSLConfiguration.presentSubscriptionSettings( activeSubscription: ActiveSubscription.Subscription, subscription: Subscription, - redemptionState: ManageDonationsState.SubscriptionRedemptionState + state: ManageDonationsState ) { - presentSubscriptionSettingsWithState(redemptionState) { + presentSubscriptionSettingsWithState(state) { val activeCurrency = Currency.getInstance(activeSubscription.currency) val activeAmount = activeSubscription.amount.movePointLeft(activeCurrency.defaultFractionDigits) @@ -194,19 +268,41 @@ class ManageDonationsFragment : price = FiatMoney(activeAmount, activeCurrency), subscription = subscription, renewalTimestamp = TimeUnit.SECONDS.toMillis(activeSubscription.endOfCurrentPeriod), - redemptionState = redemptionState, + redemptionState = state.getMonthlyDonorRedemptionState(), onContactSupport = { requireActivity().finish() requireActivity().startActivity(AppSettingsActivity.help(requireContext(), HelpFragment.DONATION_INDEX)) }, - activeSubscription = activeSubscription + activeSubscription = activeSubscription, + onPendingClick = { + displayPendingDialog(it) + } + ) + ) + } + } + + private fun DSLConfiguration.presentNonVerifiedSubscriptionSettings( + nonVerifiedMonthlyDonation: NonVerifiedMonthlyDonation, + subscription: Subscription, + state: ManageDonationsState + ) { + presentSubscriptionSettingsWithState(state) { + customPref( + ActiveSubscriptionPreference.Model( + price = nonVerifiedMonthlyDonation.price, + subscription = subscription, + redemptionState = ManageDonationsState.RedemptionState.IN_PROGRESS, + onContactSupport = {}, + activeSubscription = null, + onPendingClick = {} ) ) } } private fun DSLConfiguration.presentSubscriptionSettingsWithState( - redemptionState: ManageDonationsState.SubscriptionRedemptionState, + state: ManageDonationsState, subscriptionBlock: DSLConfiguration.() -> Unit ) { dividerPref() @@ -215,10 +311,12 @@ class ManageDonationsFragment : subscriptionBlock() + presentPendingOrProcessingOneTimeDonationState(state) + clickPref( title = DSLSettingsText.from(R.string.ManageDonationsFragment__manage_subscription), icon = DSLSettingsIcon.from(R.drawable.symbol_person_24), - isEnabled = redemptionState != ManageDonationsState.SubscriptionRedemptionState.IN_PROGRESS, + isEnabled = state.getMonthlyDonorRedemptionState() != ManageDonationsState.RedemptionState.IN_PROGRESS, onClick = { findNavController().safeNavigate(ManageDonationsFragmentDirections.actionManageDonationsFragmentToDonateToSignalFragment(DonateToSignalType.MONTHLY)) } @@ -283,10 +381,69 @@ class ManageDonationsFragment : externalLinkPref( title = DSLSettingsText.from(R.string.ManageDonationsFragment__subscription_faq), icon = DSLSettingsIcon.from(R.drawable.symbol_help_24), - linkId = R.string.donate_url + linkId = R.string.donate_faq_url ) } + private fun displayPendingDialog(fiatMoney: FiatMoney) { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.MySupportPreference__payment_pending) + .setMessage( + getString( + R.string.MySupportPreference__your_bank_transfer_of_s, + FiatMoneyUtil.format(resources, fiatMoney, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + ) + ) + .setPositiveButton(android.R.string.ok) { _, _ -> } + .setNegativeButton(R.string.MySupportPreference__learn_more) { _, _ -> + CommunicationActions.openBrowserLink( + requireContext(), + getString(R.string.pending_transfer_url) + ) + } + .show() + } + + private fun displayPendingOneTimeDonationErrorDialog(error: DonationErrorValue, isIdeal: Boolean) { + when (error.type) { + DonationErrorValue.Type.REDEMPTION -> { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.DonationsErrors__couldnt_add_badge) + .setMessage(R.string.DonationsErrors__your_badge_could_not) + .setNegativeButton(R.string.DonationsErrors__learn_more) { _, _ -> + CommunicationActions.openBrowserLink(requireContext(), DONATE_TROUBLESHOOTING_URL) + } + .setPositiveButton(R.string.Subscription__contact_support) { _, _ -> + requireActivity().finish() + startActivity(AppSettingsActivity.help(requireContext(), HelpFragment.DONATION_INDEX)) + } + .setOnDismissListener { + SignalStore.donationsValues().setPendingOneTimeDonation(null) + } + .show() + } + else -> { + val message = if (isIdeal) { + R.string.DonationsErrors__your_ideal_couldnt_be_processed + } else { + R.string.DonationsErrors__try_another_payment_method + } + + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.DonationsErrors__error_processing_payment) + .setMessage(message) + .setNegativeButton(R.string.DonationsErrors__learn_more) { _, _ -> + CommunicationActions.openBrowserLink(requireContext(), DONATE_TROUBLESHOOTING_URL) + } + .setPositiveButton(android.R.string.ok, null) + .setOnDismissListener { + SignalStore.donationsValues().setPendingOneTimeDonation(null) + } + .show() + } + } + } + override fun onMakeAMonthlyDonation() { findNavController().safeNavigate(ManageDonationsFragmentDirections.actionManageDonationsFragmentToDonateToSignalFragment(DonateToSignalType.MONTHLY)) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsState.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsState.kt index 4249fd26..6371db0c 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsState.kt @@ -1,6 +1,7 @@ package org.tm.archive.components.settings.app.subscription.manage import org.tm.archive.badges.models.Badge +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation import org.tm.archive.subscription.Subscription import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription @@ -8,24 +9,27 @@ data class ManageDonationsState( val hasOneTimeBadge: Boolean = false, val hasReceipts: Boolean = false, val featuredBadge: Badge? = null, - val transactionState: TransactionState = TransactionState.Init, + val subscriptionTransactionState: TransactionState = TransactionState.Init, val availableSubscriptions: List = emptyList(), - private val subscriptionRedemptionState: SubscriptionRedemptionState = SubscriptionRedemptionState.NONE + val pendingOneTimeDonation: PendingOneTimeDonation? = null, + val nonVerifiedMonthlyDonation: NonVerifiedMonthlyDonation? = null, + private val subscriptionRedemptionState: RedemptionState = RedemptionState.NONE ) { - fun getMonthlyDonorRedemptionState(): SubscriptionRedemptionState { - return when (transactionState) { + fun getMonthlyDonorRedemptionState(): RedemptionState { + return when (subscriptionTransactionState) { TransactionState.Init -> subscriptionRedemptionState TransactionState.NetworkFailure -> subscriptionRedemptionState - TransactionState.InTransaction -> SubscriptionRedemptionState.IN_PROGRESS - is TransactionState.NotInTransaction -> getStateFromActiveSubscription(transactionState.activeSubscription) ?: subscriptionRedemptionState + TransactionState.InTransaction -> RedemptionState.IN_PROGRESS + is TransactionState.NotInTransaction -> getStateFromActiveSubscription(subscriptionTransactionState.activeSubscription) ?: subscriptionRedemptionState } } - private fun getStateFromActiveSubscription(activeSubscription: ActiveSubscription): SubscriptionRedemptionState? { + private fun getStateFromActiveSubscription(activeSubscription: ActiveSubscription): RedemptionState? { return when { - activeSubscription.isFailedPayment -> SubscriptionRedemptionState.FAILED - activeSubscription.isInProgress -> SubscriptionRedemptionState.IN_PROGRESS + activeSubscription.isFailedPayment && !activeSubscription.isPastDue -> RedemptionState.FAILED + activeSubscription.isPendingBankTransfer -> RedemptionState.IS_PENDING_BANK_TRANSFER + activeSubscription.isInProgress -> RedemptionState.IN_PROGRESS else -> null } } @@ -37,9 +41,10 @@ data class ManageDonationsState( class NotInTransaction(val activeSubscription: ActiveSubscription) : TransactionState() } - enum class SubscriptionRedemptionState { + enum class RedemptionState { NONE, IN_PROGRESS, + IS_PENDING_BANK_TRANSFER, FAILED } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsViewModel.kt index bf9bc7fc..927c7ec8 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/ManageDonationsViewModel.kt @@ -11,14 +11,16 @@ import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.logging.Log +import org.signal.core.util.orNull import org.tm.archive.components.settings.app.subscription.MonthlyDonationRepository import org.tm.archive.database.SignalDatabase -import org.tm.archive.jobmanager.JobTracker +import org.tm.archive.keyvalue.SignalStore import org.tm.archive.recipients.Recipient import org.tm.archive.subscription.LevelUpdate import org.tm.archive.util.InternetConnectionObserver import org.tm.archive.util.livedata.Store import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription +import java.util.Optional class ManageDonationsViewModel( private val subscriptionsRepository: MonthlyDonationRepository @@ -50,8 +52,8 @@ class ManageDonationsViewModel( } fun retry() { - if (!disposables.isDisposed && store.state.transactionState == ManageDonationsState.TransactionState.NetworkFailure) { - store.update { it.copy(transactionState = ManageDonationsState.TransactionState.Init) } + if (!disposables.isDisposed && store.state.subscriptionTransactionState == ManageDonationsState.TransactionState.NetworkFailure) { + store.update { it.copy(subscriptionTransactionState = ManageDonationsState.TransactionState.Init) } refresh() } } @@ -74,22 +76,32 @@ class ManageDonationsViewModel( store.update { it.copy(hasReceipts = hasReceipts) } } - disposables += SubscriptionRedemptionJobWatcher.watch().subscribeBy { jobStateOptional -> + disposables += DonationRedemptionJobWatcher.watchSubscriptionRedemption().subscribeBy { redemptionStatus -> store.update { manageDonationsState -> manageDonationsState.copy( - subscriptionRedemptionState = jobStateOptional.map { jobState: JobTracker.JobState -> - when (jobState) { - JobTracker.JobState.PENDING -> ManageDonationsState.SubscriptionRedemptionState.IN_PROGRESS - JobTracker.JobState.RUNNING -> ManageDonationsState.SubscriptionRedemptionState.IN_PROGRESS - JobTracker.JobState.SUCCESS -> ManageDonationsState.SubscriptionRedemptionState.NONE - JobTracker.JobState.FAILURE -> ManageDonationsState.SubscriptionRedemptionState.FAILED - JobTracker.JobState.IGNORED -> ManageDonationsState.SubscriptionRedemptionState.NONE - } - }.orElse(ManageDonationsState.SubscriptionRedemptionState.NONE) + nonVerifiedMonthlyDonation = if (redemptionStatus is DonationRedemptionJobStatus.PendingExternalVerification) redemptionStatus.nonVerifiedMonthlyDonation else null, + subscriptionRedemptionState = mapStatusToRedemptionState(redemptionStatus) ) } } + disposables += Observable.combineLatest( + SignalStore.donationsValues().observablePendingOneTimeDonation, + DonationRedemptionJobWatcher.watchOneTimeRedemption() + ) { pendingFromStore, pendingFromJob -> + if (pendingFromStore.isPresent) { + pendingFromStore + } else if (pendingFromJob is DonationRedemptionJobStatus.PendingExternalVerification) { + Optional.ofNullable(pendingFromJob.pendingOneTimeDonation) + } else { + Optional.empty() + } + } + .distinctUntilChanged() + .subscribeBy { pending -> + store.update { it.copy(pendingOneTimeDonation = pending.orNull()) } + } + disposables += levelUpdateOperationEdges.switchMapSingle { isProcessing -> if (isProcessing) { Single.just(ManageDonationsState.TransactionState.InTransaction) @@ -99,14 +111,14 @@ class ManageDonationsViewModel( }.subscribeBy( onNext = { transactionState -> store.update { - it.copy(transactionState = transactionState) + it.copy(subscriptionTransactionState = transactionState) } }, onError = { throwable -> Log.w(TAG, "Error retrieving subscription transaction state", throwable) store.update { - it.copy(transactionState = ManageDonationsState.TransactionState.NetworkFailure) + it.copy(subscriptionTransactionState = ManageDonationsState.TransactionState.NetworkFailure) } } ) @@ -121,6 +133,17 @@ class ManageDonationsViewModel( ) } + private fun mapStatusToRedemptionState(status: DonationRedemptionJobStatus): ManageDonationsState.RedemptionState { + return when (status) { + DonationRedemptionJobStatus.FailedSubscription -> ManageDonationsState.RedemptionState.FAILED + DonationRedemptionJobStatus.None -> ManageDonationsState.RedemptionState.NONE + + is DonationRedemptionJobStatus.PendingExternalVerification, + DonationRedemptionJobStatus.PendingReceiptRedemption, + DonationRedemptionJobStatus.PendingReceiptRequest -> ManageDonationsState.RedemptionState.IN_PROGRESS + } + } + class Factory( private val subscriptionsRepository: MonthlyDonationRepository ) : ViewModelProvider.Factory { diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/NonVerifiedMonthlyDonation.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/NonVerifiedMonthlyDonation.kt new file mode 100644 index 00000000..25e3ee61 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/NonVerifiedMonthlyDonation.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.manage + +import org.signal.core.util.money.FiatMoney + +/** + * Represents a monthly donation via iDEAL that is still pending user verification in + * their 3rd party app. + */ +data class NonVerifiedMonthlyDonation( + val timestamp: Long, + val price: FiatMoney, + val level: Int, + val checkedVerification: Boolean +) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/OneTimeDonationPreference.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/OneTimeDonationPreference.kt new file mode 100644 index 00000000..4b13ae0f --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/OneTimeDonationPreference.kt @@ -0,0 +1,101 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.subscription.manage + +import android.widget.ProgressBar +import android.widget.TextView +import org.signal.core.util.money.FiatMoney +import org.tm.archive.R +import org.tm.archive.badges.BadgeImageView +import org.tm.archive.badges.Badges +import org.tm.archive.components.settings.app.subscription.DonationSerializationHelper.toFiatMoney +import org.tm.archive.database.model.databaseprotos.DonationErrorValue +import org.tm.archive.database.model.databaseprotos.PendingOneTimeDonation +import org.tm.archive.databinding.MySupportPreferenceBinding +import org.tm.archive.payments.FiatMoneyUtil +import org.tm.archive.util.adapter.mapping.BindingFactory +import org.tm.archive.util.adapter.mapping.BindingViewHolder +import org.tm.archive.util.adapter.mapping.MappingAdapter +import org.tm.archive.util.adapter.mapping.MappingModel +import org.tm.archive.util.visible + +/** + * Holds state information about pending one-time donations. + */ +object OneTimeDonationPreference { + + fun register(adapter: MappingAdapter) { + adapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, MySupportPreferenceBinding::inflate)) + } + + class Model( + val pendingOneTimeDonation: PendingOneTimeDonation, + val onPendingClick: (FiatMoney) -> Unit, + val onErrorClick: (DonationErrorValue) -> Unit + ) : MappingModel { + override fun areItemsTheSame(newItem: Model): Boolean = true + + override fun areContentsTheSame(newItem: Model): Boolean { + return this.pendingOneTimeDonation == newItem.pendingOneTimeDonation + } + } + + class ViewHolder(binding: MySupportPreferenceBinding) : BindingViewHolder(binding) { + + val badge: BadgeImageView = binding.mySupportBadge + val title: TextView = binding.mySupportTitle + val expiry: TextView = binding.mySupportExpiry + val progress: ProgressBar = binding.mySupportProgress + + override fun bind(model: Model) { + badge.setBadge(Badges.fromDatabaseBadge(model.pendingOneTimeDonation.badge!!)) + title.text = context.getString( + R.string.OneTimeDonationPreference__one_time_s, + FiatMoneyUtil.format(context.resources, model.pendingOneTimeDonation.amount!!.toFiatMoney(), FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + ) + + if (model.pendingOneTimeDonation.error != null) { + presentErrorState(model, model.pendingOneTimeDonation.error) + } else { + presentPendingState(model) + } + } + + private fun presentErrorState(model: Model, error: DonationErrorValue) { + expiry.text = getErrorSubtitle(error) + + itemView.setOnClickListener { model.onErrorClick(error) } + + progress.visible = false + } + + private fun presentPendingState(model: Model) { + expiry.text = getPendingSubtitle(model.pendingOneTimeDonation.paymentMethodType) + + if (model.pendingOneTimeDonation.paymentMethodType == PendingOneTimeDonation.PaymentMethodType.SEPA_DEBIT) { + itemView.setOnClickListener { model.onPendingClick(model.pendingOneTimeDonation.amount!!.toFiatMoney()) } + } + + progress.visible = model.pendingOneTimeDonation.paymentMethodType != PendingOneTimeDonation.PaymentMethodType.SEPA_DEBIT + } + + private fun getErrorSubtitle(error: DonationErrorValue): String { + return when (error.type) { + DonationErrorValue.Type.REDEMPTION -> context.getString(R.string.DonationsErrors__couldnt_add_badge) + else -> context.getString(R.string.DonationsErrors__donation_failed) + } + } + + private fun getPendingSubtitle(paymentMethodType: PendingOneTimeDonation.PaymentMethodType): String { + return when (paymentMethodType) { + PendingOneTimeDonation.PaymentMethodType.CARD -> context.getString(R.string.OneTimeDonationPreference__donation_processing) + PendingOneTimeDonation.PaymentMethodType.SEPA_DEBIT -> context.getString(R.string.OneTimeDonationPreference__donation_pending) + PendingOneTimeDonation.PaymentMethodType.PAYPAL -> context.getString(R.string.OneTimeDonationPreference__donation_processing) + PendingOneTimeDonation.PaymentMethodType.IDEAL -> context.getString(R.string.OneTimeDonationPreference__donation_pending) + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/SubscriptionRedemptionJobWatcher.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/SubscriptionRedemptionJobWatcher.kt deleted file mode 100644 index bde71901..00000000 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/manage/SubscriptionRedemptionJobWatcher.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.tm.archive.components.settings.app.subscription.manage - -import io.reactivex.rxjava3.core.Observable -import org.tm.archive.dependencies.ApplicationDependencies -import org.tm.archive.jobmanager.JobTracker -import org.tm.archive.jobs.DonationReceiptRedemptionJob -import org.tm.archive.jobs.SubscriptionReceiptRequestResponseJob -import org.tm.archive.keyvalue.SignalStore -import java.util.Optional -import java.util.concurrent.TimeUnit - -/** - * Allows observer to poll for the status of the latest pending, running, or completed redemption job for subscriptions. - */ -object SubscriptionRedemptionJobWatcher { - fun watch(): Observable> = Observable.interval(0, 5, TimeUnit.SECONDS).map { - val redemptionJobState: JobTracker.JobState? = ApplicationDependencies.getJobManager().getFirstMatchingJobState { - it.factoryKey == DonationReceiptRedemptionJob.KEY && it.parameters.queue == DonationReceiptRedemptionJob.SUBSCRIPTION_QUEUE - } - - val receiptJobState: JobTracker.JobState? = ApplicationDependencies.getJobManager().getFirstMatchingJobState { - it.factoryKey == SubscriptionReceiptRequestResponseJob.KEY && it.parameters.queue == DonationReceiptRedemptionJob.SUBSCRIPTION_QUEUE - } - - val jobState: JobTracker.JobState? = redemptionJobState ?: receiptJobState - - if (jobState == null && SignalStore.donationsValues().getSubscriptionRedemptionFailed()) { - Optional.of(JobTracker.JobState.FAILURE) - } else { - Optional.ofNullable(jobState) - } - }.distinctUntilChanged() -} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListAdapter.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListAdapter.kt index cbae4a9d..6c1899bf 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListAdapter.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListAdapter.kt @@ -2,6 +2,7 @@ package org.tm.archive.components.settings.app.subscription.receipts.list import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.content.ContextCompat import org.tm.archive.R import org.tm.archive.components.settings.DSLSettingsText import org.tm.archive.components.settings.SectionHeaderPreference @@ -32,6 +33,11 @@ class DonationReceiptListAdapter(onModelClick: (DonationReceiptListItem.Model) - } override fun onBindHeaderViewHolder(viewHolder: SectionHeaderPreferenceViewHolder?, position: Int, type: Int) { + viewHolder?.itemView?.run { + val color = ContextCompat.getColor(context, R.color.signal_colorBackground) + setBackgroundColor(color) + } + viewHolder?.bind(SectionHeaderPreference(DSLSettingsText.from(getHeaderId(position).toString()))) } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt index f5645e57..1909709f 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt @@ -32,7 +32,7 @@ class DonationReceiptListFragment : Fragment(R.layout.donation_receipt_list_frag 0 -> R.string.DonationReceiptListFragment__all 1 -> R.string.DonationReceiptListFragment__recurring 2 -> R.string.DonationReceiptListFragment__one_time - 3 -> R.string.DonationReceiptListFragment__donation_for_a_friend + 3 -> R.string.DonationReceiptListFragment__for_a_friend else -> error("Unsupported index $position") } ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/updates/AppUpdatesSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/updates/AppUpdatesSettingsFragment.kt new file mode 100644 index 00000000..82a1a302 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/updates/AppUpdatesSettingsFragment.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.updates + +import android.os.Build +import org.tm.archive.R +import org.tm.archive.components.settings.DSLConfiguration +import org.tm.archive.components.settings.DSLSettingsFragment +import org.tm.archive.components.settings.DSLSettingsText +import org.tm.archive.components.settings.configure +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.jobs.ApkUpdateJob +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.util.adapter.mapping.MappingAdapter +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +/** + * Settings around app updates. Only shown for builds that manage their own app updates. + */ +class AppUpdatesSettingsFragment : DSLSettingsFragment(R.string.preferences_app_updates__title) { + + override fun bindAdapter(adapter: MappingAdapter) { + adapter.submitList(getConfiguration().toMappingModelList()) + } + + private fun getConfiguration(): DSLConfiguration { + return configure { + if (Build.VERSION.SDK_INT >= 31) { + switchPref( + title = DSLSettingsText.from("Automatic updates"), + summary = DSLSettingsText.from("Automatically download and install app updates"), + isChecked = SignalStore.apkUpdate().autoUpdate, + onClick = { + SignalStore.apkUpdate().autoUpdate = !SignalStore.apkUpdate().autoUpdate + } + ) + } + + clickPref( + title = DSLSettingsText.from("Check for updates"), + summary = DSLSettingsText.from("Last checked on: $lastSuccessfulUpdateString"), + onClick = { + ApplicationDependencies.getJobManager().add(ApkUpdateJob()) + } + ) + } + } + + private val lastSuccessfulUpdateString: String + get() { + val lastUpdateTime = SignalStore.apkUpdate().lastSuccessfulCheck + + return if (lastUpdateTime > 0) { + val dateFormat = SimpleDateFormat("MMMM dd, yyyy 'at' h:mma", Locale.US) + dateFormat.format(Date(lastUpdateTime)) + } else { + "Never" + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCode.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCode.kt index 1e51f40e..b35a949c 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCode.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCode.kt @@ -53,14 +53,14 @@ fun QrCode( } } -private fun DrawScope.drawQr( +fun DrawScope.drawQr( data: QrCodeData, foregroundColor: Color, backgroundColor: Color, deadzonePercent: Float, - logo: ImageBitmap + logo: ImageBitmap? ) { - val deadzonePaddingPercent = 0.07f + val deadzonePaddingPercent = 0.045f // We want an even number of dots on either side of the deadzone val deadzoneRadius: Int = (data.height * (deadzonePercent + deadzonePaddingPercent)).toInt().let { candidateDeadzoneHeight -> @@ -120,12 +120,14 @@ private fun DrawScope.drawQr( // Logo val logoWidthPx = (((deadzonePercent - deadzonePaddingPercent) * 0.6f) * size.width).toInt() val logoOffsetPx = ((size.width - logoWidthPx) / 2).toInt() - drawImage( - image = logo, - dstOffset = IntOffset(logoOffsetPx, logoOffsetPx), - dstSize = IntSize(logoWidthPx, logoWidthPx), - colorFilter = ColorFilter.tint(foregroundColor) - ) + if (logo != null) { + drawImage( + image = logo, + dstOffset = IntOffset(logoOffsetPx, logoOffsetPx), + dstSize = IntSize(logoWidthPx, logoWidthPx), + colorFilter = ColorFilter.tint(foregroundColor) + ) + } } @Preview diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeBadge.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeBadge.kt index b0e2764c..aa53d4f0 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeBadge.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeBadge.kt @@ -1,80 +1,95 @@ package org.tm.archive.components.settings.app.usernamelinks +import android.content.res.Configuration import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.Image +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Rect +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.onGloballyPositioned -import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.signal.core.ui.theme.SignalTheme -import org.tm.archive.compose.ScreenshotController -import org.tm.archive.compose.getScreenshotBounds +import org.tm.archive.R /** * Renders a QR code and username as a badge. */ @Composable -fun QrCodeBadge(data: QrCodeData?, colorScheme: UsernameQrCodeColorScheme, username: String, modifier: Modifier = Modifier, screenshotController: ScreenshotController? = null) { - val borderColor by animateColorAsState(targetValue = colorScheme.borderColor) - val foregroundColor by animateColorAsState(targetValue = colorScheme.foregroundColor) - val elevation by animateFloatAsState(targetValue = if (colorScheme == UsernameQrCodeColorScheme.White) 10f else 0f) - val textColor by animateColorAsState(targetValue = if (colorScheme == UsernameQrCodeColorScheme.White) Color.Black else Color.White) - var badgeBounds by remember { - mutableStateOf(null) - } - screenshotController?.bind(LocalView.current, badgeBounds) +fun QrCodeBadge( + data: QrCodeState, + colorScheme: UsernameQrCodeColorScheme, + username: String, + modifier: Modifier = Modifier, + usernameCopyable: Boolean = false, + onClick: ((String) -> Unit) = {} +) { + val borderColor by animateColorAsState(targetValue = colorScheme.borderColor, label = "border") + val foregroundColor by animateColorAsState(targetValue = colorScheme.foregroundColor, label = "foreground") + val elevation by animateFloatAsState(targetValue = if (colorScheme == UsernameQrCodeColorScheme.White) 10f else 0f, label = "elevation") + val textColor by animateColorAsState(targetValue = colorScheme.textColor, label = "textColor") + Surface( - modifier = modifier - .fillMaxWidth() - .padding(horizontal = 59.dp, vertical = 24.dp) - .onGloballyPositioned { - badgeBounds = it.getScreenshotBounds() - }, + modifier = modifier, color = borderColor, shape = RoundedCornerShape(24.dp), shadowElevation = elevation.dp ) { - Column { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.width(296.dp) + ) { Surface( modifier = Modifier .padding( top = 32.dp, start = 40.dp, - end = 40.dp, - bottom = 16.dp + end = 40.dp ) .aspectRatio(1f) .fillMaxWidth(), shape = RoundedCornerShape(12.dp), color = Color.White ) { - if (data != null) { + if (data is QrCodeState.Present) { QrCode( - data = data, - modifier = Modifier.padding(16.dp), + data = data.data, + modifier = Modifier + .border( + width = 2.dp, + color = colorScheme.outlineColor, + shape = RoundedCornerShape(size = 12.dp) + ) + .padding(16.dp), foregroundColor = foregroundColor, backgroundColor = Color.White ) @@ -85,40 +100,169 @@ fun QrCodeBadge(data: QrCodeData?, colorScheme: UsernameQrCodeColorScheme, usern .fillMaxHeight(), contentAlignment = Alignment.Center ) { - CircularProgressIndicator( - color = colorScheme.borderColor, - modifier = Modifier.size(56.dp) - ) + if (data is QrCodeState.Loading) { + CircularProgressIndicator( + color = colorScheme.borderColor, + modifier = Modifier.size(56.dp) + ) + } else if (data is QrCodeState.NotSet) { + Image( + painter = painterResource(id = R.drawable.symbol_error_circle_24), + contentDescription = stringResource(id = R.string.UsernameLinkSettings_link_not_set_label), + colorFilter = ColorFilter.tint(colorResource(R.color.core_grey_25)), + modifier = Modifier + .width(28.dp) + .height(28.dp) + ) + } } } } - Text( - text = username, - color = textColor, - fontSize = 20.sp, - lineHeight = 26.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, modifier = Modifier - .fillMaxWidth() .padding( - start = 40.dp, - end = 40.dp, - bottom = 32.dp + start = 32.dp, + end = 32.dp, + top = 8.dp, + bottom = 28.dp ) - ) + .clip(RoundedCornerShape(8.dp)) + .clickable( + enabled = usernameCopyable, + onClick = { onClick(username) } + ) + .padding(8.dp) + ) { + if (usernameCopyable) { + Image( + painter = painterResource(id = R.drawable.symbol_copy_android_24), + contentDescription = null, + colorFilter = if (colorScheme == UsernameQrCodeColorScheme.White) { + ColorFilter.tint(Color.Black) + } else { + ColorFilter.tint(Color.White) + } + ) + } + + Text( + text = username, + color = textColor, + fontSize = 20.sp, + lineHeight = 26.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(start = 6.dp) + ) + } } } } -@Preview +@Preview(name = "Light Theme", group = "ShortName", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "ShortName", uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable -private fun PreviewWithCode() { +private fun PreviewWithCodeShort() { + SignalTheme { + Surface { + Column { + QrCodeBadge( + data = QrCodeState.Present(QrCodeData.forData("https://signal.org", 64)), + colorScheme = UsernameQrCodeColorScheme.Blue, + username = "parker.42", + usernameCopyable = false + ) + QrCodeBadge( + data = QrCodeState.Present(QrCodeData.forData("https://signal.org", 64)), + colorScheme = UsernameQrCodeColorScheme.Blue, + username = "parker.42", + usernameCopyable = true + ) + } + } + } +} + +@Preview(group = "LongName") +@Composable +private fun PreviewWithCodeLong() { + SignalTheme { + Surface { + Column { + QrCodeBadge( + data = QrCodeState.Present(QrCodeData.forData("https://signal.org", 64)), + colorScheme = UsernameQrCodeColorScheme.Blue, + username = "TheAmazingSpiderMan.42", + usernameCopyable = false + ) + Spacer(modifier = Modifier.height(8.dp)) + QrCodeBadge( + data = QrCodeState.Present(QrCodeData.forData("https://signal.org", 64)), + colorScheme = UsernameQrCodeColorScheme.Blue, + username = "TheAmazingSpiderMan.42", + usernameCopyable = true + ) + } + } + } +} + +@Preview(group = "Colors", heightDp = 1500) +@Composable +private fun PreviewAllColorsP1() { SignalTheme(isDarkMode = false) { + Surface { + Column { + SampleCode(colorScheme = UsernameQrCodeColorScheme.Blue) + Spacer(modifier = Modifier.height(8.dp)) + SampleCode(colorScheme = UsernameQrCodeColorScheme.White) + Spacer(modifier = Modifier.height(8.dp)) + SampleCode(colorScheme = UsernameQrCodeColorScheme.Green) + Spacer(modifier = Modifier.height(8.dp)) + SampleCode(colorScheme = UsernameQrCodeColorScheme.Grey) + } + } + } +} + +@Preview(group = "Colors", heightDp = 1500) +@Composable +private fun PreviewAllColorsP2() { + SignalTheme(isDarkMode = false) { + Surface { + Column { + SampleCode(colorScheme = UsernameQrCodeColorScheme.Pink) + Spacer(modifier = Modifier.height(8.dp)) + SampleCode(colorScheme = UsernameQrCodeColorScheme.Orange) + Spacer(modifier = Modifier.height(8.dp)) + SampleCode(colorScheme = UsernameQrCodeColorScheme.Purple) + Spacer(modifier = Modifier.height(8.dp)) + SampleCode(colorScheme = UsernameQrCodeColorScheme.Tan) + } + } + } +} + +@Composable +private fun SampleCode(colorScheme: UsernameQrCodeColorScheme) { + QrCodeBadge( + data = QrCodeState.Present(QrCodeData.forData("https://signal.me/#eu/asdfasdfasdfasdfasdfasdfasdfasdfasdf", 64)), + colorScheme = colorScheme, + username = "parker.42" + ) +} + +@Preview(name = "Light Theme", group = "Loading", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "Loading", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun PreviewLoading() { + SignalTheme { Surface { QrCodeBadge( - data = QrCodeData.forData("https://signal.org", 64), + data = QrCodeState.Loading, colorScheme = UsernameQrCodeColorScheme.Blue, username = "parker.42" ) @@ -126,13 +270,14 @@ private fun PreviewWithCode() { } } -@Preview +@Preview(name = "Light Theme", group = "NotSet", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "NotSet", uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable -private fun PreviewWithoutCode() { - SignalTheme(isDarkMode = false) { +private fun PreviewNotSet() { + SignalTheme { Surface { QrCodeBadge( - data = null, + data = QrCodeState.NotSet, colorScheme = UsernameQrCodeColorScheme.Blue, username = "parker.42" ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeData.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeData.kt index aa7b0e66..8efdb7ba 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeData.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeData.kt @@ -38,7 +38,7 @@ class QrCodeData( @WorkerThread fun forData(data: String, size: Int): QrCodeData { val qrCodeWriter = QRCodeWriter() - val hints = mapOf(EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.H.toString()) + val hints = mapOf(EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.Q.toString()) val padded = qrCodeWriter.encode(data, BarcodeFormat.QR_CODE, size, size, hints) val dimens = padded.enclosingRectangle diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeState.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeState.kt new file mode 100644 index 00000000..dc46ad97 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/QrCodeState.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.usernamelinks + +sealed class QrCodeState { + /** QR code data exists and is available. */ + data class Present(val data: QrCodeData) : QrCodeState() + + /** QR code data does not exist. */ + object NotSet : QrCodeState() + + /** QR code data is in an indeterminate loading state. */ + object Loading : QrCodeState() +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt index 3b8197ed..01a96936 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt @@ -8,6 +8,8 @@ import androidx.compose.ui.graphics.Color enum class UsernameQrCodeColorScheme( val borderColor: Color, val foregroundColor: Color, + val textColor: Color = Color.White, + val outlineColor: Color = Color.Transparent, private val key: String ) { Blue( @@ -17,7 +19,9 @@ enum class UsernameQrCodeColorScheme( ), White( borderColor = Color(0xFFFFFFFF), - foregroundColor = Color(0xFF464852), + foregroundColor = Color(0xFF000000), + textColor = Color.Black, + outlineColor = Color(0xFFE9E9E9), key = "white" ), Grey( diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerFragment.kt index 1c940397..4b63c27f 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerFragment.kt @@ -2,7 +2,6 @@ package org.tm.archive.components.settings.app.usernamelinks.colorpicker import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.foundation.Image import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -15,6 +14,7 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -65,12 +65,14 @@ class UsernameLinkQrColorPickerFragment : ComposeFragment() { .padding(contentPadding) .fillMaxWidth() .fillMaxHeight(), - verticalArrangement = Arrangement.SpaceBetween + verticalArrangement = Arrangement.SpaceBetween, + horizontalAlignment = Alignment.CenterHorizontally ) { QrCodeBadge( data = state.qrCodeData, colorScheme = state.selectedColorScheme, - username = state.username + username = state.username, + modifier = Modifier.padding(horizontal = 58.dp, vertical = 24.dp) ) ColorPicker( @@ -102,7 +104,11 @@ class UsernameLinkQrColorPickerFragment : ComposeFragment() { }, navigationIcon = { IconButton(onClick = onBackClicked) { - Image(painter = painterResource(R.drawable.symbol_arrow_left_24), contentDescription = null) + Icon( + painter = painterResource(R.drawable.symbol_arrow_left_24), + tint = MaterialTheme.colorScheme.onSurface, + contentDescription = null + ) } } ) @@ -160,7 +166,7 @@ class UsernameLinkQrColorPickerFragment : ComposeFragment() { @Preview @Composable - private fun ColorPickerItemPreview() { + private fun PreviewColorPickerItem() { SignalTheme(isDarkMode = false) { Surface { Row(verticalAlignment = Alignment.CenterVertically) { @@ -173,7 +179,7 @@ class UsernameLinkQrColorPickerFragment : ComposeFragment() { @Preview @Composable - private fun ColorPickerPreview() { + private fun PreviewColorPicker() { SignalTheme(isDarkMode = false) { Surface { ColorPicker( diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerState.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerState.kt index e46ae49d..3fefa9cf 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerState.kt @@ -1,12 +1,12 @@ package org.tm.archive.components.settings.app.usernamelinks.colorpicker import kotlinx.collections.immutable.ImmutableList -import org.tm.archive.components.settings.app.usernamelinks.QrCodeData +import org.tm.archive.components.settings.app.usernamelinks.QrCodeState import org.tm.archive.components.settings.app.usernamelinks.UsernameQrCodeColorScheme data class UsernameLinkQrColorPickerState( val username: String, - val qrCodeData: QrCodeData?, + val qrCodeData: QrCodeState, val colorSchemes: ImmutableList, val selectedColorScheme: UsernameQrCodeColorScheme ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerViewModel.kt index acedd952..cfde3249 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/colorpicker/UsernameLinkQrColorPickerViewModel.kt @@ -9,20 +9,22 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.schedulers.Schedulers import kotlinx.collections.immutable.toImmutableList +import org.signal.core.util.concurrent.SignalExecutors import org.tm.archive.components.settings.app.usernamelinks.QrCodeData +import org.tm.archive.components.settings.app.usernamelinks.QrCodeState import org.tm.archive.components.settings.app.usernamelinks.UsernameQrCodeColorScheme +import org.tm.archive.database.SignalDatabase import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.profiles.manage.UsernameRepository.toLink import org.tm.archive.recipients.Recipient -import org.tm.archive.util.UsernameUtil +import org.tm.archive.storage.StorageSyncHelper class UsernameLinkQrColorPickerViewModel : ViewModel() { - private val username: String = Recipient.self().username.get() - private val _state = mutableStateOf( UsernameLinkQrColorPickerState( - username = username, - qrCodeData = null, + username = SignalStore.account().username!!, + qrCodeData = QrCodeState.Loading, colorSchemes = UsernameQrCodeColorScheme.values().asList().toImmutableList(), selectedColorScheme = SignalStore.misc().usernameQrCodeColorScheme ) @@ -33,15 +35,23 @@ class UsernameLinkQrColorPickerViewModel : ViewModel() { private val disposable: CompositeDisposable = CompositeDisposable() init { - disposable += Single - .fromCallable { QrCodeData.forData(UsernameUtil.generateLink(username), 64) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { qrData -> - _state.value = _state.value.copy( - qrCodeData = qrData - ) - } + val usernameLink = SignalStore.account().usernameLink + + if (usernameLink != null) { + disposable += Single + .fromCallable { QrCodeData.forData(usernameLink.toLink(), 64) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { qrData -> + _state.value = _state.value.copy( + qrCodeData = QrCodeState.Present(qrData) + ) + } + } else { + _state.value = _state.value.copy( + qrCodeData = QrCodeState.NotSet + ) + } } override fun onCleared() { @@ -50,6 +60,11 @@ class UsernameLinkQrColorPickerViewModel : ViewModel() { fun onColorSelected(color: UsernameQrCodeColorScheme) { SignalStore.misc().usernameQrCodeColorScheme = color + SignalExecutors.BOUNDED.run { + SignalDatabase.recipients.markNeedsSync(Recipient.self().id) + StorageSyncHelper.scheduleSyncForDataChange() + } + _state.value = _state.value.copy( selectedColorScheme = color ) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/QrScanResult.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/QrScanResult.kt index f634df47..8ad3da08 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/QrScanResult.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/QrScanResult.kt @@ -8,7 +8,7 @@ import org.tm.archive.recipients.Recipient sealed class QrScanResult { class Success(val recipient: Recipient) : QrScanResult() - class NotFound(val username: String) : QrScanResult() + class NotFound(val username: String?) : QrScanResult() object InvalidData : QrScanResult() diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkResetResult.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkResetResult.kt new file mode 100644 index 00000000..2cf9ab0a --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkResetResult.kt @@ -0,0 +1,20 @@ +package org.tm.archive.components.settings.app.usernamelinks.main + +import org.whispersystems.signalservice.api.push.UsernameLinkComponents + +/** + * Result of resetting the username link. + */ +sealed class UsernameLinkResetResult { + /** Successfully reset the username link. */ + data class Success(val components: UsernameLinkComponents) : UsernameLinkResetResult() + + /** Network failed when making the request. The username is still considered to be "reset". */ + object NetworkError : UsernameLinkResetResult() + + /** We never made the request because we detected the user had no network. */ + object NetworkUnavailable : UsernameLinkResetResult() + + /** We never made the request because we hit an unexpected error. */ + object UnexpectedError : UsernameLinkResetResult() +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt index ca533649..0c41c655 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt @@ -1,6 +1,9 @@ +@file:OptIn(ExperimentalMaterial3Api::class) + package org.tm.archive.components.settings.app.usernamelinks.main import android.content.Intent +import android.content.res.Configuration import android.graphics.Bitmap import android.os.Bundle import android.view.View @@ -8,38 +11,46 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.app.ShareCompat +import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionState +import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState import kotlinx.coroutines.CoroutineScope @@ -50,31 +61,57 @@ import org.signal.core.util.concurrent.LifecycleDisposable import org.tm.archive.R import org.tm.archive.components.settings.app.usernamelinks.main.UsernameLinkSettingsState.ActiveTab import org.tm.archive.compose.ComposeFragment -import org.tm.archive.compose.ScreenshotController import org.tm.archive.providers.BlobProvider import java.io.ByteArrayOutputStream +import java.util.UUID -@OptIn( - ExperimentalMaterial3Api::class, - ExperimentalPermissionsApi::class -) +@OptIn(ExperimentalPermissionsApi::class) class UsernameLinkSettingsFragment : ComposeFragment() { private val viewModel: UsernameLinkSettingsViewModel by viewModels() private val disposables: LifecycleDisposable = LifecycleDisposable() - private val screenshotController = ScreenshotController() + override fun onStart() { + super.onStart() + setFragmentResultListener(UsernameLinkShareBottomSheet.REQUEST_KEY) { key, bundle -> + if (bundle.getBoolean(UsernameLinkShareBottomSheet.KEY_COPY)) { + viewModel.onLinkCopied() + } + } + } + @OptIn(ExperimentalMaterial3Api::class) @Composable override fun FragmentContent() { val state by viewModel.state val snackbarHostState: SnackbarHostState = remember { SnackbarHostState() } val scope: CoroutineScope = rememberCoroutineScope() val navController: NavController by remember { mutableStateOf(findNavController()) } + var showResetDialog: Boolean by remember { mutableStateOf(false) } + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() + val cameraPermissionState: PermissionState = rememberPermissionState(permission = android.Manifest.permission.CAMERA) + val linkCopiedEvent: UUID? by viewModel.linkCopiedEvent + + val linkCopiedString = stringResource(R.string.UsernameLinkSettings_link_copied_toast) + + LaunchedEffect(linkCopiedEvent) { + if (linkCopiedEvent != null) { + snackbarHostState.showSnackbar(linkCopiedString) + } + } Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, - topBar = { TopAppBarContent(state.activeTab) } + topBar = { + TopAppBarContent( + activeTab = state.activeTab, + scrollBehavior = scrollBehavior, + onCodeTabSelected = { viewModel.onTabSelected(ActiveTab.Code) }, + onScanTabSelected = { viewModel.onTabSelected(ActiveTab.Scan) }, + cameraPermissionState = cameraPermissionState + ) + }, + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection) ) { contentPadding -> if (state.indeterminateProgress) { @@ -93,9 +130,10 @@ class UsernameLinkSettingsFragment : ComposeFragment() { modifier = Modifier.padding(contentPadding), navController = navController, onShareBadge = { - shareQrBadge(it) + shareQrBadge(viewModel.generateQrCodeImage()) }, - screenshotController = screenshotController + onResetClicked = { showResetDialog = true }, + onLinkResultHandled = { viewModel.onUsernameLinkResetResultHandled() } ) } @@ -114,6 +152,16 @@ class UsernameLinkSettingsFragment : ComposeFragment() { ) } } + + if (showResetDialog) { + ResetDialog( + onConfirm = { + viewModel.onUsernameLinkReset() + showResetDialog = false + }, + onDismiss = { showResetDialog = false } + ) + } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -125,41 +173,57 @@ class UsernameLinkSettingsFragment : ComposeFragment() { viewModel.onResume() } + @OptIn(ExperimentalMaterial3Api::class) @Composable - private fun TopAppBarContent(activeTab: ActiveTab) { - val cameraPermissionState: PermissionState = rememberPermissionState(permission = android.Manifest.permission.CAMERA) - - Box( + private fun TopAppBarContent( + activeTab: ActiveTab, + scrollBehavior: TopAppBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), + onCodeTabSelected: () -> Unit = {}, + onScanTabSelected: () -> Unit = {}, + cameraPermissionState: PermissionState = previewPermissionState() + ) { + CenterAlignedTopAppBar( modifier = Modifier - .fillMaxWidth() - .height(64.dp) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .fillMaxHeight(), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically - ) { - TabButton( - label = stringResource(R.string.UsernameLinkSettings_code_tab_name), - active = activeTab == ActiveTab.Code, - onClick = { viewModel.onTabSelected(ActiveTab.Code) }, - modifier = Modifier.padding(end = 8.dp) - ) - TabButton( - label = stringResource(R.string.UsernameLinkSettings_scan_tab_name), - active = activeTab == ActiveTab.Scan, - onClick = { - if (cameraPermissionState.status.isGranted) { - viewModel.onTabSelected(ActiveTab.Scan) - } else { - cameraPermissionState.launchPermissionRequest() - } - } - ) - } - } + .fillMaxWidth(), + title = { + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + TabButton( + label = stringResource(R.string.UsernameLinkSettings_code_tab_name), + active = activeTab == ActiveTab.Code, + onClick = onCodeTabSelected, + modifier = Modifier.padding(end = 8.dp) + ) + TabButton( + label = stringResource(R.string.UsernameLinkSettings_scan_tab_name), + active = activeTab == ActiveTab.Scan, + onClick = { + if (cameraPermissionState.status.isGranted) { + onScanTabSelected() + } else { + cameraPermissionState.launchPermissionRequest() + } + }, + modifier = Modifier.padding(end = 8.dp) + ) + } + }, + navigationIcon = { + IconButton( + onClick = { requireActivity().onBackPressed() } + ) { + Icon( + painter = painterResource(R.drawable.symbol_x_24), + contentDescription = stringResource(android.R.string.cancel) + ) + } + }, + scrollBehavior = scrollBehavior + ) } @Composable @@ -172,7 +236,7 @@ class UsernameLinkSettingsFragment : ComposeFragment() { contentColor = MaterialTheme.colorScheme.onSurface ) } - Buttons.MediumTonal( + Buttons.Small( onClick = onClick, modifier = modifier.defaultMinSize(minWidth = 100.dp), shape = RoundedCornerShape(12.dp), @@ -182,23 +246,58 @@ class UsernameLinkSettingsFragment : ComposeFragment() { } } + @Composable + private fun ResetDialog(onConfirm: () -> Unit, onDismiss: () -> Unit) { + Dialogs.SimpleAlertDialog( + title = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_title), + body = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_body), + confirm = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_confirm_button), + dismiss = stringResource(id = android.R.string.cancel), + onConfirm = onConfirm, + onDismiss = onDismiss + ) + } + @Preview @Composable - private fun AppBarPreview() { - SignalTheme(isDarkMode = false) { + private fun PreviewAppBar() { + SignalTheme { Surface { TopAppBarContent(activeTab = ActiveTab.Code) } } } - @Preview + @Preview(name = "Light Theme", uiMode = Configuration.UI_MODE_NIGHT_NO) + @Preview(name = "Dark Theme", uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable - fun PreviewAll() { + private fun PreviewAll() { FragmentContent() } - private fun shareQrBadge(badge: Bitmap) { + @Preview + @Composable + private fun PreviewResetDialog() { + SignalTheme { + Surface { + ResetDialog(onConfirm = {}, onDismiss = {}) + } + } + } + + private fun previewPermissionState(): PermissionState { + return object : PermissionState { + override val permission: String = "" + override val status: PermissionStatus = PermissionStatus.Granted + override fun launchPermissionRequest() = Unit + } + } + + private fun shareQrBadge(badge: Bitmap?) { + if (badge == null) { + return + } + try { ByteArrayOutputStream().use { byteArrayOutputStream -> badge.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream) diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsState.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsState.kt index 3ea79d2c..462b724b 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsState.kt @@ -1,6 +1,6 @@ package org.tm.archive.components.settings.app.usernamelinks.main -import org.tm.archive.components.settings.app.usernamelinks.QrCodeData +import org.tm.archive.components.settings.app.usernamelinks.QrCodeState import org.tm.archive.components.settings.app.usernamelinks.UsernameQrCodeColorScheme /** @@ -9,10 +9,11 @@ import org.tm.archive.components.settings.app.usernamelinks.UsernameQrCodeColorS data class UsernameLinkSettingsState( val activeTab: ActiveTab, val username: String, - val usernameLink: String, - val qrCodeData: QrCodeData?, + val usernameLinkState: UsernameLinkState, + val qrCodeState: QrCodeState, val qrCodeColorScheme: UsernameQrCodeColorScheme, val qrScanResult: QrScanResult? = null, + val usernameLinkResetResult: UsernameLinkResetResult? = null, val indeterminateProgress: Boolean = false ) { enum class ActiveTab { diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt index ca26b654..16f2ade6 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt @@ -1,7 +1,24 @@ package org.tm.archive.components.settings.app.usernamelinks.main +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.Paint +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.Rect +import android.graphics.RectF +import android.graphics.Typeface +import android.os.Build +import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Canvas +import androidx.compose.ui.graphics.drawscope.CanvasDrawScope +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.LayoutDirection import androidx.lifecycle.ViewModel import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single @@ -10,48 +27,57 @@ import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.BehaviorSubject import org.signal.core.util.logging.Log -import org.signal.libsignal.usernames.BaseUsernameException +import org.tm.archive.R import org.tm.archive.components.settings.app.usernamelinks.QrCodeData +import org.tm.archive.components.settings.app.usernamelinks.QrCodeState +import org.tm.archive.components.settings.app.usernamelinks.drawQr import org.tm.archive.components.settings.app.usernamelinks.main.UsernameLinkSettingsState.ActiveTab import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.profiles.manage.UsernameRepository +import org.tm.archive.profiles.manage.UsernameRepository.toLink import org.tm.archive.recipients.Recipient -import org.tm.archive.util.UsernameUtil -import org.whispersystems.signalservice.api.push.ServiceId.ACI -import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException -import java.io.IOException +import org.tm.archive.util.NetworkUtil +import org.whispersystems.signalservice.api.push.UsernameLinkComponents +import java.util.Optional +import java.util.UUID class UsernameLinkSettingsViewModel : ViewModel() { private val TAG = Log.tag(UsernameLinkSettingsViewModel::class.java) - private val username: BehaviorSubject = BehaviorSubject.createDefault(Recipient.self().username.get()) - private val _state = mutableStateOf( UsernameLinkSettingsState( activeTab = ActiveTab.Code, - username = username.value!!, - usernameLink = UsernameUtil.generateLink(username.value!!), - qrCodeData = null, + username = SignalStore.account().username!!, + usernameLinkState = SignalStore.account().usernameLink?.let { UsernameLinkState.Present(it.toLink()) } ?: UsernameLinkState.NotSet, + qrCodeState = QrCodeState.Loading, qrCodeColorScheme = SignalStore.misc().usernameQrCodeColorScheme ) ) - val state: State = _state private val disposable: CompositeDisposable = CompositeDisposable() + private val usernameLink: BehaviorSubject> = BehaviorSubject.createDefault(Optional.ofNullable(SignalStore.account().usernameLink)) + + private val _linkCopiedEvent: MutableState = mutableStateOf(null) + val linkCopiedEvent: State get() = _linkCopiedEvent init { - disposable += username + disposable += usernameLink .observeOn(Schedulers.io()) - .map { UsernameUtil.generateLink(it) } + .map { link -> link.map { it.toLink() } } .flatMapSingle { generateQrCodeData(it) } .observeOn(AndroidSchedulers.mainThread()) .subscribe { qrData -> _state.value = _state.value.copy( - qrCodeData = qrData + qrCodeState = if (qrData.isPresent) QrCodeState.Present(qrData.get()) else QrCodeState.NotSet ) } + + if (SignalStore.account().usernameLink == null) { + onUsernameLinkReset() + } } override fun onCleared() { @@ -70,37 +96,74 @@ class UsernameLinkSettingsViewModel : ViewModel() { ) } + fun onUsernameLinkReset() { + if (!NetworkUtil.isConnected(ApplicationDependencies.getApplication())) { + _state.value = _state.value.copy( + usernameLinkResetResult = UsernameLinkResetResult.NetworkUnavailable + ) + return + } + + val currentValue = _state.value + val previousQrValue: QrCodeData? = if (currentValue.qrCodeState is QrCodeState.Present) { + currentValue.qrCodeState.data + } else { + null + } + + _state.value = _state.value.copy( + usernameLinkState = UsernameLinkState.Resetting, + qrCodeState = QrCodeState.Loading + ) + + disposable += UsernameRepository.createOrResetUsernameLink() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { result -> + val components: Optional = when (result) { + is UsernameLinkResetResult.Success -> Optional.of(result.components) + is UsernameLinkResetResult.NetworkError -> Optional.empty() + else -> { usernameLink.value ?: Optional.empty() } + } + + _state.value = _state.value.copy( + usernameLinkState = if (components.isPresent) { + val link = components.get().toLink() + UsernameLinkState.Present(link) + } else { + UsernameLinkState.NotSet + }, + usernameLinkResetResult = result, + qrCodeState = if (!components.isPresent && previousQrValue != null) { + QrCodeState.Present(previousQrValue) + } else { + QrCodeState.NotSet + } + ) + + if (components.isPresent) { + usernameLink.onNext(components) + } + } + } + + fun onUsernameLinkResetResultHandled() { + _state.value = _state.value.copy( + usernameLinkResetResult = null + ) + } + fun onQrCodeScanned(url: String) { _state.value = _state.value.copy( indeterminateProgress = true ) - disposable += Single - .fromCallable { - val username: String? = UsernameUtil.parseLink(url) - - if (username == null) { - Log.w(TAG, "Failed to parse username from url") - return@fromCallable QrScanResult.InvalidData - } - - return@fromCallable try { - val hashed: String = UsernameUtil.hashUsernameToBase64(username) - val aci: ACI = ApplicationDependencies.getSignalServiceAccountManager().getAciByUsernameHash(hashed) - QrScanResult.Success(Recipient.externalUsername(aci, username)) - } catch (e: BaseUsernameException) { - Log.w(TAG, "Invalid username", e) - QrScanResult.InvalidData - } catch (e: NonSuccessfulResponseCodeException) { - Log.w(TAG, "Non-successful response during username resolution", e) - if (e.code == 404) { - QrScanResult.NotFound(username) - } else { - QrScanResult.NetworkError - } - } catch (e: IOException) { - Log.w(TAG, "Network error during username resolution", e) - QrScanResult.NetworkError + disposable += UsernameRepository.fetchUsernameAndAciFromLink(url) + .map { result -> + when (result) { + is UsernameRepository.UsernameLinkConversionResult.Success -> QrScanResult.Success(Recipient.externalUsername(result.aci, result.username.toString())) + is UsernameRepository.UsernameLinkConversionResult.Invalid -> QrScanResult.InvalidData + is UsernameRepository.UsernameLinkConversionResult.NotFound -> QrScanResult.NotFound(result.username?.toString()) + is UsernameRepository.UsernameLinkConversionResult.NetworkError -> QrScanResult.NetworkError } } .subscribeOn(Schedulers.io()) @@ -119,9 +182,115 @@ class UsernameLinkSettingsViewModel : ViewModel() { ) } - private fun generateQrCodeData(url: String): Single { + fun onLinkCopied() { + _linkCopiedEvent.value = UUID.randomUUID() + } + + private fun generateQrCodeData(url: Optional): Single> { return Single.fromCallable { - QrCodeData.forData(url, 64) + url.map { QrCodeData.forData(it, 64) } } } + + /** + * Fun fact: there's no way to draw a composable to a bitmap. You'd think there would be, but there isn't. You can "screenshot" it if it's 100% on-screen, + * but if it's partially offscreen you're SOL. So, we get to go through the fun process of re-drawing the QR badge to an image for sharing ourselves. + * + * Sizes were picked arbitrarily. + * + * I hate this as much as you do. + */ + fun generateQrCodeImage(): Bitmap? { + val state: UsernameLinkSettingsState = _state.value + + if (state.qrCodeState !is QrCodeState.Present) { + Log.w(TAG, "Invalid state to generate QR code! ${state.qrCodeState.javaClass.simpleName}") + return null + } + + val qrCodeData: QrCodeData = state.qrCodeState.data + + val width = 480 + val height = 525 + val qrSize = 300f + val qrPadding = 25f + val borderSizeX = 64f + val borderSizeY = 52f + + val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply { + eraseColor(Color.TRANSPARENT) + } + + val androidCanvas = android.graphics.Canvas(bitmap) + val composeCanvas = Canvas(androidCanvas) + val canvasDrawScope = CanvasDrawScope() + + // Draw the background + androidCanvas.drawRoundRect(0f, 0f, width.toFloat(), height.toFloat(), 30f, 30f, Paint().apply { color = state.qrCodeColorScheme.borderColor.toArgb() }) + androidCanvas.drawRoundRect(borderSizeX, borderSizeY, borderSizeX + qrSize + qrPadding * 2, borderSizeY + qrSize + qrPadding * 2, 15f, 15f, Paint().apply { color = Color.WHITE }) + androidCanvas.drawRoundRect( + borderSizeX, + borderSizeY, + borderSizeX + qrSize + qrPadding * 2, + borderSizeY + qrSize + qrPadding * 2, + 15f, + 15f, + Paint().apply { + color = state.qrCodeColorScheme.outlineColor.toArgb() + style = Paint.Style.STROKE + strokeWidth = 4f + } + ) + + // Draw the QR code + composeCanvas.translate((width / 2) - (qrSize / 2), 80f) + canvasDrawScope.draw( + density = object : Density { + override val density: Float = 1f + override val fontScale: Float = 1f + }, + layoutDirection = LayoutDirection.Ltr, + canvas = composeCanvas, + size = Size(qrSize, qrSize) + ) { + drawQr( + data = qrCodeData, + foregroundColor = state.qrCodeColorScheme.foregroundColor, + backgroundColor = state.qrCodeColorScheme.borderColor, + deadzonePercent = 0.35f, + logo = null + ) + } + composeCanvas.translate(-90f, -80f) + + // Draw the signal logo -- unfortunately can't have the normal QR code drawing handle it because it requires a composable ImageBitmap + BitmapFactory.decodeResource(ApplicationDependencies.getApplication().resources, R.drawable.qrcode_logo).also { logoBitmap -> + val tintedPaint = Paint().apply { + colorFilter = PorterDuffColorFilter(state.qrCodeColorScheme.foregroundColor.toArgb(), PorterDuff.Mode.SRC_IN) + } + val sourceRect = Rect(0, 0, logoBitmap.width, logoBitmap.height) + val destRect = RectF(210f, 200f, 270f, 260f) + androidCanvas.drawBitmap(logoBitmap, sourceRect, destRect, tintedPaint) + } + + // Draw the text + val textPaint = Paint().apply { + color = state.qrCodeColorScheme.textColor.toArgb() + textSize = 34f + typeface = if (Build.VERSION.SDK_INT < 26) { + Typeface.DEFAULT_BOLD + } else { + Typeface.Builder("") + .setFallback("sans-serif") + .setWeight(600) + .build() + } + } + val textBounds = Rect() + textPaint.getTextBounds(state.username, 0, state.username.length, textBounds) + + androidCanvas.drawText(state.username, (width / 2f) - (textBounds.width() / 2f), 465f, textPaint) + + return bitmap + } } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkShareBottomSheet.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkShareBottomSheet.kt new file mode 100644 index 00000000..ad68b8ca --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkShareBottomSheet.kt @@ -0,0 +1,169 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.usernamelinks.main + +import android.content.Intent +import android.content.res.Configuration +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.os.bundleOf +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.setFragmentResult +import org.signal.core.ui.BottomSheets +import org.signal.core.ui.theme.SignalTheme +import org.tm.archive.R +import org.tm.archive.components.webrtc.requests.CallLinkIncomingRequestSheet +import org.tm.archive.compose.ComposeBottomSheetDialogFragment +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.profiles.manage.UsernameRepository.toLink +import org.tm.archive.util.BottomSheetUtil +import org.tm.archive.util.Util + +class UsernameLinkShareBottomSheet : ComposeBottomSheetDialogFragment() { + + companion object { + const val REQUEST_KEY = "link_share_bottom_sheet" + const val KEY_COPY = "copy" + + @JvmStatic + fun show(fragmentManager: FragmentManager) { + CallLinkIncomingRequestSheet().show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + } + } + + @Composable + override fun SheetContent() { + Content( + usernameLink = SignalStore.account().usernameLink?.toLink() ?: "", + dismissDialog = { didCopy -> + setFragmentResult(REQUEST_KEY, bundleOf(KEY_COPY to didCopy)) + dismiss() + } + ) + } +} + +@Composable +private fun Content( + usernameLink: String, + dismissDialog: (Boolean) -> Unit = {} +) { + val context = LocalContext.current + + Column(horizontalAlignment = Alignment.CenterHorizontally) { + BottomSheets.Handle() + + Text( + text = stringResource(R.string.UsernameLinkShareBottomSheet_title), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier + .padding(horizontal = 41.dp, vertical = 24.dp) + ) + Text( + text = usernameLink, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .padding(horizontal = 24.dp) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f), + shape = RoundedCornerShape(12.dp) + ) + .padding(all = 16.dp) + ) + ButtonRow( + icon = painterResource(R.drawable.symbol_copy_android_24), + text = stringResource(R.string.UsernameLinkShareBottomSheet_copy_link), + modifier = Modifier.padding(top = 12.dp), + onClick = { + Util.copyToClipboard(context, usernameLink) + dismissDialog(true) + } + ) + ButtonRow( + icon = painterResource(R.drawable.symbol_share_android_24), + text = stringResource(R.string.UsernameLinkShareBottomSheet_share), + modifier = Modifier.padding(bottom = 12.dp), + onClick = { + dismissDialog(false) + + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, usernameLink) + } + + context.startActivity(Intent.createChooser(sendIntent, null)) + } + ) + } +} + +@Composable +private fun ButtonRow(icon: Painter, text: String, modifier: Modifier = Modifier, onClick: () -> Unit = {}) { + Row( + modifier = modifier + .fillMaxWidth() + .clickable { onClick() } + ) { + Icon( + painter = icon, + contentDescription = text, + tint = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .padding(horizontal = 24.dp, vertical = 16.dp) + ) + Text( + text = text, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .padding(vertical = 16.dp) + ) + } +} + +@Preview(name = "Light Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ContentPreview() { + SignalTheme { + Surface { + Content( + usernameLink = "https://signal.me#eufzLWmFFUYAOqnVJ4Zlt0KqXf87r59FC1hZ3r7WipjKvgzMBg7DBlY5DB5hQTjsw0" + ) + } + } +} + +@Preview(name = "Light Theme", group = "button row", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "button row", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ButtonRowPreview() { + SignalTheme { + Surface { + ButtonRow(icon = painterResource(R.drawable.symbol_share_android_24), text = "Share") + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt index 769020a0..58c44234 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt @@ -1,8 +1,9 @@ package org.tm.archive.components.settings.app.usernamelinks.main -import android.graphics.Bitmap +import android.content.res.Configuration import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -10,6 +11,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHostState @@ -19,6 +21,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource @@ -31,14 +34,14 @@ import androidx.navigation.NavController import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.signal.core.ui.Buttons +import org.signal.core.ui.Dialogs import org.signal.core.ui.theme.SignalTheme import org.tm.archive.R import org.tm.archive.components.settings.app.usernamelinks.QrCodeBadge import org.tm.archive.components.settings.app.usernamelinks.QrCodeData +import org.tm.archive.components.settings.app.usernamelinks.QrCodeState import org.tm.archive.components.settings.app.usernamelinks.UsernameQrCodeColorScheme import org.tm.archive.components.settings.app.usernamelinks.main.UsernameLinkSettingsState.ActiveTab -import org.tm.archive.compose.ScreenshotController -import org.tm.archive.util.UsernameUtil import org.tm.archive.util.Util import org.tm.archive.util.navigation.safeNavigate @@ -48,53 +51,63 @@ import org.tm.archive.util.navigation.safeNavigate @Composable fun UsernameLinkShareScreen( state: UsernameLinkSettingsState, + onLinkResultHandled: () -> Unit, snackbarHostState: SnackbarHostState, scope: CoroutineScope, navController: NavController, - onShareBadge: (Bitmap) -> Unit, + onShareBadge: () -> Unit, modifier: Modifier = Modifier, - screenshotController: ScreenshotController? = null + onResetClicked: () -> Unit ) { + val context = LocalContext.current + + when (state.usernameLinkResetResult) { + UsernameLinkResetResult.NetworkUnavailable -> { + ResetLinkResultDialog(stringResource(R.string.UsernameLinkSettings_reset_link_result_network_unavailable), onDismiss = onLinkResultHandled) + } + UsernameLinkResetResult.NetworkError -> { + ResetLinkResultDialog(stringResource(R.string.UsernameLinkSettings_reset_link_result_network_error), onDismiss = onLinkResultHandled) + } + else -> {} + } + Column( + horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier .verticalScroll(rememberScrollState()) ) { + val usernameCopiedString = stringResource(id = R.string.UsernameLinkSettings_username_copied_toast) QrCodeBadge( - data = state.qrCodeData, + data = state.qrCodeState, colorScheme = state.qrCodeColorScheme, username = state.username, - screenshotController = screenshotController + usernameCopyable = true, + modifier = Modifier.padding(horizontal = 58.dp, vertical = 24.dp), + onClick = { username -> + Util.copyToClipboard(context, username) + scope.launch { + snackbarHostState.showSnackbar(usernameCopiedString) + } + } ) ButtonBar( - onShareClicked = { - val badgeBitmap = screenshotController?.screenshot() - if (badgeBitmap != null) { - onShareBadge.invoke(badgeBitmap) - } - }, - onColorClicked = { navController.safeNavigate(R.id.action_usernameLinkSettingsFragment_to_usernameLinkQrColorPickerFragment) } + onShareClicked = onShareBadge, + onColorClicked = { navController.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkQrColorPickerFragment()) } ) - CopyRow( - displayText = state.username, - copyMessage = stringResource(R.string.UsernameLinkSettings_username_copied_toast), - snackbarHostState = snackbarHostState, - scope = scope - ) - - CopyRow( - displayText = state.usernameLink, - copyMessage = stringResource(R.string.UsernameLinkSettings_link_copied_toast), - snackbarHostState = snackbarHostState, - scope = scope + LinkRow( + linkState = state.usernameLinkState, + onClick = { + navController.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkShareBottomSheet()) + } ) Text( text = stringResource(id = R.string.UsernameLinkSettings_qr_description), textAlign = TextAlign.Center, style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(top = 24.dp, bottom = 36.dp, start = 43.dp, end = 43.dp), + modifier = Modifier.padding(bottom = 19.dp, start = 43.dp, end = 43.dp), color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -104,7 +117,7 @@ fun UsernameLinkShareScreen( .padding(bottom = 24.dp), horizontalArrangement = Arrangement.Center ) { - Buttons.Small(onClick = { /*TODO*/ }) { + Buttons.Small(onClick = onResetClicked) { Text( text = stringResource(id = R.string.UsernameLinkSettings_reset_button_label) ) @@ -133,29 +146,40 @@ private fun ButtonBar(onShareClicked: () -> Unit, onColorClicked: () -> Unit) { } @Composable -private fun CopyRow(displayText: String, copyMessage: String, snackbarHostState: SnackbarHostState, scope: CoroutineScope) { - val context = LocalContext.current +private fun LinkRow(linkState: UsernameLinkState, onClick: () -> Unit = {}) { Row( modifier = Modifier .fillMaxWidth() .background(color = MaterialTheme.colorScheme.background) - .clickable { - Util.copyToClipboard(context, displayText) - - scope.launch { - snackbarHostState.showSnackbar(copyMessage) - } + .padding( + top = 32.dp, + bottom = 24.dp, + start = 24.dp, + end = 24.dp + ) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.outline, + shape = RoundedCornerShape(12.dp) + ) + .clickable(enabled = linkState is UsernameLinkState.Present) { + onClick() } .padding(horizontal = 26.dp, vertical = 16.dp) + .alpha(if (linkState is UsernameLinkState.Present) 1.0f else 0.6f) ) { Image( - painter = painterResource(id = R.drawable.symbol_copy_android_24), + painter = painterResource(id = R.drawable.symbol_link_24), contentDescription = null, colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onBackground) ) Text( - text = displayText, + text = when (linkState) { + is UsernameLinkState.Present -> linkState.link + is UsernameLinkState.NotSet -> stringResource(id = R.string.UsernameLinkSettings_link_not_set_label) + is UsernameLinkState.Resetting -> stringResource(id = R.string.UsernameLinkSettings_resetting_link_label) + }, modifier = Modifier.padding(start = 26.dp), maxLines = 1, overflow = TextOverflow.Ellipsis @@ -163,45 +187,62 @@ private fun CopyRow(displayText: String, copyMessage: String, snackbarHostState: } } -@Preview(name = "Light Theme") @Composable -private fun ScreenPreviewLightTheme() { - SignalTheme(isDarkMode = false) { +private fun ResetLinkResultDialog(message: String, onDismiss: () -> Unit) { + Dialogs.SimpleMessageDialog( + message = message, + dismiss = stringResource(id = android.R.string.ok), + onDismiss = onDismiss + ) +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreview() { + SignalTheme { Surface { UsernameLinkShareScreen( state = previewState(), snackbarHostState = SnackbarHostState(), scope = rememberCoroutineScope(), navController = NavController(LocalContext.current), - onShareBadge = {} + onShareBadge = {}, + onResetClicked = {}, + onLinkResultHandled = {} ) } } } -@Preview(name = "Dark Theme") +@Preview(name = "Light Theme", group = "LinkRow", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "LinkRow", uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable -private fun ScreenPreviewDarkTheme() { - SignalTheme(isDarkMode = true) { +private fun LinkRowPreview() { + SignalTheme { Surface { - UsernameLinkShareScreen( - state = previewState(), - snackbarHostState = SnackbarHostState(), - scope = rememberCoroutineScope(), - navController = NavController(LocalContext.current), - onShareBadge = {} - ) + Column(modifier = Modifier.padding(8.dp)) { + LinkRow( + linkState = UsernameLinkState.Present("https://signal.me/#eu/asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf") + ) + LinkRow( + linkState = UsernameLinkState.NotSet + ) + LinkRow( + linkState = UsernameLinkState.Resetting + ) + } } } } private fun previewState(): UsernameLinkSettingsState { - val link = UsernameUtil.generateLink("maya.45") + val link = "https://signal.me/#eu/asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf" return UsernameLinkSettingsState( activeTab = ActiveTab.Code, - username = "maya.45", - usernameLink = link, - qrCodeData = QrCodeData.forData(link, 64), + username = "parker.42", + usernameLinkState = UsernameLinkState.Present("https://signal.me/#eu/asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf"), + qrCodeState = QrCodeState.Present(QrCodeData.forData(link, 64)), qrCodeColorScheme = UsernameQrCodeColorScheme.Blue ) } diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkState.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkState.kt new file mode 100644 index 00000000..fe5595d8 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameLinkState.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.app.usernamelinks.main + +sealed class UsernameLinkState { + + /** Link is set. */ + data class Present(val link: String) : UsernameLinkState() + + /** Link has not been set yet or otherwise does not exist. */ + object NotSet : UsernameLinkState() + + /** Link is in the process of being reset. */ + object Resetting : UsernameLinkState() +} diff --git a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameQrScanScreen.kt b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameQrScanScreen.kt index 911a2fd7..95317706 100644 --- a/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameQrScanScreen.kt +++ b/app/src/main/java/org/tm/archive/components/settings/app/usernamelinks/main/UsernameQrScanScreen.kt @@ -32,6 +32,7 @@ import org.signal.qr.QrScannerView import org.tm.archive.R import org.tm.archive.mediasend.camerax.CameraXModelBlocklist import org.tm.archive.util.CommunicationActions +import java.util.concurrent.TimeUnit /** * A screen that allows you to scan a QR code to start a chat. @@ -53,7 +54,11 @@ fun UsernameQrScanScreen( QrScanResultDialog(stringResource(R.string.UsernameLinkSettings_qr_result_network_error), onDismiss = onQrResultHandled) } is QrScanResult.NotFound -> { - QrScanResultDialog(stringResource(R.string.UsernameLinkSettings_qr_result_not_found, qrScanResult.username), onDismiss = onQrResultHandled) + if (qrScanResult.username != null) { + QrScanResultDialog(stringResource(R.string.UsernameLinkSettings_qr_result_not_found, qrScanResult.username), onDismiss = onQrResultHandled) + } else { + QrScanResultDialog(stringResource(R.string.UsernameLinkSettings_qr_result_not_found_no_username), onDismiss = onQrResultHandled) + } } is QrScanResult.Success -> { CommunicationActions.startConversation(LocalContext.current, qrScanResult.recipient, null) @@ -70,7 +75,7 @@ fun UsernameQrScanScreen( AndroidView( factory = { context -> val view = QrScannerView(context) - disposables += view.qrData.distinctUntilChanged().subscribe { data -> + disposables += view.qrData.throttleFirst(3000, TimeUnit.MILLISECONDS).subscribe { data -> onQrCodeScanned(data) } view diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsEvent.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsEvent.kt index 0c806bcc..ae154b43 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsEvent.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsEvent.kt @@ -32,8 +32,4 @@ sealed class ConversationSettingsEvent { class ShowMembersAdded( val membersAddedCount: Int ) : ConversationSettingsEvent() - - class InitiateGroupMigration( - val recipientId: RecipientId - ) : ConversationSettingsEvent() } diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsFragment.kt index a2c25d6b..d5c96889 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsFragment.kt @@ -72,13 +72,13 @@ import org.tm.archive.groups.ui.invitesandrequests.ManagePendingAndRequestingMem import org.tm.archive.groups.ui.managegroup.dialogs.GroupDescriptionDialog import org.tm.archive.groups.ui.managegroup.dialogs.GroupInviteSentDialog import org.tm.archive.groups.ui.managegroup.dialogs.GroupsLearnMoreBottomSheetDialogFragment -import org.tm.archive.groups.ui.migration.GroupsV1MigrationInitiationBottomSheetDialogFragment import org.tm.archive.mediaoverview.MediaOverviewActivity import org.tm.archive.mediapreview.MediaIntentFactory -import org.tm.archive.profiles.edit.EditProfileActivity +import org.tm.archive.profiles.edit.CreateProfileActivity import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientExporter import org.tm.archive.recipients.RecipientId +import org.tm.archive.recipients.ui.about.AboutSheet import org.tm.archive.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment import org.tm.archive.stories.Stories import org.tm.archive.stories.StoryViewerArgs @@ -199,7 +199,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( val args = ConversationSettingsFragmentArgs.fromBundle(requireArguments()) val groupId = args.groupId as ParcelableGroupId - startActivity(EditProfileActivity.getIntentForGroupProfile(requireActivity(), requireNotNull(ParcelableGroupId.get(groupId)))) + startActivity(CreateProfileActivity.getIntentForGroupProfile(requireActivity(), requireNotNull(ParcelableGroupId.get(groupId)))) true } else { super.onOptionsItemSelected(item) @@ -279,7 +279,6 @@ class ConversationSettingsFragment : DSLSettingsFragment( is ConversationSettingsEvent.ShowAddMembersToGroupError -> showAddMembersToGroupError(event) is ConversationSettingsEvent.ShowGroupInvitesSentDialog -> showGroupInvitesSentDialog(event) is ConversationSettingsEvent.ShowMembersAdded -> showMembersAdded(event) - is ConversationSettingsEvent.InitiateGroupMigration -> GroupsV1MigrationInitiationBottomSheetDialogFragment.showForInitiation(parentFragmentManager, event.recipientId) } } } @@ -323,7 +322,11 @@ class ConversationSettingsFragment : DSLSettingsFragment( ) state.withRecipientSettingsState { - customPref(BioTextPreference.RecipientModel(recipient = state.recipient)) + customPref( + BioTextPreference.RecipientModel(recipient = state.recipient, onHeadlineClickListener = { + AboutSheet.create(state.recipient).show(parentFragmentManager, null) + }) + ) } state.withGroupSettingsState { groupState -> @@ -351,7 +354,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( descriptionShouldLinkify = groupState.groupDescriptionShouldLinkify, canEditGroupAttributes = groupState.canEditGroupAttributes, onEditGroupDescription = { - startActivity(EditProfileActivity.getIntentForGroupProfile(requireActivity(), groupState.groupId)) + startActivity(CreateProfileActivity.getIntentForGroupProfile(requireActivity(), groupState.groupId)) }, onViewGroupDescription = { GroupDescriptionDialog.show(childFragmentManager, groupState.groupId, null, groupState.groupDescriptionShouldLinkify) @@ -363,7 +366,6 @@ class ConversationSettingsFragment : DSLSettingsFragment( LegacyGroupPreference.Model( state = groupState.legacyGroupState, onLearnMoreClick = { GroupsLearnMoreBottomSheetDialogFragment.show(parentFragmentManager) }, - onUpgradeClick = { viewModel.initiateGroupUpgrade() }, onMmsWarningClick = { startActivity(Intent(requireContext(), InviteActivity::class.java)) } ) ) @@ -555,7 +557,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( } } - if (state.sharedMedia != null && state.sharedMedia.count > 0) { + if (state.sharedMedia.isNotEmpty()) { dividerPref() sectionHeaderPref(R.string.recipient_preference_activity__shared_media) @@ -563,7 +565,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( @Suppress("DEPRECATION") customPref( SharedMediaPreference.Model( - mediaCursor = state.sharedMedia, + mediaRecords = state.sharedMedia, mediaIds = state.sharedMediaIds, onMediaRecordClick = { view, mediaRecord, isLtr -> view.transitionName = "thumb" diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsRepository.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsRepository.kt index b96ab2fb..be79688a 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsRepository.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsRepository.kt @@ -10,7 +10,6 @@ import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.logging.Log import org.signal.storageservice.protos.groups.local.DecryptedGroup -import org.signal.storageservice.protos.groups.local.DecryptedPendingMember import org.tm.archive.contacts.sync.ContactDiscovery import org.tm.archive.database.CallTable import org.tm.archive.database.MediaTable @@ -31,7 +30,6 @@ import org.tm.archive.recipients.RecipientId import org.tm.archive.recipients.RecipientUtil import org.tm.archive.util.FeatureFlags import java.io.IOException -import java.util.Optional private val TAG = Log.tag(ConversationSettingsRepository::class.java) @@ -57,11 +55,11 @@ class ConversationSettingsRepository( } @WorkerThread - fun getThreadMedia(threadId: Long): Optional { - return if (threadId <= 0) { - Optional.empty() + fun getThreadMedia(threadId: Long, limit: Int): Cursor? { + return if (threadId > 0) { + SignalDatabase.media.getGalleryMediaForThread(threadId, MediaTable.Sorting.Newest, limit) } else { - Optional.of(SignalDatabase.media.getGalleryMediaForThread(threadId, MediaTable.Sorting.Newest)) + null } } @@ -152,9 +150,9 @@ class ConversationSettingsRepository( consumer( if (groupRecord.isV2Group) { val decryptedGroup: DecryptedGroup = groupRecord.requireV2GroupProperties().decryptedGroup - val pendingMembers: List = decryptedGroup.pendingMembersList - .map(DecryptedPendingMember::getServiceIdBytes) - .map(GroupProtoUtil::serviceIdBinaryToRecipientId) + val pendingMembers: List = decryptedGroup.pendingMembers + .map { m -> m.serviceIdBytes } + .map { s -> GroupProtoUtil.serviceIdBinaryToRecipientId(s) } val members = mutableListOf() diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsState.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsState.kt index d214b596..9d409fdc 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsState.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsState.kt @@ -1,9 +1,9 @@ package org.tm.archive.components.settings.conversation -import android.database.Cursor import org.tm.archive.components.settings.conversation.preferences.ButtonStripPreference import org.tm.archive.components.settings.conversation.preferences.CallPreference import org.tm.archive.components.settings.conversation.preferences.LegacyGroupPreference +import org.tm.archive.database.MediaTable import org.tm.archive.database.model.IdentityRecord import org.tm.archive.database.model.StoryViewState import org.tm.archive.groups.GroupId @@ -18,7 +18,7 @@ data class ConversationSettingsState( val buttonStripState: ButtonStripPreference.State = ButtonStripPreference.State(), val disappearingMessagesLifespan: Int = 0, val canModifyBlockedState: Boolean = false, - val sharedMedia: Cursor? = null, + val sharedMedia: List = emptyList(), val sharedMediaIds: List = listOf(), val displayInternalRecipientDetails: Boolean = false, val calls: List = emptyList(), diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsViewModel.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsViewModel.kt index 349824cd..f2e3af67 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsViewModel.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/ConversationSettingsViewModel.kt @@ -13,13 +13,13 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject -import org.signal.core.util.CursorUtil import org.signal.core.util.ThreadUtil import org.signal.core.util.concurrent.SignalExecutors +import org.signal.core.util.readToList import org.tm.archive.components.settings.conversation.preferences.ButtonStripPreference import org.tm.archive.components.settings.conversation.preferences.CallPreference import org.tm.archive.components.settings.conversation.preferences.LegacyGroupPreference -import org.tm.archive.database.AttachmentTable +import org.tm.archive.database.MediaTable import org.tm.archive.database.RecipientTable import org.tm.archive.database.model.StoryViewState import org.tm.archive.dependencies.ApplicationDependencies @@ -30,11 +30,9 @@ import org.tm.archive.keyvalue.SignalStore import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientId import org.tm.archive.recipients.RecipientUtil -import org.tm.archive.util.FeatureFlags import org.tm.archive.util.TextSecurePreferences import org.tm.archive.util.livedata.LiveDataUtil import org.tm.archive.util.livedata.Store -import java.util.Optional sealed class ConversationSettingsViewModel( private val callMessageIds: LongArray, @@ -42,8 +40,6 @@ sealed class ConversationSettingsViewModel( specificSettingsState: SpecificSettingsState ) : ViewModel() { - private val openedMediaCursors = HashSet() - @Volatile private var cleared = false @@ -66,37 +62,26 @@ sealed class ConversationSettingsViewModel( val threadId: LiveData = state.map { it.threadId }.distinctUntilChanged() val updater: LiveData = LiveDataUtil.combineLatest(threadId, sharedMediaUpdateTrigger) { tId, _ -> tId } - val sharedMedia: LiveData> = LiveDataUtil.mapAsync(SignalExecutors.BOUNDED, updater) { tId -> - repository.getThreadMedia(tId) + val sharedMedia: LiveData> = LiveDataUtil.mapAsync(SignalExecutors.BOUNDED, updater) { tId -> + repository.getThreadMedia(threadId = tId, limit = 100)?.readToList { cursor -> + MediaTable.MediaRecord.from(cursor) + } ?: emptyList() } store.update(repository.getCallEvents(callMessageIds).toObservable()) { callRecords, state -> state.copy(calls = callRecords.map { (call, messageRecord) -> CallPreference.Model(call, messageRecord) }) } - store.update(sharedMedia) { cursor, state -> + store.update(sharedMedia) { mediaRecords, state -> if (!cleared) { - if (cursor.isPresent) { - openedMediaCursors.add(cursor.get()) - } - - val ids: List = cursor.map> { - val result = mutableListOf() - while (it.moveToNext()) { - result.add(CursorUtil.requireLong(it, AttachmentTable.ROW_ID)) - } - result - }.orElse(listOf()) - state.copy( - sharedMedia = cursor.orElse(null), - sharedMediaIds = ids, + sharedMedia = mediaRecords, + sharedMediaIds = mediaRecords.mapNotNull { it.attachment?.attachmentId?.id }, sharedMediaLoaded = true, displayInternalRecipientDetails = repository.isInternalRecipientDetailsEnabled() ) } else { - cursor.orElse(null).ensureClosed() - state.copy(sharedMedia = null) + state.copy(sharedMedia = emptyList()) } } } @@ -123,7 +108,6 @@ sealed class ConversationSettingsViewModel( override fun onCleared() { cleared = true - openedMediaCursors.forEach { it.ensureClosed() } store.clear() disposable.clear() } @@ -134,8 +118,6 @@ sealed class ConversationSettingsViewModel( } } - open fun initiateGroupUpgrade(): Unit = error("This ViewModel does not support this interaction") - private class RecipientSettingsViewModel( private val recipientId: RecipientId, private val callMessageIds: LongArray, @@ -296,7 +278,7 @@ sealed class ConversationSettingsViewModel( ), canModifyBlockedState = RecipientUtil.isBlockable(recipient), specificSettingsState = state.requireGroupSettingsState().copy( - legacyGroupState = getLegacyGroupState(recipient) + legacyGroupState = getLegacyGroupState() ) ) } @@ -405,14 +387,8 @@ sealed class ConversationSettingsViewModel( } } - private fun getLegacyGroupState(recipient: Recipient): LegacyGroupPreference.State { - val showLegacyInfo = recipient.requireGroupId().isV1 - - return if (showLegacyInfo && recipient.participantIds.size > FeatureFlags.groupLimits().hardLimit) { - LegacyGroupPreference.State.TOO_LARGE - } else if (showLegacyInfo) { - LegacyGroupPreference.State.UPGRADE - } else if (groupId.isMms) { + private fun getLegacyGroupState(): LegacyGroupPreference.State { + return if (groupId.isMms) { LegacyGroupPreference.State.MMS_WARNING } else { LegacyGroupPreference.State.NONE @@ -483,12 +459,6 @@ sealed class ConversationSettingsViewModel( override fun unblock() { repository.unblock(groupId) } - - override fun initiateGroupUpgrade() { - repository.getExternalPossiblyMigratedGroupRecipientId(groupId) { - internalEvents.onNext(ConversationSettingsEvent.InitiateGroupMigration(it)) - } - } } class Factory( diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/InternalConversationSettingsFragment.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/InternalConversationSettingsFragment.kt index bb2a9317..1fe64182 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/InternalConversationSettingsFragment.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/InternalConversationSettingsFragment.kt @@ -7,6 +7,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.signal.core.util.Base64 import org.signal.core.util.Hex import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.isAbsent @@ -27,7 +28,6 @@ import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientForeverObserver import org.tm.archive.recipients.RecipientId import org.tm.archive.subscription.Subscriber -import org.tm.archive.util.Base64 import org.tm.archive.util.FeatureFlags import org.tm.archive.util.SpanUtil import org.tm.archive.util.Util @@ -110,7 +110,7 @@ class InternalConversationSettingsFragment : DSLSettingsFragment( summary = DSLSettingsText.from("[${recipient.profileName.givenName}] [${state.recipient.profileName.familyName}]") ) - val profileKeyBase64 = recipient.profileKey?.let(Base64::encodeBytes) ?: "None" + val profileKeyBase64 = recipient.profileKey?.let(Base64::encodeWithPadding) ?: "None" longClickPref( title = DSLSettingsText.from("Profile Key (Base64)"), summary = DSLSettingsText.from(profileKeyBase64), diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/BioTextPreference.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/BioTextPreference.kt index eef68963..75e659ec 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/BioTextPreference.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/BioTextPreference.kt @@ -31,10 +31,13 @@ object BioTextPreference { abstract fun getHeadlineText(context: Context): CharSequence abstract fun getSubhead1Text(context: Context): String? abstract fun getSubhead2Text(): String? + + open val onHeadlineClickListener: () -> Unit = {} } class RecipientModel( - private val recipient: Recipient + private val recipient: Recipient, + override val onHeadlineClickListener: () -> Unit ) : BioTextPreferenceModel() { override fun getHeadlineText(context: Context): CharSequence { @@ -44,12 +47,18 @@ object BioTextPreference { recipient.getDisplayNameOrUsername(context) } - return if (recipient.showVerified()) { - SpannableStringBuilder(name).apply { + if (!recipient.showVerified() && !recipient.isIndividual) { + return name + } + + return SpannableStringBuilder(name).apply { + if (recipient.showVerified()) { SpanUtil.appendCenteredImageSpan(this, ContextUtil.requireDrawable(context, R.drawable.ic_official_28), 28, 28) } - } else { - name + + if (recipient.isIndividual) { + SpanUtil.appendCenteredImageSpan(this, ContextUtil.requireDrawable(context, R.drawable.symbol_chevron_right_24_color_on_secondary_container), 24, 24) + } } } @@ -61,7 +70,11 @@ object BioTextPreference { } } - override fun getSubhead2Text(): String? = recipient.e164.map(PhoneNumberFormatter::prettyPrint).orElse(null) + override fun getSubhead2Text(): String? = if (recipient.shouldShowE164()) { + recipient.e164.map(PhoneNumberFormatter::prettyPrint).orElse(null) + } else { + null + } override fun areContentsTheSame(newItem: RecipientModel): Boolean { return super.areContentsTheSame(newItem) && newItem.recipient.hasSameContent(recipient) @@ -101,6 +114,7 @@ object BioTextPreference { override fun bind(model: T) { headline.text = model.getHeadlineText(context) + headline.setOnClickListener { model.onHeadlineClickListener() } model.getSubhead1Text(context).let { subhead1.text = it diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/CallPreference.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/CallPreference.kt index 357bcaad..cbab5d65 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/CallPreference.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/CallPreference.kt @@ -11,7 +11,6 @@ import org.tm.archive.util.adapter.mapping.BindingFactory import org.tm.archive.util.adapter.mapping.BindingViewHolder import org.tm.archive.util.adapter.mapping.MappingAdapter import org.tm.archive.util.adapter.mapping.MappingModel -import java.util.Locale /** * Renders a single call preference row when displaying call info. @@ -50,7 +49,7 @@ object CallPreference { MessageTypes.INCOMING_AUDIO_CALL_TYPE, MessageTypes.INCOMING_VIDEO_CALL_TYPE -> R.drawable.symbol_arrow_downleft_24 MessageTypes.OUTGOING_AUDIO_CALL_TYPE, MessageTypes.OUTGOING_VIDEO_CALL_TYPE -> R.drawable.symbol_arrow_upright_24 MessageTypes.GROUP_CALL_TYPE -> when { - call.event == CallTable.Event.MISSED -> R.drawable.symbol_missed_incoming_24 + call.event.isMissedCall() -> R.drawable.symbol_missed_incoming_24 call.event == CallTable.Event.GENERIC_GROUP_CALL || call.event == CallTable.Event.JOINED -> R.drawable.symbol_group_24 call.direction == CallTable.Direction.INCOMING -> R.drawable.symbol_arrow_downleft_24 call.direction == CallTable.Direction.OUTGOING -> R.drawable.symbol_arrow_upright_24 @@ -62,14 +61,15 @@ object CallPreference { private fun getCallType(call: CallTable.Call): String { val id = when (call.messageType) { - MessageTypes.MISSED_VIDEO_CALL_TYPE -> R.string.MessageRecord_missed_voice_call - MessageTypes.MISSED_AUDIO_CALL_TYPE -> R.string.MessageRecord_missed_video_call + MessageTypes.MISSED_VIDEO_CALL_TYPE -> if (call.event == CallTable.Event.MISSED) R.string.MessageRecord_missed_voice_call else R.string.MessageRecord_missed_voice_call_notification_profile + MessageTypes.MISSED_AUDIO_CALL_TYPE -> if (call.event == CallTable.Event.MISSED) R.string.MessageRecord_missed_video_call else R.string.MessageRecord_missed_video_call_notification_profile MessageTypes.INCOMING_AUDIO_CALL_TYPE -> R.string.MessageRecord_incoming_voice_call MessageTypes.INCOMING_VIDEO_CALL_TYPE -> R.string.MessageRecord_incoming_video_call MessageTypes.OUTGOING_AUDIO_CALL_TYPE -> R.string.MessageRecord_outgoing_voice_call MessageTypes.OUTGOING_VIDEO_CALL_TYPE -> R.string.MessageRecord_outgoing_video_call MessageTypes.GROUP_CALL_TYPE -> when { call.event == CallTable.Event.MISSED -> R.string.CallPreference__missed_group_call + call.event == CallTable.Event.MISSED_NOTIFICATION_PROFILE -> R.string.CallPreference__missed_group_call_notification_profile call.event == CallTable.Event.GENERIC_GROUP_CALL || call.event == CallTable.Event.JOINED -> R.string.CallPreference__group_call call.direction == CallTable.Direction.INCOMING -> R.string.CallPreference__incoming_group_call call.direction == CallTable.Direction.OUTGOING -> R.string.CallPreference__outgoing_group_call @@ -82,7 +82,7 @@ object CallPreference { } private fun getCallTime(messageRecord: MessageRecord): String { - return DateUtils.getOnlyTimeString(context, Locale.getDefault(), messageRecord.timestamp) + return DateUtils.getOnlyTimeString(context, messageRecord.timestamp) } } } diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/LegacyGroupPreference.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/LegacyGroupPreference.kt index b4fe8339..bd5e2371 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/LegacyGroupPreference.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/LegacyGroupPreference.kt @@ -4,7 +4,6 @@ import android.view.View import androidx.core.content.ContextCompat import org.tm.archive.R import org.tm.archive.components.settings.PreferenceModel -import org.tm.archive.util.FeatureFlags import org.tm.archive.util.adapter.mapping.LayoutFactory import org.tm.archive.util.adapter.mapping.MappingAdapter import org.tm.archive.util.adapter.mapping.MappingViewHolder @@ -19,7 +18,6 @@ object LegacyGroupPreference { class Model( val state: State, val onLearnMoreClick: () -> Unit, - val onUpgradeClick: () -> Unit, val onMmsWarningClick: () -> Unit ) : PreferenceModel() { override fun areItemsTheSame(newItem: Model): Boolean { @@ -42,15 +40,6 @@ object LegacyGroupPreference { groupInfoText.setOnLinkClickListener { model.onLearnMoreClick() } groupInfoText.setLearnMoreVisible(true) } - State.UPGRADE -> { - groupInfoText.setText(R.string.ManageGroupActivity_legacy_group_upgrade) - groupInfoText.setOnLinkClickListener { model.onUpgradeClick() } - groupInfoText.setLearnMoreVisible(true, R.string.ManageGroupActivity_upgrade_this_group) - } - State.TOO_LARGE -> { - groupInfoText.text = context.getString(R.string.ManageGroupActivity_legacy_group_too_large, FeatureFlags.groupLimits().hardLimit - 1) - groupInfoText.setLearnMoreVisible(false) - } State.MMS_WARNING -> { groupInfoText.setText(R.string.ManageGroupActivity_this_is_an_insecure_mms_group) groupInfoText.setOnLinkClickListener { model.onMmsWarningClick() } @@ -63,8 +52,6 @@ object LegacyGroupPreference { enum class State { LEARN_MORE, - UPGRADE, - TOO_LARGE, MMS_WARNING, NONE } diff --git a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/SharedMediaPreference.kt b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/SharedMediaPreference.kt index 335c36a1..8c02e091 100644 --- a/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/SharedMediaPreference.kt +++ b/app/src/main/java/org/tm/archive/components/settings/conversation/preferences/SharedMediaPreference.kt @@ -1,6 +1,5 @@ package org.tm.archive.components.settings.conversation.preferences -import android.database.Cursor import android.view.View import org.tm.archive.R import org.tm.archive.components.ThreadPhotoRailView @@ -22,7 +21,7 @@ object SharedMediaPreference { } class Model( - val mediaCursor: Cursor, + val mediaRecords: List, val mediaIds: List, val onMediaRecordClick: (View, MediaTable.MediaRecord, Boolean) -> Unit ) : PreferenceModel() { @@ -41,7 +40,7 @@ object SharedMediaPreference { private val rail: ThreadPhotoRailView = itemView.findViewById(R.id.rail_view) override fun bind(model: Model) { - rail.setCursor(GlideApp.with(rail), model.mediaCursor) + rail.setMediaRecords(GlideApp.with(rail), model.mediaRecords) rail.setListener { v, m -> model.onMediaRecordClick(v, m, ViewUtil.isLtr(rail)) } diff --git a/app/src/main/java/org/tm/archive/components/settings/dsl.kt b/app/src/main/java/org/tm/archive/components/settings/dsl.kt index 08f80a98..013ef032 100644 --- a/app/src/main/java/org/tm/archive/components/settings/dsl.kt +++ b/app/src/main/java/org/tm/archive/components/settings/dsl.kt @@ -177,10 +177,21 @@ class DSLConfiguration { fun tonalButton( text: DSLSettingsText, + icon: DSLSettingsIcon? = null, isEnabled: Boolean = true, onClick: () -> Unit ) { - val preference = Button.Model.Tonal(text, null, isEnabled, onClick) + val preference = Button.Model.Tonal(text, icon, isEnabled, onClick) + children.add(preference) + } + + fun tonalWrappedButton( + text: DSLSettingsText, + icon: DSLSettingsIcon? = null, + isEnabled: Boolean = true, + onClick: () -> Unit + ) { + val preference = Button.Model.TonalWrapped(text, icon, isEnabled, onClick) children.add(preference) } diff --git a/app/src/main/java/org/tm/archive/components/settings/models/Banner.kt b/app/src/main/java/org/tm/archive/components/settings/models/Banner.kt new file mode 100644 index 00000000..fafa6d77 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/settings/models/Banner.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.settings.models + +import androidx.annotation.StringRes +import org.tm.archive.databinding.DslBannerBinding +import org.tm.archive.util.adapter.mapping.BindingFactory +import org.tm.archive.util.adapter.mapping.BindingViewHolder +import org.tm.archive.util.adapter.mapping.MappingAdapter +import org.tm.archive.util.adapter.mapping.MappingModel + +/** + * Displays a banner to notify the user of certain state or action that needs to be taken. + */ +object Banner { + fun register(mappingAdapter: MappingAdapter) { + mappingAdapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, DslBannerBinding::inflate)) + } + + class Model( + @StringRes val textId: Int, + @StringRes val actionId: Int, + val onClick: () -> Unit + ) : MappingModel { + override fun areItemsTheSame(newItem: Model): Boolean { + return true + } + + override fun areContentsTheSame(newItem: Model): Boolean { + return textId == newItem.textId && actionId == newItem.actionId + } + } + + private class ViewHolder(binding: DslBannerBinding) : BindingViewHolder(binding) { + override fun bind(model: Model) { + binding.bannerText.setText(model.textId) + binding.bannerAction.setText(model.actionId) + binding.bannerAction.setOnClickListener { model.onClick() } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/settings/models/Button.kt b/app/src/main/java/org/tm/archive/components/settings/models/Button.kt index 78b62cb6..9fdf2d15 100644 --- a/app/src/main/java/org/tm/archive/components/settings/models/Button.kt +++ b/app/src/main/java/org/tm/archive/components/settings/models/Button.kt @@ -16,6 +16,7 @@ object Button { mappingAdapter.registerFactory(Model.Primary::class.java, LayoutFactory({ ViewHolder(it) }, R.layout.dsl_button_primary)) mappingAdapter.registerFactory(Model.PrimaryWrapped::class.java, LayoutFactory({ ViewHolder(it) }, R.layout.dsl_button_primary_wrapped)) mappingAdapter.registerFactory(Model.Tonal::class.java, LayoutFactory({ ViewHolder(it) }, R.layout.dsl_button_tonal)) + mappingAdapter.registerFactory(Model.TonalWrapped::class.java, LayoutFactory({ ViewHolder(it) }, R.layout.dsl_button_tonal_wrapped)) mappingAdapter.registerFactory(Model.SecondaryNoOutline::class.java, LayoutFactory({ ViewHolder(it) }, R.layout.dsl_button_secondary)) } @@ -56,6 +57,13 @@ object Button { onClick: () -> Unit ) : Model(title, icon, isEnabled, onClick) + class TonalWrapped( + title: DSLSettingsText?, + icon: DSLSettingsIcon?, + isEnabled: Boolean, + onClick: () -> Unit + ) : Model(title, icon, isEnabled, onClick) + class SecondaryNoOutline( title: DSLSettingsText?, icon: DSLSettingsIcon?, diff --git a/app/src/main/java/org/tm/archive/components/transfercontrols/TransferControlView.kt b/app/src/main/java/org/tm/archive/components/transfercontrols/TransferControlView.kt new file mode 100644 index 00000000..ee194e99 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/transfercontrols/TransferControlView.kt @@ -0,0 +1,794 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ +package org.tm.archive.components.transfercontrols + +import android.content.Context +import android.os.Build +import android.text.StaticLayout +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.children +import androidx.core.view.updateLayoutParams +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.signal.core.util.logging.Log +import org.tm.archive.R +import org.tm.archive.attachments.Attachment +import org.tm.archive.components.RecyclerViewParentTransitionController +import org.tm.archive.database.AttachmentTable +import org.tm.archive.databinding.TransferControlsViewBinding +import org.tm.archive.events.PartProgressEvent +import org.tm.archive.mms.Slide +import org.tm.archive.util.MediaUtil +import org.tm.archive.util.ThrottledDebouncer +import org.tm.archive.util.ViewUtil +import org.tm.archive.util.visible +import java.util.UUID +import kotlin.math.ceil +import kotlin.math.roundToInt + +class TransferControlView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) { + private val uuid = UUID.randomUUID().toString() + private val binding: TransferControlsViewBinding + + private var state = TransferControlViewState() + private val progressUpdateDebouncer: ThrottledDebouncer = ThrottledDebouncer(100) + + init { + tag = uuid + binding = TransferControlsViewBinding.inflate(LayoutInflater.from(context), this) + visibility = GONE + isLongClickable = false + + addOnAttachStateChangeListener(RecyclerViewParentTransitionController(child = this)) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + EventBus.getDefault().unregister(this) + } + + private fun updateState(stateFactory: (TransferControlViewState) -> TransferControlViewState) { + val newState = stateFactory.invoke(state) + if (newState != state && !(deriveMode(state) == Mode.GONE && deriveMode(newState) == Mode.GONE)) { + progressUpdateDebouncer.publish { + applyState(newState) + } + } + state = newState + } + + private fun applyState(currentState: TransferControlViewState) { + val mode = deriveMode(currentState) + verboseLog("New state applying, mode = $mode") + + children.forEach { + it.clearAnimation() + } + + when (mode) { + Mode.PENDING_GALLERY -> displayPendingGallery(currentState) + Mode.PENDING_GALLERY_CONTAINS_PLAYABLE -> displayPendingGalleryWithPlayable(currentState) + Mode.PENDING_SINGLE_ITEM -> displayPendingSingleItem(currentState) + Mode.PENDING_VIDEO_PLAYABLE -> displayPendingPlayableVideo(currentState) + Mode.DOWNLOADING_GALLERY -> displayDownloadingGallery(currentState) + Mode.DOWNLOADING_SINGLE_ITEM -> displayDownloadingSingleItem(currentState) + Mode.DOWNLOADING_VIDEO_PLAYABLE -> displayDownloadingPlayableVideo(currentState) + Mode.UPLOADING_GALLERY -> displayUploadingGallery(currentState) + Mode.UPLOADING_SINGLE_ITEM -> displayUploadingSingleItem(currentState) + Mode.RETRY_DOWNLOADING -> displayRetry(currentState, false) + Mode.RETRY_UPLOADING -> displayRetry(currentState, true) + Mode.GONE -> displayChildrenAsGone() + } + } + + private fun deriveMode(currentState: TransferControlViewState): Mode { + if (currentState.slides.isEmpty()) { + verboseLog("Setting empty slide deck to GONE") + return Mode.GONE + } + + if (currentState.slides.all { it.transferState == AttachmentTable.TRANSFER_PROGRESS_DONE }) { + verboseLog("Setting slide deck that's finished to GONE\n\t${slidesAsListOfTimestamps(currentState.slides)}") + return Mode.GONE + } + + if (currentState.isVisible) { + if (currentState.slides.size == 1) { + val slide = currentState.slides.first() + if (slide.hasVideo()) { + if (currentState.isOutgoing) { + return when (slide.transferState) { + AttachmentTable.TRANSFER_PROGRESS_STARTED -> { + Mode.UPLOADING_SINGLE_ITEM + } + + AttachmentTable.TRANSFER_PROGRESS_PENDING -> { + Mode.PENDING_SINGLE_ITEM + } + + else -> { + Mode.RETRY_UPLOADING + } + } + } else { + return when (slide.transferState) { + AttachmentTable.TRANSFER_PROGRESS_STARTED -> { + if (currentState.playableWhileDownloading) { + Mode.DOWNLOADING_VIDEO_PLAYABLE + } else { + Mode.DOWNLOADING_SINGLE_ITEM + } + } + + AttachmentTable.TRANSFER_PROGRESS_FAILED -> { + Mode.RETRY_DOWNLOADING + } + + else -> { + if (currentState.playableWhileDownloading) { + Mode.PENDING_VIDEO_PLAYABLE + } else { + Mode.PENDING_SINGLE_ITEM + } + } + } + } + } else { + return if (currentState.isOutgoing) { + when (slide.transferState) { + AttachmentTable.TRANSFER_PROGRESS_FAILED -> { + Mode.RETRY_UPLOADING + } + + AttachmentTable.TRANSFER_PROGRESS_PENDING -> { + Mode.PENDING_SINGLE_ITEM + } + + else -> { + Mode.UPLOADING_SINGLE_ITEM + } + } + } else { + return when (slide.transferState) { + AttachmentTable.TRANSFER_PROGRESS_STARTED -> { + Mode.DOWNLOADING_SINGLE_ITEM + } + + AttachmentTable.TRANSFER_PROGRESS_FAILED -> { + Mode.RETRY_DOWNLOADING + } + + else -> { + Mode.PENDING_SINGLE_ITEM + } + } + } + } + } else { + when (getTransferState(currentState.slides)) { + AttachmentTable.TRANSFER_PROGRESS_STARTED -> { + return if (currentState.isOutgoing) { + Mode.UPLOADING_GALLERY + } else { + Mode.DOWNLOADING_GALLERY + } + } + + AttachmentTable.TRANSFER_PROGRESS_PENDING -> { + return if (containsPlayableSlides(currentState.slides)) { + Mode.PENDING_GALLERY_CONTAINS_PLAYABLE + } else { + Mode.PENDING_GALLERY + } + } + + AttachmentTable.TRANSFER_PROGRESS_FAILED -> { + return if (currentState.isOutgoing) { + Mode.RETRY_UPLOADING + } else { + Mode.RETRY_DOWNLOADING + } + } + + AttachmentTable.TRANSFER_PROGRESS_DONE -> { + verboseLog("[Case 2] Setting slide deck that's finished to GONE\t${slidesAsListOfTimestamps(currentState.slides)}") + return Mode.GONE + } + } + } + } else { + verboseLog("Setting slide deck to GONE because isVisible is false:\t${slidesAsListOfTimestamps(currentState.slides)}") + return Mode.GONE + } + + Log.i(TAG, "[$uuid] Hit default mode case, this should not happen.") + return Mode.GONE + } + + private fun displayPendingGallery(currentState: TransferControlViewState) { + binding.primaryProgressView.startClickListener = currentState.startTransferClickListener + applyFocusableAndClickable( + currentState, + listOf(binding.primaryProgressView, binding.primaryDetailsText, binding.primaryBackground), + listOf(binding.secondaryProgressView, binding.playVideoButton) + ) + binding.primaryProgressView.setStopped(false) + showAllViews( + playVideoButton = false, + secondaryProgressView = false, + secondaryDetailsText = currentState.showSecondaryText + ) + + binding.primaryDetailsText.setOnClickListener(currentState.startTransferClickListener) + binding.primaryBackground.setOnClickListener(currentState.startTransferClickListener) + + binding.primaryDetailsText.translationX = if (ViewUtil.isLtr(this)) { + ViewUtil.dpToPx(-PRIMARY_TEXT_OFFSET_DP).toFloat() + } else { + ViewUtil.dpToPx(PRIMARY_TEXT_OFFSET_DP).toFloat() + } + setSecondaryDetailsText(currentState) + } + + private fun displayPendingGalleryWithPlayable(currentState: TransferControlViewState) { + binding.secondaryProgressView.startClickListener = currentState.startTransferClickListener + binding.secondaryDetailsText.setOnClickListener(currentState.startTransferClickListener) + binding.secondaryBackground.setOnClickListener(currentState.startTransferClickListener) + super.setClickable(false) + binding.secondaryProgressView.isClickable = currentState.showSecondaryText + binding.secondaryProgressView.isFocusable = currentState.showSecondaryText + binding.secondaryDetailsText.isClickable = currentState.showSecondaryText + binding.secondaryDetailsText.isFocusable = currentState.showSecondaryText + binding.secondaryBackground.isClickable = currentState.showSecondaryText + binding.secondaryBackground.isFocusable = currentState.showSecondaryText + binding.primaryProgressView.isClickable = false + binding.primaryProgressView.isFocusable = false + showAllViews( + playVideoButton = false, + primaryProgressView = false, + primaryDetailsText = false, + secondaryProgressView = currentState.showSecondaryText, + secondaryDetailsText = currentState.showSecondaryText + ) + + binding.secondaryProgressView.setStopped(false) + setSecondaryDetailsText(currentState) + binding.secondaryDetailsText.translationX = if (ViewUtil.isLtr(this)) { + ViewUtil.dpToPx(-SECONDARY_TEXT_OFFSET_DP).toFloat() + } else { + ViewUtil.dpToPx(SECONDARY_TEXT_OFFSET_DP).toFloat() + } + } + + private fun displayPendingSingleItem(currentState: TransferControlViewState) { + binding.primaryProgressView.startClickListener = currentState.startTransferClickListener + applyFocusableAndClickable(currentState, listOf(binding.primaryProgressView), listOf(binding.secondaryProgressView, binding.playVideoButton)) + binding.primaryProgressView.setStopped(false) + showAllViews( + playVideoButton = false, + primaryDetailsText = false, + secondaryProgressView = false, + secondaryDetailsText = currentState.showSecondaryText + ) + binding.secondaryDetailsText.translationX = 0f + setSecondaryDetailsText(currentState) + } + + private fun displayPendingPlayableVideo(currentState: TransferControlViewState) { + binding.secondaryProgressView.startClickListener = currentState.startTransferClickListener + binding.secondaryDetailsText.setOnClickListener(currentState.startTransferClickListener) + binding.secondaryBackground.setOnClickListener(currentState.startTransferClickListener) + binding.playVideoButton.setOnClickListener(currentState.instantPlaybackClickListener) + applyFocusableAndClickable( + currentState, + listOf(binding.secondaryProgressView, binding.secondaryDetailsText, binding.secondaryBackground, binding.playVideoButton), + listOf(binding.primaryProgressView) + ) + binding.secondaryProgressView.setStopped(false) + showAllViews( + primaryProgressView = false, + primaryDetailsText = false, + secondaryDetailsText = currentState.showSecondaryText, + secondaryProgressView = currentState.showSecondaryText + ) + setSecondaryDetailsText(currentState) + binding.secondaryDetailsText.translationX = if (ViewUtil.isLtr(this)) { + ViewUtil.dpToPx(-SECONDARY_TEXT_OFFSET_DP).toFloat() + } else { + ViewUtil.dpToPx(SECONDARY_TEXT_OFFSET_DP).toFloat() + } + } + + private fun displayDownloadingGallery(currentState: TransferControlViewState) { + applyFocusableAndClickable(currentState, listOf(binding.secondaryProgressView), listOf(binding.primaryProgressView, binding.playVideoButton)) + showAllViews( + playVideoButton = false, + primaryProgressView = false, + primaryDetailsText = false, + secondaryDetailsText = currentState.showSecondaryText + ) + + val progress = calculateProgress(currentState) + if (progress == 0f) { + binding.secondaryProgressView.setProgress(progress) + } else { + binding.secondaryProgressView.cancelClickListener = currentState.cancelTransferClickedListener + binding.secondaryProgressView.setProgress(progress) + } + binding.secondaryDetailsText.translationX = 0f + setSecondaryDetailsText(currentState) + } + + private fun displayDownloadingSingleItem(currentState: TransferControlViewState) { + binding.primaryProgressView.cancelClickListener = currentState.cancelTransferClickedListener + applyFocusableAndClickable(currentState, listOf(binding.primaryProgressView), listOf(binding.secondaryProgressView, binding.playVideoButton)) + showAllViews( + playVideoButton = false, + primaryDetailsText = false, + secondaryProgressView = false, + secondaryDetailsText = currentState.showSecondaryText + ) + + val progress = calculateProgress(currentState) + if (progress == 0f) { + binding.primaryProgressView.setProgress(progress) + } else { + binding.primaryProgressView.setProgress(progress) + } + binding.secondaryDetailsText.translationX = 0f + setSecondaryDetailsText(currentState) + } + + private fun displayDownloadingPlayableVideo(currentState: TransferControlViewState) { + binding.secondaryProgressView.cancelClickListener = currentState.cancelTransferClickedListener + applyFocusableAndClickable(currentState, listOf(binding.secondaryProgressView, binding.playVideoButton), listOf(binding.primaryProgressView)) + showAllViews( + primaryDetailsText = false, + secondaryProgressView = currentState.showSecondaryText, + secondaryDetailsText = currentState.showSecondaryText + ) + + binding.playVideoButton.setOnClickListener(currentState.instantPlaybackClickListener) + + val progress = calculateProgress(currentState) + if (progress == 0f) { + binding.secondaryProgressView.setProgress(progress) + } else { + binding.secondaryProgressView.setProgress(progress) + } + binding.secondaryDetailsText.translationX = 0f + setSecondaryDetailsText(currentState) + } + + private fun displayUploadingSingleItem(currentState: TransferControlViewState) { + binding.secondaryProgressView.cancelClickListener = currentState.cancelTransferClickedListener + applyFocusableAndClickable(currentState, listOf(binding.secondaryProgressView), listOf(binding.primaryProgressView, binding.playVideoButton)) + showAllViews( + playVideoButton = false, + primaryProgressView = false, + primaryDetailsText = false, + secondaryDetailsText = currentState.showSecondaryText + ) + + val progress = calculateProgress(currentState) + binding.secondaryProgressView.setProgress(progress) + + binding.secondaryDetailsText.translationX = 0f + setSecondaryDetailsText(currentState) + } + + private fun displayUploadingGallery(currentState: TransferControlViewState) { + binding.secondaryProgressView.cancelClickListener = currentState.cancelTransferClickedListener + applyFocusableAndClickable(currentState, listOf(binding.secondaryProgressView), listOf(binding.primaryProgressView, binding.playVideoButton)) + showAllViews( + playVideoButton = false, + primaryProgressView = false, + primaryDetailsText = false + ) + + val progress = calculateProgress(currentState) + binding.secondaryProgressView.setProgress(progress) + + binding.secondaryDetailsText.translationX = 0f + setSecondaryDetailsText(currentState) + } + + private fun displayRetry(currentState: TransferControlViewState, isUploading: Boolean) { + if (currentState.startTransferClickListener == null) { + Log.w(TAG, "No click listener set for retry!") + } + + binding.secondaryProgressView.startClickListener = currentState.startTransferClickListener + applyFocusableAndClickable( + currentState, + listOf(binding.secondaryProgressView, binding.secondaryDetailsText, binding.secondaryBackground), + listOf(binding.primaryProgressView, binding.playVideoButton) + ) + showAllViews( + playVideoButton = false, + primaryProgressView = false, + primaryDetailsText = false, + secondaryDetailsText = currentState.showSecondaryText + ) + binding.secondaryBackground.setOnClickListener(currentState.startTransferClickListener) + binding.secondaryDetailsText.setOnClickListener(currentState.startTransferClickListener) + binding.secondaryProgressView.setStopped(isUploading) + setSecondaryDetailsText(currentState) + binding.secondaryDetailsText.translationX = if (ViewUtil.isLtr(this)) { + ViewUtil.dpToPx(-RETRY_SECONDARY_TEXT_OFFSET_DP).toFloat() + } else { + ViewUtil.dpToPx(RETRY_SECONDARY_TEXT_OFFSET_DP).toFloat() + } + } + + private fun displayChildrenAsGone() { + children.forEach { + if (it.visible && it.animation == null) { + ViewUtil.fadeOut(it, 250) + } + } + } + + /** + * Shows all views by defaults, but allows individual views to be overridden to not be shown. + * + * @param root + * @param playVideoButton + * @param primaryProgressView + * @param primaryDetailsText + * @param secondaryProgressView + * @param secondaryDetailsText + */ + private fun showAllViews( + root: Boolean = true, + playVideoButton: Boolean = true, + primaryProgressView: Boolean = true, + primaryDetailsText: Boolean = true, + secondaryProgressView: Boolean = true, + secondaryDetailsText: Boolean = true + ) { + this.visible = root + binding.playVideoButton.visible = playVideoButton + binding.primaryProgressView.visibility = if (primaryProgressView) View.VISIBLE else View.INVISIBLE + binding.primaryDetailsText.visible = primaryDetailsText + binding.primaryBackground.visible = primaryProgressView || primaryDetailsText || playVideoButton + binding.secondaryProgressView.visible = secondaryProgressView + binding.secondaryDetailsText.visible = secondaryDetailsText + binding.secondaryBackground.visible = secondaryProgressView || secondaryDetailsText + val textPadding = if (secondaryProgressView) { + context.resources.getDimensionPixelSize(R.dimen.transfer_control_view_progressbar_to_textview_margin) + } else { + context.resources.getDimensionPixelSize(R.dimen.transfer_control_view_parent_to_textview_margin) + } + ViewUtil.setPaddingStart(binding.secondaryDetailsText, textPadding) + if (ViewUtil.isLtr(binding.secondaryDetailsText)) { + (binding.secondaryDetailsText.layoutParams as MarginLayoutParams).leftMargin = textPadding + } else { + (binding.secondaryDetailsText.layoutParams as MarginLayoutParams).rightMargin = textPadding + } + } + + private fun applyFocusableAndClickable(currentState: TransferControlViewState, activeViews: List, inactiveViews: List) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val focusIntDef = if (currentState.isFocusable) View.FOCUSABLE else View.NOT_FOCUSABLE + activeViews.forEach { it.focusable = focusIntDef } + inactiveViews.forEach { it.focusable = View.NOT_FOCUSABLE } + } + activeViews.forEach { it.isClickable = currentState.isClickable } + inactiveViews.forEach { + it.setOnClickListener(null) + it.isClickable = false + } + } + + override fun setFocusable(focusable: Boolean) { + super.setFocusable(false) + verboseLog("setFocusable update: $focusable") + updateState { it.copy(isFocusable = focusable) } + } + + override fun setClickable(clickable: Boolean) { + super.setClickable(false) + verboseLog("setClickable update: $clickable") + updateState { it.copy(isClickable = clickable) } + } + + @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) + fun onEventAsync(event: PartProgressEvent) { + val attachment = event.attachment + updateState { + verboseLog("onEventAsync update") + if (!it.networkProgress.containsKey(attachment)) { + verboseLog("onEventAsync update ignored") + return@updateState it + } + + if (event.type == PartProgressEvent.Type.COMPRESSION) { + val mutableMap = it.compressionProgress.toMutableMap() + val updateEvent = Progress.fromEvent(event) + val existingEvent = mutableMap[attachment] + if (existingEvent == null || updateEvent.completed > existingEvent.completed) { + mutableMap[attachment] = updateEvent + } + verboseLog("onEventAsync compression update") + return@updateState it.copy(compressionProgress = mutableMap.toMap()) + } else { + val mutableMap = it.networkProgress.toMutableMap() + val updateEvent = Progress.fromEvent(event) + val existingEvent = mutableMap[attachment] + if (existingEvent == null || updateEvent.completed > existingEvent.completed) { + mutableMap[attachment] = updateEvent + } + verboseLog("onEventAsync network update") + return@updateState it.copy(networkProgress = mutableMap.toMap()) + } + } + } + + fun setSlides(slides: List) { + require(slides.isNotEmpty()) { "[$uuid] Must provide at least one slide." } + updateState { state -> + verboseLog("State update for new slides: ${slidesAsListOfTimestamps(slides)}") + val isNewSlideSet = !isUpdateToExistingSet(state, slides) + val networkProgress: MutableMap = if (isNewSlideSet) HashMap() else state.networkProgress.toMutableMap() + if (isNewSlideSet) { + slides.forEach { networkProgress[it.asAttachment()] = Progress(0L, it.fileSize) } + } + val compressionProgress: MutableMap = if (isNewSlideSet) HashMap() else state.compressionProgress.toMutableMap() + var allStreamableOrDone = true + for (slide in slides) { + val attachment = slide.asAttachment() + if (attachment.transferState == AttachmentTable.TRANSFER_PROGRESS_DONE) { + networkProgress[attachment] = Progress(attachment.size, attachment.size) + } else if (!MediaUtil.isInstantVideoSupported(slide)) { + allStreamableOrDone = false + } + } + val playableWhileDownloading = allStreamableOrDone + val isOutgoing = slides.any { it.asAttachment().uploadTimestamp == 0L } + + val result = state.copy( + slides = slides, + networkProgress = networkProgress, + compressionProgress = compressionProgress, + playableWhileDownloading = playableWhileDownloading, + isOutgoing = isOutgoing + ) + verboseLog("New state calculated and being returned for new slides: ${slidesAsListOfTimestamps(slides)}\n$result") + return@updateState result + } + verboseLog("End of setSlides() for ${slidesAsListOfTimestamps(slides)}") + } + + private fun slidesAsListOfTimestamps(slides: List): String { + if (!VERBOSE_DEVELOPMENT_LOGGING) { + return "" + } + + return slides.map { it.asAttachment().uploadTimestamp }.joinToString() + } + + private fun isUpdateToExistingSet(currentState: TransferControlViewState, slides: List): Boolean { + if (slides.size != currentState.networkProgress.size) { + return false + } + for (slide in slides) { + if (!currentState.networkProgress.containsKey(slide.asAttachment())) { + return false + } + } + return true + } + + fun setTransferClickListener(listener: OnClickListener) { + verboseLog("transferClickListener update") + updateState { + it.copy( + startTransferClickListener = listener + ) + } + } + + fun setCancelClickListener(listener: OnClickListener) { + verboseLog("cancelClickListener update") + updateState { + it.copy( + cancelTransferClickedListener = listener + ) + } + } + + fun setInstantPlaybackClickListener(listener: OnClickListener) { + verboseLog("instantPlaybackClickListener update") + updateState { + it.copy( + instantPlaybackClickListener = listener + ) + } + } + + fun clear() { + clearAnimation() + visibility = GONE + updateState { TransferControlViewState() } + } + + fun setShowSecondaryText(showSecondaryText: Boolean) { + verboseLog("showSecondaryText update: $showSecondaryText") + updateState { + it.copy( + showSecondaryText = showSecondaryText + ) + } + } + + fun setVisible(isVisible: Boolean) { + verboseLog("showSecondaryText update: $isVisible") + updateState { + it.copy( + isVisible = isVisible + ) + } + } + + private fun isCompressing(state: TransferControlViewState): Boolean { + val total = state.compressionProgress.sumTotal() + return total > 0 && state.compressionProgress.sumCompleted() / total < 0.99f + } + + private fun calculateProgress(state: TransferControlViewState): Float { + val totalCompressionProgress: Float = state.compressionProgress.values.map { it.completed.toFloat() / it.total }.sum() + val totalDownloadProgress: Float = state.networkProgress.values.map { it.completed.toFloat() / it.total }.sum() + val weightedProgress = UPLOAD_TASK_WEIGHT * totalDownloadProgress + COMPRESSION_TASK_WEIGHT * totalCompressionProgress + val weightedTotal = (UPLOAD_TASK_WEIGHT * state.networkProgress.size + COMPRESSION_TASK_WEIGHT * state.compressionProgress.size).toFloat() + return weightedProgress / weightedTotal + } + + private fun setSecondaryDetailsText(currentState: TransferControlViewState) { + when (deriveMode(currentState)) { + Mode.PENDING_GALLERY -> { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + val remainingSlides = currentState.slides.filterNot { it.transferState == AttachmentTable.TRANSFER_PROGRESS_DONE } + val downloadCount = remainingSlides.size + binding.primaryDetailsText.text = context.resources.getQuantityString(R.plurals.TransferControlView_n_items, downloadCount, downloadCount) + val mebibyteCount = (currentState.networkProgress.sumTotal() - currentState.networkProgress.sumCompleted()) / MEBIBYTE + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__filesize, mebibyteCount) + } + + Mode.PENDING_GALLERY_CONTAINS_PLAYABLE -> { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + val mebibyteCount = (currentState.networkProgress.sumTotal() - currentState.networkProgress.sumCompleted()) / MEBIBYTE + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__filesize, mebibyteCount) + } + + Mode.PENDING_SINGLE_ITEM, Mode.PENDING_VIDEO_PLAYABLE -> { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + val mebibyteCount = (currentState.slides.sumOf { it.asAttachment().size }) / MEBIBYTE + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__filesize, mebibyteCount) + } + + Mode.DOWNLOADING_GALLERY, Mode.DOWNLOADING_SINGLE_ITEM, Mode.DOWNLOADING_VIDEO_PLAYABLE, Mode.UPLOADING_GALLERY, Mode.UPLOADING_SINGLE_ITEM -> { + if (currentState.networkProgress.sumCompleted() == 0L || isCompressing(currentState)) { + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + binding.secondaryDetailsText.text = context.getString(R.string.TransferControlView__processing) + } else { + val progressMiB = currentState.networkProgress.sumCompleted() / MEBIBYTE + val totalMiB = currentState.networkProgress.sumTotal() / MEBIBYTE + val completedLabel = context.resources.getString(R.string.TransferControlView__download_progress, totalMiB, totalMiB) + val desiredWidth = StaticLayout.getDesiredWidth(completedLabel, binding.secondaryDetailsText.paint) + binding.secondaryDetailsText.text = context.resources.getString(R.string.TransferControlView__download_progress, progressMiB, totalMiB) + val roundedWidth = ceil(desiredWidth.toDouble()).roundToInt() + binding.secondaryDetailsText.compoundPaddingLeft + binding.secondaryDetailsText.compoundPaddingRight + binding.secondaryDetailsText.updateLayoutParams { + width = roundedWidth + } + } + } + + Mode.RETRY_DOWNLOADING, Mode.RETRY_UPLOADING -> { + binding.secondaryDetailsText.text = resources.getString(R.string.NetworkFailure__retry) + binding.secondaryDetailsText.updateLayoutParams { + width = ViewGroup.LayoutParams.WRAP_CONTENT + } + } + + Mode.GONE -> Unit + } + } + + /** + * This is an extremely chatty logging mode for local development. Each view is assigned a UUID so that you can filter by view inside a conversation. + */ + private fun verboseLog(message: String) { + if (VERBOSE_DEVELOPMENT_LOGGING) { + Log.d(TAG, "[$uuid] $message") + } + } + + companion object { + private const val TAG = "TransferControlView" + private const val VERBOSE_DEVELOPMENT_LOGGING = false + private const val UPLOAD_TASK_WEIGHT = 1 + private const val SECONDARY_TEXT_OFFSET_DP = 6 + private const val RETRY_SECONDARY_TEXT_OFFSET_DP = 6 + private const val PRIMARY_TEXT_OFFSET_DP = 4 + private const val MEBIBYTE = 1048576f + + /** + * A weighting compared to [UPLOAD_TASK_WEIGHT] + */ + private const val COMPRESSION_TASK_WEIGHT = 3 + + @JvmStatic + fun getTransferState(slides: List): Int { + var transferState = AttachmentTable.TRANSFER_PROGRESS_DONE + var allFailed = true + for (slide in slides) { + if (slide.transferState != AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE) { + allFailed = false + transferState = if (slide.transferState == AttachmentTable.TRANSFER_PROGRESS_PENDING && transferState == AttachmentTable.TRANSFER_PROGRESS_DONE) { + slide.transferState + } else { + transferState.coerceAtLeast(slide.transferState) + } + } + } + return if (allFailed) AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE else transferState + } + + @JvmStatic + fun containsPlayableSlides(slides: List): Boolean { + return slides.any { MediaUtil.isInstantVideoSupported(it) } + } + } + + data class Progress(val completed: Long, val total: Long) { + companion object { + fun fromEvent(event: PartProgressEvent): Progress { + return Progress(event.progress, event.total) + } + } + } + + private fun Map.sumCompleted(): Long { + return this.values.sumOf { it.completed } + } + + private fun Map.sumTotal(): Long { + return this.values.sumOf { it.total } + } + + enum class Mode { + PENDING_GALLERY, + PENDING_GALLERY_CONTAINS_PLAYABLE, + PENDING_SINGLE_ITEM, + PENDING_VIDEO_PLAYABLE, + DOWNLOADING_GALLERY, + DOWNLOADING_SINGLE_ITEM, + DOWNLOADING_VIDEO_PLAYABLE, + UPLOADING_GALLERY, + UPLOADING_SINGLE_ITEM, + RETRY_DOWNLOADING, + RETRY_UPLOADING, + GONE + } +} diff --git a/app/src/main/java/org/tm/archive/components/transfercontrols/TransferControlViewState.kt b/app/src/main/java/org/tm/archive/components/transfercontrols/TransferControlViewState.kt new file mode 100644 index 00000000..67e3a318 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/transfercontrols/TransferControlViewState.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.transfercontrols + +import android.view.View +import org.tm.archive.attachments.Attachment +import org.tm.archive.mms.Slide + +data class TransferControlViewState( + val isVisible: Boolean = true, + val isFocusable: Boolean = true, + val isClickable: Boolean = true, + val slides: List = emptyList(), + val startTransferClickListener: View.OnClickListener? = null, + val cancelTransferClickedListener: View.OnClickListener? = null, + val instantPlaybackClickListener: View.OnClickListener? = null, + val showSecondaryText: Boolean = true, + val networkProgress: Map = HashMap(), + val compressionProgress: Map = HashMap(), + val playableWhileDownloading: Boolean = false, + val isOutgoing: Boolean = false +) diff --git a/app/src/main/java/org/tm/archive/components/transfercontrols/TransferProgressView.kt b/app/src/main/java/org/tm/archive/components/transfercontrols/TransferProgressView.kt new file mode 100644 index 00000000..8d02a7ed --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/transfercontrols/TransferProgressView.kt @@ -0,0 +1,197 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.transfercontrols + +import android.content.Context +import android.content.res.Resources +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.RectF +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.View +import androidx.core.content.ContextCompat +import androidx.core.graphics.withTranslation +import org.signal.core.util.logging.Log +import org.tm.archive.R +import kotlin.math.roundToInt + +/** + * This displays a circular progress around an icon. The icon is either an upload arrow, a download arrow, or a rectangular stop button. + */ +class TransferProgressView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : View(context, attrs, defStyleAttr, defStyleRes) { + companion object { + const val TAG = "TransferProgressView" + private const val PROGRESS_ARC_STROKE_WIDTH_DP = 2f + private const val ICON_SIZE_DP = 24f + private const val STOP_CORNER_RADIUS_DP = 4f + private const val PROGRESS_BAR_INSET_DP = 2 + } + + private val iconColor: Int + private val progressColor: Int + private val trackColor: Int + private val stopIconPaint: Paint + private val progressPaint: Paint + private val trackPaint: Paint + private val progressArcStrokeWidth: Float + private val iconSize: Float + private val stopIconSize: Float + private val stopIconCornerRadius: Float + + private val progressRect = RectF() + private val stopIconRect = RectF() + private val downloadDrawable = ContextCompat.getDrawable(context, R.drawable.ic_arrow_down_24) + private val uploadDrawable = ContextCompat.getDrawable(context, R.drawable.ic_arrow_up_16) + + private var progressPercent = 0f + private var currentState = State.UNINITIALIZED + + var startClickListener: OnClickListener? = null + var cancelClickListener: OnClickListener? = null + + init { + val displayDensity = Resources.getSystem().displayMetrics.density + val typedArray = context.theme.obtainStyledAttributes(attrs, R.styleable.TransferProgressView, 0, 0) + val signalCustomColor = ContextCompat.getColor(context, R.color.signal_colorOnCustom) + val signalTransparent2 = ContextCompat.getColor(context, R.color.signal_colorTransparent2) + + iconColor = typedArray.getColor(R.styleable.TransferProgressView_transferIconColor, signalCustomColor) + progressColor = typedArray.getColor(R.styleable.TransferProgressView_progressColor, signalCustomColor) + trackColor = typedArray.getColor(R.styleable.TransferProgressView_trackColor, signalTransparent2) + progressArcStrokeWidth = typedArray.getDimension(R.styleable.TransferProgressView_progressArcWidth, PROGRESS_ARC_STROKE_WIDTH_DP * displayDensity) + iconSize = typedArray.getDimension(R.styleable.TransferProgressView_iconSize, ICON_SIZE_DP * displayDensity) + stopIconSize = typedArray.getDimension(R.styleable.TransferProgressView_stopIconSize, ICON_SIZE_DP * displayDensity) + stopIconCornerRadius = typedArray.getDimension(R.styleable.TransferProgressView_stopIconCornerRadius, STOP_CORNER_RADIUS_DP * displayDensity) + + typedArray.recycle() + + progressPaint = progressPaint(progressColor) + stopIconPaint = stopIconPaint(iconColor) + trackPaint = trackPaint(trackColor) + + val filter = PorterDuffColorFilter(iconColor, PorterDuff.Mode.SRC_ATOP) + downloadDrawable?.colorFilter = filter + uploadDrawable?.colorFilter = filter + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + when (currentState) { + State.IN_PROGRESS_CANCELABLE -> drawProgress(canvas, progressPercent, true) + State.IN_PROGRESS_NON_CANCELABLE -> drawProgress(canvas, progressPercent, false) + State.READY_TO_UPLOAD -> sizeAndDrawDrawable(canvas, uploadDrawable) + State.READY_TO_DOWNLOAD -> sizeAndDrawDrawable(canvas, downloadDrawable) + State.UNINITIALIZED -> Unit + } + } + + fun setProgress(progress: Float) { + currentState = State.IN_PROGRESS_CANCELABLE + if (cancelClickListener == null) { + Log.i(TAG, "Illegal click listener attached.") + } else { + setOnClickListener(cancelClickListener) + } + progressPercent = progress + invalidate() + } + + fun setStopped(isUpload: Boolean) { + val newState = if (isUpload) State.READY_TO_UPLOAD else State.READY_TO_DOWNLOAD + currentState = newState + if (startClickListener == null) { + Log.i(TAG, "Illegal click listener attached.") + } else { + setOnClickListener(startClickListener) + } + progressPercent = 0f + invalidate() + } + + private fun drawProgress(canvas: Canvas, progressPercent: Float, showStopIcon: Boolean) { + if (showStopIcon) { + stopIconRect.set(0f, 0f, stopIconSize, stopIconSize) + + canvas.withTranslation(width / 2 - (stopIconSize / 2), height / 2 - (stopIconSize / 2)) { + drawRoundRect(stopIconRect, stopIconCornerRadius, stopIconCornerRadius, stopIconPaint) + } + } + + val trackWidthScaled = progressArcStrokeWidth + val inset: Float = PROGRESS_BAR_INSET_DP * Resources.getSystem().displayMetrics.density + progressRect.left = trackWidthScaled + inset + progressRect.top = trackWidthScaled + inset + progressRect.right = (width - trackWidthScaled) - inset + progressRect.bottom = (height - trackWidthScaled) - inset + + canvas.drawArc(progressRect, 0f, 360f, false, trackPaint) + canvas.drawArc(progressRect, 270f, 360f * progressPercent, false, progressPaint) + } + + private fun stopIconPaint(paintColor: Int): Paint { + val stopIconPaint = Paint() + stopIconPaint.color = paintColor + stopIconPaint.isAntiAlias = true + stopIconPaint.style = Paint.Style.FILL + return stopIconPaint + } + + private fun trackPaint(trackColor: Int): Paint { + val trackPaint = Paint() + trackPaint.color = trackColor + trackPaint.isAntiAlias = true + trackPaint.style = Paint.Style.STROKE + trackPaint.strokeWidth = progressArcStrokeWidth + return trackPaint + } + + private fun progressPaint(progressColor: Int): Paint { + val progressPaint = Paint() + progressPaint.color = progressColor + progressPaint.isAntiAlias = true + progressPaint.style = Paint.Style.STROKE + progressPaint.strokeWidth = progressArcStrokeWidth + return progressPaint + } + + private fun sizeAndDrawDrawable(canvas: Canvas, drawable: Drawable?) { + if (drawable == null) { + Log.w(TAG, "Could not load icon for $currentState") + return + } + + val centerX = width / 2f + val centerY = height / 2f + + // 0, 0 is the top left corner + // width, height is the bottom right + val halfIconSize = (iconSize / 2f) + val left = (centerX - halfIconSize).roundToInt().coerceAtLeast(0) + val top = (centerY - halfIconSize).roundToInt().coerceAtLeast(0) + val right = (centerX + halfIconSize).roundToInt().coerceAtMost(width) + val bottom = (centerY + halfIconSize).roundToInt().coerceAtMost(height) + + drawable.setBounds(left, top, right, bottom) + drawable.draw(canvas) + } + + private enum class State { + IN_PROGRESS_CANCELABLE, + IN_PROGRESS_NON_CANCELABLE, + READY_TO_UPLOAD, + READY_TO_DOWNLOAD, + UNINITIALIZED + } +} diff --git a/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlaybackService.java b/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlaybackService.java index 997d60ec..0b2aad06 100644 --- a/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlaybackService.java +++ b/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlaybackService.java @@ -1,12 +1,15 @@ package org.tm.archive.components.voice; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.media.AudioManager; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import androidx.annotation.NonNull; @@ -29,7 +32,6 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import org.checkerframework.checker.units.qual.A; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.tm.archive.database.MessageTable; @@ -42,6 +44,7 @@ import org.tm.archive.recipients.RecipientId; import org.tm.archive.service.KeyCachingService; import java.util.Collections; +import java.util.List; /** * Android Service responsible for playback of voice notes. @@ -54,7 +57,6 @@ public class VoiceNotePlaybackService extends MediaSessionService { private static final String TAG = Log.tag(VoiceNotePlaybackService.class); private static final String SESSION_ID = "VoiceNotePlayback"; - private static final String EMPTY_ROOT_ID = "empty-root-id"; private static final int LOAD_MORE_THRESHOLD = 2; private MediaSession mediaSession; @@ -69,8 +71,15 @@ public class VoiceNotePlaybackService extends MediaSessionService { player.addListener(new VoiceNotePlayerEventListener()); voiceNotePlayerCallback = new VoiceNotePlayerCallback(this, player); - mediaSession = new MediaSession.Builder(this, player).setCallback(voiceNotePlayerCallback).setId(SESSION_ID).build(); - keyClearedReceiver = new KeyClearedReceiver(this, mediaSession.getToken()); + mediaSession = buildMediaSession(false); + + if (mediaSession == null) { + Log.e(TAG, "Unable to create media session at all, stopping service to avoid crash."); + stopSelf(); + return; + } + + keyClearedReceiver = new KeyClearedReceiver(this, mediaSession.getToken()); setMediaNotificationProvider(new VoiceNoteMediaNotificationProvider(this)); setListener(new MediaSessionServiceListener()); @@ -102,36 +111,35 @@ public class VoiceNotePlaybackService extends MediaSessionService { } private class VoiceNotePlayerEventListener implements Player.Listener { - - @Override - public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { - onPlaybackStateChanged(playWhenReady, player.getPlaybackState()); - } + private int previousPlaybackState = player.getPlaybackState(); @Override public void onPlaybackStateChanged(int playbackState) { - onPlaybackStateChanged(player.getPlayWhenReady(), playbackState); - } - - private void onPlaybackStateChanged(boolean playWhenReady, int playbackState) { + boolean playWhenReady = player.getPlayWhenReady(); + Log.d(TAG, "[onPlaybackStateChanged] playbackState: " + playbackStateToString(playbackState) + "\tplayWhenReady: " + playWhenReady); switch (playbackState) { - case Player.STATE_BUFFERING: - case Player.STATE_READY: - + case Player.STATE_BUFFERING, Player.STATE_READY -> { if (!playWhenReady) { stopForeground(false); } else { sendViewedReceiptForCurrentWindowIndex(); } - break; - default: + } + case Player.STATE_ENDED -> { + if (previousPlaybackState == Player.STATE_READY) { + player.clearMediaItems(); + } + } + default -> { + } } + previousPlaybackState = playbackState; } @Override public void onPositionDiscontinuity(@NonNull Player.PositionInfo oldPosition, @NonNull Player.PositionInfo newPosition, int reason) { - int currentWindowIndex = newPosition.windowIndex; - if (currentWindowIndex == C.INDEX_UNSET) { + int mediaItemIndex = newPosition.mediaItemIndex; + if (mediaItemIndex == C.INDEX_UNSET) { return; } @@ -142,7 +150,7 @@ public class VoiceNotePlaybackService extends MediaSessionService { Log.d(TAG, "onPositionDiscontinuity: current window uri: " + currentMediaItem.playbackProperties.uri); } - PlaybackParameters playbackParameters = getPlaybackParametersForWindowPosition(currentWindowIndex); + PlaybackParameters playbackParameters = getPlaybackParametersForWindowPosition(mediaItemIndex); final float speed = playbackParameters != null ? playbackParameters.speed : 1f; if (speed != player.getPlaybackParameters().speed) { @@ -150,15 +158,17 @@ public class VoiceNotePlaybackService extends MediaSessionService { if (playbackParameters != null) { player.setPlaybackParameters(playbackParameters); } - player.seekTo(currentWindowIndex, 1); + player.seekTo(mediaItemIndex, 1); player.setPlayWhenReady(true); } + } else if (reason == Player.DISCONTINUITY_REASON_SEEK) { + player.setPlayWhenReady(true); } - boolean isWithinThreshold = currentWindowIndex < LOAD_MORE_THRESHOLD || - currentWindowIndex + LOAD_MORE_THRESHOLD >= player.getMediaItemCount(); + boolean isWithinThreshold = mediaItemIndex < LOAD_MORE_THRESHOLD || + mediaItemIndex + LOAD_MORE_THRESHOLD >= player.getMediaItemCount(); - if (isWithinThreshold && currentWindowIndex % 2 == 0) { + if (isWithinThreshold && mediaItemIndex % 2 == 0) { voiceNotePlayerCallback.loadMoreVoiceNotes(); } } @@ -181,6 +191,54 @@ public class VoiceNotePlaybackService extends MediaSessionService { } } + /** + * Some devices, such as the ASUS Zenfone 8, erroneously report multiple broadcast receivers for {@value Intent#ACTION_MEDIA_BUTTON} in the package manager. + * This triggers a failure within the {@link MediaSession} initialization and throws an {@link IllegalStateException}. + * This method will catch that exception and attempt to disable the duplicated broadcast receiver in the hopes of getting the package manager to + * report only 1, avoiding the error. + * If that doesn't work, it returns null, signaling the {@link MediaSession} cannot be built on this device. + * + * @return the built MediaSession, or null if the session cannot be built. + */ + private @Nullable MediaSession buildMediaSession(boolean isRetry) { + try { + return new MediaSession.Builder(this, player).setCallback(voiceNotePlayerCallback).setId(SESSION_ID).build(); + } catch (IllegalStateException e) { + + if (isRetry) { + Log.e(TAG, "Unable to create media session, even after retry.", e); + return null; + } + + Log.w(TAG, "Unable to create media session with default parameters.", e); + PackageManager pm = this.getPackageManager(); + Intent queryIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); + queryIntent.setPackage(this.getPackageName()); + final List mediaButtonReceivers = pm.queryBroadcastReceivers(queryIntent, /* flags= */ 0); + + Log.d(TAG, "Found " + mediaButtonReceivers.size() + " BroadcastReceivers for " + Intent.ACTION_MEDIA_BUTTON); + + boolean found = false; + + if (mediaButtonReceivers.size() > 1) { + for (ResolveInfo receiverInfo : mediaButtonReceivers) { + + final ActivityInfo activityInfo = receiverInfo.activityInfo; + + if (!found && activityInfo.packageName.contains("androidx.media.session")) { + found = true; + } else { + pm.setComponentEnabledSetting(new ComponentName(activityInfo.packageName, activityInfo.name), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + } + } + + return buildMediaSession(true); + } else { + return null; + } + } + } + private @Nullable PlaybackParameters getPlaybackParametersForWindowPosition(int currentWindowIndex) { if (isAudioMessage(currentWindowIndex)) { return player.getPlaybackParameters(); @@ -302,4 +360,14 @@ public class VoiceNotePlaybackService extends MediaSessionService { Log.e(TAG, "Could not start VoiceNotePlaybackService, encountered a ForegroundServiceStartNotAllowedException."); } } + + private String playbackStateToString(int playbackState) { + return switch (playbackState) { + case Player.STATE_IDLE -> "Player.STATE_IDLE"; + case Player.STATE_BUFFERING -> "Player.STATE_BUFFERING"; + case Player.STATE_READY -> "Player.STATE_READY"; + case Player.STATE_ENDED -> "Player.STATE_ENDED"; + default -> "UNKNOWN(" + playbackState + ")"; + }; + } } diff --git a/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlayerCallback.kt b/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlayerCallback.kt index 268c3408..dfdc7cf3 100644 --- a/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlayerCallback.kt +++ b/app/src/main/java/org/tm/archive/components/voice/VoiceNotePlayerCallback.kt @@ -17,7 +17,6 @@ import androidx.media3.common.AudioAttributes import androidx.media3.common.C import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem.LocalConfiguration -import androidx.media3.common.MediaMetadata import androidx.media3.common.PlaybackParameters import androidx.media3.common.Player import androidx.media3.common.Timeline @@ -36,12 +35,9 @@ import org.tm.archive.R import org.tm.archive.database.NoSuchMessageException import org.tm.archive.database.SignalDatabase.Companion.messages import org.tm.archive.database.model.MessageRecord -import org.tm.archive.util.Util import org.tm.archive.util.hasAudio -import java.util.Objects import java.util.concurrent.Executor import java.util.concurrent.Executors -import java.util.stream.Collectors import kotlin.math.max /** @@ -146,7 +142,7 @@ class VoiceNotePlayerCallback(val context: Context, val player: VoiceNotePlayer) ) { mediaItems: List -> player.clearMediaItems() if (mediaItems.isNotEmpty() && latestUri == uri) { - applyDescriptionsToQueue(mediaItems) + addItemsToPlaylist(mediaItems) val window = max(0, indexOfPlayerMediaItemByUri(uri)) player.addListener(object : Player.Listener { override fun onTimelineChanged(timeline: Timeline, reason: Int) { @@ -206,40 +202,16 @@ class VoiceNotePlayerCallback(val context: Context, val player: VoiceNotePlayer) } @MainThread - private fun applyDescriptionsToQueue(mediaItems: List) { - for (mediaItem in mediaItems) { - val playbackProperties = mediaItem.localConfiguration ?: continue - val holderIndex = indexOfPlayerMediaItemByUri(playbackProperties.uri) - val next = VoiceNoteMediaItemFactory.buildNextVoiceNoteMediaItem(mediaItem) - val currentIndex: Int = player.currentMediaItemIndex - if (holderIndex != -1) { - if (currentIndex != holderIndex) { - player.removeMediaItem(holderIndex) - player.addMediaItem(holderIndex, mediaItem) - } - if (currentIndex != holderIndex + 1) { - if (player.mediaItemCount > 1) { - player.removeMediaItem(holderIndex + 1) - } - player.addMediaItem(holderIndex + 1, next) - } - } else { - val insertLocation = indexAfter(mediaItem) - player.addMediaItem(insertLocation, next) - player.addMediaItem(insertLocation, mediaItem) - } - } - val itemsCount: Int = player.mediaItemCount - if (itemsCount > 0) { - val lastIndex = itemsCount - 1 - val last: MediaItem = player.getMediaItemAt(lastIndex) - if (last.localConfiguration?.uri == VoiceNoteMediaItemFactory.NEXT_URI) { - player.removeMediaItem(lastIndex) - if (player.mediaItemCount > 1) { - val end = VoiceNoteMediaItemFactory.buildEndVoiceNoteMediaItem(last) - player.addMediaItem(lastIndex, end) - } + private fun addItemsToPlaylist(mediaItems: List) { + var mediaItemsWithNextTone = mediaItems.flatMap { listOf(it, VoiceNoteMediaItemFactory.buildNextVoiceNoteMediaItem(it)) }.toMutableList() + mediaItemsWithNextTone = mediaItemsWithNextTone.subList(0, mediaItemsWithNextTone.lastIndex).toMutableList() + if (player.mediaItemCount == 0) { + if (mediaItems.size > 1) { + mediaItemsWithNextTone += VoiceNoteMediaItemFactory.buildEndVoiceNoteMediaItem(mediaItemsWithNextTone.last()) } + player.addMediaItems(mediaItemsWithNextTone) + } else { + player.addMediaItems(player.mediaItemCount, mediaItemsWithNextTone) } } @@ -253,69 +225,47 @@ class VoiceNotePlayerCallback(val context: Context, val player: VoiceNotePlayer) return -1 } - private fun indexAfter(target: MediaItem): Int { - val size: Int = player.mediaItemCount - val targetMessageId = target.mediaMetadata.extras?.getLong(VoiceNoteMediaItemFactory.EXTRA_MESSAGE_ID) ?: 0L - for (i in 0 until size) { - val mediaMetadata: MediaMetadata = player.getMediaItemAt(i).mediaMetadata - val messageId = mediaMetadata.extras!!.getLong(VoiceNoteMediaItemFactory.EXTRA_MESSAGE_ID) - if (messageId > targetMessageId) { - return i - } - } - return size - } - fun loadMoreVoiceNotes() { if (!canLoadMore) { return } val currentMediaItem: MediaItem = player.currentMediaItem ?: return val messageId = currentMediaItem.mediaMetadata.extras!!.getLong(VoiceNoteMediaItemFactory.EXTRA_MESSAGE_ID) + val currentPlaylist = List(player.mediaItemCount) { index -> player.getMediaItemAt(index) }.mapNotNull { it.requestMetadata.mediaUri } SimpleTask.run( EXECUTOR, - { loadMediaItemsForConsecutivePlayback(messageId) } + { loadMediaItemsForConsecutivePlayback(messageId).filterNot { it.requestMetadata.mediaUri in currentPlaylist } } ) { mediaItems: List -> - if (Util.hasItems(mediaItems) && canLoadMore) { - applyDescriptionsToQueue(mediaItems) + if (mediaItems.isNotEmpty() && canLoadMore) { + addItemsToPlaylist(mediaItems) } } } - private fun loadMediaItemsForSinglePlayback(messageId: Long): List { - return try { - val messageRecord = messages - .getMessageRecord(messageId) - if (!messageRecord.hasAudio()) { - Log.w(TAG, "Message does not contain audio.") - return emptyList() - } - val mediaItem = VoiceNoteMediaItemFactory.buildMediaItem(context, messageRecord) - mediaItem?.let { listOf(it) } ?: emptyList() - } catch (e: NoSuchMessageException) { - Log.w(TAG, "Could not find message.", e) - emptyList() - } - } - private fun loadMediaItemsForDraftPlayback(threadId: Long, draftUri: Uri): List { return listOf(VoiceNoteMediaItemFactory.buildMediaItem(context, threadId, draftUri)) } - @WorkerThread - private fun loadMediaItemsForConsecutivePlayback(messageId: Long): List { + private fun loadMediaItemsForSinglePlayback(messageId: Long): List { return try { - val recordsAfter = messages.getMessagesAfterVoiceNoteInclusive(messageId, LIMIT) - recordsAfter.filter { it.hasAudio() }.stream() - .map { record: MessageRecord? -> - VoiceNoteMediaItemFactory - .buildMediaItem(context, record!!) - } - .filter { obj: MediaItem? -> Objects.nonNull(obj) } - .collect(Collectors.toList()) + listOf(messages.getMessageRecord(messageId)).messageRecordsToVoiceNoteMediaItems() } catch (e: NoSuchMessageException) { Log.w(TAG, "Could not find message.", e) emptyList() } } + + @WorkerThread + private fun loadMediaItemsForConsecutivePlayback(messageId: Long): List { + return try { + messages.getMessagesAfterVoiceNoteInclusive(messageId, LIMIT).messageRecordsToVoiceNoteMediaItems() + } catch (e: NoSuchMessageException) { + Log.w(TAG, "Could not find message.", e) + emptyList() + } + } + + private fun List.messageRecordsToVoiceNoteMediaItems(): List { + return this.takeWhile { it.hasAudio() }.mapNotNull { VoiceNoteMediaItemFactory.buildMediaItem(context, it) } + } } diff --git a/app/src/main/java/org/tm/archive/components/webrtc/AudioIndicatorView.kt b/app/src/main/java/org/tm/archive/components/webrtc/AudioIndicatorView.kt index f5643624..5a5abed5 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/AudioIndicatorView.kt +++ b/app/src/main/java/org/tm/archive/components/webrtc/AudioIndicatorView.kt @@ -2,6 +2,7 @@ package org.tm.archive.components.webrtc import android.animation.ValueAnimator import android.content.Context +import android.content.res.ColorStateList import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint @@ -10,6 +11,7 @@ import android.util.AttributeSet import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.FrameLayout +import androidx.core.content.ContextCompat import org.signal.core.util.DimensionUnit import org.tm.archive.R import org.tm.archive.events.CallParticipant @@ -31,9 +33,9 @@ class AudioIndicatorView(context: Context, attrs: AttributeSet) : FrameLayout(co } private val barRect = RectF() - private val barWidth = DimensionUnit.DP.toPixels(4f) + private val barWidth = DimensionUnit.DP.toPixels(3f) private val barRadius = DimensionUnit.DP.toPixels(32f) - private val barPadding = DimensionUnit.DP.toPixels(4f) + private val barPadding = DimensionUnit.DP.toPixels(3f) private var middleBarAnimation: ValueAnimator? = null private var sideBarAnimation: ValueAnimator? = null @@ -43,11 +45,15 @@ class AudioIndicatorView(context: Context, attrs: AttributeSet) : FrameLayout(co init { inflate(context, R.layout.audio_indicator_view, this) setWillNotDraw(false) + + backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(context, R.color.transparent_black_70)) } private val micMuted: View = findViewById(R.id.mic_muted) fun bind(microphoneEnabled: Boolean, level: CallParticipant.AudioLevel?) { + setBackgroundResource(R.drawable.circle_tintable) + micMuted.visible = !microphoneEnabled val wasShowingAudioLevel = showAudioLevel @@ -55,11 +61,11 @@ class AudioIndicatorView(context: Context, attrs: AttributeSet) : FrameLayout(co if (showAudioLevel) { val scaleFactor = when (level!!) { - CallParticipant.AudioLevel.LOWEST -> 0.2f - CallParticipant.AudioLevel.LOW -> 0.4f - CallParticipant.AudioLevel.MEDIUM -> 0.6f - CallParticipant.AudioLevel.HIGH -> 0.8f - CallParticipant.AudioLevel.HIGHEST -> 1.0f + CallParticipant.AudioLevel.LOWEST -> 0.1f + CallParticipant.AudioLevel.LOW -> 0.3f + CallParticipant.AudioLevel.MEDIUM -> 0.5f + CallParticipant.AudioLevel.HIGH -> 0.65f + CallParticipant.AudioLevel.HIGHEST -> 0.8f } middleBarAnimation?.end() diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallLinkInfoSheet.kt b/app/src/main/java/org/tm/archive/components/webrtc/CallLinkInfoSheet.kt deleted file mode 100644 index 040eec1d..00000000 --- a/app/src/main/java/org/tm/archive/components/webrtc/CallLinkInfoSheet.kt +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright 2023 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.tm.archive.components.webrtc - -import android.content.ActivityNotFoundException -import android.content.Intent -import android.os.Bundle -import android.view.View -import android.widget.Toast -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalInspectionMode -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.compose.ui.viewinterop.AndroidView -import androidx.core.app.ShareCompat -import androidx.core.os.BundleCompat -import androidx.core.os.bundleOf -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels -import androidx.lifecycle.toLiveData -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.BackpressureStrategy -import io.reactivex.rxjava3.kotlin.subscribeBy -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toImmutableList -import org.signal.core.ui.BottomSheets -import org.signal.core.ui.Dividers -import org.signal.core.ui.Rows -import org.signal.core.ui.theme.SignalTheme -import org.signal.core.util.concurrent.LifecycleDisposable -import org.signal.core.util.concurrent.addTo -import org.signal.core.util.logging.Log -import org.signal.ringrtc.CallLinkState.Restrictions -import org.tm.archive.R -import org.tm.archive.calls.links.CallLinks -import org.tm.archive.calls.links.EditCallLinkNameDialogFragment -import org.tm.archive.calls.links.EditCallLinkNameDialogFragmentArgs -import org.tm.archive.calls.links.SignalCallRow -import org.tm.archive.calls.links.details.CallLinkDetailsViewModel -import org.tm.archive.components.AvatarImageView -import org.tm.archive.compose.ComposeBottomSheetDialogFragment -import org.tm.archive.database.CallLinkTable -import org.tm.archive.dependencies.ApplicationDependencies -import org.tm.archive.events.CallParticipant -import org.tm.archive.events.WebRtcViewModel -import org.tm.archive.recipients.Recipient -import org.tm.archive.recipients.RecipientId -import org.tm.archive.service.webrtc.links.CallLinkCredentials -import org.tm.archive.service.webrtc.links.CallLinkRoomId -import org.tm.archive.service.webrtc.links.SignalCallLinkState -import org.tm.archive.service.webrtc.links.UpdateCallLinkResult -import org.tm.archive.util.BottomSheetUtil - -/** - * Displays information about the in-progress CallLink call from - * within WebRtcActivity. If the user is able to modify call link - * state, provides options to do so. - */ -class CallLinkInfoSheet : ComposeBottomSheetDialogFragment() { - - companion object { - - private val TAG = Log.tag(CallLinkInfoSheet::class.java) - private const val CALL_LINK_ROOM_ID = "call_link_room_id" - - @JvmStatic - fun show(fragmentManager: FragmentManager, callLinkRoomId: CallLinkRoomId) { - CallLinkInfoSheet().apply { - arguments = bundleOf(CALL_LINK_ROOM_ID to callLinkRoomId) - }.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) - } - } - - private val webRtcCallViewModel: WebRtcCallViewModel by activityViewModels() - private val callLinkDetailsViewModel: CallLinkDetailsViewModel by viewModels(factoryProducer = { - CallLinkDetailsViewModel.Factory(BundleCompat.getParcelable(requireArguments(), CALL_LINK_ROOM_ID, CallLinkRoomId::class.java)!!) - }) - - private val lifecycleDisposable = LifecycleDisposable() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - lifecycleDisposable.bindTo(viewLifecycleOwner) - parentFragmentManager.setFragmentResultListener(EditCallLinkNameDialogFragment.RESULT_KEY, viewLifecycleOwner) { resultKey, bundle -> - if (bundle.containsKey(resultKey)) { - setName(bundle.getString(resultKey)!!) - } - } - } - - @Composable - override fun SheetContent() { - val callLinkDetailsState by callLinkDetailsViewModel.state - val callParticipantsState by webRtcCallViewModel.callParticipantsState - .toFlowable(BackpressureStrategy.LATEST) - .toLiveData() - .observeAsState() - - val participants: ImmutableList = if (callParticipantsState?.callState == WebRtcViewModel.State.CALL_CONNECTED) { - listOf(CallParticipant(recipient = Recipient.self())) + (callParticipantsState?.allRemoteParticipants?.map { it } ?: emptyList()) - } else { - emptyList() - }.toImmutableList() - - val onEditNameClicked: () -> Unit = remember(callLinkDetailsState) { - { - EditCallLinkNameDialogFragment().apply { - arguments = EditCallLinkNameDialogFragmentArgs.Builder(callLinkDetailsState.callLink?.state?.name ?: "").build().toBundle() - }.show(parentFragmentManager, null) - } - } - - val callLink = callLinkDetailsState.callLink - if (callLink != null) { - Sheet( - callLink = callLink, - participants = participants, - onShareLinkClicked = this::shareLink, - onEditNameClicked = onEditNameClicked, - onToggleAdminApprovalClicked = this::onApproveAllMembersChanged, - onBlock = this::onBlockParticipant - ) - } - } - - private fun onBlockParticipant(callParticipant: CallParticipant) { - MaterialAlertDialogBuilder(requireContext()) - .setNegativeButton(android.R.string.cancel, null) - .setMessage(getString(R.string.CallLinkInfoSheet__remove_s_from_the_call, callParticipant.recipient.getShortDisplayName(requireContext()))) - .setPositiveButton(R.string.CallLinkInfoSheet__remove) { _, _ -> - ApplicationDependencies.getSignalCallManager().removeFromCallLink(callParticipant) - } - .setNeutralButton(R.string.CallLinkInfoSheet__block_from_call) { _, _ -> - ApplicationDependencies.getSignalCallManager().blockFromCallLink(callParticipant) - } - .show() - } - - private fun onApproveAllMembersChanged(checked: Boolean) { - callLinkDetailsViewModel.setApproveAllMembers(checked) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeBy(onSuccess = { - if (it !is UpdateCallLinkResult.Success) { - Log.w(TAG, "Failed to change restrictions. $it") - toastFailure() - } - }, onError = handleError("onApproveAllMembersChanged")) - .addTo(lifecycleDisposable) - } - - private fun shareLink() { - val mimeType = Intent.normalizeMimeType("text/plain") - val shareIntent = ShareCompat.IntentBuilder(requireContext()) - .setText(CallLinks.url(callLinkDetailsViewModel.rootKeySnapshot)) - .setType(mimeType) - .createChooserIntent() - - try { - startActivity(shareIntent) - } catch (e: ActivityNotFoundException) { - Toast.makeText(requireContext(), R.string.CreateCallLinkBottomSheetDialogFragment__failed_to_open_share_sheet, Toast.LENGTH_LONG).show() - } - } - - private fun setName(name: String) { - callLinkDetailsViewModel.setName(name) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeBy( - onSuccess = { - if (it !is UpdateCallLinkResult.Success) { - Log.w(TAG, "Failed to set name. $it") - toastFailure() - } - }, - onError = handleError("setName") - ) - .addTo(lifecycleDisposable) - } - - private fun handleError(method: String): (throwable: Throwable) -> Unit { - return { - Log.w(TAG, "Failure during $method", it) - toastFailure() - } - } - - private fun toastFailure() { - Toast.makeText(requireContext(), R.string.CallLinkDetailsFragment__couldnt_save_changes, Toast.LENGTH_LONG).show() - } -} - -@Preview -@Composable -private fun SheetPreview() { - SignalTheme(isDarkMode = true) { - Surface { - Sheet( - callLink = CallLinkTable.CallLink( - recipientId = RecipientId.UNKNOWN, - roomId = CallLinkRoomId.fromBytes(byteArrayOf(1, 2, 3, 4, 5)), - credentials = CallLinkCredentials( - linkKeyBytes = byteArrayOf(1, 2, 3, 4, 5), - adminPassBytes = byteArrayOf(1, 2, 3, 4, 5) - ), - state = SignalCallLinkState() - ), - participants = listOf(CallParticipant(recipient = Recipient.UNKNOWN)).toImmutableList(), - onShareLinkClicked = {}, - onEditNameClicked = {}, - onToggleAdminApprovalClicked = {}, - onBlock = {} - ) - } - } -} - -@Composable -private fun Sheet( - callLink: CallLinkTable.CallLink, - participants: ImmutableList, - onShareLinkClicked: () -> Unit, - onEditNameClicked: () -> Unit, - onToggleAdminApprovalClicked: (Boolean) -> Unit, - onBlock: (CallParticipant) -> Unit -) { - LazyColumn( - horizontalAlignment = Alignment.CenterHorizontally - ) { - item { - BottomSheets.Handle() - - Text( - text = stringResource(id = R.string.CallLinkInfoSheet__call_info), - style = MaterialTheme.typography.titleLarge, - modifier = Modifier.padding(vertical = 24.dp) - ) - - SignalCallRow(callLink = callLink, onJoinClicked = null) - Rows.TextRow( - text = stringResource(id = R.string.CallLinkDetailsFragment__share_link), - icon = ImageVector.vectorResource(id = R.drawable.symbol_link_24), - iconModifier = Modifier - .background( - color = MaterialTheme.colorScheme.surfaceVariant, - shape = CircleShape - ) - .size(42.dp) - .padding(9.dp), - modifier = Modifier - .defaultMinSize(minHeight = 64.dp) - .clickable(onClick = onShareLinkClicked) - ) - } - - items(participants, { it.callParticipantId }, { null }) { - CallLinkMemberRow( - callParticipant = it, - isSelfAdmin = callLink.credentials?.adminPassBytes != null, - onBlockClicked = onBlock - ) - } - - if (callLink.credentials?.adminPassBytes != null) { - item { - Dividers.Default() - Rows.TextRow( - text = stringResource(id = R.string.CallLinkDetailsFragment__add_call_name), - modifier = Modifier.clickable(onClick = onEditNameClicked) - ) - Rows.ToggleRow( - checked = callLink.state.restrictions == Restrictions.ADMIN_APPROVAL, - text = stringResource(id = R.string.CallLinkDetailsFragment__approve_all_members), - onCheckChanged = onToggleAdminApprovalClicked - ) - } - } - } -} - -@Preview -@Composable -private fun CallLinkMemberRowPreview() { - SignalTheme(isDarkMode = true) { - Surface { - CallLinkMemberRow( - CallParticipant(recipient = Recipient.UNKNOWN), - isSelfAdmin = true, - {} - ) - } - } -} - -@Composable -private fun CallLinkMemberRow( - callParticipant: CallParticipant, - isSelfAdmin: Boolean, - onBlockClicked: (CallParticipant) -> Unit -) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(Rows.defaultPadding()) - ) { - if (LocalInspectionMode.current) { - Spacer( - modifier = Modifier - .size(40.dp) - .background(color = Color.Red, shape = CircleShape) - ) - } else { - AndroidView( - factory = ::AvatarImageView, - modifier = Modifier.size(40.dp) - ) { - it.setAvatarUsingProfile(callParticipant.recipient) - } - } - - Spacer(modifier = Modifier.width(24.dp)) - - Text( - text = callParticipant.recipient.getShortDisplayName(LocalContext.current), - modifier = Modifier - .weight(1f) - .align(Alignment.CenterVertically) - ) - - if (isSelfAdmin && !callParticipant.recipient.isSelf) { - Icon( - imageVector = ImageVector.vectorResource(id = R.drawable.symbol_minus_circle_24), - contentDescription = null, - modifier = Modifier - .clickable(onClick = { onBlockClicked(callParticipant) }) - .align(Alignment.CenterVertically) - ) - } - } -} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallLinkProfileKeySender.kt b/app/src/main/java/org/tm/archive/components/webrtc/CallLinkProfileKeySender.kt new file mode 100644 index 00000000..e93facf3 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/CallLinkProfileKeySender.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc + +import org.signal.core.util.logging.Log +import org.tm.archive.database.identity.IdentityRecordList +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.jobs.ProfileKeySendJob +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId + +/** + * In-Memory Cache that keeps track of whom we've sent profile keys to. This is + * something that really only needs to happen once so that profile information is + * displayed correctly, so we maintain an application process scoped cache. + */ +object CallLinkProfileKeySender { + private val TAG = Log.tag(CallLinkProfileKeySender::class.java) + + private val cache = hashSetOf() + + /** + * Invoked after pressing "Join" or "Continue" on the safety number change dialog before + * or during a call. + */ + @JvmStatic + fun onSendAnyway(recipientIds: Set) { + val toSendMessagesTo: Set = recipientIds - cache + cache += recipientIds + + if (toSendMessagesTo.isNotEmpty()) { + Log.i(TAG, "Sending profile key to $toSendMessagesTo users.") + val job = ProfileKeySendJob.createForCallLinks(toSendMessagesTo.toList()) + ApplicationDependencies.getJobManager().add(job) + } else { + Log.i(TAG, "No users to send profile key to.") + } + } + + /** + * Given the set of recipients, for each unblocked recipient we don't distrust, send a NullMessage + */ + fun onRecipientsUpdated(recipients: Set) { + val nonBlockedNonSelfRecipients: List = recipients.filterNot { it.isBlocked || it.isSelf } + + val identityRecords: IdentityRecordList = ApplicationDependencies + .getProtocolStore() + .aci() + .identities() + .getIdentityRecords(nonBlockedNonSelfRecipients) + + val untrustedAndUnverifiedRecipients = if (identityRecords.isUntrusted(false) || identityRecords.isUnverified(false)) { + (identityRecords.untrustedRecipients + identityRecords.unverifiedRecipients).toSet() + } else { + emptySet() + } + + val trustedRecipients: Set = (nonBlockedNonSelfRecipients - untrustedAndUnverifiedRecipients).map { it.id }.toSet() + + onSendAnyway(trustedRecipients) + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallOverflowPopupWindow.kt b/app/src/main/java/org/tm/archive/components/webrtc/CallOverflowPopupWindow.kt new file mode 100644 index 00000000..6f80b06e --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/CallOverflowPopupWindow.kt @@ -0,0 +1,93 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc + +import android.graphics.Rect +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.PopupWindow +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.widget.PopupWindowCompat +import androidx.fragment.app.FragmentActivity +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.tm.archive.R +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.util.FeatureFlags +import org.tm.archive.util.visible + +/** + * A popup window for calls that holds extra actions, such as reactions, raise hand, and screen sharing. + * + */ +class CallOverflowPopupWindow(private val activity: FragmentActivity, parentViewGroup: ViewGroup, private val raisedHandDelegate: RaisedHandDelegate) : PopupWindow( + LayoutInflater.from(activity).inflate(R.layout.call_overflow_holder, parentViewGroup, false), + activity.resources.getDimension(R.dimen.calling_reaction_popup_menu_width).toInt(), + activity.resources.getDimension(R.dimen.calling_reaction_popup_menu_height).toInt() + +) { + private val raiseHandLabel: TextView = (contentView as LinearLayout).findViewById(R.id.raise_hand_label) + + init { + val root = (contentView as LinearLayout) + if (FeatureFlags.groupCallReactions()) { + val reactionScrubber = root.findViewById(R.id.reaction_scrubber) + reactionScrubber.visible = true + reactionScrubber.initialize(activity.supportFragmentManager) { + ApplicationDependencies.getSignalCallManager().react(it) + dismiss() + } + } + if (FeatureFlags.groupCallRaiseHand()) { + val raiseHand = root.findViewById(R.id.raise_hand_layout_parent) + raiseHand.visible = true + raiseHand.setOnClickListener { + if (raisedHandDelegate.isSelfHandRaised()) { + MaterialAlertDialogBuilder(activity) + .setTitle(R.string.CallOverflowPopupWindow__lower_your_hand) + .setPositiveButton(R.string.CallOverflowPopupWindow__lower_hand) { _, _ -> + ApplicationDependencies.getSignalCallManager().raiseHand(false) + this@CallOverflowPopupWindow.dismiss() + } + .setNegativeButton(R.string.CallOverflowPopupWindow__cancel, null) + .show() + } else { + ApplicationDependencies.getSignalCallManager().raiseHand(true) + dismiss() + } + } + } + } + + fun show(anchor: View) { + isFocusable = true + + val resources = activity.resources + + val margin = resources.getDimension(R.dimen.calling_reaction_scrubber_margin).toInt() + + val windowRect = Rect() + contentView.getWindowVisibleDisplayFrame(windowRect) + val windowWidth = windowRect.width() + val popupWidth = resources.getDimension(R.dimen.reaction_scrubber_width).toInt() + + val popupHeight = resources.getDimension(R.dimen.calling_reaction_popup_menu_height).toInt() + + val xOffset = windowWidth - popupWidth - margin + val yOffset = -popupHeight - margin + + raiseHandLabel.setText(if (raisedHandDelegate.isSelfHandRaised()) R.string.CallOverflowPopupWindow__lower_hand else R.string.CallOverflowPopupWindow__raise_hand) + + PopupWindowCompat.showAsDropDown(this, anchor, xOffset, yOffset, Gravity.NO_GRAVITY) + } + + interface RaisedHandDelegate { + fun isSelfHandRaised(): Boolean + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantView.java b/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantView.java index 6d4fdbb4..11f1242d 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantView.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantView.java @@ -6,15 +6,17 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.AppCompatImageView; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; import androidx.core.content.ContextCompat; import androidx.core.view.ViewKt; import androidx.core.widget.ImageViewCompat; +import androidx.transition.Transition; import androidx.transition.TransitionManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; @@ -35,8 +37,10 @@ import org.tm.archive.mms.GlideApp; import org.tm.archive.recipients.Recipient; import org.tm.archive.recipients.RecipientId; import org.tm.archive.util.AvatarUtil; +import org.tm.archive.util.FeatureFlags; import org.tm.archive.util.ViewUtil; import org.webrtc.RendererCommon; +import org.whispersystems.signalservice.api.util.Preconditions; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -55,8 +59,11 @@ public class CallParticipantView extends ConstraintLayout { private RecipientId recipientId; private boolean infoMode; + private boolean raiseHandAllowed; private Runnable missingMediaKeysUpdater; + private SelfPipMode selfPipMode = SelfPipMode.NOT_SELF_PIP; + private AppCompatImageView backgroundAvatar; private AvatarImageView avatar; private BadgeImageView badge; @@ -70,6 +77,10 @@ public class CallParticipantView extends ConstraintLayout { private EmojiTextView infoMessage; private Button infoMoreInfo; private AppCompatImageView infoIcon; + private View switchCameraIconFrame; + private View switchCameraIcon; + private ImageView raiseHandIcon; + private TextView nameLabel; public CallParticipantView(@NonNull Context context) { super(context); @@ -88,18 +99,22 @@ public class CallParticipantView extends ConstraintLayout { protected void onFinishInflate() { super.onFinishInflate(); - backgroundAvatar = findViewById(R.id.call_participant_background_avatar); - avatar = findViewById(R.id.call_participant_item_avatar); - pipAvatar = findViewById(R.id.call_participant_item_pip_avatar); - rendererFrame = findViewById(R.id.call_participant_renderer_frame); - renderer = findViewById(R.id.call_participant_renderer); - audioIndicator = findViewById(R.id.call_participant_audio_indicator); - infoOverlay = findViewById(R.id.call_participant_info_overlay); - infoIcon = findViewById(R.id.call_participant_info_icon); - infoMessage = findViewById(R.id.call_participant_info_message); - infoMoreInfo = findViewById(R.id.call_participant_info_more_info); - badge = findViewById(R.id.call_participant_item_badge); - pipBadge = findViewById(R.id.call_participant_item_pip_badge); + backgroundAvatar = findViewById(R.id.call_participant_background_avatar); + avatar = findViewById(R.id.call_participant_item_avatar); + pipAvatar = findViewById(R.id.call_participant_item_pip_avatar); + rendererFrame = findViewById(R.id.call_participant_renderer_frame); + renderer = findViewById(R.id.call_participant_renderer); + audioIndicator = findViewById(R.id.call_participant_audio_indicator); + infoOverlay = findViewById(R.id.call_participant_info_overlay); + infoIcon = findViewById(R.id.call_participant_info_icon); + infoMessage = findViewById(R.id.call_participant_info_message); + infoMoreInfo = findViewById(R.id.call_participant_info_more_info); + badge = findViewById(R.id.call_participant_item_badge); + pipBadge = findViewById(R.id.call_participant_item_pip_badge); + switchCameraIconFrame = findViewById(R.id.call_participant_switch_camera); + switchCameraIcon = findViewById(R.id.call_participant_switch_camera_icon); + raiseHandIcon = findViewById(R.id.call_participant_raise_hand_icon); + nameLabel = findViewById(R.id.call_participant_name_label); avatar.setFallbackPhotoProvider(FALLBACK_PHOTO_PROVIDER); useLargeAvatar(); @@ -164,6 +179,15 @@ public class CallParticipantView extends ConstraintLayout { audioIndicator.setVisibility(View.VISIBLE); audioIndicator.bind(participant.isMicrophoneEnabled(), participant.getAudioLevel()); + final String shortRecipientDisplayName = participant.getShortRecipientDisplayName(getContext()); + if (FeatureFlags.groupCallRaiseHand() && raiseHandAllowed && participant.isHandRaised()) { + raiseHandIcon.setVisibility(View.VISIBLE); + nameLabel.setVisibility(View.VISIBLE); + nameLabel.setText(shortRecipientDisplayName); + } else { + raiseHandIcon.setVisibility(View.GONE); + nameLabel.setVisibility(View.GONE); + } } if (participantChanged || !Objects.equals(contactPhoto, participant.getRecipient().getContactPhoto())) { @@ -211,6 +235,132 @@ public class CallParticipantView extends ConstraintLayout { pipBadge.setVisibility(shouldRenderInPip ? View.VISIBLE : View.GONE); } + public void setRaiseHandAllowed(boolean raiseHandAllowed) { + this.raiseHandAllowed = raiseHandAllowed; + } + + /** + * Adjust UI elements for the various self PIP positions. If called after a {@link TransitionManager#beginDelayedTransition(ViewGroup, Transition)}, + * the changes to the UI elements will animate. + */ + void setSelfPipMode(@NonNull SelfPipMode selfPipMode) { + Preconditions.checkArgument(selfPipMode != SelfPipMode.NOT_SELF_PIP); + + if (this.selfPipMode == selfPipMode) { + return; + } + + this.selfPipMode = selfPipMode; + + ConstraintSet constraints = new ConstraintSet(); + constraints.clone(this); + + switch (selfPipMode) { + case NORMAL_SELF_PIP -> { + constraints.connect( + R.id.call_participant_audio_indicator, + ConstraintSet.START, + ConstraintSet.PARENT_ID, + ConstraintSet.START, + ViewUtil.dpToPx(6) + ); + constraints.clear( + R.id.call_participant_audio_indicator, + ConstraintSet.END + ); + constraints.setMargin( + R.id.call_participant_audio_indicator, + ConstraintSet.BOTTOM, + ViewUtil.dpToPx(6) + ); + + constraints.setVisibility(R.id.call_participant_switch_camera, View.VISIBLE); + constraints.setMargin( + R.id.call_participant_switch_camera, + ConstraintSet.END, + ViewUtil.dpToPx(6) + ); + constraints.setMargin( + R.id.call_participant_switch_camera, + ConstraintSet.BOTTOM, + ViewUtil.dpToPx(6) + ); + constraints.constrainWidth(R.id.call_participant_switch_camera, ViewUtil.dpToPx(28)); + constraints.constrainHeight(R.id.call_participant_switch_camera, ViewUtil.dpToPx(28)); + + ViewGroup.LayoutParams params = switchCameraIcon.getLayoutParams(); + params.width = params.height = ViewUtil.dpToPx(16); + switchCameraIcon.setLayoutParams(params); + + switchCameraIconFrame.setClickable(false); + switchCameraIconFrame.setEnabled(false); + } + case EXPANDED_SELF_PIP -> { + constraints.connect( + R.id.call_participant_audio_indicator, + ConstraintSet.START, + ConstraintSet.PARENT_ID, + ConstraintSet.START, + ViewUtil.dpToPx(8) + ); + constraints.clear( + R.id.call_participant_audio_indicator, + ConstraintSet.END + ); + constraints.setMargin( + R.id.call_participant_audio_indicator, + ConstraintSet.BOTTOM, + ViewUtil.dpToPx(8) + ); + + constraints.setVisibility(R.id.call_participant_switch_camera, View.VISIBLE); + constraints.setMargin( + R.id.call_participant_switch_camera, + ConstraintSet.END, + ViewUtil.dpToPx(8) + ); + constraints.setMargin( + R.id.call_participant_switch_camera, + ConstraintSet.BOTTOM, + ViewUtil.dpToPx(8) + ); + constraints.constrainWidth(R.id.call_participant_switch_camera, ViewUtil.dpToPx(48)); + constraints.constrainHeight(R.id.call_participant_switch_camera, ViewUtil.dpToPx(48)); + + ViewGroup.LayoutParams params = switchCameraIcon.getLayoutParams(); + params.width = params.height = ViewUtil.dpToPx(24); + switchCameraIcon.setLayoutParams(params); + + switchCameraIconFrame.setClickable(true); + switchCameraIconFrame.setEnabled(true); + } + case MINI_SELF_PIP -> { + constraints.connect( + R.id.call_participant_audio_indicator, + ConstraintSet.START, + ConstraintSet.PARENT_ID, + ConstraintSet.START, + 0 + ); + constraints.connect( + R.id.call_participant_audio_indicator, + ConstraintSet.END, + ConstraintSet.PARENT_ID, + ConstraintSet.END, + 0 + ); + constraints.setMargin( + R.id.call_participant_audio_indicator, + ConstraintSet.BOTTOM, + ViewUtil.dpToPx(6) + ); + constraints.setVisibility(R.id.call_participant_switch_camera, View.GONE); + } + } + + constraints.applyTo(this); + } + void hideAvatar() { avatar.setAlpha(0f); badge.setAlpha(0f); @@ -302,4 +452,11 @@ public class CallParticipantView extends ConstraintLayout { return photo; } } + + public enum SelfPipMode { + NOT_SELF_PIP, + NORMAL_SELF_PIP, + EXPANDED_SELF_PIP, + MINI_SELF_PIP + } } diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsLayout.java b/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsLayout.java index 1854580d..f850e522 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsLayout.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsLayout.java @@ -28,6 +28,7 @@ public class CallParticipantsLayout extends FlexboxLayout { private static final int MULTIPLE_PARTICIPANT_SPACING = ViewUtil.dpToPx(3); private static final int CORNER_RADIUS = ViewUtil.dpToPx(10); + private static final int RAISE_HAND_MINIMUM_COUNT = 2; private List callParticipants = Collections.emptyList(); private CallParticipant focusedParticipant = null; @@ -145,6 +146,8 @@ public class CallParticipantsLayout extends FlexboxLayout { callParticipantView.useLargeAvatar(); } + callParticipantView.setRaiseHandAllowed(count >= RAISE_HAND_MINIMUM_COUNT); + layoutStrategy.setChildLayoutParams(view, index, getChildCount()); } diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsState.kt b/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsState.kt index a6992f69..35a4513d 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsState.kt +++ b/app/src/main/java/org/tm/archive/components/webrtc/CallParticipantsState.kt @@ -4,10 +4,14 @@ import android.content.Context import androidx.annotation.PluralsRes import androidx.annotation.StringRes import com.annimon.stream.OptionalLong +import kotlinx.collections.immutable.toImmutableList import org.tm.archive.R import org.tm.archive.components.webrtc.WebRtcControls.FoldableState import org.tm.archive.events.CallParticipant +import org.tm.archive.events.CallParticipant.Companion.HAND_LOWERED import org.tm.archive.events.CallParticipant.Companion.createLocal +import org.tm.archive.events.GroupCallRaiseHandEvent +import org.tm.archive.events.GroupCallReactionEvent import org.tm.archive.events.WebRtcViewModel import org.tm.archive.groups.ui.GroupMemberEntry import org.tm.archive.recipients.Recipient @@ -25,15 +29,17 @@ data class CallParticipantsState( val callState: WebRtcViewModel.State = WebRtcViewModel.State.CALL_DISCONNECTED, val groupCallState: WebRtcViewModel.GroupCallState = WebRtcViewModel.GroupCallState.IDLE, private val remoteParticipants: ParticipantCollection = ParticipantCollection(SMALL_GROUP_MAX), - val localParticipant: CallParticipant = createLocal(CameraState.UNKNOWN, BroadcastVideoSink(), false), + val localParticipant: CallParticipant = createLocal(CameraState.UNKNOWN, BroadcastVideoSink(), microphoneEnabled = false, handRaisedTimestamp = HAND_LOWERED), val focusedParticipant: CallParticipant = CallParticipant.EMPTY, val localRenderState: WebRtcLocalRenderState = WebRtcLocalRenderState.GONE, + val reactions: List = emptyList(), val isInPipMode: Boolean = false, private val showVideoForOutgoing: Boolean = false, val isViewingFocusedParticipant: Boolean = false, val remoteDevicesCount: OptionalLong = OptionalLong.empty(), private val foldableState: FoldableState = FoldableState.flat(), val isInOutgoingRingingMode: Boolean = false, + val recipient: Recipient = Recipient.UNKNOWN, val ringGroup: Boolean = false, val ringerRecipient: Recipient = Recipient.UNKNOWN, val groupMembers: List = emptyList(), @@ -42,9 +48,18 @@ data class CallParticipantsState( val allRemoteParticipants: List = remoteParticipants.allParticipants val isFolded: Boolean = foldableState.isFolded - val isLargeVideoGroup: Boolean = allRemoteParticipants.size > SMALL_GROUP_MAX + val isLargeVideoGroup: Boolean = allRemoteParticipants.size > SMALL_GROUP_MAX && !isInPipMode && !isFolded val isIncomingRing: Boolean = callState == WebRtcViewModel.State.CALL_INCOMING + val raisedHands: List + get() { + val results = allRemoteParticipants.filter { it.isHandRaised }.map { GroupCallRaiseHandEvent(it.recipient, it.handRaisedTimestamp) }.toMutableList() + if (localParticipant.isHandRaised) { + results.add(GroupCallRaiseHandEvent(localParticipant.recipient, localParticipant.handRaisedTimestamp)) + } + return results.toImmutableList() + } + val gridParticipants: List get() { return remoteParticipants.gridParticipants @@ -223,6 +238,7 @@ data class CallParticipantsState( focusedParticipant = getFocusedParticipant(webRtcViewModel.remoteParticipants), localRenderState = localRenderState, showVideoForOutgoing = newShowVideoForOutgoing, + recipient = webRtcViewModel.recipient, remoteDevicesCount = webRtcViewModel.remoteDevicesCount, ringGroup = webRtcViewModel.ringGroup, isInOutgoingRingingMode = isInOutgoingRingingMode, @@ -269,7 +285,8 @@ data class CallParticipantsState( return oldState.copy( remoteParticipants = oldState.remoteParticipants.map { p -> p.copy(audioLevel = ephemeralState.remoteAudioLevels[p.callParticipantId]) }, localParticipant = oldState.localParticipant.copy(audioLevel = ephemeralState.localAudioLevel), - focusedParticipant = oldState.focusedParticipant.copy(audioLevel = ephemeralState.remoteAudioLevels[oldState.focusedParticipant.callParticipantId]) + focusedParticipant = oldState.focusedParticipant.copy(audioLevel = ephemeralState.remoteAudioLevels[oldState.focusedParticipant.callParticipantId]), + reactions = ephemeralState.getUnexpiredReactions() ) } @@ -287,7 +304,7 @@ data class CallParticipantsState( val displayLocal: Boolean = (numberOfRemoteParticipants == 0 || !isInPip) && (isNonIdleGroupCall || localParticipant.isVideoEnabled) var localRenderState: WebRtcLocalRenderState = WebRtcLocalRenderState.GONE - if (!isInPip && isExpanded && (localParticipant.isVideoEnabled || isNonIdleGroupCall)) { + if (!isInPip && isExpanded && localParticipant.isVideoEnabled) { return WebRtcLocalRenderState.EXPANDED } else if (displayLocal || showVideoForOutgoing) { if (callState == WebRtcViewModel.State.CALL_CONNECTED || callState == WebRtcViewModel.State.CALL_RECONNECTING) { diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallReactionScrubber.kt b/app/src/main/java/org/tm/archive/components/webrtc/CallReactionScrubber.kt new file mode 100644 index 00000000..bed824c0 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/CallReactionScrubber.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc + +import android.content.Context +import android.util.AttributeSet +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.fragment.app.FragmentManager +import org.tm.archive.R +import org.tm.archive.components.emoji.EmojiImageView +import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment + +class CallReactionScrubber @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + private val emojiViews: Array + private var customEmojiIndex = 0 + + init { + inflate(context, R.layout.call_overflow_popup, this) + + emojiViews = arrayOf( + findViewById(R.id.reaction_1), + findViewById(R.id.reaction_2), + findViewById(R.id.reaction_3), + findViewById(R.id.reaction_4), + findViewById(R.id.reaction_5), + findViewById(R.id.reaction_6), + findViewById(R.id.reaction_7) + ) + customEmojiIndex = emojiViews.size - 1 + } + + fun initialize(fragmentManager: FragmentManager, listener: (String) -> Unit) { + val emojis = SignalStore.emojiValues().reactions + for (i in emojiViews.indices) { + val view = emojiViews[i] + val isAtCustomIndex = i == customEmojiIndex + if (isAtCustomIndex) { + view.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_any_emoji_32)) + view.setOnClickListener { + val bottomSheet = ReactWithAnyEmojiBottomSheetDialogFragment.createForCallingReactions() + bottomSheet.show(fragmentManager, "CallReaction") + } + } else { + val preferredVariation = SignalStore.emojiValues().getPreferredVariation(emojis[i]) + view.setImageEmoji(preferredVariation) + view.setOnClickListener { listener(preferredVariation) } + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/CallStateUpdatePopupWindow.kt b/app/src/main/java/org/tm/archive/components/webrtc/CallStateUpdatePopupWindow.kt index 5810867e..732c802b 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/CallStateUpdatePopupWindow.kt +++ b/app/src/main/java/org/tm/archive/components/webrtc/CallStateUpdatePopupWindow.kt @@ -84,7 +84,7 @@ class CallStateUpdatePopupWindow(private val parent: ViewGroup) : PopupWindow( measureChild() - val anchor: View = ViewCompat.requireViewById(parent, R.id.call_screen_footer_gradient_barrier) + val anchor: View = ViewCompat.requireViewById(parent, R.id.call_screen_above_controls_guideline) val pill: View = ViewCompat.requireViewById(contentView, R.id.call_state_pill) // 54 is the top margin of the contentView (30) plus the desired padding (24) diff --git a/app/src/main/java/org/tm/archive/components/webrtc/LayoutPositions.kt b/app/src/main/java/org/tm/archive/components/webrtc/LayoutPositions.kt new file mode 100644 index 00000000..c536a0ab --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/LayoutPositions.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ +package org.tm.archive.components.webrtc + +import androidx.annotation.Dimension +import androidx.annotation.IdRes +import androidx.constraintlayout.widget.ConstraintSet +import org.tm.archive.R + +/** Constraints to apply for different call sizes */ +enum class LayoutPositions( + @JvmField @IdRes val participantBottomViewId: Int, + @JvmField @Dimension val participantBottomMargin: Int, + @JvmField @IdRes val reactionBottomViewId: Int, + @JvmField @Dimension val reactionBottomMargin: Int +) { + /** 1:1 or small calls anchor full screen or controls */ + SMALL_GROUP( + participantBottomViewId = ConstraintSet.PARENT_ID, + participantBottomMargin = 0, + reactionBottomViewId = R.id.call_screen_above_controls_guideline, + reactionBottomMargin = 8 + ), + + /** Large calls have a participant rail to anchor to */ + LARGE_GROUP( + participantBottomViewId = R.id.call_screen_participants_recycler, + participantBottomMargin = 16, + reactionBottomViewId = R.id.call_screen_participants_recycler, + reactionBottomMargin = 20 + ); + + @JvmField + val participantBottomViewEndSide: Int = if (participantBottomViewId == ConstraintSet.PARENT_ID) ConstraintSet.BOTTOM else ConstraintSet.TOP +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/PendingParticipantsView.kt b/app/src/main/java/org/tm/archive/components/webrtc/PendingParticipantsView.kt index 0c8e18d4..d3088b9e 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/PendingParticipantsView.kt +++ b/app/src/main/java/org/tm/archive/components/webrtc/PendingParticipantsView.kt @@ -53,6 +53,8 @@ class PendingParticipantsView @JvmOverloads constructor( val firstRecipient: Recipient = unresolvedPendingParticipants.first() avatar.setAvatar(firstRecipient) + avatar.setOnClickListener { listener?.onLaunchRecipientSheet(firstRecipient) } + name.text = firstRecipient.getShortDisplayName(context) allow.setOnClickListener { listener?.onAllowPendingRecipient(firstRecipient) } @@ -70,6 +72,11 @@ class PendingParticipantsView @JvmOverloads constructor( } interface Listener { + /** + * Display the sheet containing the request for the top level participant + */ + fun onLaunchRecipientSheet(pendingRecipient: Recipient) + /** * Given recipient should be admitted to the call */ diff --git a/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureExpansionHelper.java b/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureExpansionHelper.java index 40fda602..084f031a 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureExpansionHelper.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureExpansionHelper.java @@ -1,10 +1,17 @@ package org.tm.archive.components.webrtc; +import android.graphics.Point; import android.view.View; import android.view.ViewGroup; import androidx.annotation.MainThread; import androidx.annotation.NonNull; +import androidx.transition.AutoTransition; +import androidx.transition.Transition; +import androidx.transition.TransitionListenerAdapter; +import androidx.transition.TransitionManager; + +import org.tm.archive.util.ViewUtil; /** * Helps manage the expansion and shrinking of the in-app pip. @@ -12,7 +19,29 @@ import androidx.annotation.NonNull; @MainThread final class PictureInPictureExpansionHelper { + private static final int PIP_RESIZE_DURATION_MS = 300; + private static final int EXPANDED_PIP_WIDTH_DP = 170; + private static final int EXPANDED_PIP_HEIGHT_DP = 300; + + public static final int NORMAL_PIP_WIDTH_DP = 90; + public static final int NORMAL_PIP_HEIGHT_DP = 160; + + public static final int MINI_PIP_WIDTH_DP = 40; + public static final int MINI_PIP_HEIGHT_DP = 72; + + private final View selfPip; + private final ViewGroup parent; + private final Point expandedDimensions; + private State state = State.IS_SHRUNKEN; + private Point defaultDimensions; + + public PictureInPictureExpansionHelper(@NonNull View selfPip) { + this.selfPip = selfPip; + this.parent = (ViewGroup) selfPip.getParent(); + this.defaultDimensions = new Point(selfPip.getLayoutParams().width, selfPip.getLayoutParams().height); + this.expandedDimensions = new Point(ViewUtil.dpToPx(EXPANDED_PIP_WIDTH_DP), ViewUtil.dpToPx(EXPANDED_PIP_HEIGHT_DP)); + } public boolean isExpandedOrExpanding() { return state == State.IS_EXPANDED || state == State.IS_EXPANDING; @@ -22,144 +51,84 @@ final class PictureInPictureExpansionHelper { return state == State.IS_SHRUNKEN || state == State.IS_SHRINKING; } - public void expand(@NonNull View toExpand, @NonNull Callback callback) { + public boolean isMiniSize() { + return defaultDimensions.x < ViewUtil.dpToPx(NORMAL_PIP_WIDTH_DP); + } + + public void startDefaultSizeTransition(@NonNull Point dimensions, @NonNull Callback callback) { + if (defaultDimensions.equals(dimensions)) { + return; + } + + defaultDimensions = dimensions; + if (isExpandedOrExpanding()) { return; } - performExpandAnimation(toExpand, new Callback() { + beginResizeSelfPipTransition(defaultDimensions, callback); + } + + public void beginExpandTransition() { + if (isExpandedOrExpanding()) { + return; + } + + beginResizeSelfPipTransition(expandedDimensions, new Callback() { @Override public void onAnimationWillStart() { state = State.IS_EXPANDING; - callback.onAnimationWillStart(); - } - - @Override - public void onPictureInPictureExpanded() { - callback.onPictureInPictureExpanded(); - } - - @Override - public void onPictureInPictureNotVisible() { - callback.onPictureInPictureNotVisible(); } @Override public void onAnimationHasFinished() { state = State.IS_EXPANDED; - callback.onAnimationHasFinished(); } }); } - public void shrink(@NonNull View toExpand, @NonNull Callback callback) { + public void beginShrinkTransition() { if (isShrunkenOrShrinking()) { return; } - performShrinkAnimation(toExpand, new Callback() { + beginResizeSelfPipTransition(defaultDimensions, new Callback() { @Override public void onAnimationWillStart() { state = State.IS_SHRINKING; - callback.onAnimationWillStart(); - } - - @Override - public void onPictureInPictureExpanded() { - callback.onPictureInPictureExpanded(); - } - - @Override - public void onPictureInPictureNotVisible() { - callback.onPictureInPictureNotVisible(); } @Override public void onAnimationHasFinished() { state = State.IS_SHRUNKEN; - callback.onAnimationHasFinished(); } }); } - private void performExpandAnimation(@NonNull View target, @NonNull Callback callback) { - ViewGroup parent = (ViewGroup) target.getParent(); + private void beginResizeSelfPipTransition(@NonNull Point dimension, @NonNull Callback callback) { + TransitionManager.endTransitions(parent); - float x = target.getX(); - float y = target.getY(); - float scaleX = parent.getMeasuredWidth() / (float) target.getMeasuredWidth(); - float scaleY = parent.getMeasuredHeight() / (float) target.getMeasuredHeight(); - float scale = Math.max(scaleX, scaleY); + Transition transition = new AutoTransition().setDuration(PIP_RESIZE_DURATION_MS); + transition.addListener(new TransitionListenerAdapter() { + @Override + public void onTransitionStart(@NonNull Transition transition) { + callback.onAnimationWillStart(); + } - callback.onAnimationWillStart(); + @Override + public void onTransitionEnd(@NonNull Transition transition) { + callback.onAnimationHasFinished(); + } + }); - target.animate() - .setDuration(200) - .x((parent.getMeasuredWidth() - target.getMeasuredWidth()) / 2f) - .y((parent.getMeasuredHeight() - target.getMeasuredHeight()) / 2f) - .scaleX(scale) - .scaleY(scale) - .withEndAction(() -> { - callback.onPictureInPictureExpanded(); - target.animate() - .setDuration(100) - .alpha(0f) - .withEndAction(() -> { - callback.onPictureInPictureNotVisible(); + TransitionManager.beginDelayedTransition(parent, transition); - target.setX(x); - target.setY(y); - target.setScaleX(0f); - target.setScaleY(0f); - target.setAlpha(1f); + ViewGroup.LayoutParams params = selfPip.getLayoutParams(); - target.animate() - .setDuration(200) - .scaleX(1f) - .scaleY(1f) - .withEndAction(callback::onAnimationHasFinished); - }); - }); - } + params.width = dimension.x; + params.height = dimension.y; - private void performShrinkAnimation(@NonNull View target, @NonNull Callback callback) { - ViewGroup parent = (ViewGroup) target.getParent(); - - float x = target.getX(); - float y = target.getY(); - float scaleX = parent.getMeasuredWidth() / (float) target.getMeasuredWidth(); - float scaleY = parent.getMeasuredHeight() / (float) target.getMeasuredHeight(); - float scale = Math.max(scaleX, scaleY); - - callback.onAnimationWillStart(); - - target.animate() - .setDuration(200) - .scaleX(0f) - .scaleY(0f) - .withEndAction(() -> { - target.setX((parent.getMeasuredWidth() - target.getMeasuredWidth()) / 2f); - target.setY((parent.getMeasuredHeight() - target.getMeasuredHeight()) / 2f); - target.setAlpha(0f); - target.setScaleX(scale); - target.setScaleY(scale); - - callback.onPictureInPictureNotVisible(); - - target.animate() - .setDuration(100) - .alpha(1f) - .withEndAction(() -> { - callback.onPictureInPictureExpanded(); - - target.animate() - .scaleX(1f) - .scaleY(1f) - .x(x) - .y(y) - .withEndAction(callback::onAnimationHasFinished); - }); - }); + selfPip.setLayoutParams(params); } enum State { @@ -174,24 +143,12 @@ final class PictureInPictureExpansionHelper { * Called when an animation (shrink or expand) will begin. This happens before any animation * is executed. */ - void onAnimationWillStart(); - - /** - * Called when the PiP is covering the whole screen. This is when any staging / teardown of the - * large local renderer should occur. - */ - void onPictureInPictureExpanded(); - - /** - * Called when the PiP is not visible on the screen anymore. This is when any staging / teardown - * of the pip should occur. - */ - void onPictureInPictureNotVisible(); + default void onAnimationWillStart() {} /** * Called when the animation is complete. Useful for e.g. adjusting the pip's final location to * make sure it is respecting the screen space available. */ - void onAnimationHasFinished(); + default void onAnimationHasFinished() {} } } diff --git a/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureGestureHelper.java b/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureGestureHelper.java index 17dbbec7..27af7573 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureGestureHelper.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/PictureInPictureGestureHelper.java @@ -1,9 +1,9 @@ package org.tm.archive.components.webrtc; -import android.animation.Animator; import android.annotation.SuppressLint; import android.graphics.Point; import android.view.GestureDetector; +import android.view.Gravity; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; @@ -11,19 +11,16 @@ import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; +import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.core.view.GestureDetectorCompat; import org.tm.archive.R; -import org.tm.archive.animation.AnimationCompleteListener; import org.tm.archive.util.ViewUtil; import org.tm.archive.util.views.TouchInterceptingFrameLayout; import java.util.Arrays; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Queue; public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestureListener { @@ -31,18 +28,15 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu private static final Interpolator FLING_INTERPOLATOR = new ViscousFluidInterpolator(); private static final Interpolator ADJUST_INTERPOLATOR = new AccelerateDecelerateInterpolator(); - private final ViewGroup parent; - private final View child; - private final int framePadding; - private final Queue runAfterFling; + private final ViewGroup parent; + private final View child; + private final int framePadding; private int pipWidth; private int pipHeight; - private int activePointerId = MotionEvent.INVALID_POINTER_ID; + private int activePointerId = MotionEvent.INVALID_POINTER_ID; private float lastTouchX; private float lastTouchY; - private boolean isDragging; - private boolean isAnimating; private int extraPaddingTop; private int extraPaddingBottom; private double projectionX; @@ -51,6 +45,9 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu private int maximumFlingVelocity; private boolean isLockedToBottomEnd; private Interpolator interpolator; + private Corner currentCornerPosition = Corner.BOTTOM_RIGHT; + private int previousTopBoundary = -1; + private int previousBottomBoundary = -1; @SuppressLint("ClickableViewAccessibility") public static PictureInPictureGestureHelper applyTo(@NonNull View child) { @@ -111,21 +108,31 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu this.pipWidth = child.getResources().getDimensionPixelSize(R.dimen.picture_in_picture_gesture_helper_pip_width); this.pipHeight = child.getResources().getDimensionPixelSize(R.dimen.picture_in_picture_gesture_helper_pip_height); this.maximumFlingVelocity = ViewConfiguration.get(child.getContext()).getScaledMaximumFlingVelocity(); - this.runAfterFling = new LinkedList<>(); this.interpolator = ADJUST_INTERPOLATOR; } - public void clearVerticalBoundaries() { - setTopVerticalBoundary(parent.getTop()); - setBottomVerticalBoundary(parent.getMeasuredHeight() + parent.getTop()); - } - public void setTopVerticalBoundary(int topBoundary) { + if (topBoundary == previousTopBoundary) { + return; + } + previousTopBoundary = topBoundary; + extraPaddingTop = topBoundary - parent.getTop(); + + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) child.getLayoutParams(); + layoutParams.setMargins(layoutParams.leftMargin, extraPaddingTop + framePadding, layoutParams.rightMargin, layoutParams.bottomMargin); + child.setLayoutParams(layoutParams); } public void setBottomVerticalBoundary(int bottomBoundary) { + if (bottomBoundary == previousBottomBoundary) { + return; + } + previousBottomBoundary = bottomBoundary; + extraPaddingBottom = parent.getMeasuredHeight() + parent.getTop() - bottomBoundary; + + ViewUtil.setBottomMargin(child, extraPaddingBottom + framePadding); } private boolean onGestureFinished(MotionEvent e) { @@ -139,43 +146,20 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu return false; } - public void adjustPip() { - pipWidth = child.getMeasuredWidth(); - pipHeight = child.getMeasuredHeight(); - - if (isAnimating) { - interpolator = ADJUST_INTERPOLATOR; - - fling(); - } else if (!isDragging) { - interpolator = ADJUST_INTERPOLATOR; - - onFling(null, null, 0, 0); - } - } - public void lockToBottomEnd() { isLockedToBottomEnd = true; + fling(); } public void enableCorners() { isLockedToBottomEnd = false; } - public void performAfterFling(@NonNull Runnable runnable) { - if (isAnimating) { - runAfterFling.add(runnable); - } else { - runnable.run(); - } - } - @Override public boolean onDown(MotionEvent e) { activePointerId = e.getPointerId(0); lastTouchX = e.getX(0) + child.getX(); lastTouchY = e.getY(0) + child.getY(); - isDragging = true; pipWidth = child.getMeasuredWidth(); pipHeight = child.getMeasuredHeight(); interpolator = FLING_INTERPOLATOR; @@ -185,6 +169,10 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + if (isLockedToBottomEnd) { + return false; + } + int pointerIndex = e2.findPointerIndex(activePointerId); if (pointerIndex == -1) { @@ -192,10 +180,10 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu return false; } - float x = e2.getX(pointerIndex) + child.getX(); - float y = e2.getY(pointerIndex) + child.getY(); - float dx = x - lastTouchX; - float dy = y - lastTouchY; + float x = e2.getX(pointerIndex) + child.getX(); + float y = e2.getY(pointerIndex) + child.getY(); + float dx = x - lastTouchX; + float dy = y - lastTouchY; child.setTranslationX(child.getTranslationX() + dx); child.setTranslationY(child.getTranslationY() + dy); @@ -208,6 +196,10 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + if (isLockedToBottomEnd) { + return false; + } + if (velocityTracker != null) { velocityTracker.computeCurrentVelocity(1000, maximumFlingVelocity); @@ -225,92 +217,75 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu @Override public boolean onSingleTapUp(MotionEvent e) { - isDragging = false; - child.performClick(); return true; } private void fling() { Point projection = new Point((int) projectionX, (int) projectionY); - Point nearestCornerPosition = findNearestCornerPosition(projection); + Corner nearestCornerPosition = findNearestCornerPosition(projection); - isAnimating = true; - isDragging = false; + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) child.getLayoutParams(); + layoutParams.gravity = nearestCornerPosition.gravity; + + if (currentCornerPosition != null && currentCornerPosition != nearestCornerPosition) { + adjustTranslationFrameOfReference(child, currentCornerPosition, nearestCornerPosition); + } + currentCornerPosition = nearestCornerPosition; + + child.setLayoutParams(layoutParams); child.animate() - .translationX(getTranslationXForPoint(nearestCornerPosition)) - .translationY(getTranslationYForPoint(nearestCornerPosition)) + .translationX(0) + .translationY(0) .setDuration(250) .setInterpolator(interpolator) - .setListener(new AnimationCompleteListener() { - @Override - public void onAnimationEnd(Animator animation) { - isAnimating = false; - - Iterator afterFlingRunnables = runAfterFling.iterator(); - while (afterFlingRunnables.hasNext()) { - Runnable runnable = afterFlingRunnables.next(); - - runnable.run(); - afterFlingRunnables.remove(); - } - } - }) .start(); } - private Point findNearestCornerPosition(Point projection) { + private Corner findNearestCornerPosition(Point projection) { if (isLockedToBottomEnd) { - return ViewUtil.isLtr(parent) ? calculateBottomRightCoordinates(parent) - : calculateBottomLeftCoordinates(parent); + return ViewUtil.isLtr(parent) ? Corner.BOTTOM_RIGHT + : Corner.BOTTOM_LEFT; } - Point maxPoint = null; - double maxDistance = Double.MAX_VALUE; + CornerPoint maxPoint = null; + double maxDistance = Double.MAX_VALUE; - for (Point point : Arrays.asList(calculateTopLeftCoordinates(), - calculateTopRightCoordinates(parent), - calculateBottomLeftCoordinates(parent), - calculateBottomRightCoordinates(parent))) - { - double distance = distance(point, projection); + for (CornerPoint cornerPoint : Arrays.asList(calculateTopLeftCoordinates(), + calculateTopRightCoordinates(parent), + calculateBottomLeftCoordinates(parent), + calculateBottomRightCoordinates(parent))) { + double distance = distance(cornerPoint.point, projection); if (distance < maxDistance) { maxDistance = distance; - maxPoint = point; + maxPoint = cornerPoint; } } - return maxPoint; + //noinspection DataFlowIssue + return maxPoint.corner; } - private float getTranslationXForPoint(Point destination) { - return destination.x - child.getLeft(); + private CornerPoint calculateTopLeftCoordinates() { + return new CornerPoint(new Point(framePadding, framePadding + extraPaddingTop), + Corner.TOP_LEFT); } - private float getTranslationYForPoint(Point destination) { - return destination.y - child.getTop(); + private CornerPoint calculateTopRightCoordinates(@NonNull ViewGroup parent) { + return new CornerPoint(new Point(parent.getMeasuredWidth() - pipWidth - framePadding, framePadding + extraPaddingTop), + Corner.TOP_RIGHT); } - private Point calculateTopLeftCoordinates() { - return new Point(framePadding, - framePadding + extraPaddingTop); + private CornerPoint calculateBottomLeftCoordinates(@NonNull ViewGroup parent) { + return new CornerPoint(new Point(framePadding, parent.getMeasuredHeight() - pipHeight - framePadding - extraPaddingBottom), + Corner.BOTTOM_LEFT); } - private Point calculateTopRightCoordinates(@NonNull ViewGroup parent) { - return new Point(parent.getMeasuredWidth() - pipWidth - framePadding, - framePadding + extraPaddingTop); - } - - private Point calculateBottomLeftCoordinates(@NonNull ViewGroup parent) { - return new Point(framePadding, - parent.getMeasuredHeight() - pipHeight - framePadding - extraPaddingBottom); - } - - private Point calculateBottomRightCoordinates(@NonNull ViewGroup parent) { - return new Point(parent.getMeasuredWidth() - pipWidth - framePadding, - parent.getMeasuredHeight() - pipHeight - framePadding - extraPaddingBottom); + private CornerPoint calculateBottomRightCoordinates(@NonNull ViewGroup parent) { + return new CornerPoint(new Point(parent.getMeasuredWidth() - pipWidth - framePadding, parent.getMeasuredHeight() - pipHeight - framePadding - extraPaddingBottom), + Corner.BOTTOM_RIGHT); } private static float project(float initialVelocity) { @@ -321,9 +296,80 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2)); } - /** Borrowed from ScrollView */ + + /** + * User drag is implemented by translating the view from the current gravity anchor (corner). When the user drags + * to a new corner, we need to adjust the translations for the new corner so the animation of translation X/Y to 0 + * works correctly. + * + * For example, if in bottom right and need to move to top right, we need to calculate a new translation Y since instead + * of being translated up from bottom it's translated down from the top. + */ + private void adjustTranslationFrameOfReference(@NonNull View child, @NonNull Corner previous, @NonNull Corner next) { + TouchInterceptingFrameLayout parent = (TouchInterceptingFrameLayout) child.getParent(); + FrameLayout.LayoutParams childLayoutParams = (FrameLayout.LayoutParams) child.getLayoutParams(); + int parentWidth = parent.getWidth(); + int parentHeight = parent.getHeight(); + + if (previous.topHalf != next.topHalf) { + int childHeight = childLayoutParams.height + childLayoutParams.topMargin + childLayoutParams.bottomMargin; + + float adjustedTranslationY; + if (previous.topHalf) { + adjustedTranslationY = -(parentHeight - child.getTranslationY() - childHeight); + } else { + adjustedTranslationY = parentHeight + child.getTranslationY() - childHeight; + } + child.setTranslationY(adjustedTranslationY); + } + + if (previous.leftSide != next.leftSide) { + int childWidth = childLayoutParams.width + childLayoutParams.leftMargin + childLayoutParams.rightMargin; + + float adjustedTranslationX; + if (previous.leftSide) { + adjustedTranslationX = -(parentWidth - child.getTranslationX() - childWidth); + } else { + adjustedTranslationX = parentWidth + child.getTranslationX() - childWidth; + } + child.setTranslationX(adjustedTranslationX); + } + } + + private static class CornerPoint { + final Point point; + final Corner corner; + + public CornerPoint(@NonNull Point point, @NonNull Corner corner) { + this.point = point; + this.corner = corner; + } + } + + private enum Corner { + TOP_LEFT(Gravity.TOP | Gravity.START, true, true), + TOP_RIGHT(Gravity.TOP | Gravity.END, false, true), + BOTTOM_LEFT(Gravity.BOTTOM | Gravity.START, true, false), + BOTTOM_RIGHT(Gravity.BOTTOM | Gravity.END, false, false); + + final int gravity; + final boolean leftSide; + final boolean topHalf; + + Corner(int gravity, boolean leftSide, boolean topHalf) { + this.gravity = gravity; + this.leftSide = leftSide; + this.topHalf = topHalf; + } + } + + /** + * Borrowed from ScrollView + */ private static class ViscousFluidInterpolator implements Interpolator { - /** Controls the viscous fluid effect (how much of it). */ + /** + * Controls the viscous fluid effect (how much of it). + */ private static final float VISCOUS_FLUID_SCALE = 8.0f; private static final float VISCOUS_FLUID_NORMALIZE; @@ -340,10 +386,10 @@ public class PictureInPictureGestureHelper extends GestureDetector.SimpleOnGestu private static float viscousFluid(float x) { x *= VISCOUS_FLUID_SCALE; if (x < 1.0f) { - x -= (1.0f - (float)Math.exp(-x)); + x -= (1.0f - (float) Math.exp(-x)); } else { float start = 0.36787944117f; // 1/e == exp(-1) - x = 1.0f - (float)Math.exp(1.0f - x); + x = 1.0f - (float) Math.exp(1.0f - x); x = start + x * (1.0f - start); } return x; diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutput.java b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutput.java index 38930368..256e3e12 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutput.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutput.java @@ -6,7 +6,7 @@ import androidx.annotation.StringRes; import org.tm.archive.R; public enum WebRtcAudioOutput { - HANDSET(R.string.WebRtcAudioOutputToggle__phone_earpiece, R.drawable.ic_handset_solid_24), + HANDSET(R.string.WebRtcAudioOutputToggle__phone_earpiece, R.drawable.ic_handset_solid_28), SPEAKER(R.string.WebRtcAudioOutputToggle__speaker, R.drawable.symbol_speaker_fill_white_24), BLUETOOTH_HEADSET(R.string.WebRtcAudioOutputToggle__bluetooth, R.drawable.symbol_speaker_bluetooth_fill_white_24), WIRED_HEADSET(R.string.WebRtcAudioOutputToggle__wired_headset, R.drawable.symbol_headphones_filed_24); diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputBottomSheet.kt b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputBottomSheet.kt index 93ad4dae..7e830796 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputBottomSheet.kt +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputBottomSheet.kt @@ -15,7 +15,7 @@ import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -86,7 +86,7 @@ class WebRtcAudioOutputBottomSheet : ComposeBottomSheetDialogFragment(), DialogI @Composable fun DeviceList(audioOutputOptions: ImmutableList, initialDeviceId: Int, modifier: Modifier = Modifier.fillMaxWidth(), onDeviceSelected: (AudioOutputOption) -> Unit) { - var selectedDeviceId by rememberSaveable { mutableStateOf(initialDeviceId) } + var selectedDeviceId by rememberSaveable { mutableIntStateOf(initialDeviceId) } Column( horizontalAlignment = Alignment.Start, modifier = modifier @@ -94,6 +94,7 @@ fun DeviceList(audioOutputOptions: ImmutableList, initialDevi Text( text = stringResource(R.string.WebRtcAudioOutputToggle__audio_output), style = MaterialTheme.typography.headlineMedium, + color = MaterialTheme.colorScheme.onSurface, modifier = Modifier .padding(8.dp) ) @@ -127,6 +128,7 @@ fun DeviceList(audioOutputOptions: ImmutableList, initialDevi Text( text = device.friendlyName, style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface, modifier = Modifier.padding(start = 16.dp) ) } diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputToggleButton.kt b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputToggleButton.kt index 80473e6e..3cdc73aa 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputToggleButton.kt +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioOutputToggleButton.kt @@ -86,21 +86,12 @@ class WebRtcAudioOutputToggleButton @JvmOverloads constructor(context: Context, val currentOutput = outputState.getCurrentOutput() - val numberOfOutputs = outputState.getOutputs().size - val extra = if (numberOfOutputs < SHOW_PICKER_THRESHOLD) { - when (currentOutput) { - WebRtcAudioOutput.HANDSET -> intArrayOf(R.attr.state_speaker_off) - WebRtcAudioOutput.SPEAKER -> intArrayOf(R.attr.state_speaker_on) - WebRtcAudioOutput.BLUETOOTH_HEADSET -> intArrayOf(R.attr.state_bt_headset_selected) // should never be seen in practice. - WebRtcAudioOutput.WIRED_HEADSET -> intArrayOf(R.attr.state_wired_headset_selected) // should never be seen in practice. - } - } else { - when (currentOutput) { - WebRtcAudioOutput.HANDSET -> intArrayOf(R.attr.state_handset_selected) - WebRtcAudioOutput.SPEAKER -> intArrayOf(R.attr.state_speaker_selected) - WebRtcAudioOutput.BLUETOOTH_HEADSET -> intArrayOf(R.attr.state_bt_headset_selected) - WebRtcAudioOutput.WIRED_HEADSET -> intArrayOf(R.attr.state_wired_headset_selected) - } + val shouldShowDropdownForSpeaker = outputState.getOutputs().size >= SHOW_PICKER_THRESHOLD || !outputState.getOutputs().contains(WebRtcAudioOutput.HANDSET) + val extra = when (currentOutput) { + WebRtcAudioOutput.HANDSET -> intArrayOf(R.attr.state_speaker_off) + WebRtcAudioOutput.SPEAKER -> if (shouldShowDropdownForSpeaker) intArrayOf(R.attr.state_speaker_selected) else intArrayOf(R.attr.state_speaker_on) + WebRtcAudioOutput.BLUETOOTH_HEADSET -> intArrayOf(R.attr.state_bt_headset_selected) + WebRtcAudioOutput.WIRED_HEADSET -> intArrayOf(R.attr.state_wired_headset_selected) } Log.i(TAG, "Switching to $currentOutput") diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioPicker31.kt b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioPicker31.kt index 9b1fc075..05e176f6 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioPicker31.kt +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcAudioPicker31.kt @@ -30,7 +30,7 @@ class WebRtcAudioPicker31(private val audioOutputChangedListener: OnAudioOutputC return null } - val devices: List = am.availableCommunicationDevices.map { AudioOutputOption(it.toFriendlyName(fragmentActivity).toString(), AudioDeviceMapping.fromPlatformType(it.type), it.id) }.distinct().filterNot { it.deviceType == SignalAudioManager.AudioDevice.NONE } + val devices: List = am.availableCommunicationDevices.map { AudioOutputOption(it.toFriendlyName(fragmentActivity).toString(), AudioDeviceMapping.fromPlatformType(it.type), it.id) }.distinctBy { it.deviceType.name }.filterNot { it.deviceType == SignalAudioManager.AudioDevice.NONE } val currentDeviceId = am.communicationDevice?.id ?: -1 if (devices.size < threshold) { Log.d(TAG, "Only found $devices devices,\nnot showing picker.") diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallParticipantsPagerAdapter.java b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallParticipantsPagerAdapter.java index d39e238b..547b1627 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallParticipantsPagerAdapter.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallParticipantsPagerAdapter.java @@ -112,6 +112,7 @@ class WebRtcCallParticipantsPagerAdapter extends ListAdapter groupCallSpeakerHint; private Stub groupCallFullStub; private View errorButton; - private int pagerBottomMarginDp; - private boolean controlsVisible = true; private Guideline showParticipantsGuideline; + private Guideline aboveControlsGuideline; private Guideline topFoldGuideline; private Guideline callScreenTopFoldGuideline; private AvatarImageView largeHeaderAvatar; - private Guideline statusBarGuideline; - private Guideline navigationBarGuideline; private int navBarBottomInset; private View fullScreenShade; private Toolbar collapsedToolbar; private Toolbar headerToolbar; private Stub pendingParticipantsViewStub; private Stub callLinkWarningCard; + private RecyclerView groupReactionsFeed; + private MultiReactionBurstLayout reactionViews; + private ComposeView raiseHandSnackbar; + + private WebRtcCallParticipantsPagerAdapter pagerAdapter; private WebRtcCallParticipantsRecyclerAdapter recyclerAdapter; + private WebRtcReactionsRecyclerAdapter reactionsAdapter; private PictureInPictureExpansionHelper pictureInPictureExpansionHelper; private PendingParticipantsView.Listener pendingParticipantsViewListener; @@ -145,18 +137,14 @@ public class WebRtcCallView extends ConstraintLayout { private final Set topViews = new HashSet<>(); private final Set visibleViewSet = new HashSet<>(); private final Set allTimeVisibleViews = new HashSet<>(); - private final Set adjustableMarginsSet = new HashSet<>(); private final Set rotatableControls = new HashSet<>(); - private final ThrottledDebouncer throttledDebouncer = new ThrottledDebouncer(TRANSITION_DURATION_MILLIS); private WebRtcControls controls = WebRtcControls.NONE; - private final Runnable fadeOutRunnable = () -> { - if (isAttachedToWindow() && controls.isFadeOutEnabled()) fadeOutControls(); - }; private CallParticipantsViewState lastState; private ContactPhoto previousLocalAvatar; + private LayoutPositions previousLayoutPositions = null; public WebRtcCallView(@NonNull Context context) { this(context, null); @@ -185,12 +173,11 @@ public class WebRtcCallView extends ConstraintLayout { recipientName = findViewById(R.id.call_screen_recipient_name); status = findViewById(R.id.call_screen_status); incomingRingStatus = findViewById(R.id.call_screen_incoming_ring_status); - parent = findViewById(R.id.call_screen); - participantsParent = findViewById(R.id.call_screen_participants_parent); answer = findViewById(R.id.call_screen_answer_call); answerWithoutVideoLabel = findViewById(R.id.call_screen_answer_without_video_label); cameraDirectionToggle = findViewById(R.id.call_screen_camera_direction_toggle); ringToggle = findViewById(R.id.call_screen_audio_ring_toggle); + overflow = findViewById(R.id.call_screen_overflow_button); hangup = findViewById(R.id.call_screen_end_call); answerWithoutVideo = findViewById(R.id.call_screen_answer_without_video); topGradient = findViewById(R.id.call_screen_header_gradient); @@ -204,33 +191,40 @@ public class WebRtcCallView extends ConstraintLayout { groupCallSpeakerHint = new Stub<>(findViewById(R.id.call_screen_group_call_speaker_hint)); groupCallFullStub = new Stub<>(findViewById(R.id.group_call_call_full_view)); showParticipantsGuideline = findViewById(R.id.call_screen_show_participants_guideline); + aboveControlsGuideline = findViewById(R.id.call_screen_above_controls_guideline); topFoldGuideline = findViewById(R.id.fold_top_guideline); callScreenTopFoldGuideline = findViewById(R.id.fold_top_call_screen_guideline); largeHeaderAvatar = findViewById(R.id.call_screen_header_avatar); - statusBarGuideline = findViewById(R.id.call_screen_status_bar_guideline); - navigationBarGuideline = findViewById(R.id.call_screen_navigation_bar_guideline); fullScreenShade = findViewById(R.id.call_screen_full_shade); collapsedToolbar = findViewById(R.id.webrtc_call_view_toolbar_text); headerToolbar = findViewById(R.id.webrtc_call_view_toolbar_no_text); pendingParticipantsViewStub = new Stub<>(findViewById(R.id.call_screen_pending_recipients)); callLinkWarningCard = new Stub<>(findViewById(R.id.call_screen_call_link_warning)); + groupReactionsFeed = findViewById(R.id.call_screen_reactions_feed); + reactionViews = findViewById(R.id.call_screen_reactions_container); + raiseHandSnackbar = findViewById(R.id.call_screen_raise_hand_view); - View decline = findViewById(R.id.call_screen_decline_call); - View answerLabel = findViewById(R.id.call_screen_answer_call_label); - View declineLabel = findViewById(R.id.call_screen_decline_call_label); + View decline = findViewById(R.id.call_screen_decline_call); + View answerLabel = findViewById(R.id.call_screen_answer_call_label); + View declineLabel = findViewById(R.id.call_screen_decline_call_label); callParticipantsPager.setPageTransformer(new MarginPageTransformer(ViewUtil.dpToPx(4))); - pagerAdapter = new WebRtcCallParticipantsPagerAdapter(this::toggleControls); - recyclerAdapter = new WebRtcCallParticipantsRecyclerAdapter(); + pagerAdapter = new WebRtcCallParticipantsPagerAdapter(this::toggleControls); + recyclerAdapter = new WebRtcCallParticipantsRecyclerAdapter(); + reactionsAdapter = new WebRtcReactionsRecyclerAdapter(); callParticipantsPager.setAdapter(pagerAdapter); callParticipantsRecycler.setAdapter(recyclerAdapter); + groupReactionsFeed.setAdapter(reactionsAdapter); DefaultItemAnimator animator = new DefaultItemAnimator(); animator.setSupportsChangeAnimations(false); callParticipantsRecycler.setItemAnimator(animator); + groupReactionsFeed.addItemDecoration(new WebRtcReactionsAlphaItemDecoration()); + groupReactionsFeed.setItemAnimator(new WebRtcReactionsItemAnimator()); + callParticipantsPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { @@ -238,8 +232,6 @@ public class WebRtcCallView extends ConstraintLayout { } }); - topViews.add(collapsedToolbar); - topViews.add(headerToolbar); topViews.add(largeHeader); topViews.add(topGradient); @@ -250,11 +242,6 @@ public class WebRtcCallView extends ConstraintLayout { incomingCallViews.add(footerGradient); incomingCallViews.add(incomingRingStatus); - adjustableMarginsSet.add(micToggle); - adjustableMarginsSet.add(cameraDirectionToggle); - adjustableMarginsSet.add(videoToggle); - adjustableMarginsSet.add(audioToggle); - audioToggle.setOnAudioOutputChangedListener(webRtcAudioDevice -> { runIfNonNull(controlsListener, listener -> { @@ -283,6 +270,11 @@ public class WebRtcCallView extends ConstraintLayout { }); cameraDirectionToggle.setOnClickListener(v -> runIfNonNull(controlsListener, ControlsListener::onCameraDirectionChanged)); + smallLocalRender.findViewById(R.id.call_participant_switch_camera).setOnClickListener(v -> runIfNonNull(controlsListener, ControlsListener::onCameraDirectionChanged)); + + overflow.setOnClickListener(v -> { + runIfNonNull(controlsListener, ControlsListener::onOverflowClicked); + }); hangup.setOnClickListener(v -> runIfNonNull(controlsListener, ControlsListener::onEndCallPressed)); decline.setOnClickListener(v -> runIfNonNull(controlsListener, ControlsListener::onDenyCallPressed)); @@ -291,7 +283,7 @@ public class WebRtcCallView extends ConstraintLayout { answerWithoutVideo.setOnClickListener(v -> runIfNonNull(controlsListener, ControlsListener::onAcceptCallWithVoiceOnlyPressed)); pictureInPictureGestureHelper = PictureInPictureGestureHelper.applyTo(smallLocalRenderFrame); - pictureInPictureExpansionHelper = new PictureInPictureExpansionHelper(); + pictureInPictureExpansionHelper = new PictureInPictureExpansionHelper(smallLocalRenderFrame); smallLocalRenderFrame.setOnClickListener(v -> { if (controlsListener != null) { @@ -352,6 +344,7 @@ public class WebRtcCallView extends ConstraintLayout { return false; }); + rotatableControls.add(overflow); rotatableControls.add(hangup); rotatableControls.add(answer); rotatableControls.add(answerWithoutVideo); @@ -364,25 +357,6 @@ public class WebRtcCallView extends ConstraintLayout { rotatableControls.add(ringToggle); } - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - - if (controls.isFadeOutEnabled()) { - scheduleFadeOut(); - } - } - - @Override - protected boolean fitSystemWindows(Rect insets) { - if (insets.top != 0) { - statusBarGuideline.setGuidelineBegin(insets.top); - } - navigationBarGuideline.setGuidelineEnd(insets.bottom); - - return true; - } - @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { navBarBottomInset = WindowInsetsCompat.toWindowInsetsCompat(insets).getInsets(WindowInsetsCompat.Type.navigationBars()).bottom; @@ -396,25 +370,14 @@ public class WebRtcCallView extends ConstraintLayout { @Override public void onWindowSystemUiVisibilityChanged(int visible) { + final Guideline statusBarGuideline = getStatusBarGuideline(); if ((visible & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { - if (controls.adjustForFold()) { - pictureInPictureGestureHelper.clearVerticalBoundaries(); - pictureInPictureGestureHelper.setTopVerticalBoundary(getPipBarrier().getTop()); - } else { - pictureInPictureGestureHelper.setTopVerticalBoundary(getPipBarrier().getBottom()); - pictureInPictureGestureHelper.setBottomVerticalBoundary(videoToggle.getTop()); - } + pictureInPictureGestureHelper.setTopVerticalBoundary(collapsedToolbar.getBottom()); + } else if (statusBarGuideline != null) { + pictureInPictureGestureHelper.setTopVerticalBoundary(statusBarGuideline.getBottom()); } else { - pictureInPictureGestureHelper.clearVerticalBoundaries(); + Log.d(TAG, "Could not update PiP gesture helper."); } - - pictureInPictureGestureHelper.adjustPip(); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - cancelFadeOut(); } public void rotateControls(int degrees) { @@ -477,6 +440,8 @@ public class WebRtcCallView extends ConstraintLayout { } else if (state.getGroupCallState().isRinging()) { callLinkWarningCard.setVisibility(View.GONE); setStatus(state.getIncomingRingingGroupDescription(getContext())); + } else { + callLinkWarningCard.setVisibility(View.GONE); } } @@ -491,21 +456,25 @@ public class WebRtcCallView extends ConstraintLayout { pagerAdapter.submitList(pages); recyclerAdapter.submitList(state.getListParticipants()); + reactionsAdapter.submitList(state.getReactions()); + + reactionViews.displayReactions(state.getReactions()); boolean displaySmallSelfPipInLandscape = !isPortrait && isLandscapeEnabled; - updateLocalCallParticipant(state.getLocalRenderState(), state.getLocalParticipant(), state.getFocusedParticipant(), displaySmallSelfPipInLandscape); + updateLocalCallParticipant(state.getLocalRenderState(), state.getLocalParticipant(), displaySmallSelfPipInLandscape); - if (state.isLargeVideoGroup() && !state.isInPipMode() && !state.isFolded()) { - layoutParticipantsForLargeCount(); + if (state.isLargeVideoGroup()) { + moveSnackbarAboveParticipantRail(true); + adjustLayoutForLargeCount(); } else { - layoutParticipantsForSmallCount(); + moveSnackbarAboveParticipantRail(state.isViewingFocusedParticipant()); + adjustLayoutForSmallCount(); } } public void updateLocalCallParticipant(@NonNull WebRtcLocalRenderState state, @NonNull CallParticipant localCallParticipant, - @NonNull CallParticipant focusedParticipant, boolean displaySmallSelfPipInLandscape) { largeLocalRender.setMirror(localCallParticipant.getCameraDirection() == CameraState.Direction.FRONT); @@ -520,17 +489,20 @@ public class WebRtcCallView extends ConstraintLayout { videoToggle.setChecked(localCallParticipant.isVideoEnabled(), false); smallLocalRender.setRenderInPip(true); + smallLocalRender.setCallParticipant(localCallParticipant); + smallLocalRender.setMirror(localCallParticipant.getCameraDirection() == CameraState.Direction.FRONT); if (state == WebRtcLocalRenderState.EXPANDED) { - expandPip(localCallParticipant, focusedParticipant); - smallLocalRender.setCallParticipant(focusedParticipant); + pictureInPictureExpansionHelper.beginExpandTransition(); + smallLocalRender.setSelfPipMode(CallParticipantView.SelfPipMode.EXPANDED_SELF_PIP); return; - } else if ((state == WebRtcLocalRenderState.SMALL_RECTANGLE || state == WebRtcLocalRenderState.GONE) && pictureInPictureExpansionHelper.isExpandedOrExpanding()) { - shrinkPip(localCallParticipant); - return; - } else { - smallLocalRender.setCallParticipant(localCallParticipant); - smallLocalRender.setMirror(localCallParticipant.getCameraDirection() == CameraState.Direction.FRONT); + } else if ((state.isAnySmall() || state == WebRtcLocalRenderState.GONE) && pictureInPictureExpansionHelper.isExpandedOrExpanding()) { + pictureInPictureExpansionHelper.beginShrinkTransition(); + smallLocalRender.setSelfPipMode(pictureInPictureExpansionHelper.isMiniSize() ? CallParticipantView.SelfPipMode.MINI_SELF_PIP : CallParticipantView.SelfPipMode.NORMAL_SELF_PIP); + + if (state != WebRtcLocalRenderState.GONE) { + return; + } } switch (state) { @@ -600,7 +572,15 @@ public class WebRtcCallView extends ConstraintLayout { public void setStatus(@Nullable String status) { ThreadUtil.assertMainThread(); this.status.setText(status); - collapsedToolbar.setSubtitle(status); + try { + // Toolbar's subtitle view sometimes already has a parent somehow, + // so we clear it out first so that it removes the view from its parent. + // In addition, we catch the ISE to prevent a crash. + collapsedToolbar.setSubtitle(null); + collapsedToolbar.setSubtitle(status); + } catch (IllegalStateException e) { + Log.w(TAG, "IllegalStateException trying to set status on collapsed Toolbar."); + } } private void setStatus(@StringRes int statusRes) { @@ -668,7 +648,7 @@ public class WebRtcCallView extends ConstraintLayout { topFoldGuideline.setGuidelineEnd(webRtcControls.getFold()); callScreenTopFoldGuideline.setGuidelineEnd(webRtcControls.getFold()); } else { - showParticipantsGuideline.setGuidelineBegin(((LayoutParams) statusBarGuideline.getLayoutParams()).guideBegin); + showParticipantsGuideline.setGuidelineBegin(((LayoutParams) getStatusBarGuideline().getLayoutParams()).guideBegin); showParticipantsGuideline.setGuidelineEnd(-1); topFoldGuideline.setGuidelineEnd(0); callScreenTopFoldGuideline.setGuidelineEnd(0); @@ -718,8 +698,6 @@ public class WebRtcCallView extends ConstraintLayout { } if (webRtcControls.displayAudioToggle()) { - visibleViewSet.add(audioToggle); - audioToggle.setControlAvailability(webRtcControls.isEarpieceAvailableForAudioToggle(), webRtcControls.isBluetoothHeadsetAvailableForAudioToggle(), webRtcControls.isWiredHeadsetAvailableForAudioToggle()); @@ -727,26 +705,9 @@ public class WebRtcCallView extends ConstraintLayout { audioToggle.updateAudioOutputState(webRtcControls.getAudioOutput()); } - if (webRtcControls.displayCameraToggle()) { - visibleViewSet.add(cameraDirectionToggle); - } - - if (webRtcControls.displayEndCall()) { - visibleViewSet.add(hangup); - visibleViewSet.add(footerGradient); - } - - if (webRtcControls.displayMuteAudio()) { - visibleViewSet.add(micToggle); - } - - if (webRtcControls.displayVideoToggle()) { - visibleViewSet.add(videoToggle); - } - - if (webRtcControls.displaySmallOngoingCallButtons()) { + if (webRtcControls.displaySmallCallButtons()) { updateButtonStateForSmallButtons(); - } else if (webRtcControls.displayLargeOngoingCallButtons()) { + } else { updateButtonStateForLargeButtons(); } @@ -764,32 +725,20 @@ public class WebRtcCallView extends ConstraintLayout { fullScreenShade.setVisibility(GONE); } - if (webRtcControls.displayRingToggle()) { - visibleViewSet.add(ringToggle); + if (webRtcControls.displayReactions()) { + visibleViewSet.add(reactionViews); + visibleViewSet.add(groupReactionsFeed); } - - if (webRtcControls.isFadeOutEnabled()) { - if (!controls.isFadeOutEnabled()) { - scheduleFadeOut(); - } - } else { - cancelFadeOut(); - - if (controlsListener != null) { - controlsListener.showSystemUI(); - } - } - - if (webRtcControls.adjustForFold() && webRtcControls.isFadeOutEnabled() && !controls.adjustForFold()) { - scheduleFadeOut(); + if (webRtcControls.displayRaiseHand()) { + visibleViewSet.add(raiseHandSnackbar); } boolean forceUpdate = webRtcControls.adjustForFold() && !controls.adjustForFold(); controls = webRtcControls; if (!controls.isFadeOutEnabled()) { - controlsVisible = true; + boolean controlsVisible = true; } allTimeVisibleViews.addAll(visibleViewSet); @@ -800,12 +749,7 @@ public class WebRtcCallView extends ConstraintLayout { (!webRtcControls.showSmallHeader() && largeHeaderAvatar.getVisibility() == View.GONE) || forceUpdate) { - - if (controlsListener != null) { - controlsListener.showSystemUI(); - } - - throttledDebouncer.publish(() -> fadeInNewUiState(webRtcControls.displaySmallOngoingCallButtons(), webRtcControls.showSmallHeader())); + throttledDebouncer.publish(() -> fadeInNewUiState(webRtcControls.showSmallHeader())); } onWindowSystemUiVisibilityChanged(getWindowSystemUiVisibility()); @@ -815,6 +759,10 @@ public class WebRtcCallView extends ConstraintLayout { return videoToggle; } + public @NonNull View getSwitchCameraTooltipTarget() { + return smallLocalRenderFrame; + } + public void showSpeakerViewHint() { groupCallSpeakerHint.get().setVisibility(View.VISIBLE); } @@ -825,231 +773,112 @@ public class WebRtcCallView extends ConstraintLayout { } } - private void expandPip(@NonNull CallParticipant localCallParticipant, @NonNull CallParticipant focusedParticipant) { - pictureInPictureExpansionHelper.expand(smallLocalRenderFrame, new PictureInPictureExpansionHelper.Callback() { - @Override - public void onAnimationWillStart() { - largeLocalRender.attachBroadcastVideoSink(localCallParticipant.getVideoSink()); - } - - @Override - public void onPictureInPictureExpanded() { - largeLocalRenderFrame.setVisibility(View.VISIBLE); - largeLocalRenderNoVideo.setVisibility(View.GONE); - largeLocalRenderNoVideoAvatar.setVisibility(View.GONE); - } - - @Override - public void onPictureInPictureNotVisible() { - smallLocalRender.setCallParticipant(focusedParticipant); - smallLocalRender.setMirror(false); - } - - @Override - public void onAnimationHasFinished() { - pictureInPictureGestureHelper.adjustPip(); - } - }); - } - - private void shrinkPip(@NonNull CallParticipant localCallParticipant) { - pictureInPictureExpansionHelper.shrink(smallLocalRenderFrame, new PictureInPictureExpansionHelper.Callback() { - @Override - public void onAnimationWillStart() { - } - - @Override - public void onPictureInPictureExpanded() { - largeLocalRenderFrame.setVisibility(View.GONE); - largeLocalRender.attachBroadcastVideoSink(null); - } - - @Override - public void onPictureInPictureNotVisible() { - smallLocalRender.setCallParticipant(localCallParticipant); - smallLocalRender.setMirror(localCallParticipant.getCameraDirection() == CameraState.Direction.FRONT); - - if (!localCallParticipant.isVideoEnabled()) { - smallLocalRenderFrame.setVisibility(View.GONE); - } - } - - @Override - public void onAnimationHasFinished() { - pictureInPictureGestureHelper.adjustPip(); - } - }); - } - private void animatePipToLargeRectangle(boolean isLandscape) { final Point dimens; if (isLandscape) { - dimens = new Point(ViewUtil.dpToPx(160), ViewUtil.dpToPx(90)); + dimens = new Point(ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_HEIGHT_DP), + ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_WIDTH_DP)); } else { - dimens = new Point(ViewUtil.dpToPx(90), ViewUtil.dpToPx(160)); + dimens = new Point(ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_WIDTH_DP), + ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_HEIGHT_DP)); } - SimpleAnimationListener animationListener = new SimpleAnimationListener() { + pictureInPictureExpansionHelper.startDefaultSizeTransition(dimens, new PictureInPictureExpansionHelper.Callback() { @Override - public void onAnimationEnd(Animation animation) { + public void onAnimationHasFinished() { pictureInPictureGestureHelper.enableCorners(); - pictureInPictureGestureHelper.adjustPip(); } - }; + }); - ViewGroup.LayoutParams layoutParams = smallLocalRenderFrame.getLayoutParams(); - if (layoutParams.width == dimens.x && layoutParams.height == dimens.y) { - animationListener.onAnimationEnd(null); - return; - } - - ResizeAnimation animation = new ResizeAnimation(smallLocalRenderFrame, dimens.x, dimens.y); - animation.setDuration(PIP_RESIZE_DURATION); - animation.setAnimationListener(animationListener); - - smallLocalRenderFrame.startAnimation(animation); + smallLocalRender.setSelfPipMode(CallParticipantView.SelfPipMode.NORMAL_SELF_PIP); } private void animatePipToSmallRectangle() { - pictureInPictureGestureHelper.lockToBottomEnd(); + pictureInPictureExpansionHelper.startDefaultSizeTransition(new Point(ViewUtil.dpToPx(PictureInPictureExpansionHelper.MINI_PIP_WIDTH_DP), + ViewUtil.dpToPx(PictureInPictureExpansionHelper.MINI_PIP_HEIGHT_DP)), + new PictureInPictureExpansionHelper.Callback() { + @Override + public void onAnimationHasFinished() { + pictureInPictureGestureHelper.lockToBottomEnd(); + } + }); - pictureInPictureGestureHelper.performAfterFling(() -> { - ResizeAnimation animation = new ResizeAnimation(smallLocalRenderFrame, ViewUtil.dpToPx(54), ViewUtil.dpToPx(72)); - animation.setDuration(PIP_RESIZE_DURATION); - animation.setAnimationListener(new SimpleAnimationListener() { - @Override - public void onAnimationEnd(Animation animation) { - pictureInPictureGestureHelper.adjustPip(); - } - }); - - smallLocalRenderFrame.startAnimation(animation); - }); + smallLocalRender.setSelfPipMode(CallParticipantView.SelfPipMode.MINI_SELF_PIP); } private void toggleControls() { - if (controls.isFadeOutEnabled() && largeHeader.getVisibility() == VISIBLE) { - fadeOutControls(); - } else { - fadeInControls(); - } + controlsListener.toggleControls(); } - private void fadeOutControls() { - fadeControls(ConstraintSet.GONE); - controlsListener.onControlsFadeOut(); + private void adjustLayoutForSmallCount() { + adjustLayoutPositions(LayoutPositions.SMALL_GROUP); } - private void fadeInControls() { - fadeControls(ConstraintSet.VISIBLE); - - scheduleFadeOut(); + private void adjustLayoutForLargeCount() { + adjustLayoutPositions(LayoutPositions.LARGE_GROUP); } - private void layoutParticipantsForSmallCount() { - pagerBottomMarginDp = 0; - - layoutParticipants(); - } - - private void layoutParticipantsForLargeCount() { - pagerBottomMarginDp = 104; - - layoutParticipants(); - } - - private int withControlsHeight(int margin) { - if (margin == 0) { - return 0; - } - - return (controlsVisible || controls.adjustForFold()) ? margin + CONTROLS_HEIGHT : margin; - } - - private void layoutParticipants() { - int desiredMargin = ViewUtil.dpToPx(withControlsHeight(pagerBottomMarginDp)); - if (ViewKt.getMarginBottom(callParticipantsPager) == desiredMargin) { + private void adjustLayoutPositions(@NonNull LayoutPositions layoutPositions) { + if (previousLayoutPositions == layoutPositions) { return; } - Transition transition = new AutoTransition().setDuration(TRANSITION_DURATION_MILLIS); - - TransitionManager.beginDelayedTransition(participantsParent, transition); + previousLayoutPositions = layoutPositions; ConstraintSet constraintSet = new ConstraintSet(); - constraintSet.clone(participantsParent); + constraintSet.clone(this); - constraintSet.setMargin(R.id.call_screen_participants_pager, ConstraintSet.BOTTOM, desiredMargin); - constraintSet.applyTo(participantsParent); + constraintSet.connect(R.id.call_screen_participants_parent, + ConstraintSet.BOTTOM, + layoutPositions.participantBottomViewId, + layoutPositions.participantBottomViewEndSide, + ViewUtil.dpToPx(layoutPositions.participantBottomMargin)); + + constraintSet.connect(R.id.call_screen_reactions_feed, + ConstraintSet.BOTTOM, + layoutPositions.reactionBottomViewId, + ConstraintSet.TOP, + ViewUtil.dpToPx(layoutPositions.reactionBottomMargin)); + + constraintSet.connect(pendingParticipantsViewStub.getId(), + ConstraintSet.BOTTOM, + layoutPositions.reactionBottomViewId, + ConstraintSet.TOP, + ViewUtil.dpToPx(layoutPositions.reactionBottomMargin)); + + constraintSet.applyTo(this); } - private void fadeControls(int visibility) { - controlsVisible = visibility == VISIBLE; - - Transition transition = new AutoTransition().setOrdering(TransitionSet.ORDERING_TOGETHER) - .setDuration(TRANSITION_DURATION_MILLIS); - - TransitionManager.endTransitions(parent); - - if (controlsListener != null) { - if (controlsVisible) { - controlsListener.showSystemUI(); - } else { - controlsListener.hideSystemUI(); - } - } - - TransitionManager.beginDelayedTransition(parent, transition); - - ConstraintSet constraintSet = new ConstraintSet(); - constraintSet.clone(parent); - - for (View view : controlsToFade()) { - constraintSet.setVisibility(view.getId(), visibility); - } - - adjustParticipantsRecycler(constraintSet); - - constraintSet.applyTo(parent); - - layoutParticipants(); - } - - private Set controlsToFade() { - if (controls.adjustForFold()) { - return Sets.intersection(topViews, visibleViewSet); + private void moveSnackbarAboveParticipantRail(boolean aboveRail) { + if (aboveRail) { + updateSnackbarBottomConstraint(callParticipantsRecycler); } else { - return visibleViewSet; + updateSnackbarBottomConstraint(aboveControlsGuideline); } } - private void fadeInNewUiState(boolean useSmallMargins, boolean showSmallHeader) { - Transition transition = new AutoTransition().setDuration(TRANSITION_DURATION_MILLIS); - - TransitionManager.beginDelayedTransition(parent, transition); - + private void updateSnackbarBottomConstraint(View anchor) { ConstraintSet constraintSet = new ConstraintSet(); - constraintSet.clone(parent); + constraintSet.clone(this); + constraintSet.connect(R.id.call_screen_raise_hand_view, + ConstraintSet.BOTTOM, + anchor.getId(), + ConstraintSet.TOP, + ViewUtil.dpToPx(8)); + + constraintSet.applyTo(this); + } + + private void fadeInNewUiState(boolean showSmallHeader) { for (View view : SetUtil.difference(allTimeVisibleViews, visibleViewSet)) { - constraintSet.setVisibility(view.getId(), ConstraintSet.GONE); + view.setVisibility(GONE); } for (View view : visibleViewSet) { - constraintSet.setVisibility(view.getId(), ConstraintSet.VISIBLE); - - if (adjustableMarginsSet.contains(view)) { - constraintSet.setMargin(view.getId(), - ConstraintSet.END, - ViewUtil.dpToPx(useSmallMargins ? SMALL_ONGOING_CALL_BUTTON_MARGIN_DP - : LARGE_ONGOING_CALL_BUTTON_MARGIN_DP)); - } + view.setVisibility(VISIBLE); } - adjustParticipantsRecycler(constraintSet); - - constraintSet.applyTo(parent); - if (showSmallHeader) { collapsedToolbar.setEnabled(true); collapsedToolbar.setAlpha(1); @@ -1067,28 +896,6 @@ public class WebRtcCallView extends ConstraintLayout { } } - private void adjustParticipantsRecycler(@NonNull ConstraintSet constraintSet) { - if (controlsVisible || controls.adjustForFold()) { - constraintSet.connect(R.id.call_screen_participants_recycler, ConstraintSet.BOTTOM, R.id.call_screen_video_toggle, ConstraintSet.TOP); - } else { - constraintSet.connect(R.id.call_screen_participants_recycler, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM); - } - - constraintSet.setHorizontalBias(R.id.call_screen_participants_recycler, controls.adjustForFold() ? 0.5f : 1f); - } - - private void scheduleFadeOut() { - cancelFadeOut(); - - if (getHandler() == null) return; - getHandler().postDelayed(fadeOutRunnable, FADE_OUT_DELAY); - } - - private void cancelFadeOut() { - if (getHandler() == null) return; - getHandler().removeCallbacks(fadeOutRunnable); - } - private static void runIfNonNull(@Nullable T listener, @NonNull Consumer listenerConsumer) { if (listener != null) { listenerConsumer.accept(listener); @@ -1098,19 +905,23 @@ public class WebRtcCallView extends ConstraintLayout { private void updateButtonStateForLargeButtons() { cameraDirectionToggle.setImageResource(R.drawable.webrtc_call_screen_camera_toggle); hangup.setImageResource(R.drawable.webrtc_call_screen_hangup); + overflow.setImageResource(R.drawable.webrtc_call_screen_overflow_menu); micToggle.setBackgroundResource(R.drawable.webrtc_call_screen_mic_toggle); videoToggle.setBackgroundResource(R.drawable.webrtc_call_screen_video_toggle); audioToggle.setImageResource(R.drawable.webrtc_call_screen_speaker_toggle); ringToggle.setBackgroundResource(R.drawable.webrtc_call_screen_ring_toggle); + overflow.setBackgroundResource(R.drawable.webrtc_call_screen_overflow_menu); } private void updateButtonStateForSmallButtons() { cameraDirectionToggle.setImageResource(R.drawable.webrtc_call_screen_camera_toggle_small); hangup.setImageResource(R.drawable.webrtc_call_screen_hangup_small); + overflow.setImageResource(R.drawable.webrtc_call_screen_overflow_menu_small); micToggle.setBackgroundResource(R.drawable.webrtc_call_screen_mic_toggle_small); videoToggle.setBackgroundResource(R.drawable.webrtc_call_screen_video_toggle_small); audioToggle.setImageResource(R.drawable.webrtc_call_screen_speaker_toggle_small); ringToggle.setBackgroundResource(R.drawable.webrtc_call_screen_ring_toggle_small); + overflow.setBackgroundResource(R.drawable.webrtc_call_screen_overflow_menu_small); } public void switchToSpeakerView() { @@ -1127,17 +938,26 @@ public class WebRtcCallView extends ConstraintLayout { ringToggle.setActivated(enabled); } + public void onControlTopChanged(int guidelineTop, int snackBarHeight) { + int offset = 0; + if (lastState != null) { + CallParticipantsState state = lastState.getCallParticipantsState(); + if (!state.isViewingFocusedParticipant() && !state.isLargeVideoGroup()) { + offset = snackBarHeight; + } + pictureInPictureGestureHelper.setBottomVerticalBoundary(guidelineTop - offset); + } + } + public interface ControlsListener { void onStartCall(boolean isVideoCall); void onCancelStartCall(); - void onControlsFadeOut(); - void showSystemUI(); - void hideSystemUI(); void onAudioOutputChanged(@NonNull WebRtcAudioOutput audioOutput); @RequiresApi(31) void onAudioOutputChanged31(@NonNull WebRtcAudioDevice audioOutput); void onVideoChanged(boolean isVideoEnabled); void onMicChanged(boolean isMicEnabled); + void onOverflowClicked(); void onCameraDirectionChanged(); void onEndCallPressed(); void onDenyCallPressed(); @@ -1148,5 +968,6 @@ public class WebRtcCallView extends ConstraintLayout { void onRingGroupChanged(boolean ringGroup, boolean ringingAllowed); void onCallInfoClicked(); void onNavigateUpClicked(); + void toggleControls(); } } diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallViewModel.java b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallViewModel.java index 6a5596ff..b06c8c64 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallViewModel.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcCallViewModel.java @@ -81,17 +81,18 @@ public class WebRtcCallViewModel extends ViewModel { private final Runnable elapsedTimeRunnable = this::handleTick; private final Runnable stopOutgoingRingingMode = this::stopOutgoingRingingMode; - private boolean canDisplayTooltipIfNeeded = true; - private boolean canDisplayPopupIfNeeded = true; - private boolean hasEnabledLocalVideo = false; - private boolean wasInOutgoingRingingMode = false; - private long callConnectedTime = -1; - private boolean answerWithVideoAvailable = false; - private boolean canEnterPipMode = false; - private List previousParticipantsList = Collections.emptyList(); - private boolean callStarting = false; - private boolean switchOnFirstScreenShare = true; - private boolean showScreenShareTip = true; + private boolean canDisplayTooltipIfNeeded = true; + private boolean canDisplaySwitchCameraTooltipIfNeeded = true; + private boolean canDisplayPopupIfNeeded = true; + private boolean hasEnabledLocalVideo = false; + private boolean wasInOutgoingRingingMode = false; + private long callConnectedTime = -1; + private boolean answerWithVideoAvailable = false; + private boolean canEnterPipMode = false; + private List previousParticipantsList = Collections.emptyList(); + private boolean callStarting = false; + private boolean switchOnFirstScreenShare = true; + private boolean showScreenShareTip = true; private final WebRtcCallRepository repository = new WebRtcCallRepository(ApplicationDependencies.getApplication()); @@ -253,10 +254,6 @@ public class WebRtcCallViewModel extends ViewModel { public void onLocalPictureInPictureClicked() { CallParticipantsState state = participantsState.getValue(); - if (state.getGroupCallState() != WebRtcViewModel.GroupCallState.IDLE) { - return; - } - participantsState.onNext(CallParticipantsState.setExpanded(participantsState.getValue(), state.getLocalRenderState() != WebRtcLocalRenderState.EXPANDED)); } @@ -265,6 +262,11 @@ public class WebRtcCallViewModel extends ViewModel { canDisplayTooltipIfNeeded = false; } + public void onDismissedSwitchCameraTooltip() { + canDisplaySwitchCameraTooltipIfNeeded = false; + SignalStore.tooltips().markCallingSwitchCameraTooltipSeen(); + } + @MainThread public void updateFromWebRtcViewModel(@NonNull WebRtcViewModel webRtcViewModel, boolean enableVideo) { canEnterPipMode = !webRtcViewModel.getState().isPreJoinOrNetworkUnavailable(); @@ -346,6 +348,16 @@ public class WebRtcCallViewModel extends ViewModel { } else if (!webRtcViewModel.isCellularConnection()) { canDisplayPopupIfNeeded = true; } + + if (SignalStore.tooltips().showCallingSwitchCameraTooltip() && + canDisplaySwitchCameraTooltipIfNeeded && + localParticipant.getCameraState().isEnabled() && + webRtcViewModel.getState() == WebRtcViewModel.State.CALL_CONNECTED && + !newState.getAllRemoteParticipants().isEmpty() + ) { + canDisplaySwitchCameraTooltipIfNeeded = false; + events.setValue(new Event.ShowSwitchCameraTooltip()); + } } @MainThread @@ -541,6 +553,12 @@ public class WebRtcCallViewModel extends ViewModel { public static class ShowWifiToCellularPopup extends Event { } + public static class ShowSwitchCameraTooltip extends Event { + } + + public static class DismissSwitchCameraTooltip extends Event { + } + public static class StartCall extends Event { private final boolean isVideoCall; diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcControls.java b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcControls.java index a24fbcd8..6c23e4d3 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcControls.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcControls.java @@ -8,6 +8,7 @@ import androidx.annotation.Px; import androidx.annotation.StringRes; import org.tm.archive.R; +import org.tm.archive.util.FeatureFlags; import org.tm.archive.webrtc.audio.SignalAudioManager; import java.util.Set; @@ -100,23 +101,28 @@ public final class WebRtcControls { isCallLink); } - boolean displayErrorControls() { + /** This is only true at the very start of a call and will then never be true again */ + public boolean hideControlsSheetInitially() { + return displayIncomingCallButtons() || callState == CallState.NONE; + } + + public boolean displayErrorControls() { return isError(); } - boolean displayStartCallControls() { + public boolean displayStartCallControls() { return isPreJoin(); } - boolean adjustForFold() { + public boolean adjustForFold() { return foldableState.isFolded(); } - @Px int getFold() { + public @Px int getFold() { return foldableState.getFoldPoint(); } - @StringRes int getStartCallButtonText() { + public @StringRes int getStartCallButtonText() { if (isGroupCall()) { if (groupCallState == GroupCallState.FULL) { return R.string.WebRtcCallView__call_is_full; @@ -127,86 +133,94 @@ public final class WebRtcControls { return R.string.WebRtcCallView__start_call; } - boolean isStartCallEnabled() { + public boolean isStartCallEnabled() { return groupCallState != GroupCallState.FULL; } - boolean displayGroupCallFull() { + public boolean displayGroupCallFull() { return groupCallState == GroupCallState.FULL; } - @NonNull String getGroupCallFullMessage(@NonNull Context context) { + public @NonNull String getGroupCallFullMessage(@NonNull Context context) { if (participantLimit != null) { return context.getString(R.string.WebRtcCallView__the_maximum_number_of_d_participants_has_been_Reached_for_this_call, participantLimit); } return ""; } - boolean displayGroupMembersButton() { + public boolean displayGroupMembersButton() { return (groupCallState.isAtLeast(GroupCallState.CONNECTING) && hasAtLeastOneRemote) || groupCallState.isAtLeast(GroupCallState.FULL); } - boolean displayEndCall() { + public boolean displayEndCall() { return isAtLeastOutgoing() || callState == CallState.RECONNECTING; } - boolean displayMuteAudio() { + public boolean displayOverflow() { + return FeatureFlags.groupCallReactions() && isAtLeastOutgoing() && hasAtLeastOneRemote && isGroupCall(); + } + + public boolean displayMuteAudio() { return isPreJoin() || isAtLeastOutgoing(); } - boolean displayVideoToggle() { + public boolean displayVideoToggle() { return isPreJoin() || isAtLeastOutgoing(); } - boolean displayAudioToggle() { + public boolean displayAudioToggle() { return (isPreJoin() || isAtLeastOutgoing()) && (!isLocalVideoEnabled || isBluetoothHeadsetAvailableForAudioToggle() || isWiredHeadsetAvailableForAudioToggle()); } - boolean displayCameraToggle() { - return (isPreJoin() || isAtLeastOutgoing()) && isLocalVideoEnabled && isMoreThanOneCameraAvailable; + public boolean displayCameraToggle() { + return (isPreJoin() || (isAtLeastOutgoing() && !hasAtLeastOneRemote)) && isLocalVideoEnabled && isMoreThanOneCameraAvailable && !isInPipMode; } - boolean displayRemoteVideoRecycler() { + public boolean displayRemoteVideoRecycler() { return isOngoing(); } - boolean displayAnswerWithoutVideo() { + public boolean displayAnswerWithoutVideo() { return isIncoming() && isRemoteVideoEnabled; } - boolean displayIncomingCallButtons() { + public boolean displayIncomingCallButtons() { return isIncoming(); } - boolean isEarpieceAvailableForAudioToggle() { + public boolean isEarpieceAvailableForAudioToggle() { return !isLocalVideoEnabled; } - boolean isBluetoothHeadsetAvailableForAudioToggle() { + public boolean isBluetoothHeadsetAvailableForAudioToggle() { return availableDevices.contains(SignalAudioManager.AudioDevice.BLUETOOTH); } - boolean isWiredHeadsetAvailableForAudioToggle() { + public boolean isWiredHeadsetAvailableForAudioToggle() { return availableDevices.contains(SignalAudioManager.AudioDevice.WIRED_HEADSET); } - boolean isFadeOutEnabled() { + public boolean isFadeOutEnabled() { return isAtLeastOutgoing() && isRemoteVideoEnabled && callState != CallState.RECONNECTING; } - boolean displaySmallOngoingCallButtons() { - return isAtLeastOutgoing() && displayAudioToggle() && displayCameraToggle(); + public boolean displaySmallCallButtons() { + return displayedButtonCount() >= 5; } - boolean displayLargeOngoingCallButtons() { - return isAtLeastOutgoing() && !(displayAudioToggle() && displayCameraToggle()); - } - - boolean displayTopViews() { + public boolean displayTopViews() { return !isInPipMode; } - @NonNull WebRtcAudioOutput getAudioOutput() { + public boolean displayReactions() { + return !isInPipMode; + } + + public boolean displayRaiseHand() { + return FeatureFlags.groupCallRaiseHand() && !isInPipMode; + } + + public @NonNull WebRtcAudioOutput getAudioOutput() { switch (activeDevice) { case SPEAKER_PHONE: return WebRtcAudioOutput.SPEAKER; @@ -219,15 +233,15 @@ public final class WebRtcControls { } } - boolean showSmallHeader() { + public boolean showSmallHeader() { return isAtLeastOutgoing(); } - boolean showFullScreenShade() { + public boolean showFullScreenShade() { return isPreJoin() || isIncoming(); } - boolean displayRingToggle() { + public boolean displayRingToggle() { return isPreJoin() && isGroupCall() && !isCallLink && !hasAtLeastOneRemote; } @@ -255,6 +269,16 @@ public final class WebRtcControls { return groupCallState != GroupCallState.NONE; } + private int displayedButtonCount() { + return (displayAudioToggle() ? 1 : 0) + + (displayCameraToggle() ? 1 : 0) + + (displayVideoToggle() ? 1 : 0) + + (displayMuteAudio() ? 1 : 0) + + (displayRingToggle() ? 1 : 0) + + (displayOverflow() ? 1 : 0) + + (displayEndCall() ? 1 : 0); + } + public enum CallState { NONE, ERROR, diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcLocalRenderState.java b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcLocalRenderState.java index 94fd46b2..11e394bd 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcLocalRenderState.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcLocalRenderState.java @@ -6,5 +6,9 @@ public enum WebRtcLocalRenderState { SMALLER_RECTANGLE, LARGE, LARGE_NO_VIDEO, - EXPANDED + EXPANDED; + + public boolean isAnySmall() { + return this == SMALL_RECTANGLE || this == SMALLER_RECTANGLE; + } } diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsAlphaItemDecoration.kt b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsAlphaItemDecoration.kt new file mode 100644 index 00000000..ce4429c9 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsAlphaItemDecoration.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc + +import android.graphics.Canvas +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ItemDecoration + +/** + * This fades the top 2 reactions slightly inside their recyclerview. + */ +class WebRtcReactionsAlphaItemDecoration : ItemDecoration() { + override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + for (i in 0..parent.childCount) { + val child = parent.getChildAt(i) ?: continue + when (parent.getChildAdapterPosition(child)) { + WebRtcReactionsRecyclerAdapter.MAX_REACTION_NUMBER - 1 -> child.alpha = 0.7f + WebRtcReactionsRecyclerAdapter.MAX_REACTION_NUMBER - 2 -> child.alpha = 0.9f + else -> child.alpha = 1f + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsItemAnimator.kt b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsItemAnimator.kt new file mode 100644 index 00000000..282ead96 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsItemAnimator.kt @@ -0,0 +1,235 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc + +import android.animation.Animator +import android.animation.ValueAnimator +import android.os.Build +import android.view.animation.AccelerateInterpolator +import android.view.animation.DecelerateInterpolator +import android.view.animation.Interpolator +import androidx.core.animation.doOnEnd +import androidx.recyclerview.widget.RecyclerView +import org.signal.core.util.logging.Log + +/** + * Reactions item animator based on [org.tm.archive.conversation.mutiselect.ConversationItemAnimator] + */ +class WebRtcReactionsItemAnimator : RecyclerView.ItemAnimator() { + + private data class TweeningInfo( + val property: AnimatedProperty, + val interpolator: Interpolator, + val startValue: Float, + val endValue: Float + ) { + private val range = endValue - startValue + + fun calculateCurrentValue(progress: Float): Float { + val interpolatedProgress = interpolator.getInterpolation(progress) + return startValue + (interpolatedProgress * range) + } + } + + private data class AnimationInfo( + val sharedAnimator: ValueAnimator, + val tweeningInfos: List + ) + + private enum class AnimatedProperty { + TRANSLATION_Y, + ALPHA + } + + private val accelerateInterpolator: Interpolator = AccelerateInterpolator() + private val decelerateInterpolator: Interpolator = DecelerateInterpolator() + + private val pendingAnimations: MutableMap> = mutableMapOf() + private val activeAnimations: MutableMap = mutableMapOf() + + override fun animateDisappearance(viewHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo, postLayoutInfo: ItemHolderInfo?): Boolean { + if (!pendingAnimations.containsKey(viewHolder) && + !activeAnimations.containsKey(viewHolder) + ) { + val existingAnimations = pendingAnimations[viewHolder]?.toMutableList() ?: mutableListOf() + + val startingAlpha = when (viewHolder.layoutPosition) { + WebRtcReactionsRecyclerAdapter.MAX_REACTION_NUMBER - 2 -> 0.7f + WebRtcReactionsRecyclerAdapter.MAX_REACTION_NUMBER - 3 -> 0.9f + else -> 1f + } + existingAnimations.add(TweeningInfo(AnimatedProperty.ALPHA, accelerateInterpolator, startingAlpha, 0f)) + existingAnimations.add(TweeningInfo(AnimatedProperty.TRANSLATION_Y, accelerateInterpolator, 0f, (preLayoutInfo.top - preLayoutInfo.bottom) / 2f)) + + pendingAnimations[viewHolder] = existingAnimations + dispatchAnimationStarted(viewHolder) + return true + } + + dispatchAnimationFinished(viewHolder) + return false + } + + override fun animateAppearance(viewHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo?, postLayoutInfo: ItemHolderInfo): Boolean { + if (viewHolder.absoluteAdapterPosition > 1) { + dispatchAnimationFinished(viewHolder) + return false + } + val existingAnimations = pendingAnimations[viewHolder]?.toMutableList() ?: mutableListOf() + existingAnimations.add(TweeningInfo(AnimatedProperty.ALPHA, accelerateInterpolator, 0f, 1f)) + pendingAnimations[viewHolder] = existingAnimations + return animateSlideIn(viewHolder, preLayoutInfo, postLayoutInfo) + } + + private fun animateSlideIn(viewHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo?, postLayoutInfo: ItemHolderInfo): Boolean { + if (activeAnimations.containsKey(viewHolder)) { + dispatchAnimationFinished(viewHolder) + return false + } + + val translationY = if (preLayoutInfo == null) { + postLayoutInfo.bottom - postLayoutInfo.top + } else { + preLayoutInfo.top - postLayoutInfo.top + }.toFloat() + + if (translationY == 0f) { + viewHolder.itemView.translationY = 0f + dispatchAnimationFinished(viewHolder) + return false + } + + viewHolder.itemView.translationY = translationY + + val existingAnimations = pendingAnimations[viewHolder]?.toMutableList() ?: mutableListOf() + existingAnimations.add(TweeningInfo(AnimatedProperty.TRANSLATION_Y, decelerateInterpolator, translationY, 0f)) + pendingAnimations[viewHolder] = existingAnimations + dispatchAnimationStarted(viewHolder) + + return true + } + + override fun animatePersistence(viewHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo, postLayoutInfo: ItemHolderInfo): Boolean { + return if (pendingAnimations.contains(viewHolder) || activeAnimations.containsKey(viewHolder)) { + dispatchAnimationFinished(viewHolder) + false + } else { + animateSlideIn(viewHolder, preLayoutInfo, postLayoutInfo) + } + } + + override fun animateChange(oldHolder: RecyclerView.ViewHolder, newHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo, postLayoutInfo: ItemHolderInfo): Boolean { + if (oldHolder != newHolder) { + dispatchAnimationFinished(oldHolder) + } + + return animatePersistence(newHolder, preLayoutInfo, postLayoutInfo) + } + + override fun runPendingAnimations() { + Log.d(TAG, "Starting ${pendingAnimations.size} animations.") + runPendingAnimationsInternal() + } + + private fun runPendingAnimationsInternal() { + activeAnimations.filter { pendingAnimations.containsKey(it.key) } + .forEach { + it.value.sharedAnimator.end() + handleAnimationEnd(it.key) + } + val animator = ValueAnimator.ofFloat(0f, 1f) + + animator.duration = ANIMATION_DURATION + animator.addUpdateListener { + activeAnimationsByAnimator(it).forEach { (viewHolder, animationInfo) -> + val itemView = viewHolder.itemView + animationInfo.tweeningInfos.forEach { tween -> + val currentValue = tween.calculateCurrentValue(it.animatedFraction) + when (tween.property) { + AnimatedProperty.TRANSLATION_Y -> itemView.translationY = currentValue + AnimatedProperty.ALPHA -> { + if (Build.VERSION.SDK_INT >= 29) { + itemView.transitionAlpha = currentValue + } else { + itemView.alpha = currentValue + } + } + } + } + } + } + + animator.doOnEnd { + activeAnimationsByAnimator(it) + .forEach { (viewHolder, _) -> + handleAnimationEnd(viewHolder) + } + } + + animator.start() + + activeAnimations.putAll(pendingAnimations.mapValues { AnimationInfo(animator, it.value) }) + + pendingAnimations.clear() + } + + private fun handleAnimationEnd(viewHolder: RecyclerView.ViewHolder) { + viewHolder.itemView.translationY = 0f + if (Build.VERSION.SDK_INT >= 29) { + viewHolder.itemView.transitionAlpha = 1f + } else { + viewHolder.itemView.alpha = 1f + } + activeAnimations.remove(viewHolder) + + dispatchAnimationFinished(viewHolder) + dispatchFinishedWhenDone() + } + + override fun endAnimation(item: RecyclerView.ViewHolder) { + endSlideAnimation(item) + } + + override fun endAnimations() { + endSlideAnimations() + dispatchAnimationsFinished() + } + + override fun isRunning(): Boolean { + return activeAnimations.values.any { it.sharedAnimator.isRunning } + } + + override fun onAnimationFinished(viewHolder: RecyclerView.ViewHolder) { + val parent = (viewHolder.itemView.parent as? RecyclerView) + parent?.post { parent.invalidate() } + } + + private fun endSlideAnimation(item: RecyclerView.ViewHolder) { + activeAnimations[item]?.sharedAnimator?.cancel() + } + + private fun endSlideAnimations() { + activeAnimations.values.map { it.sharedAnimator }.forEach { + it.cancel() + } + } + + private fun dispatchFinishedWhenDone() { + if (!isRunning) { + Log.d(TAG, "Finished running animations.") + dispatchAnimationsFinished() + } + } + + private fun activeAnimationsByAnimator(it: Animator): Map { + return activeAnimations.filterValues { animationInfo: AnimationInfo -> animationInfo.sharedAnimator == it } + } + + companion object { + private val TAG = Log.tag(WebRtcReactionsItemAnimator::class.java) + private const val ANIMATION_DURATION = 150L + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsRecyclerAdapter.kt b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsRecyclerAdapter.kt new file mode 100644 index 00000000..3b9adca8 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/WebRtcReactionsRecyclerAdapter.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import org.tm.archive.R +import org.tm.archive.components.emoji.EmojiImageView +import org.tm.archive.components.emoji.EmojiTextView +import org.tm.archive.events.GroupCallReactionEvent +import org.tm.archive.recipients.Recipient + +/** + * RecyclerView adapter for the reactions feed. This takes in a list of [GroupCallReactionEvent] and renders them onto the screen. + * This adapter also encapsulates logic for whether the reaction should be displayed, such as expiration and maximum visible count. + */ +class WebRtcReactionsRecyclerAdapter : ListAdapter(DiffCallback()) { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.webrtc_call_reaction_recycler_item, parent, false)) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = getItem(position) + holder.bind(item) + } + + override fun submitList(list: MutableList?) { + if (list == null) { + super.submitList(null) + } else { + super.submitList( + list.filter { it.getExpirationTimestamp() > System.currentTimeMillis() } + .sortedBy { it.timestamp } + .takeLast(MAX_REACTION_NUMBER) + .reversed() + ) + } + } + + class ViewHolder(val itemView: View) : RecyclerView.ViewHolder(itemView) { + private val emojiView: EmojiImageView = itemView.findViewById(R.id.webrtc_call_reaction_emoji_view) + private val textView: EmojiTextView = itemView.findViewById(R.id.webrtc_call_reaction_name_textview) + fun bind(item: GroupCallReactionEvent) { + emojiView.setImageEmoji(item.reaction) + textView.text = getName(item.sender) + itemView.isClickable = false + textView.isClickable = false + emojiView.isClickable = false + } + + private fun getName(recipient: Recipient): String { + return if (recipient.isSelf) { + itemView.context.getString(R.string.CallParticipant__you) + } else { + recipient.getDisplayName(itemView.context) + } + } + } + + private class DiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: GroupCallReactionEvent, newItem: GroupCallReactionEvent): Boolean { + return oldItem == newItem + } + + override fun areContentsTheSame(oldItem: GroupCallReactionEvent, newItem: GroupCallReactionEvent): Boolean { + return oldItem == newItem + } + } + + companion object { + const val MAX_REACTION_NUMBER = 5 + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/controls/CallInfoView.kt b/app/src/main/java/org/tm/archive/components/webrtc/controls/CallInfoView.kt new file mode 100644 index 00000000..88654387 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/controls/CallInfoView.kt @@ -0,0 +1,543 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.controls + +import android.content.Context +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.remember +import androidx.compose.runtime.rxjava3.subscribeAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.res.pluralStringResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.toLiveData +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import io.reactivex.rxjava3.core.BackpressureStrategy +import io.reactivex.rxjava3.core.Observable +import org.signal.core.ui.Dividers +import org.signal.core.ui.Rows +import org.signal.core.ui.theme.SignalTheme +import org.signal.ringrtc.CallLinkState +import org.tm.archive.R +import org.tm.archive.calls.links.SignalCallRow +import org.tm.archive.components.AvatarImageView +import org.tm.archive.components.webrtc.WebRtcCallViewModel +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.events.CallParticipant +import org.tm.archive.events.GroupCallRaiseHandEvent +import org.tm.archive.events.WebRtcViewModel +import org.tm.archive.groups.ui.GroupMemberEntry +import org.tm.archive.recipients.Recipient + +/** + * Renders information about a call (1:1, group, or call link) and provides actions available for + * said call (e.g., raise hand, kick, etc) + */ +object CallInfoView { + + @Composable + fun View( + webRtcCallViewModel: WebRtcCallViewModel, + controlsAndInfoViewModel: ControlsAndInfoViewModel, + callbacks: Callbacks, + modifier: Modifier + ) { + val participantsState: ParticipantsState by webRtcCallViewModel.callParticipantsState + .toFlowable(BackpressureStrategy.LATEST) + .map { state -> + ParticipantsState( + inCallLobby = state.callState == WebRtcViewModel.State.CALL_PRE_JOIN, + ringGroup = state.ringGroup, + includeSelf = state.groupCallState === WebRtcViewModel.GroupCallState.CONNECTED_AND_JOINED || state.groupCallState === WebRtcViewModel.GroupCallState.IDLE, + participantCount = if (state.participantCount.isPresent) state.participantCount.asLong.toInt() else 0, + remoteParticipants = state.allRemoteParticipants.sortedBy { it.callParticipantId.recipientId }, + localParticipant = state.localParticipant, + groupMembers = state.groupMembers.filterNot { it.member.isSelf }, + callRecipient = state.recipient, + raisedHands = state.raisedHands + ) + } + .subscribeAsState(ParticipantsState()) + + val controlAndInfoState: ControlAndInfoState by controlsAndInfoViewModel.state + + val onEditNameClicked: () -> Unit = remember(controlAndInfoState) { + { + callbacks.onEditNameClicked(controlAndInfoState.callLink?.state?.name ?: "") + } + } + + SignalTheme( + isDarkMode = true + ) { + Surface { + CallInfo( + participantsState = participantsState, + controlAndInfoState = controlAndInfoState, + onShareLinkClicked = callbacks::onShareLinkClicked, + onEditNameClicked = onEditNameClicked, + onToggleAdminApprovalClicked = callbacks::onToggleAdminApprovalClicked, + onBlock = callbacks::onBlock, + modifier = modifier + ) + } + } + } + + interface Callbacks { + fun onShareLinkClicked() + fun onEditNameClicked(name: String) + fun onToggleAdminApprovalClicked(checked: Boolean) + fun onBlock(callParticipant: CallParticipant) + } +} + +@Preview +@Composable +private fun CallInfoPreview() { + SignalTheme(isDarkMode = true) { + Surface { + val remoteParticipants = listOf(CallParticipant(recipient = Recipient.UNKNOWN)) + CallInfo( + participantsState = ParticipantsState(remoteParticipants = remoteParticipants, raisedHands = remoteParticipants.map { GroupCallRaiseHandEvent(it.recipient, System.currentTimeMillis()) }), + controlAndInfoState = ControlAndInfoState(), + onShareLinkClicked = { }, + onEditNameClicked = { }, + onToggleAdminApprovalClicked = { }, + onBlock = { } + ) + } + } +} + +@Composable +private fun CallInfo( + participantsState: ParticipantsState, + controlAndInfoState: ControlAndInfoState, + onShareLinkClicked: () -> Unit, + onEditNameClicked: () -> Unit, + onToggleAdminApprovalClicked: (Boolean) -> Unit, + onBlock: (CallParticipant) -> Unit, + modifier: Modifier = Modifier +) { + val listState = rememberLazyListState() + + LaunchedEffect(controlAndInfoState.resetScrollState) { + listState.scrollToItem(0) + } + + LazyColumn( + state = listState, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + ) { + item { + Text( + text = stringResource(id = R.string.CallLinkInfoSheet__call_info), + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(bottom = 24.dp) + ) + } + + if (controlAndInfoState.callLink != null) { + item { + SignalCallRow(callLink = controlAndInfoState.callLink, onJoinClicked = null) + + Rows.TextRow( + text = stringResource(id = R.string.CallLinkDetailsFragment__share_link), + icon = ImageVector.vectorResource(id = R.drawable.symbol_link_24), + iconModifier = Modifier + .background( + color = MaterialTheme.colorScheme.surfaceVariant, + shape = CircleShape + ) + .size(42.dp) + .padding(9.dp), + onClick = onShareLinkClicked, + modifier = Modifier + .defaultMinSize(minHeight = 64.dp) + ) + + Dividers.Default() + } + } + + if (participantsState.raisedHands.isNotEmpty()) { + item { + Box( + modifier = Modifier + .padding(horizontal = 24.dp) + .defaultMinSize(minHeight = 52.dp) + .fillMaxWidth(), + contentAlignment = Alignment.CenterStart + ) { + Text( + text = pluralStringResource(id = R.plurals.CallParticipantsListDialog__raised_hands, count = participantsState.raisedHands.size, participantsState.raisedHands.size), + style = MaterialTheme.typography.titleSmall + ) + } + } + + items( + items = participantsState.raisedHands, + key = { it.sender.id }, + contentType = { null } + ) { + HandRaisedRow(recipient = it.sender) + } + + item { + Dividers.Default() + } + } + + var includeAdminControlsDivider = true + if (controlAndInfoState.callLink == null || participantsState.isOngoing()) { + item { + Box( + modifier = Modifier + .padding(horizontal = 24.dp) + .defaultMinSize(minHeight = 52.dp) + .fillMaxWidth(), + contentAlignment = Alignment.CenterStart + ) { + Text( + text = getCallSheetLabel(participantsState), + style = MaterialTheme.typography.titleSmall + ) + } + } + } else { + includeAdminControlsDivider = false + } + + if (!participantsState.inCallLobby || participantsState.isOngoing()) { + items( + items = participantsState.participantsForList, + key = { it.callParticipantId }, + contentType = { null } + ) { + CallParticipantRow( + callParticipant = it, + isSelfAdmin = controlAndInfoState.isSelfAdmin() && !participantsState.inCallLobby, + onBlockClicked = onBlock + ) + } + } else if (participantsState.isGroupCall()) { + items( + items = participantsState.groupMembers, + key = { it.member.id.toLong() }, + contentType = { null } + ) { + GroupMemberRow( + groupMember = it, + isSelfAdmin = false + ) + } + } else if (controlAndInfoState.callLink == null) { + item { + CallParticipantRow( + initialRecipient = participantsState.callRecipient, + name = participantsState.callRecipient.getShortDisplayName(LocalContext.current), + showIcons = false, + isVideoEnabled = false, + isMicrophoneEnabled = false, + showHandRaised = false, + canLowerHand = false, + isSelfAdmin = false, + onBlockClicked = {} + ) + } + } + + if (controlAndInfoState.callLink?.credentials?.adminPassBytes != null) { + item { + if (includeAdminControlsDivider) { + Dividers.Default() + } + + Rows.TextRow( + text = stringResource(id = R.string.CallLinkDetailsFragment__add_call_name), + onClick = onEditNameClicked + ) + Rows.ToggleRow( + checked = controlAndInfoState.callLink.state.restrictions == CallLinkState.Restrictions.ADMIN_APPROVAL, + text = stringResource(id = R.string.CallLinkDetailsFragment__approve_all_members), + onCheckChanged = onToggleAdminApprovalClicked + ) + } + } + + item { + Spacer(modifier = Modifier.size(48.dp)) + } + } +} + +@Composable +private fun getCallSheetLabel(state: ParticipantsState): String { + return if (!state.inCallLobby || state.isOngoing()) { + pluralStringResource(id = R.plurals.CallParticipantsListDialog_in_this_call, count = state.participantCountForDisplay, state.participantCountForDisplay) + } else if (state.isGroupCall()) { + val groupSize = state.groupMembers.size + if (state.ringGroup) { + pluralStringResource(id = R.plurals.CallParticipantsListDialog__signal_will_ring, count = groupSize, groupSize) + } else { + pluralStringResource(id = R.plurals.CallParticipantsListDialog__signal_will_notify, count = groupSize, groupSize) + } + } else { + pluralStringResource(id = R.plurals.CallParticipantsListDialog__signal_will_ring, count = 1, 1) + } +} + +@Preview +@Composable +private fun CallParticipantRowPreview() { + SignalTheme(isDarkMode = true) { + Surface { + CallParticipantRow( + CallParticipant(recipient = Recipient.UNKNOWN), + isSelfAdmin = true + ) {} + } + } +} + +@Preview +@Composable +private fun HandRaisedRowPreview() { + SignalTheme(isDarkMode = true) { + Surface { + HandRaisedRow(Recipient.UNKNOWN, canLowerHand = true) + } + } +} + +@Composable +private fun CallParticipantRow( + callParticipant: CallParticipant, + isSelfAdmin: Boolean, + onBlockClicked: (CallParticipant) -> Unit +) { + CallParticipantRow( + initialRecipient = callParticipant.recipient, + name = callParticipant.getShortRecipientDisplayName(LocalContext.current), + showIcons = true, + isVideoEnabled = callParticipant.isVideoEnabled, + isMicrophoneEnabled = callParticipant.isMicrophoneEnabled, + showHandRaised = false, + canLowerHand = false, + isSelfAdmin = isSelfAdmin, + onBlockClicked = { onBlockClicked(callParticipant) } + ) +} + +@Composable +private fun HandRaisedRow(recipient: Recipient, canLowerHand: Boolean = recipient.isSelf) { + CallParticipantRow( + initialRecipient = recipient, + name = recipient.getShortDisplayName(LocalContext.current), + showIcons = true, + isVideoEnabled = true, + isMicrophoneEnabled = true, + showHandRaised = true, + canLowerHand = canLowerHand, + isSelfAdmin = false, + onBlockClicked = {} + ) +} + +@Composable +private fun CallParticipantRow( + initialRecipient: Recipient, + name: String, + showIcons: Boolean, + isVideoEnabled: Boolean, + isMicrophoneEnabled: Boolean, + showHandRaised: Boolean, + canLowerHand: Boolean, + isSelfAdmin: Boolean, + onBlockClicked: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(Rows.defaultPadding()) + ) { + val recipient by ((if (LocalInspectionMode.current) Observable.just(Recipient.UNKNOWN) else Recipient.observable(initialRecipient.id))) + .toFlowable(BackpressureStrategy.LATEST) + .toLiveData() + .observeAsState(initial = initialRecipient) + + if (LocalInspectionMode.current) { + Spacer( + modifier = Modifier + .size(40.dp) + .background(color = Color.Red, shape = CircleShape) + ) + } else { + AndroidView( + factory = ::AvatarImageView, + modifier = Modifier.size(40.dp) + ) { + it.setAvatarUsingProfile(recipient) + } + } + + Spacer(modifier = Modifier.width(24.dp)) + + Text( + text = name, + modifier = Modifier + .weight(1f) + .align(Alignment.CenterVertically) + ) + + if (showIcons && showHandRaised && canLowerHand) { + val context = LocalContext.current + TextButton(onClick = { + if (recipient.isSelf) { + showLowerHandDialog(context) + } + }) { + Text(text = stringResource(id = R.string.CallOverflowPopupWindow__lower_hand)) + } + Spacer(modifier = Modifier.width(16.dp)) + } + + if (showIcons && showHandRaised) { + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.symbol_raise_hand_24), + contentDescription = null, + modifier = Modifier.align(Alignment.CenterVertically) + ) + } + + if (showIcons && !isVideoEnabled) { + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.symbol_video_slash_24), + contentDescription = null, + modifier = Modifier.align(Alignment.CenterVertically) + ) + } + + if (showIcons && !isMicrophoneEnabled) { + if (!isVideoEnabled) { + Spacer(modifier = Modifier.width(16.dp)) + } + + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.symbol_mic_slash_24), + contentDescription = null, + modifier = Modifier.align(Alignment.CenterVertically) + ) + } + + if (showIcons && isSelfAdmin && !recipient.isSelf) { + if (!isMicrophoneEnabled) { + Spacer(modifier = Modifier.width(16.dp)) + } + + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.symbol_minus_circle_24), + contentDescription = null, + modifier = Modifier + .clickable(onClick = onBlockClicked) + .align(Alignment.CenterVertically) + ) + } + } +} + +private fun showLowerHandDialog(context: Context) { + MaterialAlertDialogBuilder(context) + .setTitle(R.string.CallOverflowPopupWindow__lower_your_hand) + .setPositiveButton( + R.string.CallOverflowPopupWindow__lower_hand + ) { _, _ -> ApplicationDependencies.getSignalCallManager().raiseHand(false) } + .setNegativeButton(R.string.CallOverflowPopupWindow__cancel, null) + .show() +} + +@Composable +private fun GroupMemberRow( + groupMember: GroupMemberEntry.FullMember, + isSelfAdmin: Boolean +) { + CallParticipantRow( + initialRecipient = groupMember.member, + name = groupMember.member.getShortDisplayName(LocalContext.current), + showIcons = false, + isVideoEnabled = false, + isMicrophoneEnabled = false, + showHandRaised = false, + canLowerHand = false, + isSelfAdmin = isSelfAdmin + ) {} +} + +private data class ParticipantsState( + val inCallLobby: Boolean = false, + val ringGroup: Boolean = true, + val includeSelf: Boolean = false, + val participantCount: Int = 0, + val remoteParticipants: List = emptyList(), + val localParticipant: CallParticipant? = null, + val groupMembers: List = emptyList(), + val callRecipient: Recipient = Recipient.UNKNOWN, + val raisedHands: List = emptyList() +) { + + val participantsForList: List = if (includeSelf && localParticipant != null) { + listOf(localParticipant) + remoteParticipants + } else { + remoteParticipants + } + + val participantCountForDisplay: Int = if (participantCount == 0) { + participantsForList.size + } else { + participantCount + } + + fun isGroupCall(): Boolean { + return groupMembers.isNotEmpty() + } + + fun isOngoing(): Boolean { + return remoteParticipants.isNotEmpty() + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlAndInfoState.kt b/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlAndInfoState.kt new file mode 100644 index 00000000..87d14b52 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlAndInfoState.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.controls + +import androidx.compose.runtime.Immutable +import org.tm.archive.database.CallLinkTable + +@Immutable +data class ControlAndInfoState( + val callLink: CallLinkTable.CallLink? = null, + val resetScrollState: Long = 0 +) { + fun isSelfAdmin(): Boolean { + return callLink?.credentials?.adminPassBytes != null + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlsAndInfoController.kt b/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlsAndInfoController.kt new file mode 100644 index 00000000..8d2cda2a --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlsAndInfoController.kt @@ -0,0 +1,465 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.controls + +import android.content.ActivityNotFoundException +import android.content.Intent +import android.content.res.ColorStateList +import android.os.Handler +import android.view.View +import android.widget.FrameLayout +import android.widget.Toast +import androidx.annotation.IdRes +import androidx.annotation.Px +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.compose.ui.platform.rememberNestedScrollInteropConnection +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.constraintlayout.widget.Guideline +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.app.ShareCompat +import androidx.core.content.ContextCompat +import androidx.transition.AutoTransition +import androidx.transition.TransitionManager +import androidx.transition.TransitionSet +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback +import com.google.android.material.bottomsheet.BottomSheetBehaviorHack +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.shape.CornerFamily +import com.google.android.material.shape.MaterialShapeDrawable +import com.google.android.material.shape.ShapeAppearanceModel +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.disposables.Disposable +import io.reactivex.rxjava3.kotlin.addTo +import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.core.util.dp +import org.signal.core.util.logging.Log +import org.tm.archive.R +import org.tm.archive.WebRtcCallActivity +import org.tm.archive.calls.links.CallLinks +import org.tm.archive.calls.links.EditCallLinkNameDialogFragment +import org.tm.archive.calls.links.EditCallLinkNameDialogFragmentArgs +import org.tm.archive.components.InsetAwareConstraintLayout +import org.tm.archive.components.webrtc.CallOverflowPopupWindow +import org.tm.archive.components.webrtc.WebRtcCallView +import org.tm.archive.components.webrtc.WebRtcCallViewModel +import org.tm.archive.components.webrtc.WebRtcControls +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.events.CallParticipant +import org.tm.archive.service.webrtc.links.UpdateCallLinkResult +import org.tm.archive.util.padding +import org.tm.archive.util.visible +import kotlin.math.max +import kotlin.time.Duration.Companion.seconds + +/** + * Brain for rendering the call controls and info within a bottom sheet. + */ +class ControlsAndInfoController( + private val webRtcCallActivity: WebRtcCallActivity, + private val webRtcCallView: WebRtcCallView, + private val overflowPopupWindow: CallOverflowPopupWindow, + private val viewModel: WebRtcCallViewModel, + private val controlsAndInfoViewModel: ControlsAndInfoViewModel +) : CallInfoView.Callbacks, Disposable { + + companion object { + private val TAG = Log.tag(ControlsAndInfoController::class.java) + + private const val CONTROL_FADE_OUT_START = 0f + private const val CONTROL_FADE_OUT_DONE = 0.23f + private const val INFO_FADE_IN_START = CONTROL_FADE_OUT_DONE + private const val INFO_FADE_IN_DONE = 0.8f + private const val CONTROL_TRANSITION_DURATION = 250L + + private val HIDE_CONTROL_DELAY = 5.seconds.inWholeMilliseconds + } + + private val disposables = CompositeDisposable() + + private val coordinator: CoordinatorLayout + private val frame: FrameLayout + private val behavior: BottomSheetBehavior + private val callInfoComposeView: ComposeView + private val raiseHandComposeView: ComposeView + private val callControls: ConstraintLayout + private val aboveControlsGuideline: Guideline + private val bottomSheetVisibilityListeners = mutableSetOf() + private val scheduleHideControlsRunnable: Runnable = Runnable { onScheduledHide() } + private val handler: Handler? + get() = webRtcCallView.handler + + private var previousCallControlHeight = 0 + private var controlPeakHeight = 0 + private var controlState: WebRtcControls = WebRtcControls.NONE + + init { + val infoTranslationDistance = 24f.dp + coordinator = webRtcCallView.findViewById(R.id.call_controls_info_coordinator) + frame = webRtcCallView.findViewById(R.id.call_controls_info_parent) + behavior = BottomSheetBehavior.from(frame) + callInfoComposeView = webRtcCallView.findViewById(R.id.call_info_compose) + callControls = webRtcCallView.findViewById(R.id.call_controls_constraint_layout) + raiseHandComposeView = webRtcCallView.findViewById(R.id.call_screen_raise_hand_view) + aboveControlsGuideline = webRtcCallView.findViewById(R.id.call_screen_above_controls_guideline) + + callInfoComposeView.apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + val nestedScrollInterop = rememberNestedScrollInteropConnection() + CallInfoView.View(viewModel, controlsAndInfoViewModel, this@ControlsAndInfoController, Modifier.nestedScroll(nestedScrollInterop)) + } + } + + callInfoComposeView.alpha = 0f + callInfoComposeView.translationY = infoTranslationDistance + + raiseHandComposeView.apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + RaiseHandSnackbar.View(viewModel, showCallInfoListener = ::showCallInfo) + } + } + + frame.background = MaterialShapeDrawable( + ShapeAppearanceModel.builder() + .setTopLeftCorner(CornerFamily.ROUNDED, 18.dp.toFloat()) + .setTopRightCorner(CornerFamily.ROUNDED, 18.dp.toFloat()) + .build() + ).apply { + fillColor = ColorStateList.valueOf(ContextCompat.getColor(webRtcCallActivity, R.color.signal_colorSurface)) + } + + behavior.isHideable = true + behavior.peekHeight = 0 + behavior.state = BottomSheetBehavior.STATE_HIDDEN + BottomSheetBehaviorHack.setNestedScrollingChild(behavior, callInfoComposeView) + + coordinator.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> + webRtcCallView.post { onControlTopChanged() } + } + + raiseHandComposeView.addOnLayoutChangeListener { _, _, top, _, bottom, _, _, _, _ -> + onControlTopChanged(composeViewSize = bottom - top) + } + + callControls.viewTreeObserver.addOnGlobalLayoutListener { + if (callControls.height > 0 && callControls.height != previousCallControlHeight) { + previousCallControlHeight = callControls.height + controlPeakHeight = callControls.height + callControls.y.toInt() + behavior.peekHeight = controlPeakHeight + frame.minimumHeight = coordinator.height / 2 + behavior.maxHeight = (coordinator.height.toFloat() * 0.66f).toInt() + + webRtcCallView.post { onControlTopChanged() } + } + } + + behavior.addBottomSheetCallback(object : BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + overflowPopupWindow.dismiss() + if (newState == BottomSheetBehavior.STATE_COLLAPSED) { + controlsAndInfoViewModel.resetScrollState() + if (controlState.isFadeOutEnabled) { + hide(delay = HIDE_CONTROL_DELAY) + } + } else if (newState == BottomSheetBehavior.STATE_EXPANDED || newState == BottomSheetBehavior.STATE_DRAGGING) { + cancelScheduledHide() + } else if (newState == BottomSheetBehavior.STATE_HIDDEN) { + controlsAndInfoViewModel.resetScrollState() + } + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) { + callControls.alpha = alphaControls(slideOffset) + callControls.visible = callControls.alpha > 0f + + callInfoComposeView.alpha = alphaCallInfo(slideOffset) + callInfoComposeView.translationY = infoTranslationDistance - (infoTranslationDistance * callInfoComposeView.alpha) + + onControlTopChanged() + } + }) + + webRtcCallView.addWindowInsetsListener(object : InsetAwareConstraintLayout.WindowInsetsListener { + override fun onApplyWindowInsets(statusBar: Int, navigationBar: Int, parentStart: Int, parentEnd: Int) { + if (navigationBar > 0) { + callControls.padding(bottom = navigationBar) + } + } + }) + + overflowPopupWindow.setOnDismissListener { + hide(delay = HIDE_CONTROL_DELAY) + } + + webRtcCallActivity + .supportFragmentManager + .setFragmentResultListener(EditCallLinkNameDialogFragment.RESULT_KEY, webRtcCallActivity) { resultKey, bundle -> + if (bundle.containsKey(resultKey)) { + setName(bundle.getString(resultKey)!!) + } + } + } + + fun onControlTopChanged(composeViewSize: Int = raiseHandComposeView.height) { + val guidelineTop = max(frame.top, coordinator.height - behavior.peekHeight) + aboveControlsGuideline.setGuidelineBegin(guidelineTop) + webRtcCallView.onControlTopChanged(guidelineTop, composeViewSize) + } + + fun addVisibilityListener(listener: BottomSheetVisibilityListener): Boolean { + return bottomSheetVisibilityListeners.add(listener) + } + + fun showCallInfo() { + cancelScheduledHide() + behavior.isHideable = false + behavior.state = BottomSheetBehavior.STATE_EXPANDED + } + + private fun showControls() { + cancelScheduledHide() + behavior.isHideable = false + behavior.state = BottomSheetBehavior.STATE_COLLAPSED + + bottomSheetVisibilityListeners.forEach { it.onShown() } + } + + private fun hide(delay: Long = 0L) { + if (delay == 0L) { + if (controlState.isFadeOutEnabled || controlState == WebRtcControls.PIP) { + behavior.isHideable = true + behavior.state = BottomSheetBehavior.STATE_HIDDEN + + bottomSheetVisibilityListeners.forEach { it.onHidden() } + } + } else { + cancelScheduledHide() + handler?.postDelayed(scheduleHideControlsRunnable, delay) + } + } + + fun toggleControls() { + if (behavior.state == BottomSheetBehavior.STATE_EXPANDED || behavior.state == BottomSheetBehavior.STATE_HIDDEN) { + showControls() + } else { + hide() + } + } + + fun toggleOverflowPopup() { + if (overflowPopupWindow.isShowing) { + overflowPopupWindow.dismiss() + } else { + cancelScheduledHide() + overflowPopupWindow.show(aboveControlsGuideline) + } + } + + fun updateControls(newControlState: WebRtcControls) { + val previousState = controlState + controlState = newControlState + + showOrHideControlsOnUpdate(previousState) + + if (controlState != WebRtcControls.PIP && controlState.controlVisibilitiesChanged(previousState)) { + updateControlVisibilities() + } + } + + fun restartHideControlsTimer() { + hide(delay = HIDE_CONTROL_DELAY) + } + + private fun showOrHideControlsOnUpdate(previousState: WebRtcControls) { + if (controlState == WebRtcControls.PIP) { + hide() + return + } + + if (controlState.hideControlsSheetInitially()) { + return + } + + if (previousState.hideControlsSheetInitially() && (previousState != WebRtcControls.PIP)) { + showControls() + return + } + + if (controlState.isFadeOutEnabled) { + if (!previousState.isFadeOutEnabled) { + hide(delay = HIDE_CONTROL_DELAY) + } + } else { + cancelScheduledHide() + if (behavior.state != BottomSheetBehavior.STATE_EXPANDED) { + showControls() + } + } + } + + private fun updateControlVisibilities() { + TransitionManager.endTransitions(callControls) + TransitionManager.beginDelayedTransition( + callControls, + AutoTransition().apply { + ordering = TransitionSet.ORDERING_TOGETHER + duration = CONTROL_TRANSITION_DURATION + } + ) + + val constraints = ConstraintSet().apply { + clone(callControls) + val margin = if (controlState.displaySmallCallButtons()) 4.dp else 8.dp + + setControlConstraints(R.id.call_screen_speaker_toggle, controlState.displayAudioToggle(), margin) + setControlConstraints(R.id.call_screen_camera_direction_toggle, controlState.displayCameraToggle(), margin) + setControlConstraints(R.id.call_screen_video_toggle, controlState.displayVideoToggle(), margin) + setControlConstraints(R.id.call_screen_audio_mic_toggle, controlState.displayMuteAudio(), margin) + setControlConstraints(R.id.call_screen_audio_ring_toggle, controlState.displayRingToggle(), margin) + setControlConstraints(R.id.call_screen_overflow_button, controlState.displayOverflow(), margin) + setControlConstraints(R.id.call_screen_end_call, controlState.displayEndCall(), margin) + } + + constraints.applyTo(callControls) + } + + private fun onScheduledHide() { + if (behavior.state != BottomSheetBehavior.STATE_EXPANDED && !isDisposed) { + hide() + } + } + + private fun cancelScheduledHide() { + handler?.removeCallbacks(scheduleHideControlsRunnable) + } + + private fun alphaControls(slideOffset: Float): Float { + return if (slideOffset <= CONTROL_FADE_OUT_START) { + 1f + } else if (slideOffset >= CONTROL_FADE_OUT_DONE) { + 0f + } else { + 1f - (1f * (slideOffset - CONTROL_FADE_OUT_START) / (CONTROL_FADE_OUT_DONE - CONTROL_FADE_OUT_START)) + } + } + + private fun alphaCallInfo(slideOffset: Float): Float { + return if (slideOffset >= INFO_FADE_IN_DONE) { + 1f + } else if (slideOffset <= INFO_FADE_IN_START) { + 0f + } else { + (1f * (slideOffset - INFO_FADE_IN_START) / (INFO_FADE_IN_DONE - INFO_FADE_IN_START)) + } + } + + override fun dispose() { + disposables.dispose() + } + + override fun isDisposed(): Boolean { + return disposables.isDisposed + } + + override fun onShareLinkClicked() { + val mimeType = Intent.normalizeMimeType("text/plain") + val shareIntent = ShareCompat.IntentBuilder(webRtcCallActivity) + .setText(CallLinks.url(controlsAndInfoViewModel.rootKeySnapshot)) + .setType(mimeType) + .createChooserIntent() + + try { + webRtcCallActivity.startActivity(shareIntent) + } catch (e: ActivityNotFoundException) { + Toast.makeText(webRtcCallActivity, R.string.CreateCallLinkBottomSheetDialogFragment__failed_to_open_share_sheet, Toast.LENGTH_LONG).show() + } + } + + override fun onEditNameClicked(name: String) { + EditCallLinkNameDialogFragment().apply { + arguments = EditCallLinkNameDialogFragmentArgs.Builder(name).build().toBundle() + }.show(webRtcCallActivity.supportFragmentManager, null) + } + + override fun onToggleAdminApprovalClicked(checked: Boolean) { + controlsAndInfoViewModel.setApproveAllMembers(checked) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy(onSuccess = { + if (it !is UpdateCallLinkResult.Success) { + Log.w(TAG, "Failed to change restrictions. $it") + toastFailure() + } + }, onError = handleError("onApproveAllMembersChanged")) + .addTo(disposables) + } + + override fun onBlock(callParticipant: CallParticipant) { + MaterialAlertDialogBuilder(webRtcCallActivity) + .setNegativeButton(android.R.string.cancel, null) + .setMessage(webRtcCallView.resources.getString(R.string.CallLinkInfoSheet__remove_s_from_the_call, callParticipant.recipient.getShortDisplayName(webRtcCallActivity))) + .setPositiveButton(R.string.CallLinkInfoSheet__remove) { _, _ -> + ApplicationDependencies.getSignalCallManager().removeFromCallLink(callParticipant) + } + .setNeutralButton(R.string.CallLinkInfoSheet__block_from_call) { _, _ -> + ApplicationDependencies.getSignalCallManager().blockFromCallLink(callParticipant) + } + .show() + } + + private fun setName(name: String) { + controlsAndInfoViewModel.setName(name) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy( + onSuccess = { + if (it !is UpdateCallLinkResult.Success) { + Log.w(TAG, "Failed to set name. $it") + toastFailure() + } + }, + onError = handleError("setName") + ) + .addTo(disposables) + } + + private fun handleError(method: String): (throwable: Throwable) -> Unit { + return { + Log.w(TAG, "Failure during $method", it) + toastFailure() + } + } + + private fun toastFailure() { + Toast.makeText(webRtcCallActivity, R.string.CallLinkDetailsFragment__couldnt_save_changes, Toast.LENGTH_LONG).show() + } + + private fun ConstraintSet.setControlConstraints(@IdRes viewId: Int, visible: Boolean, @Px horizontalMargins: Int) { + setVisibility(viewId, if (visible) View.VISIBLE else View.GONE) + setMargin(viewId, ConstraintSet.START, horizontalMargins) + setMargin(viewId, ConstraintSet.END, horizontalMargins) + } + + private fun WebRtcControls.controlVisibilitiesChanged(previousState: WebRtcControls): Boolean { + return displayAudioToggle() != previousState.displayAudioToggle() || + displayCameraToggle() != previousState.displayCameraToggle() || + displayVideoToggle() != previousState.displayVideoToggle() || + displayMuteAudio() != previousState.displayMuteAudio() || + displayRingToggle() != previousState.displayRingToggle() || + displayOverflow() != previousState.displayOverflow() || + displayEndCall() != previousState.displayEndCall() + } + + interface BottomSheetVisibilityListener { + fun onShown() + fun onHidden() + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlsAndInfoViewModel.kt b/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlsAndInfoViewModel.kt new file mode 100644 index 00000000..2dbe7680 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/controls/ControlsAndInfoViewModel.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.controls + +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.ringrtc.CallLinkState +import org.tm.archive.calls.links.CallLinks +import org.tm.archive.calls.links.UpdateCallLinkRepository +import org.tm.archive.calls.links.details.CallLinkDetailsRepository +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId +import org.tm.archive.service.webrtc.links.UpdateCallLinkResult + +/** + * Provides a view model communicating with the Controls and Info view, [CallInfoView]. + */ +class ControlsAndInfoViewModel( + private val repository: CallLinkDetailsRepository = CallLinkDetailsRepository(), + private val mutationRepository: UpdateCallLinkRepository = UpdateCallLinkRepository() +) : ViewModel() { + private val disposables = CompositeDisposable() + private var callRecipientId: RecipientId? = null + private val _state = mutableStateOf(ControlAndInfoState()) + val state: State = _state + + val rootKeySnapshot: ByteArray + get() = state.value.callLink?.credentials?.linkKeyBytes ?: error("Call link not loaded yet.") + + fun setRecipient(recipient: Recipient) { + if (recipient.isCallLink && callRecipientId != recipient.id) { + callRecipientId = recipient.id + disposables += repository.refreshCallLinkState(recipient.requireCallLinkRoomId()) + disposables += CallLinks.watchCallLink(recipient.requireCallLinkRoomId()).subscribeBy { + _state.value = _state.value.copy(callLink = it) + } + } + } + + override fun onCleared() { + super.onCleared() + disposables.dispose() + } + + fun resetScrollState() { + _state.value = _state.value.copy(resetScrollState = System.currentTimeMillis()) + } + + fun setApproveAllMembers(approveAllMembers: Boolean): Single { + val credentials = _state.value.callLink?.credentials ?: error("User cannot change the name of this call.") + return mutationRepository.setCallRestrictions(credentials, if (approveAllMembers) CallLinkState.Restrictions.ADMIN_APPROVAL else CallLinkState.Restrictions.NONE) + } + + fun setName(name: String): Single { + val credentials = _state.value.callLink?.credentials ?: error("User cannot change the name of this call.") + return mutationRepository.setCallName(credentials, name) + } + + class Factory : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return modelClass.cast(ControlsAndInfoViewModel()) as T + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/controls/RaiseHandSnackbar.kt b/app/src/main/java/org/tm/archive/components/webrtc/controls/RaiseHandSnackbar.kt new file mode 100644 index 00000000..ce3ac4ba --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/controls/RaiseHandSnackbar.kt @@ -0,0 +1,241 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.controls + +import android.content.Context +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.expandIn +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkOut +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rxjava3.subscribeAsState +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.pluralStringResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import io.reactivex.rxjava3.core.BackpressureStrategy +import kotlinx.coroutines.delay +import org.signal.core.ui.theme.SignalTheme +import org.tm.archive.R +import org.tm.archive.components.webrtc.WebRtcCallViewModel +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.events.GroupCallRaiseHandEvent +import org.tm.archive.recipients.Recipient +import java.util.concurrent.TimeUnit + +/** + * This is a UI element to display the status of one or more people with raised hands in a group call. + * It supports both an expanded and collapsed mode. + */ +object RaiseHandSnackbar { + const val TAG = "RaiseHandSnackbar" + private val COLLAPSE_DELAY_MS = TimeUnit.SECONDS.toMillis(4L) + + @Composable + fun View(webRtcCallViewModel: WebRtcCallViewModel, showCallInfoListener: () -> Unit, modifier: Modifier = Modifier) { + var expansionState by remember { mutableStateOf(ExpansionState(shouldExpand = false, forced = false)) } + + val webRtcState by webRtcCallViewModel.callParticipantsState + .toFlowable(BackpressureStrategy.LATEST) + .map { state -> + val raisedHands = state.raisedHands.sortedByDescending { it.timestamp } + val shouldExpand = RaiseHandState.shouldExpand(raisedHands) + if (!expansionState.forced) { + expansionState = ExpansionState(shouldExpand, false) + } + raisedHands + }.subscribeAsState(initial = emptyList()) + + val state by remember { + derivedStateOf { + RaiseHandState(raisedHands = webRtcState, expansionState = expansionState) + } + } + + LaunchedEffect(expansionState) { + delay(COLLAPSE_DELAY_MS) + expansionState = ExpansionState(shouldExpand = false, forced = false) + } + + RaiseHand(state, modifier, { expansionState = ExpansionState(shouldExpand = true, forced = true) }, showCallInfoListener = showCallInfoListener) + } +} + +@Preview +@Composable +private fun RaiseHandSnackbarPreview() { + RaiseHand( + state = RaiseHandState(listOf(GroupCallRaiseHandEvent(Recipient.UNKNOWN, System.currentTimeMillis()))) + ) +} + +@Composable +private fun RaiseHand( + state: RaiseHandState, + modifier: Modifier = Modifier, + setExpanded: (Boolean) -> Unit = {}, + showCallInfoListener: () -> Unit = {} +) { + AnimatedVisibility( + visible = state.raisedHands.isNotEmpty(), + enter = fadeIn() + expandIn(expandFrom = Alignment.CenterEnd), + exit = shrinkOut(shrinkTowards = Alignment.CenterEnd) + fadeOut() + ) { + SignalTheme( + isDarkMode = true + ) { + Surface( + modifier = modifier + .padding(horizontal = 16.dp) + .clip(shape = RoundedCornerShape(16.dp, 16.dp, 16.dp, 16.dp)) + .background(MaterialTheme.colorScheme.surface) + .animateContentSize() + ) { + val boxModifier = modifier + .padding(horizontal = 16.dp) + .clickable( + !state.isExpanded, + stringResource(id = R.string.CallOverflowPopupWindow__expand_snackbar_accessibility_label), + Role.Button + ) { setExpanded(true) } + + Box( + contentAlignment = Alignment.CenterStart, + modifier = if (state.isExpanded) { + boxModifier.fillMaxWidth() + } else { + boxModifier.wrapContentWidth() + } + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.symbol_raise_hand_24), + contentDescription = null, + modifier = Modifier.align(Alignment.CenterVertically).padding(vertical = 8.dp) + ) + + Text( + text = getSnackbarText(state), + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .padding(start = 16.dp) + .weight(1f, fill = state.isExpanded) + .wrapContentWidth(Alignment.Start) + .padding(vertical = 16.dp) + ) + if (state.isExpanded) { + if (state.raisedHands.first().sender.isSelf) { + val context = LocalContext.current + TextButton( + onClick = { + showLowerHandDialog(context) + }, + modifier = Modifier.wrapContentWidth(Alignment.End) + ) { + Text(text = stringResource(id = R.string.CallOverflowPopupWindow__lower_hand), maxLines = 1) + } + } else { + TextButton( + onClick = showCallInfoListener, + modifier = Modifier.wrapContentWidth(Alignment.End) + ) { + Text(text = stringResource(id = R.string.CallOverflowPopupWindow__view), maxLines = 1) + } + } + } + } + } + } + } + } +} + +private fun showLowerHandDialog(context: Context) { + MaterialAlertDialogBuilder(context) + .setTitle(R.string.CallOverflowPopupWindow__lower_your_hand) + .setPositiveButton( + R.string.CallOverflowPopupWindow__lower_hand + ) { _, _ -> ApplicationDependencies.getSignalCallManager().raiseHand(false) } + .setNegativeButton(R.string.CallOverflowPopupWindow__cancel, null) + .show() +} + +@Composable +private fun getSnackbarText(state: RaiseHandState): String { + if (state.isEmpty) { + return "" + } + return if (!state.isExpanded) { + pluralStringResource(id = R.plurals.CallRaiseHandSnackbar_raised_hands, count = state.raisedHands.size, getShortDisplayName(state.raisedHands), state.raisedHands.size - 1) + } else { + if (state.raisedHands.size == 1 && state.raisedHands.first().sender.isSelf) { + stringResource(id = R.string.CallOverflowPopupWindow__you_raised_your_hand) + } else { + pluralStringResource(id = R.plurals.CallOverflowPopupWindow__raised_a_hand, count = state.raisedHands.size, state.raisedHands.first().sender.getShortDisplayName(LocalContext.current), state.raisedHands.size - 1) + } + } +} + +@Composable +private fun getShortDisplayName(raisedHands: List): String { + val recipient = raisedHands.first().sender + return if (recipient.isSelf) { + stringResource(id = R.string.CallParticipant__you) + } else { + recipient.getShortDisplayName(LocalContext.current) + } +} + +private data class RaiseHandState( + val raisedHands: List = emptyList(), + val expansionState: ExpansionState = ExpansionState(shouldExpand = false, forced = false) +) { + val isExpanded = expansionState.shouldExpand && raisedHands.isNotEmpty() + + val isEmpty = raisedHands.isEmpty() + + companion object { + @JvmStatic + fun shouldExpand(raisedHands: List): Boolean { + val now = System.currentTimeMillis() + return raisedHands.any { it.getCollapseTimestamp() > now } + } + } +} + +private data class ExpansionState( + val shouldExpand: Boolean, + val forced: Boolean +) diff --git a/app/src/main/java/org/tm/archive/components/webrtc/participantslist/CallParticipantsListHeader.java b/app/src/main/java/org/tm/archive/components/webrtc/participantslist/CallParticipantsListHeader.java index 1b614130..688269e6 100644 --- a/app/src/main/java/org/tm/archive/components/webrtc/participantslist/CallParticipantsListHeader.java +++ b/app/src/main/java/org/tm/archive/components/webrtc/participantslist/CallParticipantsListHeader.java @@ -16,7 +16,7 @@ public class CallParticipantsListHeader implements MappingModel { + return Recipient.observable(recipientId).flatMapSingle { recipient -> + if (recipient.hasGroupsInCommon()) { + Single.fromCallable { + val groupsInCommon = SignalDatabase.groups.getGroupsContainingMember(recipient.id, true) + val total = groupsInCommon.size + val names = groupsInCommon.take(2).map { it.title!! } + GroupsInCommon(total, names) + }.observeOn(Schedulers.io()) + } else { + Single.just(GroupsInCommon(0, listOf())) + } + } + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestSheet.kt b/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestSheet.kt new file mode 100644 index 00000000..fe2d41f5 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestSheet.kt @@ -0,0 +1,235 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.requests + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rxjava3.subscribeAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Alignment.Companion.CenterVertically +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.os.bundleOf +import androidx.fragment.app.FragmentManager +import org.signal.core.ui.BottomSheets +import org.signal.core.ui.Dividers +import org.signal.core.ui.Rows +import org.signal.core.ui.theme.SignalTheme +import org.signal.core.util.getParcelableCompat +import org.tm.archive.R +import org.tm.archive.components.AvatarImageView +import org.tm.archive.compose.ComposeBottomSheetDialogFragment +import org.tm.archive.dependencies.ApplicationDependencies +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId +import org.tm.archive.util.BottomSheetUtil +import org.tm.archive.util.viewModel + +/** + * Displayed when the user presses the user avatar in the call link join request + * bar. + */ +class CallLinkIncomingRequestSheet : ComposeBottomSheetDialogFragment() { + + companion object { + private const val RECIPIENT_ID = "recipient_id" + + @JvmStatic + fun show(fragmentManager: FragmentManager, recipientId: RecipientId) { + CallLinkIncomingRequestSheet().apply { + arguments = bundleOf( + RECIPIENT_ID to recipientId + ) + }.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + } + } + + override val forceDarkTheme = true + + private val recipientId: RecipientId by lazy { + requireArguments().getParcelableCompat(RECIPIENT_ID, RecipientId::class.java)!! + } + + private val viewModel by viewModel { + CallLinkIncomingRequestViewModel(recipientId) + } + + @Composable + override fun SheetContent() { + val state = viewModel.observeState(LocalContext.current).subscribeAsState(initial = CallLinkIncomingRequestState()) + if (state.value.recipient == Recipient.UNKNOWN) { + return + } + + CallLinkIncomingRequestSheetContent( + state = state.value, + onApproveEntry = this::onApproveEntry, + onDenyEntry = this::onDenyEntry + ) + } + + private fun onApproveEntry() { + ApplicationDependencies.getSignalCallManager().setCallLinkJoinRequestAccepted(recipientId) + dismissAllowingStateLoss() + } + + private fun onDenyEntry() { + ApplicationDependencies.getSignalCallManager().setCallLinkJoinRequestRejected(recipientId) + dismissAllowingStateLoss() + } +} + +@Preview +@Composable +private fun CallLinkIncomingRequestSheetContentPreview() { + SignalTheme(isDarkMode = true) { + Surface { + CallLinkIncomingRequestSheetContent( + state = CallLinkIncomingRequestState( + name = "Miles Morales", + subtitle = "+1 (555) 555-5555", + groupsInCommon = "Member of Webheads", + isSystemContact = true + ), + onApproveEntry = {}, + onDenyEntry = {} + ) + } + } +} + +@Composable +private fun CallLinkIncomingRequestSheetContent( + state: CallLinkIncomingRequestState, + onApproveEntry: () -> Unit, + onDenyEntry: () -> Unit +) { + LazyColumn( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + item { BottomSheets.Handle() } + item { Avatar(state.recipient) } + item { + Title( + recipientName = state.name, + isSystemContact = state.isSystemContact + ) + } + + if (state.subtitle.isNotEmpty()) { + item { + Text( + text = state.subtitle, + modifier = Modifier.padding(4.dp) + ) + } + } + + if (state.groupsInCommon.isNotEmpty()) { + item { + Text( + text = state.groupsInCommon, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(6.dp) + ) + } + } + + item { + Dividers.Default() + } + + item { + Rows.TextRow( + text = stringResource(id = R.string.CallLinkIncomingRequestSheet__approve_entry), + icon = ImageVector.vectorResource(R.drawable.symbol_check_circle_24), + onClick = onApproveEntry + ) + } + + item { + Rows.TextRow( + text = stringResource(id = R.string.CallLinkIncomingRequestSheet__deny_entry), + icon = ImageVector.vectorResource(R.drawable.symbol_x_circle_24), + onClick = onDenyEntry + ) + } + + item { + Spacer(modifier = Modifier.size(32.dp)) + } + } +} + +@Composable +private fun Avatar( + recipient: Recipient +) { + if (LocalInspectionMode.current) { + Spacer( + modifier = Modifier + .padding(top = 13.dp) + .size(80.dp) + .background(color = Color.Red, shape = CircleShape) + ) + } else { + AndroidView( + factory = ::AvatarImageView, + modifier = Modifier + .size(80.dp) + .padding(top = 13.dp) + ) { + it.setAvatarUsingProfile(recipient) + } + } +} + +@Composable +private fun Title( + recipientName: String, + isSystemContact: Boolean +) { + if (isSystemContact) { + Row(modifier = Modifier.padding(top = 12.dp)) { + Text( + text = recipientName, + style = MaterialTheme.typography.headlineMedium + ) + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.symbol_person_circle_24), + contentDescription = null, + modifier = Modifier + .padding(start = 6.dp) + .align(CenterVertically) + ) + } + } else { + Text( + text = recipientName, + style = MaterialTheme.typography.headlineMedium + ) + } +} diff --git a/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestState.kt b/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestState.kt new file mode 100644 index 00000000..0d7d6343 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestState.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.requests + +import androidx.compose.runtime.Stable +import org.tm.archive.recipients.Recipient + +data class CallLinkIncomingRequestState( + val recipient: Recipient = Recipient.UNKNOWN, + val name: String = "", + val isSystemContact: Boolean = false, + val subtitle: String = "", + @Stable val groupsInCommon: String = "" +) diff --git a/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestViewModel.kt b/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestViewModel.kt new file mode 100644 index 00000000..65e2b190 --- /dev/null +++ b/app/src/main/java/org/tm/archive/components/webrtc/requests/CallLinkIncomingRequestViewModel.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.tm.archive.components.webrtc.requests + +import android.content.Context +import androidx.lifecycle.ViewModel +import io.reactivex.rxjava3.core.BackpressureStrategy +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign +import org.tm.archive.recipients.Recipient +import org.tm.archive.recipients.RecipientId +import org.tm.archive.util.rx.RxStore + +class CallLinkIncomingRequestViewModel( + private val recipientId: RecipientId +) : ViewModel() { + + private val repository = CallLinkIncomingRequestRepository() + private val store = RxStore(CallLinkIncomingRequestState()) + private val disposables = CompositeDisposable().apply { + add(store) + } + + override fun onCleared() { + disposables.dispose() + } + + fun observeState(context: Context): Flowable { + disposables += store.update(Recipient.observable(recipientId).toFlowable(BackpressureStrategy.LATEST)) { r, s -> + s.copy( + recipient = r, + name = r.getShortDisplayName(context), + subtitle = r.e164.orElse(""), + isSystemContact = r.isSystemContact + ) + } + + disposables += store.update(repository.getGroupsInCommon(recipientId).toFlowable(BackpressureStrategy.LATEST)) { g, s -> + s.copy(groupsInCommon = g.toDisplayText(context)) + } + + return store.stateFlowable + } +} diff --git a/app/src/main/java/org/tm/archive/compose/ComposeBottomSheetDialogFragment.kt b/app/src/main/java/org/tm/archive/compose/ComposeBottomSheetDialogFragment.kt index 212ba809..10be5349 100644 --- a/app/src/main/java/org/tm/archive/compose/ComposeBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/tm/archive/compose/ComposeBottomSheetDialogFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.platform.ComposeView @@ -17,14 +18,20 @@ import org.tm.archive.util.DynamicTheme abstract class ComposeBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogFragment() { + protected open val forceDarkTheme = false + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return ComposeView(requireContext()).apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { SignalTheme( - isDarkMode = DynamicTheme.isDarkTheme(LocalContext.current) + isDarkMode = forceDarkTheme || DynamicTheme.isDarkTheme(LocalContext.current) ) { - Surface(shape = RoundedCornerShape(18.dp, 18.dp)) { + Surface( + shape = RoundedCornerShape(18.dp, 18.dp), + color = SignalTheme.colors.colorSurface1, + contentColor = MaterialTheme.colorScheme.onSurface + ) { SheetContent() } } diff --git a/app/src/main/java/org/tm/archive/compose/StatusBarColorAnimator.kt b/app/src/main/java/org/tm/archive/compose/StatusBarColorAnimator.kt new file mode 100644 index 00000000..999a3986 --- /dev/null +++ b/app/src/main/java/org/tm/archive/compose/StatusBarColorAnimator.kt @@ -0,0 +1,62 @@ +package org.tm.archive.compose + +import android.animation.ValueAnimator +import android.app.Activity +import androidx.core.content.ContextCompat +import com.google.android.material.animation.ArgbEvaluatorCompat +import org.tm.archive.R +import org.tm.archive.util.WindowUtil + +/** + * Controls status-bar color based off ability to scroll up + */ +class StatusBarColorAnimator( + private val activity: Activity +) { + private var animator: ValueAnimator? = null + private var previousCanScrollUp: Boolean = false + + private val normalColor = ContextCompat.getColor(activity, R.color.signal_colorBackground) + private val scrollColor = ContextCompat.getColor(activity, R.color.signal_colorSurface2) + + fun setCanScrollUp(canScrollUp: Boolean) { + if (previousCanScrollUp == canScrollUp) { + return + } + + previousCanScrollUp = canScrollUp + applyState(canScrollUp) + } + + fun setColorImmediate() { + val end = when { + previousCanScrollUp -> scrollColor + else -> normalColor + } + + animator?.cancel() + WindowUtil.setStatusBarColor( + activity.window, + end + ) + } + + private fun applyState(canScrollUp: Boolean) { + val (start, end) = when { + canScrollUp -> normalColor to scrollColor + else -> scrollColor to normalColor + } + + animator?.cancel() + animator = ValueAnimator.ofFloat(0f, 1f).apply { + duration = 200 + addUpdateListener { + WindowUtil.setStatusBarColor( + activity.window, + ArgbEvaluatorCompat.getInstance().evaluate(it.animatedFraction, start, end) + ) + } + start() + } + } +} diff --git a/app/src/main/java/org/tm/archive/contacts/TurnOffContactJoinedNotificationsActivity.java b/app/src/main/java/org/tm/archive/contacts/TurnOffContactJoinedNotificationsActivity.java index c7e0e74d..bd99aade 100644 --- a/app/src/main/java/org/tm/archive/contacts/TurnOffContactJoinedNotificationsActivity.java +++ b/app/src/main/java/org/tm/archive/contacts/TurnOffContactJoinedNotificationsActivity.java @@ -47,8 +47,8 @@ public class TurnOffContactJoinedNotificationsActivity extends AppCompatActivity }) .setNegativeButton(android.R.string.cancel, ((dialog, which) -> { dialog.dismiss(); - finish(); })) + .setOnDismissListener(dialog -> finish()) .show(); } @@ -65,7 +65,6 @@ public class TurnOffContactJoinedNotificationsActivity extends AppCompatActivity return null; }, unused -> { dialog.dismiss(); - finish(); }); } } diff --git a/app/src/main/java/org/tm/archive/contacts/avatars/ProfileContactPhoto.java b/app/src/main/java/org/tm/archive/contacts/avatars/ProfileContactPhoto.java index c88cb337..df880ba2 100644 --- a/app/src/main/java/org/tm/archive/contacts/avatars/ProfileContactPhoto.java +++ b/app/src/main/java/org/tm/archive/contacts/avatars/ProfileContactPhoto.java @@ -66,4 +66,8 @@ public class ProfileContactPhoto implements ContactPhoto { public int hashCode() { return Objects.hash(recipient, avatarObject, profileAvatarFileDetails); } + + public @NonNull Recipient getRecipient() { + return recipient; + } } diff --git a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchAdapter.kt b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchAdapter.kt index 5661792d..1213f17e 100644 --- a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchAdapter.kt +++ b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchAdapter.kt @@ -27,7 +27,6 @@ import org.tm.archive.contacts.avatars.GeneratedContactPhoto import org.tm.archive.database.model.DistributionListPrivacyMode import org.tm.archive.database.model.StoryViewState import org.tm.archive.keyvalue.SignalStore -import org.tm.archive.phonenumbers.PhoneNumberFormatter import org.tm.archive.recipients.Recipient import org.tm.archive.util.adapter.mapping.LayoutFactory import org.tm.archive.util.adapter.mapping.MappingAdapter @@ -437,8 +436,7 @@ open class ContactSearchAdapter( number.text = recipient.combinedAboutAndEmoji number.visible = true } else if (displayOptions.displaySecondaryInformation == DisplaySecondaryInformation.ALWAYS && recipient.hasE164()) { - number.text = PhoneNumberFormatter.prettyPrint(recipient.requireE164()) - number.visible = true + number.visible = false } else { super.bindNumberField(model) } diff --git a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchKey.kt b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchKey.kt index 52dd001c..ee9e8a90 100644 --- a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchKey.kt +++ b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchKey.kt @@ -34,10 +34,14 @@ sealed class ContactSearchKey { data class UnknownRecipientKey(val sectionKey: ContactSearchConfiguration.SectionKey, val query: String) : ContactSearchKey() { override fun requireSelectedContact(): SelectedContact = when (sectionKey) { - ContactSearchConfiguration.SectionKey.USERNAME -> SelectedContact.forPhone(null, query) + ContactSearchConfiguration.SectionKey.USERNAME -> SelectedContact.forUsername(null, query) ContactSearchConfiguration.SectionKey.PHONE_NUMBER -> SelectedContact.forPhone(null, query) else -> error("Unexpected section for unknown recipient: $sectionKey") } + + override fun toString(): String { + return "UnknownRecipientKey(sectionKey=$sectionKey)" + } } /** diff --git a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchMediator.kt b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchMediator.kt index 0b884432..75c77321 100644 --- a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchMediator.kt +++ b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchMediator.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable +import org.signal.core.util.logging.Log import org.tm.archive.R import org.tm.archive.conversationlist.chatfilter.ConversationFilterRequest import org.tm.archive.groups.SelectionLimits @@ -50,6 +51,10 @@ class ContactSearchMediator( arbitraryRepository: ArbitraryRepository? = null ) { + companion object { + private val TAG = Log.tag(ContactSearchMediator::class.java) + } + private val queryDebouncer = Debouncer(300, TimeUnit.MILLISECONDS) private val viewModel: ContactSearchViewModel = ViewModelProvider( @@ -70,14 +75,17 @@ class ContactSearchMediator( displayOptions = displayOptions, callbacks = object : ContactSearchAdapter.ClickCallbacks { override fun onStoryClicked(view: View, story: ContactSearchData.Story, isSelected: Boolean) { + Log.d(TAG, "onStoryClicked() Recipient: ${story.recipient.id}") toggleStorySelection(view, story, isSelected) } override fun onKnownRecipientClicked(view: View, knownRecipient: ContactSearchData.KnownRecipient, isSelected: Boolean) { + Log.d(TAG, "onKnownRecipientClicked() Recipient: ${knownRecipient.recipient.id}") toggleSelection(view, knownRecipient, isSelected) } override fun onExpandClicked(expand: ContactSearchData.Expand) { + Log.d(TAG, "onExpandClicked()") viewModel.expandSection(expand.sectionKey) } }, @@ -119,6 +127,7 @@ class ContactSearchMediator( } fun setKeysSelected(keys: Set) { + Log.d(TAG, "setKeysSelected() Keys: ${keys.map { it.toString() }}") viewModel.setKeysSelected(callbacks.onBeforeContactsSelected(null, keys)) } @@ -133,6 +142,10 @@ class ContactSearchMediator( viewModel.clearSelection() } + fun getSelectedMembersSize(): Int { + return viewModel.getSelectedMembersSize() + } + fun getSelectedContacts(): Set { return viewModel.getSelectedContacts() } @@ -167,9 +180,11 @@ class ContactSearchMediator( private fun toggleSelection(view: View, contactSearchData: ContactSearchData, isSelected: Boolean) { return if (isSelected) { + Log.d(TAG, "toggleSelection(OFF) ${contactSearchData.contactSearchKey}") callbacks.onContactDeselected(view, contactSearchData.contactSearchKey) viewModel.setKeysNotSelected(setOf(contactSearchData.contactSearchKey)) } else { + Log.d(TAG, "toggleSelection(ON) ${contactSearchData.contactSearchKey}") viewModel.setKeysSelected(callbacks.onBeforeContactsSelected(view, setOf(contactSearchData.contactSearchKey))) } } @@ -212,10 +227,13 @@ class ContactSearchMediator( open class SimpleCallbacks : Callbacks { override fun onBeforeContactsSelected(view: View?, contactSearchKeys: Set): Set { + Log.d(TAG, "onBeforeContactsSelected() Selecting: ${contactSearchKeys.map { it.toString() }}") return contactSearchKeys } - override fun onContactDeselected(view: View?, contactSearchKey: ContactSearchKey) = Unit + override fun onContactDeselected(view: View?, contactSearchKey: ContactSearchKey) { + Log.i(TAG, "onContactDeselected() Deselected: $contactSearchKey}") + } override fun onAdapterListCommitted(size: Int) = Unit } diff --git a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchViewModel.kt b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchViewModel.kt index b0d0ebc3..4d0eb1e3 100644 --- a/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchViewModel.kt +++ b/app/src/main/java/org/tm/archive/contacts/paged/ContactSearchViewModel.kt @@ -55,10 +55,14 @@ class ContactSearchViewModel( val selectionState: LiveData> = selectionStore.stateLiveData val errorEventsStream: Observable = errorEvents + private var selectionSize = 0 override fun onCleared() { disposables.clear() } + fun getSelectedMembersSize(): Int { + return selectionSize + } fun setConfiguration(contactSearchConfiguration: ContactSearchConfiguration) { val pagedDataSource = ContactSearchPagedDataSource( contactSearchConfiguration, @@ -90,7 +94,7 @@ class ContactSearchViewModel( val newSelectionEntries = results.filter { it.isSelectable }.map { it.key } - getSelectedContacts() val newSelectionSize = newSelectionEntries.size + getSelectedContacts().size - + selectionSize = newSelectionSize if (selectionLimits.hasRecommendedLimit() && getSelectedContacts().size < selectionLimits.recommendedLimit && newSelectionSize >= selectionLimits.recommendedLimit) { errorEvents.onNext(ContactSearchError.RECOMMENDED_LIMIT_REACHED) } else if (selectionLimits.hasHardLimit() && newSelectionSize > selectionLimits.hardLimit) { @@ -107,6 +111,8 @@ class ContactSearchViewModel( } fun setKeysNotSelected(contactSearchKeys: Set) { + val newSelectionSize = getSelectedContacts().size - contactSearchKeys.size + selectionSize = newSelectionSize selectionStore.update { it - contactSearchKeys } } diff --git a/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscovery.kt b/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscovery.kt index cc3644b1..f6ca2375 100644 --- a/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscovery.kt +++ b/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscovery.kt @@ -15,6 +15,7 @@ import org.tm.archive.database.SignalDatabase import org.tm.archive.dependencies.ApplicationDependencies import org.tm.archive.jobs.SyncSystemContactLinksJob import org.tm.archive.keyvalue.SignalStore +import org.tm.archive.mms.IncomingMessage import org.tm.archive.notifications.NotificationChannels import org.tm.archive.notifications.v2.ConversationId import org.tm.archive.permissions.Permissions @@ -23,7 +24,6 @@ import org.tm.archive.profiles.ProfileName import org.tm.archive.recipients.Recipient import org.tm.archive.recipients.RecipientId import org.tm.archive.registration.RegistrationUtil -import org.tm.archive.sms.IncomingJoinedMessage import org.tm.archive.storage.StorageSyncHelper import org.tm.archive.util.FeatureFlags import org.tm.archive.util.TextSecurePreferences @@ -57,9 +57,13 @@ object ContactDiscovery { } if (!SignalStore.registrationValues().isRegistrationComplete) { - Log.w(TAG, "Registration is not yet complete. Skipping, but running a routine to possibly mark it complete.") - RegistrationUtil.maybeMarkRegistrationComplete() - return + if (SignalStore.account().isRegistered && SignalStore.svr().lastPinCreateFailed()) { + Log.w(TAG, "Registration isn't complete, but only because PIN creation failed. Allowing CDS to continue.") + } else { + Log.w(TAG, "Registration is not yet complete. Skipping, but running a routine to possibly mark it complete.") + RegistrationUtil.maybeMarkRegistrationComplete() + return + } } refreshRecipients( @@ -69,7 +73,8 @@ object ContactDiscovery { ContactDiscoveryRefreshV2.refreshAll(context, useCompat = FeatureFlags.cdsCompatMode()) }, removeSystemContactLinksIfMissing = true, - notifyOfNewUsers = notifyOfNewUsers + notifyOfNewUsers = notifyOfNewUsers, + forceFullSystemContactSync = true ) StorageSyncHelper.scheduleSyncForDataChange() @@ -136,7 +141,8 @@ object ContactDiscovery { descriptor: String, refresh: () -> RefreshResult, removeSystemContactLinksIfMissing: Boolean, - notifyOfNewUsers: Boolean + notifyOfNewUsers: Boolean, + forceFullSystemContactSync: Boolean = false ): RefreshResult { val stopwatch = Stopwatch(descriptor) @@ -149,7 +155,7 @@ object ContactDiscovery { if (hasContactsPermissions(context)) { ApplicationDependencies.getJobManager().add(SyncSystemContactLinksJob()) - val useFullSync = removeSystemContactLinksIfMissing && result.registeredIds.size > FULL_SYSTEM_CONTACT_SYNC_THRESHOLD + val useFullSync = forceFullSystemContactSync || (removeSystemContactLinksIfMissing && result.registeredIds.size > FULL_SYSTEM_CONTACT_SYNC_THRESHOLD) syncRecipientsWithSystemContacts( context = context, rewrites = result.rewrites, @@ -193,14 +199,14 @@ object ContactDiscovery { Recipient.resolvedList(newUserIds) .filter { !it.isSelf && it.hasAUserSetDisplayName(context) && !hasSession(it.id) } - .map { IncomingJoinedMessage(it.id) } + .map { IncomingMessage.contactJoined(it.id, System.currentTimeMillis()) } .map { SignalDatabase.messages.insertMessageInbox(it) } .filter { it.isPresent } .map { it.get() } .forEach { result -> val hour = Calendar.getInstance()[Calendar.HOUR_OF_DAY] if (hour in 9..22) { - ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(result.threadId), true) + ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(result.threadId)) } else { Log.i(TAG, "Not notifying of a new user due to the time of day. (Hour: $hour)") } diff --git a/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscoveryRefreshV2.kt b/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscoveryRefreshV2.kt index 65a44eca..55172b0c 100644 --- a/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscoveryRefreshV2.kt +++ b/app/src/main/java/org/tm/archive/contacts/sync/ContactDiscoveryRefreshV2.kt @@ -206,9 +206,11 @@ object ContactDiscoveryRefreshV2 { */ @WorkerThread private fun Set.removePossiblyRegisteredButUnlisted(): Set { + val selfId = Recipient.self().id return this - Recipient.resolvedList(this) - .filter { it.hasServiceId() } - .filter { hasCommunicatedWith(it) } + .filter { + (it.hasServiceId() && hasCommunicatedWith(it)) || it.id == selfId + } .map { it.id } .toSet() } diff --git a/app/src/main/java/org/tm/archive/contactshare/ContactModelMapper.java b/app/src/main/java/org/tm/archive/contactshare/ContactModelMapper.java index 4db6ff50..741420e5 100644 --- a/app/src/main/java/org/tm/archive/contactshare/ContactModelMapper.java +++ b/app/src/main/java/org/tm/archive/contactshare/ContactModelMapper.java @@ -1,6 +1,7 @@ package org.tm.archive.contactshare; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.signal.core.util.logging.Log; import org.tm.archive.attachments.Attachment; @@ -9,7 +10,7 @@ import org.whispersystems.signalservice.api.InvalidMessageStructureException; import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer; import org.whispersystems.signalservice.api.messages.shared.SharedContact; import org.whispersystems.signalservice.api.util.AttachmentPointerUtil; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.DataMessage; import java.util.ArrayList; import java.util.LinkedList; @@ -125,47 +126,52 @@ public class ContactModelMapper { return new Contact(name, sharedContact.getOrganization().orElse(null), phoneNumbers, emails, postalAddresses, avatar); } - public static Contact remoteToLocal(@NonNull SignalServiceProtos.DataMessage.Contact contact) { - Name name = new Name(contact.getName().getDisplayName(), - contact.getName().getGivenName(), - contact.getName().getFamilyName(), - contact.getName().getPrefix(), - contact.getName().getSuffix(), - contact.getName().getMiddleName()); + public static Contact remoteToLocal(@NonNull DataMessage.Contact contact) { + DataMessage.Contact.Name contactName = contact.name != null ? contact.name : new DataMessage.Contact.Name(); + Name name = new Name(contactName.displayName, + contactName.givenName, + contactName.familyName, + contactName.prefix, + contactName.suffix, + contactName.middleName); - List phoneNumbers = new ArrayList<>(contact.getNumberCount()); - for (SignalServiceProtos.DataMessage.Contact.Phone phone : contact.getNumberList()) { - phoneNumbers.add(new Phone(phone.getValue(), - remoteToLocalType(phone.getType()), - phone.getLabel())); + List phoneNumbers = new ArrayList<>(contact.number.size()); + for (DataMessage.Contact.Phone phone : contact.number) { + if (phone.value_ != null) { + phoneNumbers.add(new Phone(phone.value_, + remoteToLocalType(phone.type), + phone.label)); + } } - List emails = new ArrayList<>(contact.getEmailCount()); - for (SignalServiceProtos.DataMessage.Contact.Email email : contact.getEmailList()) { - emails.add(new Email(email.getValue(), - remoteToLocalType(email.getType()), - email.getLabel())); + List emails = new ArrayList<>(contact.email.size()); + for (DataMessage.Contact.Email email : contact.email) { + if (email.value_ != null) { + emails.add(new Email(email.value_, + remoteToLocalType(email.type), + email.label)); + } } - List postalAddresses = new ArrayList<>(contact.getAddressCount()); - for (SignalServiceProtos.DataMessage.Contact.PostalAddress postalAddress : contact.getAddressList()) { - postalAddresses.add(new PostalAddress(remoteToLocalType(postalAddress.getType()), - postalAddress.getLabel(), - postalAddress.getStreet(), - postalAddress.getPobox(), - postalAddress.getNeighborhood(), - postalAddress.getCity(), - postalAddress.getRegion(), - postalAddress.getPostcode(), - postalAddress.getCountry())); + List postalAddresses = new ArrayList<>(contact.address.size()); + for (DataMessage.Contact.PostalAddress postalAddress : contact.address) { + postalAddresses.add(new PostalAddress(remoteToLocalType(postalAddress.type), + postalAddress.label, + postalAddress.street, + postalAddress.pobox, + postalAddress.neighborhood, + postalAddress.city, + postalAddress.region, + postalAddress.postcode, + postalAddress.country)); } Avatar avatar = null; - if (contact.hasAvatar()) { + if (contact.avatar != null && contact.avatar.avatar != null) { try { - SignalServiceAttachmentPointer attachmentPointer = AttachmentPointerUtil.createSignalAttachmentPointer(contact.getAvatar().getAvatar()); + SignalServiceAttachmentPointer attachmentPointer = AttachmentPointerUtil.createSignalAttachmentPointer(contact.avatar.avatar); Attachment attachment = PointerAttachment.forPointer(Optional.of(attachmentPointer.asPointer())).get(); - boolean isProfile = contact.getAvatar().getIsProfile(); + boolean isProfile = Boolean.TRUE.equals(contact.avatar.isProfile); avatar = new Avatar(null, attachment, isProfile); } catch (InvalidMessageStructureException e) { @@ -173,10 +179,12 @@ public class ContactModelMapper { } } - return new Contact(name, contact.getOrganization(), phoneNumbers, emails, postalAddresses, avatar); + return new Contact(name, contact.organization, phoneNumbers, emails, postalAddresses, avatar); } - private static Phone.Type remoteToLocalType(SharedContact.Phone.Type type) { + private static Phone.Type remoteToLocalType(@Nullable SharedContact.Phone.Type type) { + if (type == null) return Phone.Type.CUSTOM; + switch (type) { case HOME: return Phone.Type.HOME; case MOBILE: return Phone.Type.MOBILE; @@ -185,7 +193,9 @@ public class ContactModelMapper { } } - private static Phone.Type remoteToLocalType(SignalServiceProtos.DataMessage.Contact.Phone.Type type) { + private static Phone.Type remoteToLocalType(@Nullable DataMessage.Contact.Phone.Type type) { + if (type == null) return Phone.Type.CUSTOM; + switch (type) { case HOME: return Phone.Type.HOME; case MOBILE: return Phone.Type.MOBILE; @@ -194,7 +204,9 @@ public class ContactModelMapper { } } - private static Email.Type remoteToLocalType(SharedContact.Email.Type type) { + private static Email.Type remoteToLocalType(@Nullable SharedContact.Email.Type type) { + if (type == null) return Email.Type.CUSTOM; + switch (type) { case HOME: return Email.Type.HOME; case MOBILE: return Email.Type.MOBILE; @@ -203,7 +215,9 @@ public class ContactModelMapper { } } - private static Email.Type remoteToLocalType(SignalServiceProtos.DataMessage.Contact.Email.Type type) { + private static Email.Type remoteToLocalType(@Nullable DataMessage.Contact.Email.Type type) { + if (type == null) return Email.Type.CUSTOM; + switch (type) { case HOME: return Email.Type.HOME; case MOBILE: return Email.Type.MOBILE; @@ -212,7 +226,9 @@ public class ContactModelMapper { } } - private static PostalAddress.Type remoteToLocalType(SharedContact.PostalAddress.Type type) { + private static PostalAddress.Type remoteToLocalType(@Nullable SharedContact.PostalAddress.Type type) { + if (type == null) return PostalAddress.Type.CUSTOM; + switch (type) { case HOME: return PostalAddress.Type.HOME; case WORK: return PostalAddress.Type.WORK; @@ -220,7 +236,9 @@ public class ContactModelMapper { } } - private static PostalAddress.Type remoteToLocalType(SignalServiceProtos.DataMessage.Contact.PostalAddress.Type type) { + private static PostalAddress.Type remoteToLocalType(@Nullable DataMessage.Contact.PostalAddress.Type type) { + if (type == null) return PostalAddress.Type.CUSTOM; + switch (type) { case HOME: return PostalAddress.Type.HOME; case WORK: return PostalAddress.Type.WORK; diff --git a/app/src/main/java/org/tm/archive/contactshare/ContactUtil.java b/app/src/main/java/org/tm/archive/contactshare/ContactUtil.java index 1ab6ecff..acec805d 100644 --- a/app/src/main/java/org/tm/archive/contactshare/ContactUtil.java +++ b/app/src/main/java/org/tm/archive/contactshare/ContactUtil.java @@ -11,7 +11,6 @@ import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; -import androidx.appcompat.app.AlertDialog; import com.annimon.stream.Stream; import com.google.android.material.dialog.MaterialAlertDialogBuilder; diff --git a/app/src/main/java/org/tm/archive/conversation/AttachmentKeyboard.java b/app/src/main/java/org/tm/archive/conversation/AttachmentKeyboard.java index 88a256a1..83e2778d 100644 --- a/app/src/main/java/org/tm/archive/conversation/AttachmentKeyboard.java +++ b/app/src/main/java/org/tm/archive/conversation/AttachmentKeyboard.java @@ -28,9 +28,9 @@ public class AttachmentKeyboard extends FrameLayout implements InputAwareLayout. private static final List DEFAULT_BUTTONS = Arrays.asList( AttachmentKeyboardButton.GALLERY, AttachmentKeyboardButton.FILE, - AttachmentKeyboardButton.PAYMENT, AttachmentKeyboardButton.CONTACT, - AttachmentKeyboardButton.LOCATION + AttachmentKeyboardButton.LOCATION, + AttachmentKeyboardButton.PAYMENT ); private View container; diff --git a/app/src/main/java/org/tm/archive/conversation/ConversationAdapter.java b/app/src/main/java/org/tm/archive/conversation/ConversationAdapter.java index 2dae822b..f50b4290 100644 --- a/app/src/main/java/org/tm/archive/conversation/ConversationAdapter.java +++ b/app/src/main/java/org/tm/archive/conversation/ConversationAdapter.java @@ -46,7 +46,7 @@ import org.tm.archive.R; import org.tm.archive.conversation.colors.Colorizable; import org.tm.archive.conversation.colors.Colorizer; import org.tm.archive.conversation.mutiselect.MultiselectPart; -import org.tm.archive.database.model.MediaMmsMessageRecord; +import org.tm.archive.database.model.MmsMessageRecord; import org.tm.archive.database.model.MessageRecord; import org.tm.archive.giph.mp4.GiphyMp4Playable; import org.tm.archive.giph.mp4.GiphyMp4PlaybackPolicyEnforcer; @@ -114,8 +114,7 @@ public class ConversationAdapter private ConversationMessage inlineContent; private Colorizer colorizer; private boolean isTypingViewEnabled; - private ConversationItemDisplayMode condensedMode; - private boolean scheduledMessagesMode; + private ConversationItemDisplayMode displayMode; private PulseRequest pulseRequest; public ConversationAdapter(@NonNull Context context, @@ -252,12 +251,7 @@ public class ConversationAdapter } public void setCondensedMode(ConversationItemDisplayMode condensedMode) { - this.condensedMode = condensedMode; - notifyDataSetChanged(); - } - - public void setScheduledMessagesMode(boolean scheduledMessagesMode) { - this.scheduledMessagesMode = scheduledMessagesMode; + this.displayMode = condensedMode; notifyDataSetChanged(); } @@ -276,7 +270,7 @@ public class ConversationAdapter ConversationMessage previousMessage = adapterPosition < getItemCount() - 1 && !isFooterPosition(adapterPosition + 1) ? getItem(adapterPosition + 1) : null; ConversationMessage nextMessage = adapterPosition > 0 && !isHeaderPosition(adapterPosition - 1) ? getItem(adapterPosition - 1) : null; - ConversationItemDisplayMode displayMode = condensedMode != null ? condensedMode : ConversationItemDisplayMode.STANDARD; + ConversationItemDisplayMode itemDisplayMode = displayMode != null ? displayMode : ConversationItemDisplayMode.Standard.INSTANCE; conversationViewHolder.getBindable().bind(lifecycleOwner, conversationMessage, @@ -288,11 +282,11 @@ public class ConversationAdapter conversationMessage.getThreadRecipient(), searchQuery, conversationMessage == recordToPulse, - hasWallpaper && displayMode.displayWallpaper(), + hasWallpaper && itemDisplayMode.displayWallpaper(), isMessageRequestAccepted, conversationMessage == inlineContent, colorizer, - displayMode); + itemDisplayMode); if (conversationMessage == recordToPulse) { recordToPulse = null; @@ -331,9 +325,9 @@ public class ConversationAdapter if (conversationMessage == null) return -1; - if (scheduledMessagesMode) { - calendar.setTimeInMillis(((MediaMmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate()); - } else if (condensedMode == ConversationItemDisplayMode.EDIT_HISTORY) { + if (displayMode.getScheduleMessageMode()) { + calendar.setTimeInMillis(((MmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate()); + } else if (displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) { calendar.setTimeInMillis(conversationMessage.getMessageRecord().getDateSent()); } else { calendar.setTimeInMillis(conversationMessage.getConversationTimestamp()); @@ -351,9 +345,9 @@ public class ConversationAdapter Context context = viewHolder.itemView.getContext(); ConversationMessage conversationMessage = Objects.requireNonNull(getItem(position)); - if (scheduledMessagesMode) { - viewHolder.setText(DateUtils.getScheduledMessagesDateHeaderString(viewHolder.itemView.getContext(), locale, ((MediaMmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate())); - } else if (condensedMode == ConversationItemDisplayMode.EDIT_HISTORY) { + if (displayMode.getScheduleMessageMode()) { + viewHolder.setText(DateUtils.getScheduledMessagesDateHeaderString(viewHolder.itemView.getContext(), locale, ((MmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate())); + } else if (displayMode == ConversationItemDisplayMode.EditHistory.INSTANCE) { viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getMessageRecord().getDateSent())); } else { viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getConversationTimestamp())); diff --git a/app/src/main/java/org/tm/archive/conversation/ConversationAdapterBridge.kt b/app/src/main/java/org/tm/archive/conversation/ConversationAdapterBridge.kt index 75a617ee..51a24daf 100644 --- a/app/src/main/java/org/tm/archive/conversation/ConversationAdapterBridge.kt +++ b/app/src/main/java/org/tm/archive/conversation/ConversationAdapterBridge.kt @@ -16,6 +16,7 @@ interface ConversationAdapterBridge { const val PAYLOAD_TIMESTAMP = 0 const val PAYLOAD_NAME_COLORS = 1 const val PAYLOAD_SELECTED = 2 + const val PAYLOAD_PARENT_SCROLLING = 3 } fun hasNoConversationMessages(): Boolean diff --git a/app/src/main/java/org/tm/archive/conversation/ConversationHeaderView.java b/app/src/main/java/org/tm/archive/conversation/ConversationHeaderView.java index 985f100d..9bad2b16 100644 --- a/app/src/main/java/org/tm/archive/conversation/ConversationHeaderView.java +++ b/app/src/main/java/org/tm/archive/conversation/ConversationHeaderView.java @@ -1,39 +1,38 @@ package org.tm.archive.conversation; import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; -import android.widget.TextView; +import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewKt; +import org.signal.core.util.DimensionUnit; import org.signal.core.util.concurrent.SignalExecutors; import org.tm.archive.R; -import org.tm.archive.badges.BadgeImageView; -import org.tm.archive.components.AvatarImageView; import org.tm.archive.components.emoji.EmojiTextView; import org.tm.archive.contacts.avatars.FallbackContactPhoto; import org.tm.archive.contacts.avatars.ResourceContactPhoto; import org.tm.archive.database.SignalDatabase; +import org.tm.archive.databinding.ConversationHeaderViewBinding; import org.tm.archive.mms.GlideRequests; import org.tm.archive.recipients.Recipient; import org.tm.archive.util.ContextUtil; import org.tm.archive.util.LongClickMovementMethod; import org.tm.archive.util.SpanUtil; +import org.whispersystems.signalservice.api.util.Preconditions; public class ConversationHeaderView extends ConstraintLayout { - private AvatarImageView contactAvatar; - private TextView contactTitle; - private TextView contactAbout; - private TextView contactSubtitle; - private EmojiTextView contactDescription; - private View tapToView; - private BadgeImageView contactBadge; + private final ConversationHeaderViewBinding binding; public ConversationHeaderView(Context context) { this(context, null); @@ -46,38 +45,32 @@ public class ConversationHeaderView extends ConstraintLayout { public ConversationHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - inflate(getContext(), R.layout.conversation_banner_view, this); + inflate(getContext(), R.layout.conversation_header_view, this); - contactAvatar = findViewById(R.id.message_request_avatar); - contactBadge = findViewById(R.id.message_request_badge); - contactTitle = findViewById(R.id.message_request_title); - contactAbout = findViewById(R.id.message_request_about); - contactSubtitle = findViewById(R.id.message_request_subtitle); - contactDescription = findViewById(R.id.message_request_description); - tapToView = findViewById(R.id.message_request_avatar_tap_to_view); + binding = ConversationHeaderViewBinding.bind(this); - contactAvatar.setFallbackPhotoProvider(new FallbackPhotoProvider()); + binding.messageRequestAvatar.setFallbackPhotoProvider(new FallbackPhotoProvider()); } public void setBadge(@Nullable Recipient recipient) { if (recipient == null || recipient.isSelf()) { - contactBadge.setBadge(null); + binding.messageRequestBadge.setBadge(null); } else { - contactBadge.setBadgeFromRecipient(recipient); + binding.messageRequestBadge.setBadgeFromRecipient(recipient); } } public void setAvatar(@NonNull GlideRequests requests, @Nullable Recipient recipient) { - contactAvatar.setAvatar(requests, recipient, false); + binding.messageRequestAvatar.setAvatar(requests, recipient, false); if (recipient != null && recipient.shouldBlurAvatar() && recipient.getContactPhoto() != null) { - tapToView.setVisibility(VISIBLE); - tapToView.setOnClickListener(v -> { + binding.messageRequestAvatarTapToView.setVisibility(VISIBLE); + binding.messageRequestAvatarTapToView.setOnClickListener(v -> { SignalExecutors.BOUNDED.execute(() -> SignalDatabase.recipients().manuallyShowAvatar(recipient.getId())); }); } else { - tapToView.setVisibility(GONE); - tapToView.setOnClickListener(null); + binding.messageRequestAvatarTapToView.setVisibility(GONE); + binding.messageRequestAvatarTapToView.setOnClickListener(null); } } @@ -86,7 +79,7 @@ public class ConversationHeaderView extends ConstraintLayout { if (recipient.showVerified()) { SpanUtil.appendCenteredImageSpan(title, ContextUtil.requireDrawable(getContext(), R.drawable.ic_official_28), 28, 28); } - contactTitle.setText(title); + binding.messageRequestTitle.setText(title); return title.toString(); } @@ -98,46 +91,83 @@ public class ConversationHeaderView extends ConstraintLayout { about = recipient.getCombinedAboutAndEmoji(); } - contactAbout.setText(about); - contactAbout.setVisibility(TextUtils.isEmpty(about) ? GONE : VISIBLE); + binding.messageRequestAbout.setText(about); + binding.messageRequestAbout.setVisibility(TextUtils.isEmpty(about) ? GONE : VISIBLE); } - public void setSubtitle(@Nullable CharSequence subtitle) { - contactSubtitle.setText(subtitle); - contactSubtitle.setVisibility(TextUtils.isEmpty(subtitle) ? GONE : VISIBLE); + public void setSubtitle(@NonNull CharSequence subtitle, @DrawableRes int iconRes) { + if (TextUtils.isEmpty(subtitle)) { + hideSubtitle(); + return; + } + + binding.messageRequestSubtitle.setText(prependIcon(subtitle, iconRes)); + binding.messageRequestSubtitle.setVisibility(View.VISIBLE); } - public void setDescription(@Nullable CharSequence description) { - contactDescription.setText(description); - contactDescription.setVisibility(TextUtils.isEmpty(description) ? GONE : VISIBLE); + public void setDescription(@Nullable CharSequence description, @DrawableRes int iconRes) { + if (TextUtils.isEmpty(description)) { + hideDescription(); + return; + } + + binding.messageRequestDescription.setText(prependIcon(description, iconRes)); + binding.messageRequestDescription.setVisibility(View.VISIBLE); } public @NonNull EmojiTextView getDescription() { - return contactDescription; + return binding.messageRequestDescription; } public void showBackgroundBubble(boolean enabled) { if (enabled) { - setBackgroundResource(R.drawable.wallpaper_bubble_background_12); + setBackgroundResource(R.drawable.wallpaper_bubble_background_18); + binding.messageRequestInfoOutline.setVisibility(View.INVISIBLE); + binding.messageRequestDivider.setVisibility(View.VISIBLE); } else { setBackground(null); + binding.messageRequestInfoOutline.setVisibility(View.VISIBLE); + binding.messageRequestDivider.setVisibility(View.INVISIBLE); } + + hideDecoratorsIfContentIsNotPresent(); } public void hideSubtitle() { - contactSubtitle.setVisibility(View.GONE); + binding.messageRequestSubtitle.setVisibility(View.GONE); } public void showDescription() { - contactDescription.setVisibility(View.VISIBLE); + binding.messageRequestDescription.setVisibility(View.VISIBLE); } public void hideDescription() { - contactDescription.setVisibility(View.GONE); + binding.messageRequestDescription.setVisibility(View.GONE); } public void setLinkifyDescription(boolean enable) { - contactDescription.setMovementMethod(enable ? LongClickMovementMethod.getInstance(getContext()) : null); + binding.messageRequestDescription.setMovementMethod(enable ? LongClickMovementMethod.getInstance(getContext()) : null); + } + + private void hideDecoratorsIfContentIsNotPresent() { + if (ViewKt.isVisible(binding.messageRequestSubtitle) || ViewKt.isVisible(binding.messageRequestDescription)) { + return; + } + + binding.messageRequestInfoOutline.setVisibility(View.GONE); + binding.messageRequestDivider.setVisibility(View.GONE); + } + + private @NonNull CharSequence prependIcon(@NonNull CharSequence input, @DrawableRes int iconRes) { + Drawable drawable = ContextCompat.getDrawable(getContext(), iconRes); + Preconditions.checkNotNull(drawable); + drawable.setBounds(0, 0, (int) DimensionUnit.DP.toPixels(20), (int) DimensionUnit.DP.toPixels(20)); + drawable.setColorFilter(ContextCompat.getColor(getContext(), R.color.signal_colorOnSurface), PorterDuff.Mode.SRC_ATOP); + + return new SpannableStringBuilder() + .append(SpanUtil.buildCenteredImageSpan(drawable)) + .append(SpanUtil.space(8, DimensionUnit.DP)) + .append(input); } private static final class FallbackPhotoProvider extends Recipient.FallbackPhotoProvider { diff --git a/app/src/main/java/org/tm/archive/conversation/ConversationItem.java b/app/src/main/java/org/tm/archive/conversation/ConversationItem.java index 299142ab..a8744761 100644 --- a/app/src/main/java/org/tm/archive/conversation/ConversationItem.java +++ b/app/src/main/java/org/tm/archive/conversation/ConversationItem.java @@ -63,12 +63,16 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.common.collect.Sets; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import org.signal.core.util.DimensionUnit; import org.signal.core.util.StringUtil; import org.signal.core.util.logging.Log; import org.signal.ringrtc.CallLinkRootKey; import org.tm.archive.BindableConversationItem; import org.tm.archive.R; +import org.tm.archive.attachments.AttachmentId; import org.tm.archive.attachments.DatabaseAttachment; import org.tm.archive.badges.BadgeImageView; import org.tm.archive.badges.gifts.GiftMessageView; @@ -91,25 +95,27 @@ import org.tm.archive.components.ThumbnailView; import org.tm.archive.components.emoji.EmojiTextView; import org.tm.archive.components.mention.MentionAnnotation; import org.tm.archive.contactshare.Contact; +import org.tm.archive.conversation.clicklisteners.AttachmentCancelClickListener; +import org.tm.archive.conversation.clicklisteners.ResendClickListener; import org.tm.archive.conversation.colors.Colorizer; import org.tm.archive.conversation.mutiselect.MultiselectCollection; import org.tm.archive.conversation.mutiselect.MultiselectPart; import org.tm.archive.conversation.ui.payment.PaymentMessageView; import org.tm.archive.conversation.v2.items.InteractiveConversationElement; -import org.tm.archive.conversation.v2.items.V2ConversationBodyUtil; +import org.tm.archive.conversation.v2.items.V2ConversationItemUtils; import org.tm.archive.database.AttachmentTable; import org.tm.archive.database.MediaTable; import org.tm.archive.database.MessageTable; import org.tm.archive.database.SignalDatabase; -import org.tm.archive.database.model.MediaMmsMessageRecord; -import org.tm.archive.database.model.MessageRecord; import org.tm.archive.database.model.MmsMessageRecord; +import org.tm.archive.database.model.MessageRecord; import org.tm.archive.database.model.Quote; import org.tm.archive.dependencies.ApplicationDependencies; +import org.tm.archive.events.PartProgressEvent; import org.tm.archive.giph.mp4.GiphyMp4PlaybackPolicy; import org.tm.archive.giph.mp4.GiphyMp4PlaybackPolicyEnforcer; +import org.tm.archive.jobmanager.JobManager; import org.tm.archive.jobs.AttachmentDownloadJob; -import org.tm.archive.jobs.MmsDownloadJob; import org.tm.archive.jobs.MmsSendJob; import org.tm.archive.jobs.SmsSendJob; import org.tm.archive.keyvalue.SignalStore; @@ -135,6 +141,7 @@ import org.tm.archive.util.DateUtils; import org.tm.archive.util.FeatureFlags; import org.tm.archive.util.InterceptableLongClickCopyLinkSpan; import org.tm.archive.util.LongClickMovementMethod; +import org.tm.archive.util.MediaUtil; import org.tm.archive.util.MessageRecordUtil; import org.tm.archive.util.PlaceholderURLSpan; import org.tm.archive.util.Projection; @@ -196,42 +203,42 @@ public final class ConversationItem extends RelativeLayout implements BindableCo private Optional previousMessage; private ConversationItemDisplayMode displayMode; - protected ConversationItemBodyBubble bodyBubble; - protected View reply; - protected View replyIcon; - @Nullable protected ViewGroup contactPhotoHolder; - @Nullable private QuoteView quoteView; - private EmojiTextView bodyText; - private ConversationItemFooter footer; - @Nullable private ConversationItemFooter stickerFooter; - @Nullable private TextView groupSender; - @Nullable private View groupSenderHolder; - private AvatarImageView contactPhoto; - private AlertView alertView; - protected ReactionsConversationView reactionsView; - protected BadgeImageView badgeImageView; - private View storyReactionLabelWrapper; - private TextView storyReactionLabel; - protected View quotedIndicator; - protected View scheduledIndicator; + private ConversationItemBodyBubble bodyBubble; + private View reply; + private View replyIcon; + @Nullable private ViewGroup contactPhotoHolder; + @Nullable private QuoteView quoteView; + private EmojiTextView bodyText; + private ConversationItemFooter footer; + @Nullable private ConversationItemFooter stickerFooter; + @Nullable private TextView groupSender; + @Nullable private View groupSenderHolder; + private AvatarImageView contactPhoto; + private AlertView alertView; + private ReactionsConversationView reactionsView; + private BadgeImageView badgeImageView; + private View storyReactionLabelWrapper; + private TextView storyReactionLabel; + private View quotedIndicator; + private View scheduledIndicator; - private @NonNull Set batchSelected = new HashSet<>(); - private @NonNull Outliner outliner = new Outliner(); - private @NonNull Outliner pulseOutliner = new Outliner(); - private @NonNull List outliners = new ArrayList<>(2); - private LiveRecipient conversationRecipient; - private NullableStub mediaThumbnailStub; - private Stub audioViewStub; - private Stub documentViewStub; - private Stub sharedContactStub; - private Stub linkPreviewStub; - private Stub stickerStub; - private Stub revealableStub; - private Stub joinCallLinkStub; - private Stub + +

+ + +
+ + + {{> partials/suffix }} + + + + diff --git a/spinner/lib/src/main/assets/partials/prefix.hbs b/spinner/lib/src/main/assets/partials/prefix.hbs index fbc0f2ef..1242fe2a 100644 --- a/spinner/lib/src/main/assets/partials/prefix.hbs +++ b/spinner/lib/src/main/assets/partials/prefix.hbs @@ -9,6 +9,12 @@ {{/each}} +
+ Download Trace: Link +
+ +
+
Database: