diff --git a/android-smsmms/src/main/java/com/android/mms/service_alt/MmsHttpClient.java b/android-smsmms/src/main/java/com/android/mms/service_alt/MmsHttpClient.java
index aa31f9d8b..281392542 100755
--- a/android-smsmms/src/main/java/com/android/mms/service_alt/MmsHttpClient.java
+++ b/android-smsmms/src/main/java/com/android/mms/service_alt/MmsHttpClient.java
@@ -18,21 +18,24 @@
import android.content.Context;
import android.text.TextUtils;
+
import com.android.mms.service_alt.exception.MmsHttpException;
import com.squareup.okhttp.ConnectionPool;
import com.squareup.okhttp.ConnectionSpec;
+import com.squareup.okhttp.Dns;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Protocol;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
-import com.squareup.okhttp.internal.Internal;
import com.squareup.okhttp.internal.huc.HttpURLConnectionImpl;
import com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl;
+
import timber.log.Timber;
import javax.net.SocketFactory;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
+
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
@@ -40,6 +43,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.ProtocolException;
@@ -48,6 +52,7 @@
import java.net.SocketAddress;
import java.net.URI;
import java.net.URL;
+import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -86,13 +91,13 @@ public class MmsHttpClient {
/**
* Constructor
*
- * @param context The Context object
- * @param socketFactory The socket factory for creating an OKHttp client
- * @param hostResolver The host name resolver for creating an OKHttp client
+ * @param context The Context object
+ * @param socketFactory The socket factory for creating an OKHttp client
+ * @param hostResolver The host name resolver for creating an OKHttp client
* @param connectionPool The connection pool for creating an OKHttp client
*/
public MmsHttpClient(Context context, SocketFactory socketFactory, MmsNetworkManager hostResolver,
- ConnectionPool connectionPool) {
+ ConnectionPool connectionPool) {
mContext = context;
mSocketFactory = socketFactory;
mHostResolver = hostResolver;
@@ -102,19 +107,19 @@ public MmsHttpClient(Context context, SocketFactory socketFactory, MmsNetworkMan
/**
* Execute an MMS HTTP request, either a POST (sending) or a GET (downloading)
*
- * @param urlString The request URL, for sending it is usually the MMSC, and for downloading
- * it is the message URL
- * @param pdu For POST (sending) only, the PDU to send
- * @param method HTTP method, POST for sending and GET for downloading
+ * @param urlString The request URL, for sending it is usually the MMSC, and for downloading
+ * it is the message URL
+ * @param pdu For POST (sending) only, the PDU to send
+ * @param method HTTP method, POST for sending and GET for downloading
* @param isProxySet Is there a proxy for the MMSC
- * @param proxyHost The proxy host
- * @param proxyPort The proxy port
- * @param mmsConfig The MMS config to use
+ * @param proxyHost The proxy host
+ * @param proxyPort The proxy port
+ * @param mmsConfig The MMS config to use
* @return The HTTP response body
* @throws MmsHttpException For any failures
*/
public byte[] execute(String urlString, byte[] pdu, String method, boolean isProxySet,
- String proxyHost, int proxyPort, MmsConfig.Overridden mmsConfig)
+ String proxyHost, int proxyPort, MmsConfig.Overridden mmsConfig)
throws MmsHttpException {
Timber.d("HTTP: " + method + " " + urlString
+ (isProxySet ? (", proxy=" + proxyHost + ":" + proxyPort) : "")
@@ -214,13 +219,13 @@ public byte[] execute(String urlString, byte[] pdu, String method, boolean isPro
/**
* Open an HTTP connection
- *
+ *
* TODO: The following code is borrowed from android.net.Network.openConnection
* Once that method supports proxy, we should use that instead
* Also we should remove the associated HostResolver and ConnectionPool from
* MmsNetworkManager
*
- * @param url The URL to connect to
+ * @param url The URL to connect to
* @param proxy The proxy to use
* @return The opened HttpURLConnection
* @throws MalformedURLException If URL is malformed
@@ -228,6 +233,26 @@ public byte[] execute(String urlString, byte[] pdu, String method, boolean isPro
private HttpURLConnection openConnection(URL url, final Proxy proxy) throws MalformedURLException {
final String protocol = url.getProtocol();
OkHttpClient okHttpClient;
+
+ Dns resolverDns = new Dns() {
+ @Override
+ public List lookup(String hostname) throws UnknownHostException {
+ try {
+ InetAddress[] addrs = mHostResolver.resolveInetAddresses(hostname);
+ if (addrs == null || addrs.length == 0) {
+ throw new UnknownHostException("No addresses for " + hostname);
+ }
+ return Arrays.asList(addrs);
+ } catch (UnknownHostException e) {
+ throw e;
+ } catch (Exception e) {
+ UnknownHostException uhe = new UnknownHostException("Failed to resolve " + hostname);
+ uhe.initCause(e);
+ throw uhe;
+ }
+ }
+ };
+
if (protocol.equals("http")) {
okHttpClient = new OkHttpClient();
okHttpClient.setFollowRedirects(false);
@@ -260,8 +285,14 @@ public Request authenticateProxy(Proxy proxy, Response response) throws IOExcept
});
okHttpClient.setConnectionSpecs(Arrays.asList(ConnectionSpec.CLEARTEXT));
okHttpClient.setConnectionPool(new ConnectionPool(3, 60000));
- okHttpClient.setSocketFactory(SocketFactory.getDefault());
- Internal.instance.setNetwork(okHttpClient, mHostResolver);
+
+ okHttpClient.setDns(resolverDns);
+
+ if (mSocketFactory != null) {
+ okHttpClient.setSocketFactory(mSocketFactory);
+ } else {
+ okHttpClient.setSocketFactory(SocketFactory.getDefault());
+ }
if (proxy != null) {
okHttpClient.setProxy(proxy);
@@ -298,7 +329,8 @@ public Request authenticateProxy(Proxy proxy, Response response) throws IOExcept
});
okHttpClient.setConnectionSpecs(Arrays.asList(ConnectionSpec.CLEARTEXT));
okHttpClient.setConnectionPool(new ConnectionPool(3, 60000));
- Internal.instance.setNetwork(okHttpClient, mHostResolver);
+
+ okHttpClient.setDns(resolverDns);
return new HttpsURLConnectionImpl(url, okHttpClient);
} else {
@@ -385,6 +417,7 @@ private static void addLocaleToHttpAcceptLanguage(StringBuilder builder, Locale
}
private static final Pattern MACRO_P = Pattern.compile("##(\\S+)##");
+
/**
* Resolve the macro in HTTP param value text
* For example, "something##LINE1##something" is resolved to "something9139531419something"
@@ -393,7 +426,7 @@ private static void addLocaleToHttpAcceptLanguage(StringBuilder builder, Locale
* @return The HTTP param with macro resolved to real value
*/
private static String resolveMacro(Context context, String value,
- MmsConfig.Overridden mmsConfig) {
+ MmsConfig.Overridden mmsConfig) {
if (TextUtils.isEmpty(value)) {
return value;
}
@@ -429,7 +462,7 @@ private static String resolveMacro(Context context, String value,
* macros like "##LINE1##" or "##NAI##" which is resolved with methods in this class
*
* @param connection The HttpURLConnection that we add headers to
- * @param mmsConfig The MmsConfig object
+ * @param mmsConfig The MmsConfig object
*/
private void addExtraHeaders(HttpURLConnection connection, MmsConfig.Overridden mmsConfig) {
final String extraHttpParams = mmsConfig.getHttpParams();
diff --git a/android-smsmms/src/main/java/com/android/mms/service_alt/MmsNetworkManager.java b/android-smsmms/src/main/java/com/android/mms/service_alt/MmsNetworkManager.java
index e3092499d..2c541ea71 100755
--- a/android-smsmms/src/main/java/com/android/mms/service_alt/MmsNetworkManager.java
+++ b/android-smsmms/src/main/java/com/android/mms/service_alt/MmsNetworkManager.java
@@ -23,7 +23,6 @@
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.SSLCertificateSocketFactory;
-import android.os.Build;
import android.os.SystemClock;
import com.android.mms.service_alt.exception.MmsNetworkException;
import com.squareup.okhttp.ConnectionPool;
@@ -32,7 +31,7 @@
import java.net.InetAddress;
import java.net.UnknownHostException;
-public class MmsNetworkManager implements com.squareup.okhttp.internal.Network {
+public class MmsNetworkManager {
// Timeout used to call ConnectivityManager.requestNetwork
private static final int NETWORK_REQUEST_TIMEOUT_MILLIS = 60 * 1000;
@@ -236,7 +235,6 @@ private void resetLocked() {
private static final InetAddress[] EMPTY_ADDRESS_ARRAY = new InetAddress[0];
- @Override
public InetAddress[] resolveInetAddresses(String host) throws UnknownHostException {
Network network = null;
synchronized (this) {
diff --git a/build.gradle.kts b/build.gradle.kts
index da2223bd6..831d41720 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,9 +1,10 @@
-import org.jetbrains.kotlin.gradle.plugin.KaptExtension
+import com.android.build.gradle.BaseExtension
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// Needed until we upstream
buildscript {
dependencies {
- classpath("io.realm:realm-gradle-plugin:10.15.0")
+ classpath("io.realm:realm-gradle-plugin:10.19.0")
classpath("com.google.firebase:firebase-crashlytics-gradle:2.5.2")
}
}
@@ -11,21 +12,33 @@ buildscript {
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
- alias(libs.plugins.kotlin.android) version "1.7.21" apply false
- alias(libs.plugins.google.services) version "4.3.14" apply false
+ alias(libs.plugins.kotlin.android) apply false
+ alias(libs.plugins.google.services) apply false
}
tasks.register("clean") {
- delete(rootProject.buildDir)
+ delete(rootProject.layout.buildDirectory)
}
subprojects {
- afterEvaluate {
- extensions.findByType(KaptExtension::class.java)?.apply {
- javacOptions {
- option("-source", "8")
- option("-target", "8")
+ tasks.withType().configureEach {
+ kotlinOptions.jvmTarget = "17"
+ }
+
+ plugins.withId("com.android.application") {
+ extensions.configure(BaseExtension::class.java) {
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
}
}
}
-}
+ plugins.withId("com.android.library") {
+ extensions.configure(BaseExtension::class.java) {
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/build.gradle.kts b/data/build.gradle.kts
index 84d169d50..edd113b38 100644
--- a/data/build.gradle.kts
+++ b/data/build.gradle.kts
@@ -30,11 +30,6 @@ android {
version = release(36)
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
- }
-
defaultConfig {
minSdk = 23
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts
index 43e89cc8c..6f5b22d93 100644
--- a/domain/build.gradle.kts
+++ b/domain/build.gradle.kts
@@ -31,11 +31,6 @@ android {
version = release(36)
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
- }
-
defaultConfig {
minSdk = 23
}
diff --git a/domain/src/main/java/com/moez/QKSMS/util/FlowPreference.kt b/domain/src/main/java/com/moez/QKSMS/util/FlowPreference.kt
new file mode 100644
index 000000000..a579240cb
--- /dev/null
+++ b/domain/src/main/java/com/moez/QKSMS/util/FlowPreference.kt
@@ -0,0 +1,14 @@
+package com.moez.QKSMS.util
+
+import com.f2prateek.rx.preferences2.Preference
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.rx2.asFlow
+
+class FlowPreference(
+ private val pref: Preference
+) {
+ val flow: Flow = pref.asObservable().asFlow()
+
+ fun get(): T = pref.get()
+ fun set(value: T) = pref.set(value)
+}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 6734a85bf..ca4c18c17 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,46 +1,45 @@
[versions]
agp = "8.13.1"
-kotlin = "1.7.21"
+kotlin = "1.9.25"
appcompat = "1.7.1"
-autodispose-android-archcomponents = "1.3.0"
-conductor = "2.1.5"
-constraintlayout = "1.1.3"
+autodispose-android-archcomponents = "1.4.1"
+conductor = "3.2.0"
+constraintlayout = "2.2.1"
dagger = "2.57.2"
datashare = "1.3.0"
-documentfile = "1.0.1"
-emoji2-bundled = "1.4.0"
-exifinterface = "1.0.0"
+documentfile = "1.1.0"
+emoji2-bundled = "1.6.0"
+exifinterface = "1.4.2"
exoplayer-core = "r2.9.0"
flexbox = "3.0.0"
-glide = "4.16.0"
+glide = "5.0.5"
javax-annotation-api = "1.3.2"
-junit = "4.12"
-kotlin-stdlib = "1.7.21"
-kotlinx-coroutines-core = "1.4.3"
-ktx = "1.10.1"
-libphonenumber-android = "8.13.47"
-lifecycle-extensions = "2.1.0"
+junit = "4.13.2"
+kotlinx-coroutines-core = "1.8.0"
+ktx = "1.17.0"
+libphonenumber-android = "9.0.17"
+lifecycle = "2.1.0"
material = "1.13.0"
-mockito-android = "2.18.3"
-moshi = "1.8.0"
-okhttp = "2.5.0"
-okhttp-version = "4.10.0"
+mockito-android = "5.7.0"
+moshi = "1.15.2"
+okhttp2 = "2.7.5"
+okhttp3 = "4.12.0"
photoview = "2.1.4"
realm-android-adapters = "3.1.0"
realm-annotations = "10.19.0"
-robolectric = "4.10.3"
-runner = "1.1.0-alpha3"
-rx-preferences = "2.0.0-RC3"
-rxandroid = "2.0.1"
-rxbinding-kotlin = "2.0.0"
-rxdogtag = "0.2.0"
-rxjava = "2.1.4"
-rxkotlin = "2.1.0"
+robolectric = "4.16"
+runner = "1.7.0"
+rx-preferences = "2.0.1"
+rxandroid = "2.1.1"
+rxbinding-kotlin = "2.2.0"
+rxdogtag = "1.0.2"
+rxjava = "2.2.21"
+rxkotlin = "2.4.0"
shortcutbadger = "1.1.22"
timber = "5.0.1"
-google-services = "4.3.14"
-viewpager2 = "1.0.0-beta05"
-work-runtime-ktx = "2.8.0"
+google-services = "4.4.4"
+viewpager2 = "1.1.0"
+work-runtime-ktx = "2.10.5"
[libraries]
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
@@ -49,8 +48,11 @@ androidx-documentfile = { module = "androidx.documentfile:documentfile", version
androidx-emoji2-bundled = { module = "androidx.emoji2:emoji2-bundled", version.ref = "emoji2-bundled" }
androidx-exifinterface = { module = "androidx.exifinterface:exifinterface", version.ref = "exifinterface" }
androidx-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "ktx" }
-androidx-lifecycle-common-java8 = { module = "androidx.lifecycle:lifecycle-common-java8", version.ref = "lifecycle-extensions" }
-androidx-lifecycle-extensions = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "lifecycle-extensions" }
+lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
+lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" }
+lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycle" }
+lifecycle-common-java8 = { group = "androidx.lifecycle", name = "lifecycle-common-java8", version.ref = "lifecycle" }
+lifecycle-extensions = { group = "androidx.lifecycle", name = "lifecycle-extensions", version.ref = "lifecycle" }
androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" }
androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "work-runtime-ktx" }
androidx-work-rxjava2 = { module = "androidx.work:work-rxjava2", version.ref = "work-runtime-ktx" }
@@ -71,8 +73,8 @@ exoplayer-core = { module = "com.github.google.ExoPlayer:exoplayer-core", versio
flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" }
glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
javax-annotation-api = { module = "javax.annotation:javax.annotation-api", version.ref = "javax-annotation-api" }
-kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin-stdlib" }
-kotlin-stdlib-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin-stdlib" }
+kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
+kotlin-stdlib-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin" }
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines-core" }
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines-core" }
kotlinx-coroutines-reactive = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactive", version.ref = "kotlinx-coroutines-core" }
@@ -84,9 +86,9 @@ mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito-and
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
moshi-kotlin = { module = "com.squareup.moshi:moshi-kotlin", version.ref = "moshi" }
moshi-kotlin-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi" }
-okhttp = { module = "com.squareup.okhttp:okhttp", version.ref = "okhttp" }
-okhttp-urlconnection = { module = "com.squareup.okhttp:okhttp-urlconnection", version.ref = "okhttp" }
-okhttp3-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp-version" }
+okhttp = { module = "com.squareup.okhttp:okhttp", version.ref = "okhttp2" }
+okhttp-urlconnection = { module = "com.squareup.okhttp:okhttp-urlconnection", version.ref = "okhttp2" }
+okhttp3-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp3" }
photoview = { module = "com.github.chrisbanes:photoview", version.ref = "photoview" }
realm-android-adapters = { module = "com.github.realm:realm-android-adapters", version.ref = "realm-android-adapters" }
realm-android-library = { module = "io.realm:realm-android-library", version.ref = "realm-annotations" }
diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts
index afbe80a1a..a21985684 100644
--- a/presentation/build.gradle.kts
+++ b/presentation/build.gradle.kts
@@ -83,16 +83,6 @@ android {
includeInBundle = false
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
- }
-
- // kotlinOptions inside android block (Kotlin DSL)
- kotlinOptions {
- jvmTarget = "1.8"
- }
-
lint {
abortOnError = false
}
@@ -100,8 +90,11 @@ android {
dependencies {
// lifecycle
- implementation(libs.androidx.lifecycle.extensions)
- implementation(libs.androidx.lifecycle.common.java8)
+ implementation(libs.lifecycle.viewmodel.ktx)
+ implementation(libs.lifecycle.runtime.ktx)
+ implementation(libs.lifecycle.livedata.ktx)
+ implementation(libs.lifecycle.common.java8)
+ implementation(libs.lifecycle.extensions)
// androidx
implementation(libs.androidx.appcompat)
diff --git a/presentation/proguard-rules.pro b/presentation/proguard-rules.pro
index fed41f3a1..dd3caedf3 100644
--- a/presentation/proguard-rules.pro
+++ b/presentation/proguard-rules.pro
@@ -1,7 +1,4 @@
--dontobfuscate
-
# android-smsmms
-# -keep class android.net.** { *; }
-dontwarn android.net.ConnectivityManager
-dontwarn android.net.LinkProperties
@@ -45,8 +42,10 @@
-dontwarn org.slf4j.Logger
-dontwarn org.slf4j.LoggerFactory
+# Keep @FromJson/@ToJson adapters
-keepclasseswithmembers class * {
- @com.squareup.moshi.* ;
+ @com.squareup.moshi.FromJson ;
+ @com.squareup.moshi.ToJson ;
}
-keep @com.squareup.moshi.JsonQualifier interface *
@@ -106,24 +105,27 @@
(...);
;
}
-# Dagger
-# This is to allow the restore functionality to work
+
+# Dagger 2
-keep class dagger.** { *; }
--keep class * extends dagger.Module { *; }
--keep class * extends dagger.Component { *; }
--keep class * extends dagger.Subcomponent { *; }
--keep class * {
+
+-keep @dagger.Module class * { *; }
+-keep @dagger.Subcomponent interface * { *; }
+-keep @dagger.Component interface * { *; }
+
+-keepclassmembers class * {
@dagger.Provides ;
}
+
+# RxJava
-keep class io.reactivex.** { *; }
-keep class io.reactivex.subjects.** { *; }
-keep class androidx.activity.result.** { *; }
-keep class org.prauga.messages.** { *; }
--keep class io.realm.annotations.RealmModule
+# Realm
-keep @io.realm.annotations.RealmModule class *
-keep @interface io.realm.annotations.RealmModule { *; }
--keep class io.realm.annotations.RealmModule { *; }
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class * { *; }
@@ -131,7 +133,6 @@
-keep class io.realm.internal.KeepMember
-keep @io.realm.internal.KeepMember class * { @io.realm.internal.KeepMember *; }
--dontwarn javax.**
-dontwarn io.realm.**
-dontwarn io.reactivex.android.**
diff --git a/presentation/src/main/java/com/moez/QKSMS/common/MenuItemAdapter.kt b/presentation/src/main/java/com/moez/QKSMS/common/MenuItemAdapter.kt
index d824daafc..e1b600bf8 100644
--- a/presentation/src/main/java/com/moez/QKSMS/common/MenuItemAdapter.kt
+++ b/presentation/src/main/java/com/moez/QKSMS/common/MenuItemAdapter.kt
@@ -24,20 +24,23 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.ArrayRes
import androidx.recyclerview.widget.RecyclerView
+import io.reactivex.disposables.CompositeDisposable
+import io.reactivex.subjects.PublishSubject
+import io.reactivex.subjects.Subject
import org.prauga.messages.common.base.QkAdapter
import org.prauga.messages.common.base.QkBindingViewHolder
import org.prauga.messages.common.util.Colors
import org.prauga.messages.common.util.extensions.resolveThemeColor
import org.prauga.messages.common.util.extensions.setVisible
import org.prauga.messages.databinding.MenuListItemBinding
-import io.reactivex.disposables.CompositeDisposable
-import io.reactivex.subjects.PublishSubject
-import io.reactivex.subjects.Subject
import javax.inject.Inject
data class MenuItem(val title: String, val actionId: Int)
-class MenuItemAdapter @Inject constructor(private val context: Context, private val colors: Colors) : QkAdapter