From 2dee02e771c0e088a92f0480633b70580ecdb2d8 Mon Sep 17 00:00:00 2001 From: Daxesh Date: Mon, 27 Feb 2023 18:25:11 +0530 Subject: [PATCH 01/14] project setup --- app/build.gradle | 61 +++++ app/proguard-rules.pro | 21 ++ .../bulletin/ExampleInstrumentedTest.kt | 24 ++ app/src/main/AndroidManifest.xml | 29 +++ app/src/main/java/com/bulletin/BulletinApp.kt | 29 +++ .../java/com/bulletin/BulletinDataStore.kt | 56 +++++ app/src/main/java/com/bulletin/BulletinSdk.kt | 30 +++ .../main/java/com/bulletin/MainActivity.kt | 38 +++ .../com/bulletin/extension/JsonExtension.kt | 27 +++ .../java/com/bulletin/extension/Storage.kt | 10 + .../com/bulletin/extension/StringExtension.kt | 38 +++ .../com/bulletin/extension/String_Compare.kt | 7 + .../java/com/bulletin/models/ActionButton.kt | 8 + .../java/com/bulletin/models/BulletPoint.kt | 16 ++ .../java/com/bulletin/models/BulletinItem.kt | 32 +++ .../com/bulletin/models/BulletinVersion.kt | 14 ++ .../main/java/com/bulletin/models/Media.kt | 32 +++ .../main/java/com/bulletin/models/Message.kt | 15 ++ .../main/java/com/bulletin/models/PreTitle.kt | 6 + .../main/java/com/bulletin/models/Title.kt | 5 + .../main/java/com/bulletin/models/Version.kt | 6 + .../bulletin/utilities/AppStorageHelper.kt | 38 +++ .../bulletin/utilities/AppUpdatedChecker.kt | 42 ++++ .../java/com/bulletin/utilities/GsonHelper.kt | 37 +++ .../utilities/RuntimeTypeAdapterFactory.kt | 223 ++++++++++++++++++ .../com/bulletin/utilities/VersionUtil.kt | 91 +++++++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-night/themes.xml | 16 ++ app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/themes.xml | 16 ++ app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 ++ .../com/example/bulletin/ExampleUnitTest.kt | 17 ++ build.gradle | 10 + gradle.properties | 23 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + 51 files changed, 1278 insertions(+) create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/bulletin/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/bulletin/BulletinApp.kt create mode 100644 app/src/main/java/com/bulletin/BulletinDataStore.kt create mode 100644 app/src/main/java/com/bulletin/BulletinSdk.kt create mode 100644 app/src/main/java/com/bulletin/MainActivity.kt create mode 100644 app/src/main/java/com/bulletin/extension/JsonExtension.kt create mode 100644 app/src/main/java/com/bulletin/extension/Storage.kt create mode 100644 app/src/main/java/com/bulletin/extension/StringExtension.kt create mode 100644 app/src/main/java/com/bulletin/extension/String_Compare.kt create mode 100644 app/src/main/java/com/bulletin/models/ActionButton.kt create mode 100644 app/src/main/java/com/bulletin/models/BulletPoint.kt create mode 100644 app/src/main/java/com/bulletin/models/BulletinItem.kt create mode 100644 app/src/main/java/com/bulletin/models/BulletinVersion.kt create mode 100644 app/src/main/java/com/bulletin/models/Media.kt create mode 100644 app/src/main/java/com/bulletin/models/Message.kt create mode 100644 app/src/main/java/com/bulletin/models/PreTitle.kt create mode 100644 app/src/main/java/com/bulletin/models/Title.kt create mode 100644 app/src/main/java/com/bulletin/models/Version.kt create mode 100644 app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt create mode 100644 app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt create mode 100644 app/src/main/java/com/bulletin/utilities/GsonHelper.kt create mode 100644 app/src/main/java/com/bulletin/utilities/RuntimeTypeAdapterFactory.kt create mode 100644 app/src/main/java/com/bulletin/utilities/VersionUtil.kt create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/example/bulletin/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..95d47e9 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,61 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdk 32 + + defaultConfig { + applicationId "com.bulletin" + minSdk 21 + targetSdk 32 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + + +ext { + appCompat='1.4.1' + materialDesign='1.6.0' + vectorDrawable='1.1.0' + multiDex='2.0.1' + jUnit='4.13.2' + runner='1.4.0' + playCore='1.10.3' + retrofit='2.9.0' + espressoCore='3.4.0' +} +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "androidx.appcompat:appcompat:$appCompat" + implementation "com.google.android.material:material:$materialDesign" + implementation "androidx.vectordrawable:vectordrawable:$vectorDrawable" + implementation "androidx.multidex:multidex:$multiDex" + implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: []) + testImplementation "junit:junit:$jUnit" + androidTestImplementation "androidx.test:runner:$runner" + implementation "com.google.android.play:core:$playCore" + androidTestImplementation "androidx.test.espresso:espresso-core:$espressoCore" + + implementation "com.squareup.retrofit2:converter-gson:$retrofit" + + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/bulletin/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/bulletin/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..b260604 --- /dev/null +++ b/app/src/androidTest/java/com/example/bulletin/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.bulletin + +import androidx.test.platform.app.InstrumentationRegistry +//import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +//@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.bulletin", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1d92ea6 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/BulletinApp.kt b/app/src/main/java/com/bulletin/BulletinApp.kt new file mode 100644 index 0000000..e39a0bf --- /dev/null +++ b/app/src/main/java/com/bulletin/BulletinApp.kt @@ -0,0 +1,29 @@ +package com.bulletin + +import android.app.Application +import android.content.Context +import android.content.pm.PackageManager +import android.util.Log +import com.bulletin.utilities.GsonHelper +import com.google.gson.Gson + +class BulletinApp : Application() { + private var gsonInstance: Gson? = null + + companion object { + lateinit var shared: BulletinApp + private set + + val applicationContext: Context + get() { + return shared.applicationContext + } + } + + //Initializer + init { + shared = this + gsonInstance = GsonHelper.getGsonInstance() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/BulletinDataStore.kt b/app/src/main/java/com/bulletin/BulletinDataStore.kt new file mode 100644 index 0000000..5e95e2b --- /dev/null +++ b/app/src/main/java/com/bulletin/BulletinDataStore.kt @@ -0,0 +1,56 @@ +package com.bulletin + +import com.bulletin.models.BulletinItem +import com.bulletin.models.BulletinVersion +import com.bulletin.utilities.AppStorageHelper +import com.bulletin.utilities.VersionUtil +import java.util.* + +object BulletinDataStore { + var data: MutableList = mutableListOf() + fun registerVersionInfo(version: String, map: HashMap) { + for ((key, value) in map) { + + } + } + + fun registerVersionInfo(version: String, items: MutableList?) { + if (items != null && items.isNotEmpty()) { + data.add(BulletinVersion(version, items)) + Collections.sort(data, BulletinVersion.descendingSort) + } + } + + + fun getData( + fromNewVersion: String?, + toOldVersion: String?, + limit: Int? = null + ): MutableList { + val finalMap: MutableList = mutableListOf() + + if (fromNewVersion == null && toOldVersion == null && limit == null) { + return data + } else if (fromNewVersion == null && toOldVersion == null && limit != null) { + return finalMap.take(limit).toMutableList() + } + + + for (indice in data.indices) { + + if (indice == 0) AppStorageHelper.lastAppVersion = data[indice].versionNumber + if (VersionUtil.versionCompare(fromNewVersion, data[indice].versionNumber) >= 0) { + finalMap.add(data[indice]) + } else if (VersionUtil.versionCompare(toOldVersion, data[indice].versionNumber) < 0) { + finalMap.add(data[indice]) + } + + if (limit != null && finalMap.size >= limit) break + + + } + return finalMap + + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/BulletinSdk.kt b/app/src/main/java/com/bulletin/BulletinSdk.kt new file mode 100644 index 0000000..ae9b1d1 --- /dev/null +++ b/app/src/main/java/com/bulletin/BulletinSdk.kt @@ -0,0 +1,30 @@ +package com.bulletin + +import com.bulletin.models.BulletinVersion +import com.bulletin.utilities.AppStorageHelper + +class BulletinSdk { + + fun showFullBulletin() : Boolean{ + val items = BulletinDataStore.getData(null, null) + return showBulletin(items) + } + + fun showLastBulletins(limit: Int? = 1): Boolean { + val items = BulletinDataStore.getData(null, null, limit) + return showBulletin(items) + } + + fun showUnseenBulletin(limit: Int? = null): Boolean { + val lastseenVersion = AppStorageHelper.lastAppVersion + val items = BulletinDataStore.getData(null, "1.2", limit) + return showBulletin(items) + } + + fun showBulletin(item: MutableList?): Boolean { + if (item == null || item.isEmpty()) return false; + + return true + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt new file mode 100644 index 0000000..f22ef0a --- /dev/null +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -0,0 +1,38 @@ +package com.example.bulletin + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.bulletin.BulletinDataStore +import com.bulletin.BulletinSdk +import com.bulletin.models.ActionButton +import com.bulletin.models.BulletinItem +import com.bulletin.models.PreTitle + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + val bulletinItem = PreTitle("text") + val bulletinItem1 = ActionButton("actionButton") + val bulletinItem2 = bulletinItem.copy(text = "Hello") + val bulletinItem3 = bulletinItem1.copy(title = "New Action button") + val bulletinItem4 = bulletinItem.copy(text = "Hello boss") + val bulletinItem5 = bulletinItem.copy(text = "Hello boss") + val bulletinItemListTwo: MutableList = mutableListOf() + + bulletinItemListTwo.add(bulletinItem) + bulletinItemListTwo.add(bulletinItem2) + bulletinItemListTwo.add(bulletinItem3) + bulletinItemListTwo.add(bulletinItem4) + bulletinItemListTwo.add(bulletinItem5) + + BulletinDataStore.registerVersionInfo("1.0", bulletinItemListTwo) + BulletinDataStore.registerVersionInfo("1.3", bulletinItemListTwo) + BulletinDataStore.registerVersionInfo("1.4", bulletinItemListTwo) + BulletinDataStore.registerVersionInfo("1.1", bulletinItemListTwo) + BulletinDataStore.registerVersionInfo("1.2", bulletinItemListTwo) + + val items = BulletinSdk().showUnseenBulletin(4) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/extension/JsonExtension.kt b/app/src/main/java/com/bulletin/extension/JsonExtension.kt new file mode 100644 index 0000000..2937ed9 --- /dev/null +++ b/app/src/main/java/com/bulletin/extension/JsonExtension.kt @@ -0,0 +1,27 @@ +package com.bulletin.extension + +import com.google.gson.Gson + +fun String.toJsonObj() : Any? { + return toJsonObj(Any::class.java) +} + +fun String.toJsonObj(classOfT : Class) : T? { + try { + return Gson().fromJson(this, classOfT) + } catch (e : Throwable) { + print("Json object conversion failed: $e") + } + return null +} + +fun Any.toJsonString() : String? { + try { + return Gson().toJson(this) + } catch (e : Throwable) { + print("Json string conversion failed: $e") + } + return null +} + + diff --git a/app/src/main/java/com/bulletin/extension/Storage.kt b/app/src/main/java/com/bulletin/extension/Storage.kt new file mode 100644 index 0000000..36794b6 --- /dev/null +++ b/app/src/main/java/com/bulletin/extension/Storage.kt @@ -0,0 +1,10 @@ +package com.bulletin.extension + +import com.bulletin.utilities.AppStorageHelper + +class Storage { +} + +fun Any.saveToStorage(key: Any) { +// AppStorageHelper.save(key, this) +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/extension/StringExtension.kt b/app/src/main/java/com/bulletin/extension/StringExtension.kt new file mode 100644 index 0000000..83084aa --- /dev/null +++ b/app/src/main/java/com/bulletin/extension/StringExtension.kt @@ -0,0 +1,38 @@ +package com.bulletin.extension + +import java.util.* + +fun String?.isEmpty(): Boolean { + return this == null || "" == trim() +} + +fun String?.toCamelCaseSingleWord(): String { + if (this == null) return "" + + var s = "" + if (length > 0) { + s = substring(0, 1).uppercase(Locale.getDefault()) + } + + if (length > 1) { + s += substring(1).lowercase(Locale.getDefault()) + } + return s +} + +fun String.toCamelCaseMultipleWords(): String { + if (length == 0) { + return this + } + val parts = split(" ").toTypedArray() + var camelCaseString = "" + for (part in parts) { + camelCaseString = camelCaseString + toProperCase(part) + " " + } + return camelCaseString +} + +private fun toProperCase(s: String): String? { + return s.substring(0, 1).uppercase(Locale.getDefault()) + + s.substring(1).lowercase(Locale.getDefault()) +} diff --git a/app/src/main/java/com/bulletin/extension/String_Compare.kt b/app/src/main/java/com/bulletin/extension/String_Compare.kt new file mode 100644 index 0000000..b6c6701 --- /dev/null +++ b/app/src/main/java/com/bulletin/extension/String_Compare.kt @@ -0,0 +1,7 @@ +package com.bulletin.extension + + +internal fun String.validVersion(): String { + val chars =this.toCharArray() + return "false" +} diff --git a/app/src/main/java/com/bulletin/models/ActionButton.kt b/app/src/main/java/com/bulletin/models/ActionButton.kt new file mode 100644 index 0000000..d36d29a --- /dev/null +++ b/app/src/main/java/com/bulletin/models/ActionButton.kt @@ -0,0 +1,8 @@ +package com.bulletin.models + +import com.google.gson.annotations.SerializedName + +data class ActionButton(val title: String) : BulletinItem() { + @SerializedName("clickPayload") + var clickPayload: Any? = null +} diff --git a/app/src/main/java/com/bulletin/models/BulletPoint.kt b/app/src/main/java/com/bulletin/models/BulletPoint.kt new file mode 100644 index 0000000..60ee1de --- /dev/null +++ b/app/src/main/java/com/bulletin/models/BulletPoint.kt @@ -0,0 +1,16 @@ +package com.bulletin.models + +import com.google.gson.annotations.SerializedName + +data class BulletPoint(var bulletType: BulletType) : BulletinItem() { + enum class BulletType { + UNICODE, + IMAGE; + } + @SerializedName("title") + var title: String? = null; + @SerializedName("subtitle") + var subtitle: String? = null +} + + diff --git a/app/src/main/java/com/bulletin/models/BulletinItem.kt b/app/src/main/java/com/bulletin/models/BulletinItem.kt new file mode 100644 index 0000000..68c1db1 --- /dev/null +++ b/app/src/main/java/com/bulletin/models/BulletinItem.kt @@ -0,0 +1,32 @@ +package com.bulletin.models + +import com.bulletin.utilities.RuntimeTypeAdapterFactory +import com.wrx.wazirx.views.bulletin.model.Media + +abstract class BulletinItem() { + companion object { + @JvmStatic + val runtimeTypeAdapterFactory: RuntimeTypeAdapterFactory<*> + get() { + val mediaRuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of( + BulletinItem::class.java, "type" + ) + mediaRuntimeTypeAdapterFactory.registerSubtype(PreTitle::class.java, "preTitle") + mediaRuntimeTypeAdapterFactory.registerSubtype(Title::class.java, "title") + mediaRuntimeTypeAdapterFactory.registerSubtype(Message::class.java, "message") + mediaRuntimeTypeAdapterFactory.registerSubtype(Media::class.java, "media") + mediaRuntimeTypeAdapterFactory.registerSubtype( + BulletPoint::class.java, + "bulletPoint" + ) + mediaRuntimeTypeAdapterFactory.registerSubtype( + ActionButton::class.java, + "actionButton" + ) + return mediaRuntimeTypeAdapterFactory + } + + } + + //endregion + } diff --git a/app/src/main/java/com/bulletin/models/BulletinVersion.kt b/app/src/main/java/com/bulletin/models/BulletinVersion.kt new file mode 100644 index 0000000..4da560c --- /dev/null +++ b/app/src/main/java/com/bulletin/models/BulletinVersion.kt @@ -0,0 +1,14 @@ +package com.bulletin.models + +import com.bulletin.utilities.VersionUtil + +data class BulletinVersion(val versionNumber: String, val items: MutableList) { + companion object { + var descendingSort: Comparator = + Comparator { t2: BulletinVersion, t1: BulletinVersion -> + VersionUtil.versionCompare(t1.versionNumber, t2.versionNumber) + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/models/Media.kt b/app/src/main/java/com/bulletin/models/Media.kt new file mode 100644 index 0000000..01c8e03 --- /dev/null +++ b/app/src/main/java/com/bulletin/models/Media.kt @@ -0,0 +1,32 @@ +package com.wrx.wazirx.views.bulletin.model + +import com.bulletin.models.BulletinItem +import com.bulletin.utilities.RuntimeTypeAdapterFactory +import com.google.gson.annotations.SerializedName + + +open class Media() : BulletinItem() { + + @SerializedName("imageType") + lateinit var imageType: String + @SerializedName("size") + var size: Int = 0 + @SerializedName("url") + lateinit var url: String + + companion object { + @JvmStatic + val runtimeTypeAdapterFactory: RuntimeTypeAdapterFactory<*> + get() { + val mediaRuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of( + Media::class.java, "type" + ) + mediaRuntimeTypeAdapterFactory.registerSubtype(ImageMedia::class.java, "Image") + return mediaRuntimeTypeAdapterFactory + } + } +} + +class ImageMedia(val versionNumber :String) : Media() { + +} diff --git a/app/src/main/java/com/bulletin/models/Message.kt b/app/src/main/java/com/bulletin/models/Message.kt new file mode 100644 index 0000000..558f97a --- /dev/null +++ b/app/src/main/java/com/bulletin/models/Message.kt @@ -0,0 +1,15 @@ +package com.bulletin.models + +import com.google.gson.annotations.SerializedName + +data class Message(val message: String) : BulletinItem() { + + enum class MessageType(type: String) { + HTML("html"), + TEXT("text"); + } + + @SerializedName("imageType") + var messageType: MessageType? = null + +} diff --git a/app/src/main/java/com/bulletin/models/PreTitle.kt b/app/src/main/java/com/bulletin/models/PreTitle.kt new file mode 100644 index 0000000..bf4c3de --- /dev/null +++ b/app/src/main/java/com/bulletin/models/PreTitle.kt @@ -0,0 +1,6 @@ +package com.bulletin.models + + +data class PreTitle(val text: String) : BulletinItem() { + +} diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt new file mode 100644 index 0000000..a8d70c3 --- /dev/null +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -0,0 +1,5 @@ +package com.bulletin.models + +data class Title( val text: String) : BulletinItem() { + +} diff --git a/app/src/main/java/com/bulletin/models/Version.kt b/app/src/main/java/com/bulletin/models/Version.kt new file mode 100644 index 0000000..082bc30 --- /dev/null +++ b/app/src/main/java/com/bulletin/models/Version.kt @@ -0,0 +1,6 @@ +package com.bulletin.models + +data class Version(val versionNumber: String) { + lateinit var version :String + +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt new file mode 100644 index 0000000..f761b87 --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt @@ -0,0 +1,38 @@ +package com.bulletin.utilities + +import android.content.Context +import android.content.SharedPreferences +import com.bulletin.BulletinApp.Companion.applicationContext + +object AppStorageHelper { + private const val SHARED_PREFS_NAME = "Bulletin_Shared_Prefs" + private const val SHARED_PREFS_PARAMS_LATEST_APP_VERSION = "latest_app_version" + + // App version + var lastAppVersion: String? + get() { + return if (AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] == null) { + "" + } else { + AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] + } + } + set(value) { + save(SHARED_PREFS_PARAMS_LATEST_APP_VERSION, value) + } + + //region Shared Prefs methods + private val sharedPreferences: SharedPreferences + get() = applicationContext.getSharedPreferences( + SHARED_PREFS_NAME, + Context.MODE_PRIVATE + ) + + public fun save(key: String, value: String?) { + sharedPreferences.edit().putString(key, value).apply() + } + + public operator fun get(key: String): String? { + return sharedPreferences.getString(key, null) + } //endregion +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt b/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt new file mode 100644 index 0000000..8ed9b2f --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt @@ -0,0 +1,42 @@ +package com.bulletin.utilities + +import com.bulletin.BulletinApp + + +object AppUpdatedChecker { + + enum class AppRunningState(val value: Int) { + NORMAL(1), + FRESHINSTALL(2), + AFTERUPDATE(3); + } + + var appRunningState = AppRunningState.NORMAL + + + fun currentAppRunningState() { + + // Fetch Last Known App Version from User Defaults + val lastKnownAppVersion: String? = + AppStorageHelper.lastAppVersion // get(LAST_KNOWN_APP_VERSION_KEY); + + // Fetch Current App Version + val currentAppVersion: String? = VersionUtil.getApplicationVersion() + appRunningState = if (lastKnownAppVersion != null) { + if (currentAppVersion == lastKnownAppVersion) { + + // App is running on Same Version + AppRunningState.NORMAL + } else { + + // App is running newer version then Last known App Version + AppRunningState.AFTERUPDATE + } + } else { + + // App Running After Fresh Install + AppRunningState.FRESHINSTALL + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/GsonHelper.kt b/app/src/main/java/com/bulletin/utilities/GsonHelper.kt new file mode 100644 index 0000000..87215a0 --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/GsonHelper.kt @@ -0,0 +1,37 @@ +package com.bulletin.utilities + +import com.bulletin.models.BulletinItem +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.wrx.wazirx.views.bulletin.model.Media + + +object GsonHelper { + private var gsonBuilder: GsonBuilder? = null + private var gsonInstance: Gson? = null + + private fun getGsonBuilder(): GsonBuilder { + if (gsonBuilder == null) { + gsonBuilder = GsonBuilder() + setupGsonBuilder() + } + return gsonBuilder as GsonBuilder + } + + fun getGsonInstance(): Gson? { + if (gsonInstance == null) { + gsonInstance = getGsonBuilder().create() + } + return gsonInstance + } + + + private fun setupGsonBuilder() { + gsonBuilder!!.setDateFormat("yyyy-MM-dd'T'HH:mm:ss+Z") + gsonBuilder!!.enableComplexMapKeySerialization() + + gsonBuilder!!.registerTypeAdapterFactory(Media.runtimeTypeAdapterFactory) + gsonBuilder!!.registerTypeAdapterFactory(BulletinItem.runtimeTypeAdapterFactory) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/RuntimeTypeAdapterFactory.kt b/app/src/main/java/com/bulletin/utilities/RuntimeTypeAdapterFactory.kt new file mode 100644 index 0000000..824b49f --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/RuntimeTypeAdapterFactory.kt @@ -0,0 +1,223 @@ +package com.bulletin.utilities + + +import com.google.gson.* +import com.google.gson.internal.Streams +import com.google.gson.reflect.TypeToken +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonWriter +import java.io.IOException + +/** + * Adapts values whose runtime type may differ from their declaration type. This + * is necessary when a field's type is not the same type that GSON should create + * when deserializing that field. For example, consider these types: + *
   `abstract class Shape {
+ * int x;
+ * int y;
+ * }
+ * class Circle extends Shape {
+ * int radius;
+ * }
+ * class Rectangle extends Shape {
+ * int width;
+ * int height;
+ * }
+ * class Diamond extends Shape {
+ * int width;
+ * int height;
+ * }
+ * class Drawing {
+ * Shape bottomShape;
+ * Shape topShape;
+ * }
+`
* + * + * Without additional type information, the serialized JSON is ambiguous. Is + * the bottom shape in this drawing a rectangle or a diamond?
   `{
+ * "bottomShape": {
+ * "width": 10,
+ * "height": 5,
+ * "x": 0,
+ * "y": 0
+ * },
+ * "topShape": {
+ * "radius": 2,
+ * "x": 4,
+ * "y": 1
+ * }
+ * }`
+ * This class addresses this problem by adding type information to the + * serialized JSON and honoring that type information when the JSON is + * deserialized:
   `{
+ * "bottomShape": {
+ * "type": "Diamond",
+ * "width": 10,
+ * "height": 5,
+ * "x": 0,
+ * "y": 0
+ * },
+ * "topShape": {
+ * "type": "Circle",
+ * "radius": 2,
+ * "x": 4,
+ * "y": 1
+ * }
+ * }`
+ * Both the type field name (`"type"`) and the type labels (`"Rectangle"`) are configurable. + * + * + *

Registering Types

+ * Create a `RuntimeTypeAdapterFactory` by passing the base type and type field + * name to the [.of] factory method. If you don't supply an explicit type + * field name, `"type"` will be used.
   `RuntimeTypeAdapterFactory shapeAdapterFactory
+ * = RuntimeTypeAdapterFactory.of(Shape.class, "type");
+`
* + * Next register all of your subtypes. Every subtype must be explicitly + * registered. This protects your application from injection attacks. If you + * don't supply an explicit type label, the type's simple name will be used. + *
   `shapeAdapter.registerSubtype(Rectangle.class, "Rectangle");
+ * shapeAdapter.registerSubtype(Circle.class, "Circle");
+ * shapeAdapter.registerSubtype(Diamond.class, "Diamond");
+`
* + * Finally, register the type adapter factory in your application's GSON builder: + *
   `Gson gson = new GsonBuilder()
+ * .registerTypeAdapterFactory(shapeAdapterFactory)
+ * .create();
+`
* + * Like `GsonBuilder`, this API supports chaining:
   `RuntimeTypeAdapterFactory shapeAdapterFactory = RuntimeTypeAdapterFactory.of(Shape.class)
+ * .registerSubtype(Rectangle.class)
+ * .registerSubtype(Circle.class)
+ * .registerSubtype(Diamond.class);
+`
* + */ +class RuntimeTypeAdapterFactory private constructor( + baseType: Class<*>?, + typeFieldName: String? +) : TypeAdapterFactory { + private val baseType: Class<*> + private var defaultTypeLabel: String? = null + private val typeFieldName: String + private val labelToSubtype: MutableMap> = LinkedHashMap() + /** + * Registers `type` identified by `label`. Labels are case + * sensitive. + * + * @throws IllegalArgumentException if either `type` or `label` + * have already been registered on this type adapter. + */ + /** + * Registers `type` identified by its [simple][Class.getSimpleName]. Labels are case sensitive. + * + * @throws IllegalArgumentException if either `type` or its simple name + * have already been registered on this type adapter. + */ + @JvmOverloads + fun registerSubtype( + type: Class?, + label: String? = type!!.simpleName + ): RuntimeTypeAdapterFactory { + if (type == null || label == null) { + throw NullPointerException() + } + labelToSubtype[label] = type + return this + } + + /** + * Registers `defaultType` which is used when the type is null or unknown + * You must call this method if you want to handle the cases where you expect the type to be null. + * If this method is not called then JsonParseException will be thrown if any null type is encountered. + */ + fun registerDefaultSubtype(type: Class?, label: String?): RuntimeTypeAdapterFactory { + if (type == null || label == null) { + throw NullPointerException() + } + defaultTypeLabel = label + registerSubtype(type, label) + return this + } + + override fun create(gson: Gson, type: TypeToken): TypeAdapter? { + if (type.rawType != baseType) { + return null + } + val labelToDelegate: MutableMap> = LinkedHashMap() + val subtypeToDelegate: MutableMap, TypeAdapter<*>> = LinkedHashMap() + for ((key, value) in labelToSubtype) { + val delegate = gson.getDelegateAdapter(this, TypeToken.get(value)) + labelToDelegate[key] = delegate + subtypeToDelegate[value] = delegate + } + return object : TypeAdapter() { + @Throws(IOException::class) + override fun read(`in`: JsonReader): R { + val jsonElement = Streams.parse(`in`) + val labelJsonElement = jsonElement.asJsonObject[typeFieldName] + val label: String + label = if (labelJsonElement == null) ({ + if (defaultTypeLabel == null) { + throw JsonParseException( + "cannot deserialize " + baseType + + " because it does not define a default " + typeFieldName + ) + } else { + defaultTypeLabel + } + + }).toString() else { + labelJsonElement.asString + } + + var delegate// registration requires that subtype extends T + = labelToDelegate[label] as TypeAdapter? + if (delegate == null) { + delegate = labelToDelegate[defaultTypeLabel] as TypeAdapter? + } + return delegate!!.fromJsonTree(jsonElement) + } + + @Throws(IOException::class) + override fun write(out: JsonWriter, value: R) { + val srcType: Class<*> = value!!::class.java + val delegate// registration requires that subtype extends T + = subtypeToDelegate[srcType] as TypeAdapter? + ?: throw JsonParseException( + "cannot serialize " + srcType.name + + "; did you forget to register a subtype?" + ) + val jsonObject = delegate.toJsonTree(value).asJsonObject + val clone = JsonObject() + for ((key, value1) in jsonObject.entrySet()) { + clone.add(key, value1) + } + Streams.write(clone, out) + } + }.nullSafe() + } + + companion object { + /** + * Creates a new runtime type adapter using for `baseType` using `typeFieldName` as the type field name. Type field names are case sensitive. + */ + fun of(baseType: Class?, typeFieldName: String?): RuntimeTypeAdapterFactory { + return RuntimeTypeAdapterFactory(baseType, typeFieldName) + } + + /** + * Creates a new runtime type adapter for `baseType` using `"type"` as + * the type field name. + */ + fun of(baseType: Class?): RuntimeTypeAdapterFactory { + return RuntimeTypeAdapterFactory(baseType, "type") + } + } + + init { + if (typeFieldName == null || baseType == null) { + throw NullPointerException() + } + this.baseType = baseType + this.typeFieldName = typeFieldName + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/VersionUtil.kt b/app/src/main/java/com/bulletin/utilities/VersionUtil.kt new file mode 100644 index 0000000..d1ecca4 --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/VersionUtil.kt @@ -0,0 +1,91 @@ +package com.bulletin.utilities + +import android.content.pm.PackageManager +import com.bulletin.BulletinApp +import com.bulletin.extension.isEmpty + +object VersionUtil { + + /** + * if v1>v2 : returns 1 + * if v1 vnum2) return 1 + + if (vnum2 > vnum1) return -1 + + // if equal, reset variables and + // go for next numeric part + vnum2 = 0 + vnum1 = vnum2 + i++ + j++ + } + return 0 + } + + fun getLatestVersion(v1: String?, v2: String?): String? { + if (v1.isEmpty()) return v2 + if (v2.isEmpty()) return v1 + + // if (v1!=null && v2!=null) call versionCompare + return if (v1?.let { v2?.let { it1 -> versionCompare(it, it1) } } == -1) { + v2 + } else { + v1 + } + } + + fun getApplicationVersion(): String? { + try { + val pInfo = + BulletinApp.shared.packageManager.getPackageInfo(BulletinApp.shared.packageName, 0) + return pInfo.versionName + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + return "" + } + + fun getVersionInAscendingOrder(set: MutableSet): List { + val list: List = set.toList() + return list.sortedWith { version, version1 -> versionCompare(version1, version) }; + } + +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..11ad208 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..b573182 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Bulletin + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..265747c --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/example/bulletin/ExampleUnitTest.kt b/app/src/test/java/com/example/bulletin/ExampleUnitTest.kt new file mode 100644 index 0000000..c4f07b7 --- /dev/null +++ b/app/src/test/java/com/example/bulletin/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.example.bulletin + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7b9b67d --- /dev/null +++ b/build.gradle @@ -0,0 +1,10 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id 'com.android.application' version '7.2.1' apply false + id 'com.android.library' version '7.2.1' apply false + id 'org.jetbrains.kotlin.android' version '1.6.10' apply false +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..cd0519b --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..76d567d --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Sep 20 16:28:33 IST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME From 86315b1dd9195d8e8d129dd66321ee1f6bef1698 Mon Sep 17 00:00:00 2001 From: Daxesh Date: Thu, 2 Mar 2023 12:19:51 +0530 Subject: [PATCH 02/14] project structure updated --- app/src/main/java/com/bulletin/BulletinApp.kt | 2 +- .../java/com/bulletin/BulletinDataStore.kt | 25 +++--- app/src/main/java/com/bulletin/BulletinSdk.kt | 5 +- .../main/java/com/bulletin/MainActivity.kt | 6 +- .../java/com/bulletin/extension/Storage.kt | 22 ++++- .../com/bulletin/extension/StringExtension.kt | 11 +++ .../com/bulletin/extension/String_Compare.kt | 27 ++++++- .../java/com/bulletin/models/ActionButton.kt | 28 ++++++- .../java/com/bulletin/models/BulletPoint.kt | 81 +++++++++++++++++-- .../main/java/com/bulletin/models/Message.kt | 36 ++++++++- .../main/java/com/bulletin/models/Title.kt | 26 +++++- .../main/java/com/bulletin/models/Version.kt | 23 +++++- .../bulletin/utilities/AppStorageHelper.kt | 72 +++++++++++------ .../bulletin/utilities/AppUpdatedChecker.kt | 4 +- .../java/com/bulletin/utilities/GsonHelper.kt | 63 ++++++++++----- 15 files changed, 345 insertions(+), 86 deletions(-) diff --git a/app/src/main/java/com/bulletin/BulletinApp.kt b/app/src/main/java/com/bulletin/BulletinApp.kt index e39a0bf..caa78fe 100644 --- a/app/src/main/java/com/bulletin/BulletinApp.kt +++ b/app/src/main/java/com/bulletin/BulletinApp.kt @@ -23,7 +23,7 @@ class BulletinApp : Application() { //Initializer init { shared = this - gsonInstance = GsonHelper.getGsonInstance() + gsonInstance = GsonHelper.gsonInstance } } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/BulletinDataStore.kt b/app/src/main/java/com/bulletin/BulletinDataStore.kt index 5e95e2b..b3fcea5 100644 --- a/app/src/main/java/com/bulletin/BulletinDataStore.kt +++ b/app/src/main/java/com/bulletin/BulletinDataStore.kt @@ -1,10 +1,13 @@ package com.bulletin +import com.bulletin.extension.lastSeenVersion import com.bulletin.models.BulletinItem import com.bulletin.models.BulletinVersion +import com.bulletin.models.Version import com.bulletin.utilities.AppStorageHelper import com.bulletin.utilities.VersionUtil import java.util.* +import java.util.prefs.Preferences object BulletinDataStore { var data: MutableList = mutableListOf() @@ -23,8 +26,8 @@ object BulletinDataStore { fun getData( - fromNewVersion: String?, - toOldVersion: String?, + fromNewVersion: Version?, + toOldVersion: Version?, limit: Int? = null ): MutableList { val finalMap: MutableList = mutableListOf() @@ -35,22 +38,22 @@ object BulletinDataStore { return finalMap.take(limit).toMutableList() } + val sortedList = data.sortedWith(compareBy({ + it.versionNumber + })) - for (indice in data.indices) { + for (indice in sortedList.indices) { - if (indice == 0) AppStorageHelper.lastAppVersion = data[indice].versionNumber - if (VersionUtil.versionCompare(fromNewVersion, data[indice].versionNumber) >= 0) { - finalMap.add(data[indice]) - } else if (VersionUtil.versionCompare(toOldVersion, data[indice].versionNumber) < 0) { - finalMap.add(data[indice]) + if (indice == 0) AppStorageHelper.shared.lastSeenVersion = Version.init(sortedList[indice].versionNumber) + if (VersionUtil.versionCompare(fromNewVersion?.version, sortedList[indice].versionNumber) >= 0) { + finalMap.add(sortedList[indice]) + } else if (VersionUtil.versionCompare(toOldVersion?.version, sortedList[indice].versionNumber) < 0) { + finalMap.add(sortedList[indice]) } if (limit != null && finalMap.size >= limit) break - } return finalMap - - } } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/BulletinSdk.kt b/app/src/main/java/com/bulletin/BulletinSdk.kt index ae9b1d1..4c153e9 100644 --- a/app/src/main/java/com/bulletin/BulletinSdk.kt +++ b/app/src/main/java/com/bulletin/BulletinSdk.kt @@ -1,5 +1,6 @@ package com.bulletin +import com.bulletin.extension.lastSeenVersion import com.bulletin.models.BulletinVersion import com.bulletin.utilities.AppStorageHelper @@ -16,8 +17,8 @@ class BulletinSdk { } fun showUnseenBulletin(limit: Int? = null): Boolean { - val lastseenVersion = AppStorageHelper.lastAppVersion - val items = BulletinDataStore.getData(null, "1.2", limit) + val lastseenVersion = AppStorageHelper.shared.lastSeenVersion ?: return false + val items = BulletinDataStore.getData(lastseenVersion, null, limit) return showBulletin(items) } diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt index f22ef0a..0596d82 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.bulletin.BulletinDataStore import com.bulletin.BulletinSdk +import com.bulletin.extension.validVersion import com.bulletin.models.ActionButton import com.bulletin.models.BulletinItem import com.bulletin.models.PreTitle @@ -12,8 +13,11 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + val value = "11".validVersion() + val bulletinItem = PreTitle("text") - val bulletinItem1 = ActionButton("actionButton") + val bulletinItem1 = ActionButton("actionButton","") val bulletinItem2 = bulletinItem.copy(text = "Hello") val bulletinItem3 = bulletinItem1.copy(title = "New Action button") val bulletinItem4 = bulletinItem.copy(text = "Hello boss") diff --git a/app/src/main/java/com/bulletin/extension/Storage.kt b/app/src/main/java/com/bulletin/extension/Storage.kt index 36794b6..b4cb560 100644 --- a/app/src/main/java/com/bulletin/extension/Storage.kt +++ b/app/src/main/java/com/bulletin/extension/Storage.kt @@ -1,10 +1,30 @@ package com.bulletin.extension +import android.content.SharedPreferences +import com.bulletin.models.Version import com.bulletin.utilities.AppStorageHelper +import com.bulletin.utilities.AppStorageHelper.edit class Storage { } fun Any.saveToStorage(key: Any) { // AppStorageHelper.save(key, this) -} \ No newline at end of file +} + +private const val SHARED_PREFS_PARAMS_LATEST_APP_VERSION = "latest_app_version" + +var SharedPreferences.lastSeenVersion : Version? + set(newValue) { + edit { + if (newValue == null) { + it.remove(SHARED_PREFS_PARAMS_LATEST_APP_VERSION) + } else { + it.putString(SHARED_PREFS_PARAMS_LATEST_APP_VERSION, newValue.version.toString()) + } + } + } + get() { + val versionString = getString(SHARED_PREFS_PARAMS_LATEST_APP_VERSION, null) ?: return null + return Version(versionString) + } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/extension/StringExtension.kt b/app/src/main/java/com/bulletin/extension/StringExtension.kt index 83084aa..00d7c82 100644 --- a/app/src/main/java/com/bulletin/extension/StringExtension.kt +++ b/app/src/main/java/com/bulletin/extension/StringExtension.kt @@ -6,6 +6,17 @@ fun String?.isEmpty(): Boolean { return this == null || "" == trim() } +fun String?.capitalized(): String? { + if (this.isNullOrBlank()) { + return this + } + + return this.trim().split("\\s+".toRegex()) + .joinToString(" ") { it.replaceFirstChar { // it: Char + it.uppercase() + } } +} + fun String?.toCamelCaseSingleWord(): String { if (this == null) return "" diff --git a/app/src/main/java/com/bulletin/extension/String_Compare.kt b/app/src/main/java/com/bulletin/extension/String_Compare.kt index b6c6701..0d2dedd 100644 --- a/app/src/main/java/com/bulletin/extension/String_Compare.kt +++ b/app/src/main/java/com/bulletin/extension/String_Compare.kt @@ -1,7 +1,28 @@ package com.bulletin.extension -internal fun String.validVersion(): String { - val chars =this.toCharArray() - return "false" +fun String.isNumeric(): Boolean { + if (this.isEmpty()) { + return false + } + val e = this.takeIf { it.isNotEmpty() } ?: return false + this.toUIntOrNull()?.let { return true } ?: return false +} + +fun String.validVersion(): String? { + + // Convert String In to Array + val versionBlocks = this.split(".").toTypedArray() + + // Validation + if (versionBlocks.size == 0) return null + + // Validation For String as Int + for (versionBlock in versionBlocks) { + if (versionBlock.isNumeric() == false) { + return null + } + } + + return versionBlocks.joinToString(".") } diff --git a/app/src/main/java/com/bulletin/models/ActionButton.kt b/app/src/main/java/com/bulletin/models/ActionButton.kt index d36d29a..c2d2381 100644 --- a/app/src/main/java/com/bulletin/models/ActionButton.kt +++ b/app/src/main/java/com/bulletin/models/ActionButton.kt @@ -2,7 +2,29 @@ package com.bulletin.models import com.google.gson.annotations.SerializedName -data class ActionButton(val title: String) : BulletinItem() { - @SerializedName("clickPayload") - var clickPayload: Any? = null +//data class ActionButton(val title: String) : BulletinItem() { +// @SerializedName("clickPayload") +// var clickPayload: Any? = null +//} + +data class ActionButton(val title: String?, var clickPayload: Any?) : BulletinItem() { + + // region Init Methods + init { + + } + + companion object { + + fun init(attributes: Map): ActionButton? { + + // Set Title + val title = (attributes["title"] as? String) ?: return null + + // Set Click Payload + val clickPayload = attributes["clickPayload"] + + return ActionButton(title,clickPayload) + } + } } diff --git a/app/src/main/java/com/bulletin/models/BulletPoint.kt b/app/src/main/java/com/bulletin/models/BulletPoint.kt index 60ee1de..ca46aea 100644 --- a/app/src/main/java/com/bulletin/models/BulletPoint.kt +++ b/app/src/main/java/com/bulletin/models/BulletPoint.kt @@ -2,15 +2,84 @@ package com.bulletin.models import com.google.gson.annotations.SerializedName -data class BulletPoint(var bulletType: BulletType) : BulletinItem() { +//data class BulletPoint(var bulletType: BulletType) : BulletinItem() { +// enum class BulletType { +// UNICODE, +// IMAGE; +// } +// @SerializedName("title") +// var title: String? = null; +// @SerializedName("subtitle") +// var subtitle: String? = null +//} + +data class BulletPoint(var bullet: Bullet?, var titleText: String?, var subTitleText: String?) : BulletinItem() { + + companion object { + + @Suppress("UNCHECKED_CAST") + fun init(attributes: Map): BulletPoint? { + + // Set Bullet + val bulletObj = attributes["bullet"] as? Map ?: return null + + val bullet = Bullet.init(bulletObj) ?: return null + + // Set Title Text + val titleText = (attributes["titleText"] as? String) ?: return null + + // Set SubTitle Text + val subTitleText = (attributes["subTitleText"] as? String) ?: return null + + return BulletPoint(bullet, titleText, subTitleText) + } + } +} + +data class Bullet(val bulletType: BulletType?, val unicode: String?, val imageUrl: String?) : BulletinItem() { + enum class BulletType { UNICODE, IMAGE; } - @SerializedName("title") - var title: String? = null; - @SerializedName("subtitle") - var subtitle: String? = null -} + companion object { + + fun init(attributes: Map?): Bullet? { + // Validation + val attributesObj = attributes ?: return null + + // Set BulletType + val bulletTypeString = (attributes["bulletType"] as? String) ?: return null + + // Set BulletType + val bulletType = (BulletType.valueOf(bulletTypeString.uppercase())) + + var visualSymbol = "" + var imageUrlString = "" + + when(bulletType) { + BulletType.UNICODE -> { + + // Set Unicode + visualSymbol = attributes["unicode"] as? String ?: return null + } + BulletType.IMAGE -> { + + // Set ImageUrl + imageUrlString = attributes["imageUrl"] as? String ?: return null + + } + else -> { + return null + } + } + + return Bullet(bulletType, visualSymbol, imageUrlString) + + } + } + + +} diff --git a/app/src/main/java/com/bulletin/models/Message.kt b/app/src/main/java/com/bulletin/models/Message.kt index 558f97a..2d3fc12 100644 --- a/app/src/main/java/com/bulletin/models/Message.kt +++ b/app/src/main/java/com/bulletin/models/Message.kt @@ -2,14 +2,42 @@ package com.bulletin.models import com.google.gson.annotations.SerializedName -data class Message(val message: String) : BulletinItem() { +//data class Message(val message: String) : BulletinItem() { +// +// enum class MessageType(type: String) { +// HTML("html"), +// TEXT("text"); +// } +// +// @SerializedName("imageType") +// var messageType: MessageType? = null +// +//} + +data class Message(var messageType: MessageType = MessageType.TEXT, val text: String?) : BulletinItem() { enum class MessageType(type: String) { HTML("html"), TEXT("text"); } - @SerializedName("imageType") - var messageType: MessageType? = null + companion object { + fun init(attributes: Map): Message? { + + // Set Message Type + var messageType = MessageType.TEXT + val messasgeTypeString = attributes["messageType"] as? String + if (!messasgeTypeString.isNullOrEmpty()) { + (MessageType.valueOf(messasgeTypeString.uppercase())).let { + messageType = it + } + } + + // Set Text + val text = (attributes["text"] as? String) ?: return null -} + + return Message(messageType, text) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt index a8d70c3..c65ed88 100644 --- a/app/src/main/java/com/bulletin/models/Title.kt +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -1,5 +1,27 @@ package com.bulletin.models -data class Title( val text: String) : BulletinItem() { +import com.bulletin.extension.validVersion -} +//data class Title( val text: String) : BulletinItem() { +// +//} + +data class Title(val preTitleText: String?, val titleText: String?, val subTitleText: String?) : BulletinItem() { + + companion object { + + fun init(attributes: Map): Title? { + + // Set PreTitle + val preTitleText = (attributes["preTitleText"] as? String) ?: return null + + // Set Title + val titleText = (attributes["titleText"] as? String) ?: return null + + // Set SubTitle + val subTitleText = (attributes["subTitleText"] as? String) ?: return null + + return Title(preTitleText, titleText, subTitleText) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/models/Version.kt b/app/src/main/java/com/bulletin/models/Version.kt index 082bc30..3ae40be 100644 --- a/app/src/main/java/com/bulletin/models/Version.kt +++ b/app/src/main/java/com/bulletin/models/Version.kt @@ -1,6 +1,23 @@ package com.bulletin.models -data class Version(val versionNumber: String) { - lateinit var version :String +import com.bulletin.extension.validVersion -} \ No newline at end of file +//data class Version(val versionNumber: String) { +// lateinit var version :String +// +//} + +data class Version(val version: String) { + + companion object { + + fun init(version: String): Version? { + + // Set Title + val validVersion = version.validVersion() ?: return null + + return Version(validVersion) + } + } + +} diff --git a/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt index f761b87..a5d5cac 100644 --- a/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt +++ b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt @@ -4,35 +4,55 @@ import android.content.Context import android.content.SharedPreferences import com.bulletin.BulletinApp.Companion.applicationContext -object AppStorageHelper { - private const val SHARED_PREFS_NAME = "Bulletin_Shared_Prefs" - private const val SHARED_PREFS_PARAMS_LATEST_APP_VERSION = "latest_app_version" +//object AppStorageHelper { +// private const val SHARED_PREFS_NAME = "Bulletin_Shared_Prefs" +// private const val SHARED_PREFS_PARAMS_LATEST_APP_VERSION = "latest_app_version" +// +// // App version +// var lastAppVersion: String? +// get() { +// return if (AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] == null) { +// "" +// } else { +// AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] +// } +// } +// set(value) { +// save(SHARED_PREFS_PARAMS_LATEST_APP_VERSION, value) +// } +// +// //region Shared Prefs methods +// private val sharedPreferences: SharedPreferences +// get() = applicationContext.getSharedPreferences( +// SHARED_PREFS_NAME, +// Context.MODE_PRIVATE +// ) +// +// public fun save(key: String, value: String?) { +// sharedPreferences.edit().putString(key, value).apply() +// } +// +// public operator fun get(key: String): String? { +// return sharedPreferences.getString(key, null) +// } //endregion +//} - // App version - var lastAppVersion: String? - get() { - return if (AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] == null) { - "" - } else { - AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] - } - } - set(value) { - save(SHARED_PREFS_PARAMS_LATEST_APP_VERSION, value) - } +object AppStorageHelper { - //region Shared Prefs methods - private val sharedPreferences: SharedPreferences - get() = applicationContext.getSharedPreferences( - SHARED_PREFS_NAME, - Context.MODE_PRIVATE - ) + private const val SHARED_PREFS_NAME = "Bulletin_Shared_Prefs" + val shared: SharedPreferences = applicationContext.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE) - public fun save(key: String, value: String?) { - sharedPreferences.edit().putString(key, value).apply() + inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) { + val edit = edit() + operation(edit) + edit.apply() } - public operator fun get(key: String): String? { - return sharedPreferences.getString(key, null) - } //endregion + var SharedPreferences.clearValue + set(newValue) { + edit { + it.clear() + } + } + get() = run { } } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt b/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt index 8ed9b2f..2118dc5 100644 --- a/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt +++ b/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt @@ -1,6 +1,6 @@ package com.bulletin.utilities -import com.bulletin.BulletinApp +import com.bulletin.extension.lastSeenVersion object AppUpdatedChecker { @@ -18,7 +18,7 @@ object AppUpdatedChecker { // Fetch Last Known App Version from User Defaults val lastKnownAppVersion: String? = - AppStorageHelper.lastAppVersion // get(LAST_KNOWN_APP_VERSION_KEY); + AppStorageHelper.shared.lastSeenVersion?.version // get(LAST_KNOWN_APP_VERSION_KEY); // Fetch Current App Version val currentAppVersion: String? = VersionUtil.getApplicationVersion() diff --git a/app/src/main/java/com/bulletin/utilities/GsonHelper.kt b/app/src/main/java/com/bulletin/utilities/GsonHelper.kt index 87215a0..812d15f 100644 --- a/app/src/main/java/com/bulletin/utilities/GsonHelper.kt +++ b/app/src/main/java/com/bulletin/utilities/GsonHelper.kt @@ -6,32 +6,53 @@ import com.google.gson.GsonBuilder import com.wrx.wazirx.views.bulletin.model.Media +//object GsonHelper { +// private var gsonBuilder: GsonBuilder? = null +// private var gsonInstance: Gson? = null +// +// private fun getGsonBuilder(): GsonBuilder { +// if (gsonBuilder == null) { +// gsonBuilder = GsonBuilder() +// setupGsonBuilder() +// } +// return gsonBuilder as GsonBuilder +// } +// +// fun getGsonInstance(): Gson? { +// if (gsonInstance == null) { +// gsonInstance = getGsonBuilder().create() +// } +// return gsonInstance +// } +// +// private fun setupGsonBuilder() { +// gsonBuilder!!.setDateFormat("yyyy-MM-dd'T'HH:mm:ss+Z") +// gsonBuilder!!.enableComplexMapKeySerialization() +// +// gsonBuilder!!.registerTypeAdapterFactory(Media.runtimeTypeAdapterFactory) +// gsonBuilder!!.registerTypeAdapterFactory(BulletinItem.runtimeTypeAdapterFactory) +// } +// +//} + object GsonHelper { - private var gsonBuilder: GsonBuilder? = null - private var gsonInstance: Gson? = null - - private fun getGsonBuilder(): GsonBuilder { - if (gsonBuilder == null) { - gsonBuilder = GsonBuilder() - setupGsonBuilder() - } - return gsonBuilder as GsonBuilder - } - fun getGsonInstance(): Gson? { - if (gsonInstance == null) { - gsonInstance = getGsonBuilder().create() - } - return gsonInstance + private val gsonBuilder: GsonBuilder by lazy { + val _gsonBuilder = GsonBuilder() + _gsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss+Z") + _gsonBuilder.enableComplexMapKeySerialization() + setupGsonBuilder(_gsonBuilder) + _gsonBuilder } + val gsonInstance: Gson by lazy { + gsonBuilder.create() + } - private fun setupGsonBuilder() { - gsonBuilder!!.setDateFormat("yyyy-MM-dd'T'HH:mm:ss+Z") - gsonBuilder!!.enableComplexMapKeySerialization() + private fun setupGsonBuilder(gsonBuilder: GsonBuilder) { - gsonBuilder!!.registerTypeAdapterFactory(Media.runtimeTypeAdapterFactory) - gsonBuilder!!.registerTypeAdapterFactory(BulletinItem.runtimeTypeAdapterFactory) + gsonBuilder.registerTypeAdapterFactory(Media.runtimeTypeAdapterFactory) + gsonBuilder.registerTypeAdapterFactory(BulletinItem.runtimeTypeAdapterFactory) } -} \ No newline at end of file +} From 545c213d9dc7cd9b1919b96fc1764aacda93bfff Mon Sep 17 00:00:00 2001 From: Daxesh Date: Thu, 2 Mar 2023 13:15:11 +0530 Subject: [PATCH 03/14] color added --- app/src/main/res/values-night/themes.xml | 69 +++++++++++++++++++++++ app/src/main/res/values/colors.xml | 69 +++++++++++++++++++++++ app/src/main/res/values/theme_attrs.xml | 71 ++++++++++++++++++++++++ app/src/main/res/values/themes.xml | 69 +++++++++++++++++++++++ 4 files changed, 278 insertions(+) create mode 100644 app/src/main/res/values/theme_attrs.xml diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 11ad208..ce266f8 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -12,5 +12,74 @@ ?attr/colorPrimaryVariant + + ------------------ New Dark theme Color ------------------------ + @color/colors_gray_30 + @color/colors_gray_50 + @color/colors_gray_60 + + @color/colors_blue_40 + + @color/colors_gray_30 + @color/colors_gray_80 + + @color/colors_gray_100 + @color/colors_gray_100 + @color/colors_gray_80 + @color/colors_gray_90 + @color/colors_gray_70 + + @color/colors_blue_20 + + @color/colors_blue_40 + @color/colors_blue_40 + @color/colors_white + + @color/colors_blue_40 + @color/colors_blue_90 + @color/colors_blue_80 + + @color/colors_green_40 + @color/colors_green_30 + @color/colors_white + + @color/colors_green_50 + @color/colors_green_80 + @color/colors_green_70 + + @color/colors_red_50 + @color/colors_red_30 + @color/colors_white + + @color/colors_red_50 + @color/colors_red_100 + @color/colors_red_90 + + @color/colors_yellow_20 + @color/colors_yellow_50 + @color/colors_yellow_100 + + @color/colors_yellow_100 + @color/colors_yellow_50 + @color/colors_yellow_90 + + @color/colors_blue_20 + @color/colors_blue_40 + @color/colors_blue_40 + @color/colors_white + + @color/colors_blue_40 + @color/colors_blue_90 + @color/colors_blue_40 + + @color/colors_orange_30 + @color/colors_orange_50 + @color/colors_orange_100 + + @color/colors_orange_100 + @color/colors_orange_90 + @color/colors_orange_50 + + @color/colors_white \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..f303616 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -7,4 +7,73 @@ #FF018786 #FF000000 #FFFFFFFF + + ------------------ New Color ------------------------ + #000000 + #ffffff + + #FBFCFE + #F2F2F8 + #D9E1EB + #A0AAB5 + #6F7F90 + #4C5C70 + #2E3E54 + #232F3F + #212C3A + #1A212B + + #FFEFEF + #fed7d7 + #feb2b2 + #fc8181 + #f56565 + #e53e3e + #c53030 + #9b2c2c + #742a2a + #4B2830 + + #fffff0 + #fefcbf + #faf089 + #f6e05e + #ecc94b + #d69e2e + #b7791f + #975a16 + #744210 + #4F3502 + + #E0FAEE + #ABEDCF + #7BDBB0 + #56C292 + #3BA073 + #287D57 + #1D5E41 + #16422E + #123023 + + #E8EEFD + #B6C9FA + #96B2F7 + #2DA4FE + #167CF9 + #3067F0 + #1746BD + #2A5573 + #19364A + + #FDEFE9 + #FAE0D4 + #F6C4AD + #F1A07B + #EE895B + #E86427 + #BF5728 + #964929 + #713D29 + #4B312A + \ No newline at end of file diff --git a/app/src/main/res/values/theme_attrs.xml b/app/src/main/res/values/theme_attrs.xml new file mode 100644 index 0000000..f24f314 --- /dev/null +++ b/app/src/main/res/values/theme_attrs.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 265747c..e27af6b 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -12,5 +12,74 @@ ?attr/colorPrimaryVariant + + + @color/colors_gray_100 + @color/colors_gray_50 + @color/colors_gray_40 + + @color/colors_blue_60 + + @color/colors_white + + @color/colors_blue_60 + + @color/colors_gray_20 + @color/colors_white + @color/colors_white + @color/colors_gray_10 + @color/colors_gray_30 + + @color/colors_blue_30 + @color/colors_blue_60 + @color/colors_blue_60 + @color/colors_white + + @color/colors_blue_60 + @color/colors_blue_10 + @color/colors_blue_20 + + @color/colors_green_60 + @color/colors_green_60 + @color/colors_white + + @color/colors_green_60 + @color/colors_green_10 + @color/colors_green_20 + + @color/colors_red_60 + @color/colors_red_60 + @color/colors_white + + @color/colors_red_60 + @color/colors_red_10 + @color/colors_red_20 + + @color/colors_yellow_90 + @color/colors_yellow_70 + @color/colors_yellow_100 + + @color/colors_yellow_20 + @color/colors_yellow_50 + @color/colors_yellow_30 + + @color/colors_orange_30 + @color/colors_orange_60 + @color/colors_orange_60 + @color/colors_white + + @color/colors_orange_60 + @color/colors_orange_10 + @color/colors_orange_40 + + @color/colors_orange_60 + @color/colors_orange_60 + @color/colors_white + + @color/colors_orange_10 + @color/colors_orange_20 + @color/colors_orange_60 + + @color/colors_black \ No newline at end of file From 9f110eadc7c393a12af297af60c5cf87c8ddebbf Mon Sep 17 00:00:00 2001 From: Daxesh Date: Thu, 2 Mar 2023 20:14:41 +0530 Subject: [PATCH 04/14] Font added --- app/src/main/res/font/ibm_plex_sans_bold.ttf | Bin 0 -> 175712 bytes .../main/res/font/ibm_plex_sans_medium.ttf | Bin 0 -> 177104 bytes .../main/res/font/ibm_plex_sans_regular.ttf | Bin 0 -> 175748 bytes .../main/res/font/ibm_plex_sans_semi_bold.ttf | Bin 0 -> 177272 bytes .../main/res/layout/layout_form_section_1.xml | 55 +++++ app/src/main/res/values/styles.xml | 219 ++++++++++++++++++ 6 files changed, 274 insertions(+) create mode 100644 app/src/main/res/font/ibm_plex_sans_bold.ttf create mode 100644 app/src/main/res/font/ibm_plex_sans_medium.ttf create mode 100644 app/src/main/res/font/ibm_plex_sans_regular.ttf create mode 100644 app/src/main/res/font/ibm_plex_sans_semi_bold.ttf create mode 100644 app/src/main/res/layout/layout_form_section_1.xml create mode 100644 app/src/main/res/values/styles.xml diff --git a/app/src/main/res/font/ibm_plex_sans_bold.ttf b/app/src/main/res/font/ibm_plex_sans_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e5389d833ffadfad83fdea8ff707d149ab6c03f8 GIT binary patch literal 175712 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 OE*Nb}?`#^~uKhnq-os1) literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/ibm_plex_sans_medium.ttf b/app/src/main/res/font/ibm_plex_sans_medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9395402b0ae00fa731c4ad63958a41dff26d9344 GIT binary patch literal 177104 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/ibm_plex_sans_regular.ttf b/app/src/main/res/font/ibm_plex_sans_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b5819647e1dfa7dae61b29e582f3464a90c537e1 GIT binary patch literal 175748 zcmdqK2Y6M*7B)OH`=nPoLI@}HP8wAN5|Th5K!5~8Cxj3JA&Dt85fHJVA|N(YL_kDD zjHpNvuwX&CTonr_BkhjsQ173`=009=b5r+Pg%2OX3fl6Yvu?k zgs1|`A;NnmC8s?4#iJ!cSg#2o*Y!;AKj`$jv*U%x_*sb0HuoHqnfS>0JDLj-@u3ib z$NCRy8+&h$2^olc9J!3nnUq}|yZZiaLR6n2g#W;t$z@J8DL4|}SL1uvam9I)e1|;V zK?v0gVWoN5rNyGQh=M-?-^23?rj1K_P#zGn>Zz*J+{srowwn8F}}ASj{v_f ze3#=r4eyP{Pb!=G{lJPrLNwhdMCjClqMYno7u0`9h>$Kq_;sC>J+;_plRAy~tq|W? zm^~@?h1$E?;G0tj--zO((z1cm?(s*~(LzLSEiTC|-WPGlcS86SAkBIqg(dt&pa>T} zE|&cmKC<-h1hyE6DMMgWdy>xqfPi9%8iUF4~KpqKhaHeMB44 zNZc!8MQ@QL(#2pz3wCuB!7^3&%A16*a)@BH8Rn=6#y5xRD;EH2q2{S9y!X+r94WfU zb_fmfv3!&zl(kH#pVEc%dR?p#sfm4^vbzu$lojl1BwIP8tmYK*N&2oFC_xCPP-uWw zeKv}K^sE=9oIhlvbltvDB-Pu58d#%7w%&*)a5|IolPctByr@ezYC6zBNtu@#QS?BYZ2ydiC!6=G0UKJ1LFsEY1G>bkwTLxyxlJ`TzU zNf3SB5ackyP8J2 zf>^$8NCELJ`Lzwqet_Ax1-|?1Tn1%Tbgx?>hRmBsc@D~I7*#QQ-n_c=P!IFIQM`Ux zfE1SpbTBtOD!>GCx&@ifD6yO|^gt7x#^%<0v3`nDfv_=;N?x}6* zQ6d?Akoss9(HZv3;uVB#5H2C5zeKpKBCEl!A#1^|BO_ruWhdCz%M{qXF{Y&KFVQe^ zv)m5*4T=6Mzm&&dAD7?5{!vvCQq@wmVMnM4*pUkPD5pY)P)$@5*sWA6*wHEuc01Jp zb|(dRR2Ovv>~5+X>;#nnyN61GouW{>>II4*Rk})tovDVy9;rsb9;3#<9;@*1bOqIc&tR};ruBOADrDnmtRn37tSKSHwZgn^8d(?ff?^lapFIJ0TKcpUl zy+kd6{iIp}d$n2vd#l)?EUH>>~GXJuurK|u+OP;LRuKo zu$2WWVEJ4Aut!=Gg=I~$Zh?KDwS*#IjI@dt=;pxnCLAQ7wVvVuh;HQ$7XU<4N$f2fF;osGYmC=>5!zr;K#mK(o> zf2Q#((L`h!zlHF4<9EO(L^fuaGLeg>DTJSVPJ|SRDIAuAuu=}og*zR-GW^EkJGr^= zIgzehOhVIB9!`!^g72lsh0>1yi&*(cTa37WR&E~h_^UYCq8CH#1O(ZDpa||5_;SQV z(OOJk_==HBp~wS-QphPgyi*8a zEgdPS=WEQ{F$bcgQj|v{h*~MpK;Q&nB|s+dWvNmZV-wX<6zrqd*HnU?Mtvw56J^O)C&n7-7~00PEKEldONw#Q*SIqzSN7#U=vK#^QLfa zgez)4Dz}X(DV=LF6@7|oUW&0ZkV_*B5oDM5o;ak8bwg>Vrar0DJ1Utqg^Y6+4xuJi=2k>Q6P#<9^}Kxf*eoy4EK4_=QrOZ-vz#}`6c^3>UY9_od3aqsDOI{ zz6fj+I4U_YDU#1RrgfuRPC;6A5{0Lo>hHsjkFr`Yn-V0NX_H52G`nEJD~RK*LAGpQ)hpj zU+Y|`Tdi)(x;^R^)SXfHuDYA*zFqgDxP@Y;C$fEHZsg*~O_2xcH?3b%e^LGQ_4m~O(m5?EJt{A1UW1MeCO2%|@K~eNMtd7K zXk6U*zQ&I>ey2%DlZj0(HEq|!UrE`~QH~8H!^oDHco_J>3s=|DpSZ1iyr83H1|NCUi*Xk4UslyrO2!lWmXo=r|o zK9PJj#gP)85|Pp@B|fElN?J-*%GjPQdbaPG*mGddkv%8$oZR!*o~~X&y=wJp*sE=? z>wER=HK^C_R7YyF)cDlyscETMsbf=%Q)i^!mAbgMvv;fB9ed~YzNz;uz2ED-zxVOp zr~8OL1N)5ZGojDqK6Coa?{lKh*)&I5cv?hSv$XiM?rCXhS!rX_&h~Zm4evXr@BF?? z`mXA`zVEia@Auu;_gLRw`d;d{qu+=9_V+v9?{t6B|Ed1Z_uth2bov7WLI>PB;JyKm z4s0}V>A*DuHw=7p;O>F@1|A#u%fL&60teL`^unMmgWk<(lhHXNC1YU5$czaYlQZUI z%+FYou_|MI#SZ<0YM1q9 z*85qXWgW>nnRR}M?~tlPB8RjX(tb$dkb^_MA97}>@6f74BZsya`oz#@hrTlOjiLV< zHged6VUvf=88&~|l3}Zctsk~+*!#mi8+K%P_V7u=cMSh<`2OL?ho2rHMg)%-K4Scc zvJtaK+&kjLh_fRdBg02VjBGYCeq{HNX(O{njvb{&g^sE->Y-7~N39#RdDJ_jJ|1;& z)X7ojNBfShI(qBqoufY;{nh9nN1w}Hn!P4_!ry za^K9|ox3mhSne;mm&OH-t2yqLahu1T&r8jFYy6P$`|=C&-m3jt2C&zT4{D^e(6o6(@I|{-CFu~*%M_?mj{(sE3aSPvb;likMjQI!^-o@OUq}K z-&6i@`HJ!v%D0riTfV3KQ27t#zfZO%hfS_Ex&GvbrdU(jPPuK$JyR2>uA6#(n(wq} z)83t4Z+hgL@Al!hzja6G9TV?3aOZ$KN8FizXZfAC-g)<(58nCCT|svh-ZlNMJMLO^*Xg^( z-NARifA?qe`p+w!H*4NK^B$hJ;+}f+jn(zsdYI^XJWfX#Vo~ z>*jC1U*13D{`L27ThM61q6JGAtXlBxf}a*#SZFQ0ZQ(r&A6WR4)$|@_PR>rJMSUF&2_R5=9-nw$(%BNPoxblsaAFcf3>DEu*`1E~GzxnhJ zt7@$3wkm(s1FJrKCghn;&*VO{@R_a8oL}8xb@J*#tLLx&-`MS>+KfiHZwRLx`du81xFGRm^*9&VZ{3@zc)U9Y- z(YB&fMURTU6*pF7S4^xZuh?9%qhfc(&lTrito35@i~V1Ge|^gO4_}(~(nl}1d3ol` z2VNQU%K8n>Hq3an%B#1%`t?S?jlDKLuyM=A&o-Xg6uW8WrsJENZoYf-uUo>mblb9U z%h#_Bcxg#rcZ_nBI-YPm?Rd`dl4FbGO>o){IlgoJ z<~SGHE%NrrrIF{H)tz;mk1hPES7Oim&q68zvOvU zn`^p7y`%Pm+u-Z2X%p0RE^0d8T4=4X)>!MU_Z`9!j+(|e(j6s^1&(EoHI8+T4UX3x z|90$m9C4go=~ea2*!HwTdb(YPo{gW$V)6ORK~a z;B4wA3+u}PU|aP!06 z4);3T@NlyukK*^hVR^`P=+dD-ggA8m(78juANuXk=|gi5%{i2D_~%2^`@~l$@vA3b z=HqwESJMwZd^qGVxTpuS4o*8b|twi%}s5RA^ZY{Q! zTFcPVFIyX}UDn6eVe2Gfk~sr5?<#6-9sf$(vE<4yq?zXcwjGbatgigsv8?jDesjzx z*Rg=#EUfA?#VjyP3c+Z~;GM$^F$Zmy3bxV&Fp<)+-k&G#6!&1q(F;46i5SVVMPF+G z_?5ok>-d9594La&=V@hdpKlGd0SR+Jbcr^_-qMb4H}ltz{8^q-{_=$EC0+y9bdz`!T&LI3g2%;g;-okwegXe9NQTNV z@uO@gTgfJ}xr~)9#2qqPW`b`zP!5t4WItITXNYaGT)Zl85!>Z`;uyH@-^qpIdpTcx zD;J3$1XA`;%B*9O8E?g2y3JzpOs3kl>zcO@NPGPXS+dG zlj~%#d{tJL>t&$aBx{08TU&0C*MXP&nyf3g$$E0DjF8)9q?XgG3G%S)E|17W`3?3kM`e=yTK14X$iDJB*#~^z z-twFrCeO$$c~Yj!vvR2XP2MPfmqV0~%u@k!q6$)B@+MV9ma1@BB74d`GESbC!{ubL z5wt5rz9*Z>pX2}~PPjH<*U9^->S0~@qV9GAE}kJXKI=H6ny8;)e3b`t+D*o zC+e_TtG-q*sN?Eobxf@Xe|f9=Rc%+lfg62By{UdzZ>fvwJ>^m#C_kC69CDoUmE+|! zu|?i2w#qxid-5*vzPwv}Am@o)@=mc+-YVXbw~4pqT=9;)UA!yjh#m4Vaaukh&d6or zoP0{0mn+0Yxl;TgpB9(oa&bYvBCE=mWVrl5w#3ZST7DrrK?-m^=G!jvfV@HOlbz)! zGG2Zr+sn^o2f0^vl%L9W@)wyQPs_pbf*c|LkfY=!Ia<18w!A1us$f~D0_7wXB8yZg zqBhWx3(g!`c?zX;f<`uRuikK6>Y^>aaOFAX!Wq- zt#(!itG(6H>S}eex~UrCHtPoKdaDblWVtm36p2<5fim6^D;!BFX&K^D&a{#O@o`>B z?nJSwAiJzk)B%lBefy_5MdyM2`#QlA7MPc+f(;%7K65QmPt*q|z9r`34&nyzW|sbiU0kZBmX=@3o}OD$q)M)B^Ekz-2&0vxDiR~l7j_kR zX-yz$OhTwezA*R{`$FN9>=4_jfB z)nJ!m)$%#)v)pGke&c*vIgUEkW6exvfn$av*gEEzVePecSZ%CONEKIMtW(hvV^v{v z))OI^jcZxetm@c#)U;|@wXN%{I@p6mSQ8=ln}Bus{n&*pv=&(pVCD9p^^ol;XtzE?ks zCYaq$i`JO4E{JH%R+mH^&61)WR;m7=6|^&>GP-+};ZQNE7s|*~S)#TYs)mUO%)lc+ z4=Hv7PC;1G5Gk&Y;F@581F9N@I1NEN8-pS>1+{AqD%ujXsWs?cTjtHif~LiTUbY7n z?g;AESx%F;@Oth6tl%D#Ps&wTB|V3k>Q$_Qwqecl7FIbQU^TY~v(Z7UY>r}80l78S zGAA%M{f;%sMHOgz2Gu9gz(){;dxf{~3J){kkYF=y};#ZRL5v zLO3Fr9MC0Ds3+AY5XSEP{ZPISAnhXlC3cH{ix0&|;$yK#d?G#-pNY@KUh#$4C%zQ> z#Q||p91@4cSK^5HS~{eU^p$=x6?@v=YLt3PEl2)=D2L`O8W9q+YA+wNk7f>06-WlSR|8%UV z{$ZQi{lvSsTC=TNtvS|h;Je&z-C^CyoTmG(N$Eqpdjn8uiQ3$wBe-YO*|r3~|FnCgz$<3RlsbE|cQQB7FN+G?Jr`zN1K&Cqz{= zLw$Kc)R4bIWAH$LUc8svLagsaa` z&*P$j!$Q0C7v0oYQB^6#y9qP!H?BX_Ae22Aco>0|#9YLIRG-5(iZH-6!rCYrW9=|P zC5fIYUj(Yrs8bmz_e#Vo6Kyy?g^dvH&<8?P5x(69xI3VqWx!BB{;wL>S$BSVe9##A zZ<(rgUe;*QiVTgt%MDgXu^1b%swMDx-=4XWUh6#abj<8?gT5vy;KWo}R@rXVc8ZiLlfN6ys2e&5r1knpGV`25?rXfT} z{>pU38kEdm#na!b+wrUwz%S9JB5^%T7p74}r@T!~^rP7@Z4eLo9Yn)ygZ3i0)Bjh7 zXr#AcT1oWsY6div=%|~P54>%y{r5II zMO~u%JRd9oy`B&=M{#^{~sFb3*=98mThS6 zy4<{m?!1@~;B-zx^hCiTbo``rZaNXX+E|TIFV(xB+`QmH%dt$sE zz#~Ds$)*Y1cKEi@yc2E+-)4=5HC%O~3+kkZ zqjeSL;!IUX#6lXBX?23XAMo}GTz|%IgcSmREzy+mHUo9X+KX}b8QKWAvpz;&93UFI z$HYU3vlcr9?{$}rH=+TAw?XJPX=rO&Z|y_;+eK%b{up6>1^+kDN1X_FGRzdr>#xI| zEt+3GpYps1JV-KcgYMP=oL=)B`Uc~M@MHOD91)%{=V&~6{X9%W+f>!SHjqEBLuWTW9Vw3lcl z;gxagCqmWDsJAy=oB|vH*KGC~oCELNU%hD(;eRR2%fKh}e<7a>RL8{#M+n{*Bix%# zQG1{*Dj9q1&PCgxU7(-dncIijglG=h($LM$L?^NDt7%1`O>ftE%jsB;K(|#66%Al& z!&H~UF<0iH4fY7UO+^m5fu$!tPo)h)J%ZijFbM^s; z=~X@{vqQWsw&6$xWKd#-a6n_e0eB0+;GT4cs%#n7k=U)$lt0#&RYXA-dd3Hl7zRejDUPM5^`OqjDl3Rp==~x z7jKAs$aR}QqF#WxZ35)1&1DNwC|in2kWjaVoVP8c(=m`!$3b4#4)VGVvLmE1~@=ke|yj#u#U-({mANI^ILf*eXE|iPJH;`%)r}#l}w|q!G%o+eoAjzKz z-tpsNwzw5C&{=XR_{htkO|)FDkSpcW;3+=?IsCJb!9NH2`}2^wzd$+zkl3#mo55>- z8Pd@W@>NLkH$u9)35R&zg~q`a@jPVkTje&9gVQ|gz>9tZa`(5OXYe-k4BmwVe5Y6d zU4uVx8fz?g)Vm;8-7UToxsb_!DBgq2_9OW*q_%q?SN#-n)z2YQ{Q`2<6Hy6IuaFP7kN(31+YIb;d3Do(}YyjXi^Id!BHW9oW3F{ZkT z$8ct>yGl@rbY4s)9bS|4Bt$t0i+fHfjG%%fGd z8l!U5Se2{BsXR3vXUQh0iK+mn$qH4GDpohC5><-xWaT(bHbqTU)6{fzvzno9Q8OV; znN26k)NMFXcDuSm-3cx4yK#E*9(Av}PtC`vvIT0PTBIJp$+8D=uIyp;h&a^?E%s@SOZ;ywa^7v2Z?_LGy>K`)8J+38*G3!!A58wY=-{9 zYtR7L1`UAMp#ktFr2jjhRqzfp3f_Z8!TZnx*agi5t*!78bQShMhu~9a7JLpphc8It zLs}2eE;t0ug0CR;`I=-t&@A{C8V27%^78|<7Jh`*!cWjzI0YHduh3lh4VnhOtFw>= zormtiMUn<77oS-X9N1e|yOKJ3`LinI-%;K<3}g>TV^lCP0#vY^7K|tzK3t zIKX|tFYRmfgVsp8HNYBZ4T2^~Cb*|JT3OZ*YpD3b8U|U!elZ_%i2ESZ-wRp9msqPD zutt!Ei8v?@vyRCa$V|pU4l)jMl=0xWPJk4z0Qx3{ki`{)_gZ3=T4m5Qm~2h4rdrdW zjdim%!@7ld&R1}S!H))K_#WuyU4u7lJ!U;_JpqlbC!y2zlwWyaespwnl3#WkNTQ=- z{PHTfv4JF3)j=L_tWK4X#BN-NWO8F;W7@GB9mn5eqvPTNvI~pKatm_vv-wL*td1EI z6Q|!}+B=fVON!_vIyo*yCr^kmZoF~Z8@HozI~g~@xQWJPaAKnqbRp4+CZ9wDPNK;# z(SVs~@=G-NC7S#aO+JY!zS(0+awq3f_R%ptINO+H4IbP$zwAlbIVDAfe%VENMTNN& z1G7u=3-hvb%F8$jqHv93k`p^n7H}CNxLkd>3<=`dE|-jV6F-3=!+T%^qZhPV*#~A$xtU zC}wnQT!)|up3H(LdI26h5z0@wg$3D#WAk%-3mECX1&q(&0HHB5#O!SOZdn@E$24MdQmc{z}Rx6=au}`4wsSgNjNEvP;Kv zAwEUpi%JT0O_NMblTCvpnS7E=!zG&rOR`9+t8I>^|Qo{3cOC|wbV+zbLb(EpCe9JgTjqezSH#(+$oNu`|8knlZBqtki zk~@TyS3*O%X~uHhj6UT=qAI^L*6pkkZa~8hOEu&mRg;6% z-a)-RnFROoD$O^Iapaq($3>dgCr26p@$IL-_tW3|d40E%(MS7x0c4ND9tIgbl0*7e z>gN45ctQQWMtgrx?@lrmNjAvRy*4H}$sje^Ak(IUx_9Hd9p7|`r1ri8HPiz&)C0Ys z_8p`<#UL+)4D$M}+q+Y;BZCHa24_HF(XlZM9tL-;Z>D#x4XsHwr6;!!$*ffCOw%Zt zW^iZn;Lg;8JJVDBWYcp~Of{2jbQp9dGa4|M^{f<=#G?@JhUg@9^1V^l?M6@C0&a8< z?i=;s9^(0EMsvLH5bwclx^7BG-=Umc;81sm^vNzL9-ke=wwbZU@nEE^Bok&h|dXJU47aW*EKNn^%lGg9Lcd#J*4H8meIK|Zb1 ztdj9XzNPtjld@xc*s;p8%l)8QNO@Ytc+9}>I z*?=*Wz(~gD3a8b>6xbVbd=l! zCcQLY7n9H_kWo=qR9I9R?(u5W1RG57SAT%Po&Z7w`+~`5w@wxB7ya2_M86me@JpC^ zvC~$+?42V8GJdp|k)-o6XyF%spoKjFgcbdre0ILU1|#~5!2-X8nHM`|V1H^1{=}Gx zkBjCtFIS5w9KINh`3X8z!cPr8H@jRm7n)2hBVBp=9A8*Q!H|58h^5aeU@uvKEQ+~WDKi-rd zZ_1B1<;R=y(2BR`Nlpkx#k2U4Tn(|{!{bNo2V@>(7rhL7H zjE;{rMaQ=@bzMa91 z-Y-VSC!2CRnD2TC7agBq@-s`ec)g^Hj!&`kF>R>#r_u3xUkcZJPceAV`&NV-I8uz; z&c>6eUpv#L?F>BaOq;ed_-SY0!Jdihk!14GlPg-u;5*6SH`>6_$%J>Z@oaxL;b2$j z{7m`LcKaB->OB|Q!+h71J>Cs`dIbeM+WFe;W6F!R+sEL&lX=%m&gl4PyM65VcKew8 zl1;fC%y&HtqkT*~Gwa6dSsCqP=VP~zarHVC?O?vAnEdrR7U8BoDaMU9?GtUCUyoi0ZAJG|?3F?!tKo$CWv!xN+XA>O$i z;c|P!Wjw>x@OCilsScX<#>VJ=2v>iP(ewiEx?VB5f8kxjAEU=V-VHpu{bFMbCn{0X z>exixKCy|KhU4A9VK`SYdOXI)=oLR)Q-3T$(C?AI#$Sx?2gu))ulYt;RGRu5&Q?rf zVi2zkHBAiUg=QN%trSpcqZA!$25M|#4oS6sC2 zRB>jI#zpHv8yBrRU7Q(Qai(*|MeEKNX9iWAnaJYI#1&^Iq&PEi#F+^u&P*tAu^n}V z^tzJk#w*VN_Kq(qny9}s2HX|m*zPx8k-OhGd6;KO%W=KlIb*MPjvwlYPi2PMn9~b& zuh*hS75TqBHP7px-@Ugt{BVE4l{{Rc(xUa&QNE z0Cop?@~!T{yeFwwpr?vnfu7{mJjtoy7`AFQEM86FmDmF`&qL9AUPw;So7ChU$?Ke6(;CX|HT=-AS zEh!XTue2v+mrN9~SK7!5HwGeKi*q8_e8SHAANDyeWxY;8{ij#a!#Y1 znp{>momzrClFFkJ^=~c8TL!u1V#qNsA;cH$rl$WARSq@=yN4Wv9s#Tz+@J z&|SsLV>tA17_!z+kbk(`O*N43A*XnxqFijqQxLL5ErVS5HAsLfc)YyTt;(-~$R~B0F z6}1_54BMmG{*LVliq2cerWB)B2XB^uW+cVhi&30|Ji#h&Wj^C8+s%!_d z-H_ry8cU_;vfZ9T`m_Hq$I&-`R%3r7vc)az4`O>M+s!%tHns<_9m%$n?FMXTv;7d+ z;!gG_uegfo#XIok+Gg&XAmE`x3)2oBe0lUx)oC+5VD4s<0i; zc5SwuY;PbNHKLI-i}SC^;el*dXS){1xybe=j2a(Mi2#f<(g6vDu1K{?dMKoYQcpxe z2gC_2kbivcO>BW)%EvfSMRyUL7H5TvP8>ofgfv1L$VSirX$dWlIOunDg)T=Dv^X-L zk1<@1goeen&dfny0Xhm-KQre(FURuz2*~xFkma{>%j&hHp5*i-rSAs$JW1zM-12vl zzLVsAj9ccO@0PWfK+ZlH^7UCPRkvm8cN=-SElpnxN%|7V%y+R|`*TRH&(WzwK9krC zlxy|>A+sFi{BuK8m3pN>9|3iTjCq1NFBrnN!PfE6TJ=42KP38FFz$_b9k)8X46T#Z z&`5b4dMgVM^7nt6k^1lcUPd|B`mF;LSN>K5vTOa81Ma{3dmJ^q*6$(I|H|J2;N)7r zc?NUKp&>LA=`}_Pn}kQgj;{4OhEtc%rGVnykG7U7itQF;%a_^C;1E7ptk8}K|C(&* zaFIWc?Vs2_2V05OOcUt#Zo0oa3_lCHXmt@9g`baTjGr&gT{H*XXosIa^w72;?(5L4 zsR~`GuW?@Jr1%|Q&WTH+8^$~C1IGO$)o^YJT493pv9fR`3p!U~DD@W-Mq9)>gH}Q_#PO5zC={ z(@v~_?oB7LlE$%k8gu6m@eGY)@hryiSn(Xj>@2YsdN6av^U!NqF4jSpWsO+RcO<_; z+9zTI-;ul#Xa!#rhtpBVQQZ;h@OLQdqIJgl+4|l(Y8`~x>u7@eZ+2PlSg%`~aUae) zYc<}MTaP=EaL#%G&TY>_thv@)>t#Rao)lajM(@@*V1@94pEa7X6ABFd^$!aT`T>ic-_O7(;q>qPhT^uJ zgXVV>IyM==@t^-zqjl)lkK5=Sv{U8Z>u59jt>)h@#QJ-`UeK9A8#C4txuqANwg37z z5B-6D=n<8FX!R!CtM($C`qO52UwQ~3NBL_P=p#krTMOJwLOp7{Bi)L`m)efuz~)7h zejV3gIdJq4(owHNk3x^pJ*0_^ceGqrwE0xV`cQ+zcaU~2LJ3Q+TdP4^oS-LCHf8%3 zwxKbM5F9arJ%jDuY&RquCo?EKm+kg!e?~U+ohbY;+Yw|#kB>rdrvhxPv)i2g+t?n! zHr+}kae|cW25e`u{Se!lLZ*`++Eiq}$Khkx9?mvxxg<13$&OwV`YTz0@Yq;k^y|yYb>KXzX?Z#lBv47Y~w_u6PVuy2;`R($E!4 zF$)ZWmTo5If~PSTj1bR4^R@uGsD;q%--7+c4BYxN6L$dZl(*q_pnpMEcE0!sv*!}A z7xUp#=-NW}6*p9^!2fd`htBJIaT2rR2HZ_W^Tm0ZEpZ$E&{_3^&gvJqG3ZO|q^gsSD(dzPei5vjS`YKiDQGVLid&=_VfMKIJ>@@e zb5tv6msXLTXbzIyvAS#`6G#(OCer@~$RyGNl|5;FiL=-E-vHT1C8z|MMk`I(7i-NF zNt&POG99zka5;eHDcnkhc}fn0j%S`6PAg710z0Z=ISTrnC2}-Yo@FwdW-;7Fb*s8n z=FnUw$71byAND)yzMeqg>jr2>}EATJ+&$5*&MoaTfGGci#TVx2-b@^f8q;T#Tr zNd5mh=KpE^fK?y#PPYGP+W$O0TI2|N!4dqs#3L z!|5K_G&)WK3+Lhg-IN&Yx`BpOrXzla#85OM@@h+6B~Y5ysTt@G14Ar__Hk3FFfQPdNW<^abq7S8AM zLos<2eTo>=r;i}r3B(Qdj{V>9Uj^d?wJ8bZYn)uGusv8V=dt6^}Nqc}Z!rK|p;63cy!)`-_Y=&X22q~)@HQSHSN_NYnNUrmQ(s}ACw!B+>uXf|w#{g)r)TK@R8WUg5Y)Hx9G={7KudIcjq z1i!(!y(=6$E8?)v#*VE9Qq{!oHsoImaYzz28yLGz+=^1_;9M#3-3ob4mIf|-J>0ey ziC9R#Ue*Vn4D-!MT z3&9;37591O;La?zoy2#e72qu3*QoVToOUb_$8bKgh4=yI z^jd;@=n^d?-7_^9=WhK(OYjf_!41TDQk*)hBkRELlnr4wmW^RIkzEnLn@oT|5qAXL zN+&^ainKS*fZm9GCjQ9==Q#6mUVMTq7Oin+vsAPJ&+%T|?rT7r`+kk=Q45Lu)Y`q>4a05GR8%0x+XyWFKAquz0;*8@^(H@ePVWK0>Iu1uEbO$5uRZ=5G z9;7d$aG%U*H5#`+Wvek_CQd-+;I;|kaw2MZ_O}Gath4#|8<)T!T;*KZ!5577$H(8FD^iO=l==>!7)6_KF zb%#@w@I&s28wqYvxak+?DQAja%tx+=6P35&)~MUn?ZSz3m3IhVoT{7$-qd}#*`hv9 zRW5+NP%XsGHH&aBmJd!?J|L24e-1$q{eNF1&RISx6wX;bj+?8N;;w~cI&F!%KLy@& zEl7`6z>iaxD0dZZUP;B-%V*$Ut)4?&)~a>D08U>51M6{L%}hwKHv;BOY7_9VS-pmk zt?G5eq<;g9z}d^UMQ@zHd`I-b8O(Q4>-W_AsP6~3*JLK~1;h-T$NV?^AF2<XL{g{(?wk4*N(*#T=psozBEfKj1asu7v?lY|+ z2H{TAnqnaCHLWH3;bzn8!~ooGT1TYge$xotzOKMGBN|74A=n=@oT!^0(>2mo7z`>& zbS;4Cnm^OE0H$kxVmN*l&iaqQEHDy33-g6NW6(c8jK@quGlpWSCxr?>ftaHD>MD1D zt`EW-^c&{FA8BqE{e#DxGR{Y2ZA^+va^*vTfM*%JEE@}1m1jIk0jE9G{?0fmo-U6b{#E*Y}7W zi1kW6QO&iFeT@N52zUzBvEq3bP<}>r!ZhNC$Kp*t#`{66jVG*qh*S=NS$^I2W3GfgFB8 z`GiZ1OKwrx$seN>l*VAnhakio#unV)xc$KwK}yZUDo2ROUPq4u<@l=i=RZ)tF}1R z7bP*|+;b^UMg4@R6pcK3xGvhunB~4syg9=BXD~ZK<9I(qxS)sfqEy@#M7Nn!r@v{N zp*-U{MtM|zI32@9;RKt0u8e7axzgov_AX`)>?&RF!)(Mzdfv4j{2&?~&vUN|#5nfD zZt*?WVe}8;=lHqsAJo_cX!61S54-`c$se&l0D z5554GA+Rewo*E(M&zKePFrJ9(a2lia9L;~Oo!~lriyv{Qh^92-ej5o0XkH>y0lGza z{)uVv*56w&h*df}><5F|5Q1>(Fg%~TIhw6-;euC*R z^=sn2?Zgkg9~d@NgfUI=%sw8ue@}TJHqmABokp6ou21Y4C_JetQ{n#54R}Q$N~kdq3{@L;)^)u)0uK zIS3k?=yeY6E&GUH1U!-y1TcbvkpEk5UATaQYDT^WfG_}AhJds3Ile>E1h_Gy0v3{$ z5am0ldkwF?euW>a52OfW&NV!QUv5z|!l=awNYg{e%Y1kC7>jGHbKzcqV4_9zXxH{L zb+42YQhBgoC^w~}vElW2eF25B+t?EU5MN0r-U2`DLtt(%#&ZDL`#SX7T3D4vfNI{w z?*TZTQ`J8b* z$M9AM9XJCT@*Tn+M~sW$9#y!02j6SEYYoDG11#^kHo>(Sk#7;3q9PX#EH^xrZi6s-6D2;)WO8m@yX`? zXiF75!I$|cM^7&N(X^wTqgyh;9~myYHrx-8Ue6O;1B!$YcMQD!;mO}SoU@}_+s51oc-c$A%aEiDnjVW!DerThL}eyq~bo*arIY3wULLa4#Vi z(Q@2%k3Mo8IA*%Fo58&fSg3`5tvQ;f!BGoFx#*WjcNBHt76c9WgYrP`Um^tmPy?H0 z3P6J2CAKdRjY2*IANC}$EA<+VP2awE{RB#P0yKqJG$t)mZmKEXsT`{Hw`^B{p70!x z&?6}8dl)Vo?>`||rks>J-YKQVmXVU+{a3=h7cA({I`)+|=9phG*3R)RZ8Koph&kj_ ztnzB98*xiJr(`J^#RXgv^yg_ z@$AAl!-C5U;hq<*Ext(~XGIaB(0Htq*yBV#rhvK-lU?&@bT=s#+oB|9V z!Tkmws`BcSc0+cr{l@hs%KUCFG^#{AE8=6??0mgvU(&&J#yKFt42X8xyx`Jd^`|CG%C zOlSV5#r)57=6`l!{%1P#Khv21>C61j2F(9VVE$(t=70KgySCzV)ApZT9Xng7{}`JX+R|C!GG&lKi=rZfMu8}mQAGyk&}^FPy> z|7kJ*Q!)QDo%x^LnE&a+{LiM$|7_0uPY3fqCG$Ving7|B`%^meKW~6`)E+UAxuD&c z3+l^U&=$=9Y|Z@71m=IXVg6?-^FITa|LM>C&(_TU3}*gk6Xt(5WBz9#^FRHV|Cz+S zGnM(DQOy4gV*Y1q=6`l&{%1|*f7WOIXD8-=wqyQhJo7*6F#oeQ^FQO5|5+V3+2Lk= z=7NF;3NC0Qb3r4R3tElNE8)K|h!=Vt^Fn*z-=6A8Zgs@uq6CFVxsI z;nrlC7zc2!bV3a~AUwRghwF=9_l1?g;^uB$uP7D*ptaCK(+`;;L{sg;eLzny3~1vk^(}YJg&p%#MEcqw7O&RZLov z?bQ&9jTv|X!5`pu#MeK2^mltL3QiTq$6r3E9ae_0v0A{soYshEAfLwSPuB=v zsFuJMT*TqH^hUg2(y2I$uhjd4G3H3#9gK8ZJE0lYxq%3&4t@l!u(5^&M*R{0Z{v#b zLM0Il+X)t~5K|aHtNSwb3Gy-jkWy$&QR`7C+py4ksD8RtX*I0dn>>hvuf%r;w-~nf z2%_&^PbG+`_WwU2(tQl&(_Z6R5OELn0OH|n*}HF~KE<{7L~{3^${6>G<;IRXQ6O_$ z`IYz5Xlwf+98oFu`_*0Gkw!e}`fP{29r)Z~FiI2>d@FoCPb+t{*m?9f@U1Z7PEyaq z_&kaNlE+v`m3GoLnzXV`^saM$K6L>$al0o#!9zd-y@A#3jaK$~Jy_V`HGl8|JkCbY3$M za$c3n@#GHdpiM}Z@w~1n!=z^eLqoXDs1ABRU%~L9-93+uZ(t1=*7&8CBHVjYbI!U2 zenC%kb7v7}H|7hitwt%pC&%~!R{*`2^pdEzR^azI-Yeigg48?VI|061B=(iyo#72U z2Ce~dJWgwV8ghuFUXOGa(Cev;9oSovW?BW0po2U|ksdRZN_u~LAq}XG)e-)W$=rvH z)5d&amhQl|PtDTp)^xM=^{Oj$M3VmE4r`pegLVhsV2w4`7~XS*@}4W4_gsNqd#?7p z=kn)0S9{)b`SYGDfcIQMyyt4ed#)hfbG6|;S9{)b_24~MSKf2=;60btHA><=S1;aY zb>w|kPu^$6@IEV&_gMkB*ZzL!Z;;+j3hV8}qy9CaT|?SClC^h|S$n4uYwzI1wZdsw z*4}Bz+B=KIy}K>#a^f{Y4S+cYtPF)UgNbEK={e{Ov@|Jo7nU`eH7qC|gngQJU5%^-}wyPBSXF;ej%BC98`mG^)IR23oYk0yI$yl)t$9G6iDHcq1 z=7iGffzs%wIz|d<{u1`8W4DWOfRqFcR`&2kdbJYmx4qx(JjkUwgGf?T> z&uI-DPq`kSI~sfJo@~AwSf~yxA*dYrT5t9mkyf<8E$>K7i&MR>{@A7eCq3ipIr47I zdOV%pg6%3P$gdDT3F- zt6BPD_R{tz?jf}Ar=CJ*8^Ylu+|sEB+GX+@5V0BC<_&Pc$7^%W2m5iIpY7Uj9LtSa z({lRb6}F+JM0aWLu#K?zyD_v@5&x5k;#}^VR&zrj+B7edv zwF2Rsu})zq(IYb_>{0vB*)s4vDNFQv-2<+icj>cd6!P2U7HKvhju$+5bB~wHVqdK% zTo&aYzINdF9Z;vry^eyp{f%vBOKq=X(!6B%SbL`Q;n;Ru3e|adLI}fG_8^+2H3*Q2jU=cbf8_Fve#=9E(R7miN3 z7(D78;K9Td*&!y+;&2Tm*YH!sKZE5ec%c@zdmD7%@Mf_T$m=@Tv>#2kjCFe+2s#SjS9cjydTZkyiC0iiw=f>C&y)n%i=mePQeMCj6U5KJ^ALag{xwI5s z;Z;TB)j0MJ_s|#b(7*EAy_seytfltDCYr{OuuIrtil-r@{3@4i_66Lhkb=0+=qH>H zQ7HEbSPvwWFTU$GI_(Lk-e*6&pSEATN0RAXNPof1F7BBT(P?g>yeo}#54@Gb-PvF1 z2_tSd`Y3U}w?kIW^ACF5ZuHIS=ymwNQ|f!%hw0`MI?sLp-)Ut|BY8JQFIGRmrJfma zCI!C=%V z%P$xT(lYn%TQrAY6^Z<8ei8c_7P{GH2TCCN2t9TVBRL7lOKALJWd=XrcK}#cA#4X? zqCen`XeW&YYG1mYKubbM-m(+@<$K)+s2}lnEnlJaAW<~BPlu$4wC|w4O8o^ZGQdeK zrEyFN3F|f&M^j+>Mj=!~Y7r`x(qQ!1549=zJ^AogT{}Axxs;B2J@E4X5%(^DRaIBQ z|2gO8MF>eQxp^lykDK>9xyem{kN|-Yo<;;j6h+Zmty4=yI@4CC9b4Pl>Dbo(`?QZ~ z9ong#Df3O+!8lW_MO&>!eB+x^6{YxyrTIYM=Kou3pZm%KvHE@Ag_Cpcx##S?_ImHN z*WNq+ePVMG9g~Rn406ko$R;aAmSpGN0%CX7+>^QCe&W(i+?8430W#6LSc6$+f7dhX zdoJ^@f5r^#ChJwZl$~D7m`VNrF^Brc*8eaw`j@Qrbr=6+PV`Ic%FAqMdkwRpz4m(Q zzCnAz^TDgkhnIYuE?}8zR(zR8%$taoM`p!0Y4p4c%w#beT{3aHHFu^#k4CjTYdnGR>+>kGF!f!HWoA6TvjkD*7he0U(%0|+43p;UaoWHD}YN@Xy{dp z^wRcv*0q({^395uUhvY+uQFS{C2qF-BAqQiQ}GpGJ+&Ti7n?1guA^M7I?C0rqg;-T zausQ2p+`r#mgp##M@PAq#LY8J(ortIj&ddGD3@PHxjZ_`RjQ+0vXk?Lv`XfgE?^e_ z#ndhH>gVZL*Idmn?9}|iP968k)e)~+9r4O{XQBSg`Z<{Rh4lbCPRHin&!1-QeUm%) zKFywCb?FTJ0d|VcvqCx#znh(%3%M_|@dsF&yUgm*Ir#%RCx0MrPX2(-$zP~*^2^wt zc^Oa2%=~hlnct@~^OJREeu~b_uh5zKsX8;iS7+w;>dgE~oteK#XXZES%=})RncosO zGk=lJ%n!uP%um;ms(Kx%^6E%cp^j7qb)>3VN2=O&q{^owRkL-Zs!d0#vUH@XL`SN! zb)>35N2>C4q$*QKs%Gg(RgR8Sb?8V{hK^L#AQhLZJa|70SAh+armNs#=y z45H+chnAv}FjFNVRV5)!C1Hk20(tSs_)L|A406z9O;VABG|fNDR7sGP#EN)RB*CjP zkfYr1Q|`}I{?AkH&xd=fcvDt$EmTP;Qb{OQNhm>z8+pHpe}0vUGL?!lB3T`jBC=7b zvJudgB#aiRQF*9Elgvfxe#XC4IF30b%57d<=^;tE%|Xxn2@m2`{$;Sa?OM~-rtyK0DFJKLZLU?WlJXdU`vr1nH8~m1{vC`34W&AC-t9h%& z?x3`w-DAyS&+z$N_t||`lCBbwsT`T5T$s)N;HxbgUOeCOvhMW7)@)sq)~kG(qkQR8 zzRZO$Z?f`aw{ELYxig=Y(!XLAuww1MaA$|T!zyD3?jKu4%CE)BuT{#gCH9@{vt24{ z*Ry;3UG`o4y_c1f%h)x0Ka%jI{VdndvD!o-yJi2us!-0ZRL%~t0^xD1%6`ipXJrLh z`L;^AyhgdaR@a}Xvz+cPfK ze*`*f>`(opF%!poo43#CXJ(B}@nNo)%rCo@dUpfqt^C`~Tm{x0W2V_o@!-|#neZka z*-Pfk^sq5*gSl<5=|DBVG{$5xl?ITKw(%Y8235m+Sc-l5e zkHvf~H^OV{l{_Qiqj?f|D1=By5 zztl&5jnv8^wbHAH-s0I$`4On!n~&CMbdRhbAaMxIA=R_Q5vGP{;mk`g_z_G(QCjDIH|;#i>NCW)IbP8^gzD~i!c;X(r+d-b zuGKMXBd8WXCN)yZG=4!u&rem)JGmFBIq@A@B-#jXlNcd$ozYXW?n9*Y0_~L4r2WAC zZa>rEiTZ_t*po;tX0%10mzfh&T7TiocMFlc4?aYy@R9h!Y-Q-KQF)2i>F*|EMV_2k zUtE5m^0YiIQO6VX#=ZCzn&}9JGso|z238@6@wmz~vTR;S{0lZ@{)}X(5!sY)hAM(3 zK4L+p)E4?{{2#S7aoqhnJ#h1WA#25`6w)e<1yYa5lWC!>p*e+}iZ5DdV{F!YVYw!j z9RK}v*9K<(svf2d2cxvp*J2c#8q;pskvO+VrL2(S)%oqB8^)mBqnssX>(WZjk!yWF z!Ae3S!JOE6#=P*FG&2J{*t*>KurIj(RGgrlU7h(g&hWgb*)YWIH zkJS)(K7tv>Zulf<7Ky2I4=nNKezcXzjfmtGNcq!^4@63pG7UE?CY9DAal+$%VnKxp zonT1dlfPnV_^0nl_NT0#n;Hj~K*UF%5j=_4ae7~oY!#l;__}%bJ^#y`86c9GT?#jC zcw0-S@VIT6K!f)jyjXz>r;b9)J)lg`mZ~KZI3V`sdvX;Ug^DXqVcH4bi}xg$qfacb zaeSHMk@3$?9cM7l#1-_8E@M0+R1^N-pR9MX2QLTP!aef&q)4UI)L3yP&*fHm)_4tL z(xVc2ky_*)wnbJy#uZH-mCpVhNP2 zH07_1UrQE-w8~&}4E;p!UB{cmwiwxV^9B{Rh~y;`(Umn-#QNyFE*``Vi@y&Yd49jd z5P(qr@{wLdq$atV<|7c8kK~_8OQa7ZeTZjSQSg51WSrN1!sQoQb0n5c5G&W!*GdJT zAtM3&NJ)5w&`xM3e+?ClMv1-b-ZwWCM?x#nB(idp`4!)nwKgQ$H%8`VM7A{xL%&H5 znE51fw&51@S7>MCJRb5CEXR7-s#)_ zXP*DR0h3aHO7No`>HhkE&-aZ=%Otq8S0HvaF?s`+sTNA)$VqR%n;X#>MnWOvoU(3a z!mWgvo%~`XBJmOR3ntw9E543@A@-6>N5ufwiTIJnVs~P(mDuYOuVj4+Ib^uwo)n1}o4l+-Z*~;7}`V{$<`>GEUF~>Wi$5mrUt%<+NyHaXg8RRs$ z9~TbQ(|XI4FPE_^^Q@66v^no^J#7oj)6@MmdU3j6<-XK2vF`Zi<69DcpSL2GAmO$? z|9`m8sXAYL5@Tg$X9>+FO2AYkN;VO5k^2T}!LHCsJzTNaQ*WRb(O6^sjLNk9S=r(k>u?P0s^q2>;1Izm37_%zCYlR48gT1LjCe2$3SGd9)qN=!bxc{K6wd!V;8 zN|0Ep`)z7|k{=EJr+UfIYN}t}**$0=qdgKS5&DV$B=PTL`KuI(>dsj1=@d1{dfG;3 zYLA!*kx)-O=2xJeNZOw9U%4ma-jOg5(3VRx*$1?h)osxO^9`Le(WAb12#GCSi4K}!q{u)QAX=CBM zH6@j!g`D997||XGFbEFlyJ)OORuI*X!j?emXu*3efv(cjBFI2Ay=i!C(jzr_(I5;5|>oFRMm!`yl;ZNxm#9>Hzynt8aSLwkB6cWAA zXGF`$m41_0kMKc4tcUOJhq)cmPyBWC=DWC1nd5zxmAHDQEYj`kfn}Y62d=aq4Avqs zR+(q4w2Q}tmK9Gsjfp8f1UIrC{qx|((5{d;o#bkYRTqp&FJ=N}`5yfU?f4?=Mv)B~ zp&jip`a!T7p-%LjDKDgy*e97$DlcCR?WCtDb;w^@7tuZXcp19B117KC($Ab=kyooJ89{i<9AK}jQ*0$x>FkO2VPd`gr9by zFC|J4UGrK;1Y)!Lq6J1q38FXN?t&J^H1^v)9Q)m9YQci8Txp;cJw63YvA53n%5do0 zJWkDjp+=dIq8jmS%KvMAj_`%j2dijsYw`hN^JJzj+040~ z`nRd>62ldKdVZ=HP5krVNg$Cm?j&16)6@x9lj7a1w{@!V?RePd$rqf#5F9nKMSn2!-T7Z2M zSp7CaJMnu?s;{D46{#r#q4}Pub0W`7cSfh4Cg(xkGMWZW^lRwL%;WKUnZy6IwjduJ zb_z}RIQO9*&x&Re-5$;C5NP@KJNbL&AJMFoeKf)k)4dtLCKRh4OD@7wI|-*9 zhKA2g_a^s6qn_~x9Lq?<+vfNQm$C-7_U4eaXdS#Sv^VruddfZ!JnQ>Q*AU0wm3=bygWsbvqlNnuJjU3Y{F-3H;(wXux)3})Lk@DqG{5U@ zW{Js)m47BrP&D_`&3I)d_+p=H>GJsJjY9%)?Kt;IH|Hza>_6T3w)JnszJo#GXlXn|&C>D(fc}$8uL* zo=S7N&z`|a*XEGuIb3}DkMhl1&_(*4GE4Aj#uhX?ApX6CdEo93FtE}dK0F2$K?RbDYC)r`a_2^Ur z&=eCt60JJ(kM#fG2;rw_k3I2ip5TLh`>n3;c}RVyha;9(S4VtaqX+nx;@7y(tH%=k z_Kskpx)R=$9@=#Lq&6QKy$&xO<5|&~vZ}%B_`iR0HLk3@FIp7(na>1!_l{s9GL%kz zvWDYyczRB1VULF=(MV4N3E!cfmzzM#yRu8T@TA}gTVwos>lD&wx-{<0Fg{u-9zk5PL%4?7NkR0Bq&m!fxzTR}YPac`#Q^aa@(knX7%&*gYfCGLLnb*JBP%j-A8A%70bY^?$ zNBdM$_$*4>qh@s#@ulQFvE8klLoHVKjGL+C3^h0QTTf z{>j*c#1nZ}$7A9meUXw>Z@(Mb8Mtg_;gz71E3F!K;SModcqwy(S8?|eX6;_e9NiCE zS2IU^k5q zVK3&T?Cr6YeLS`~pKw0u+{|7Zx3Ig$4tB}7o!u_(WtWQw*vsM}_U(O|T`P{W2gL~% zFim2gi5bj>oyjcNSDPSRd?N) ztGn*B>#jRPy6aA}?z%IiyY95=t~*1z-%hLUw9}@0?99s1wp1b-Hygoi5!=r$hJB>D2vm7RT+M zvsm}f8Pc6|hIHqgR^2&guI`-Et~=)pIkIzji|(A$tUKon>CQQ=x^qsO?v^u0cgtC* zyX6e&J~=~ZmWSD~T=ofX)g5x?>E1Z~x;M^z-5aMz_r~efy>U8qZ=9g+jnl7t<8%OKc{Pe=j!U;7wNj+-O9UVy5e`auJV0B-1^=vy1sXZ@^QPa?;X;W zz3X&kZ=bI0-GEN-U_I-g6J(EgS<^ck{XUl+)fYMokt5fjzbT6mn%4aLE1)pGT@J~9Qv<9#VH?!ls>_NXocV8M*j#;X^DV?o6 zaSpcPc59XHj<#OeV*=!v|9Hb}}l_)fb9%^@UDdeW6WPU&zdS9p{G`s8TUDtPQ z>$;Ioj`U|4IAx?RD+`c7NLiZG&y) zZJGLeLF>uZms-Exy1X^J<#5Zb-6<`LT1uKt4oxzKF+*L5W|P5Re#SJ(BO zd%CtYeUsnc_FvNwFzUa?w}ADX{LARnf5Gp?|1ax}T zBmPCD$4YN3{Y2>}O2Q>yFWFx5p^__0t}NbHe1CC9(OX4dDM~4Pp)geN^@2fpzF>hl z%2vx8`QOP;%G;6GllzqKnD1`ir+9aJ$@ZL)oD#11H~V2Jt8De`2js6@muxS-pHlVT z>`d?4?C)f^&3<6^16gBPS7q+a?3s1{ti>5W&hX8=B>ht}UYpUGc6VA&>PYJ1lwYJQ zNWM3@D(RaZV#at4#?@sMP1xElPi-IOS+W;ECtHY@1Z znRb@dWarp9R*Rj>>MX5xfn8v=>$(^nx*|qUJWQ+8USY3b?Uw88>#S~Fx1vW^teA(r zAF+Dv|FQqaTCQtStkBgcHrR(8ueC|F-)B|(eNMICO{)DqFJ7wkkE-|n3BA{7-Hd)~ zwZ0;Ls`WM1X5Ub4_D!_eQtMmJYUeEL`?4p5b(^!<*=+4lYx+ay3g-&zN2<;KRkhiV z#iO-uSL^t1&c~dOS^ths`v>c%&ZnGDTmMV<4*VIK?JL&LoqutDXx)hh`*-V?&d;4Y zth=2%oja}Hpv`_`{Z=*D@0`8pt_Rq=?Vzy55Vl;B8<#X_PX?Z%kI;1}Nm#z&od zIUX24;XJ`{e0-<#*7%zq`r@7>E7?P@%#+ViIDX7i#JQMwKqXKf1i}#@90S5+Ak2z` zZWQRUfQ}s|sJ)qU3pIzh7lCXE?+tQ9pxZ)gwvImrWQ9QG1FFM7^|}kqVW2tTLNn?i z>kCLmfrRzPfJ9~-jRDPmpgHJ5lMcRsh#Kl>tAS+Hh2#j3B!i#5KoG%=&)GuTw}LOh z&-ENPfRkIS4DfWq`3?uG7drQF|6a;F4sOXpHaHqT;vrKJ93Ao$D4vdZh_3+Ms7GOQ zakUp52?c#F^$g`&#-B~V%Tn+p)Y`(cTcPar)O-UwSKcxn27+|(atOQ}ah?E@<2?7) z_z11Sk%<+$vD` z!NH3P#m9vr?A^HoirfPf0?7m1dxA0y9$tk%(hav-J|G$cniEkR2=;|T1q${V2MG4ZL6E9c5T5ur@^U?g;ZTvABS10gLLf5pvdft#=tHU$qpiUMzGAv^ zrJ?n{|ua)OQT#N1;;QJE3uZH{1;@DtyI2$?6 z=h(!t1&Q6tGuP0H>v{f$@yC%)^aIB|lzA@)W4aC_OwNNG`)Jh@;QKhZdkcM3#*or+u zzXBbcY-i$;8r-7!k#fUdV?a4-03c zdH$O5=aIP=!141yz84%H0mnyxK3#S21JExIW~`RD2)t zWTTtC+@DRGnxZ(zawxvxTy0S$TrW6hJ$+hpLUG^BxdohtfI>J$@y}VT$ZBdni(>=t z&~F6)e(>*i@qYmP=ehV#PT-VS3xrGdB2lAA6qZ-HWDHu2Dda+r*-&C4mz+?j4Q~g4 zG5~~VQm8%%w1z7>rr?TnxZ)sC6&nkK=G`H(ZIyuAk~qA&P$lqg3?eT$osG_~0gp0^ zR(LlH-ZfAOXH2HH8pV1o1@|3gg9zr0{ejM+?W>*ZwB8d#U*#cu1X4d%Tu82oClu zkB9~lUr78QX|HIIbk`R`>vApDS2%eQ$AHVl>$o-=<1jU*$1JbtIKHcAh6TQtV;}8& z0x4m=8aVbiHSbY*BZCRuHim8!EpiB16COE4%p<1X&?L$ub!ZTgw}^J0O5Os5TCgRcnf#k7Ur9~kk=`(VRNL^x_)B2;xF;9Pil1jZaJmpKj4V}c0HK9fi(ng zfn&Y{c6admJ=i9J>H)mYeb}}qtfDA{Nme!-^`^@7OdvDZJqUIM(wD)mSk5=W?ikq3 z18P4|v+K0g4Ag$0t^(=`piT$76+oSee}H!ZnFxX zut$eQGCj-+aP2;_!S!tLo5OFu@mHbjt5Eh;DElN{{Hyp<2chnpQ1>vt)a&%*&kXV- zKz?r=eqAt3)XknaQc55+kV;Y@}=aBu}J*t&`CI1RQ$8GlL~3XK}Fq z7xZ+Xr2`!u$_t}SjJzhpZ4be154qeX-r|!gv$w!ix8nDHNBg~Xm4LAWdnE=zW0BMYdq;Ii~M8O~DK z=zvy_(ANEM*)}*Vo%Y@ehn;}Cd_ejdG`b5K-3PSzw&S~@(eI$qebDIl;N%6<> z{2zd}qYnAv4A~#u33AIUba5opI^KaNh|y?+6-MtxM0?QV zZ@Ch;9}0;Fh15X_vEdPoYy4)hD48;Gb+7mp+AX zAR__P#?E=rCms3}LZ3pU<8`EC6zLFaE3utdk&ZE><7Fh{btFR~PsA#K>`owi1<3Fm zT*!h2+-{Zx+AW|5Pv`{#u0SxqvTfkfbmse6mQ_T zV#;^}r_d{>z?5jiy&A_wI+^oRw`zK$9DVNc~|L?X}t z*8rK}o|H{c1XNXFfJa-aqP%R+H@T3zYg|~nl@3g z##7;F)!@{Y!M#~nK-I^GowFVE0{pjv zEs2*tG5)mk6c|2^ZI)PR()ep&FA2;go7y<5Rl;s~xu4Iu5RNNCKPEZf#nbxf_$%1F zG4x}#dOwF;i@FmmB%^WgIEg?Tiz@!^-B{E|;PU5Pi+V3QVGnRU2{xVrCj8*>2f)O$ zVB%RYF+z_(v~L}--X4w5uoon-?gv(}R-(&YYlXy#CCx@ldAT>6>l~~kJB2{yy-;}% zZ5V;dduhiWu(sE=qI=Z)Nl{%UoQc;wem!l-2L8Qhja=Fw{qdK9Uvyd$@W18ivj>6s z1h9%9xl8aF2b*x=6qXdc8u-$IZ!hreb>R~(6z^;g@ZIiG^**S&SK;&O-%L32yFl_i zj(;70&iOINPr3dd&U>K;{s%l@dMKmF{HRO+FdE+jt|K-k4LrXEp2faM%vkz}!UMu_ zqaNcknCOP|6^%zf=GqwPgN$0`)Upo^^9ERYQ#tKg^zC-|!t`wZL~WrK9YWy=A<~3@34P8h480=~E-tvh4v>ZGRu|TG; z<8$?hPbp^lH=;w1B70*{?4;{?ip&YsPNMD7fF7${kfxSU>;i~cfKo6b(kB__X ziylm-ptX>l&P0)jn z!GX`fflnbJ&%l9u;lTZH;A3#$ACQp8;K0Z5>6E9yx@q?)&`IP{tkzN2Z;>&GNZZ9< zdC|2W`0HR&{1f5~N=5NaBDR6iDR7Z4)TG~#XRQSj>p0e9yUs-xH*h|W^GCV&F%Gc? zUqW|%nO^HR@F5;##Qq59zwn*4t?o}wx(gx9qrlvY-vZ%?TCW{D@)L>CMUL^b?{m__?Dy55$YPq`2 zLbowr7~T<$E8f@j@Q(D5$E=&-^FrjT7@jVLFLY!9Ow{qco}-zg68Mrvy0_h#Qa=@XC zv5ALY2}EN?M)8^yDj>rn0y3eP8Ota`J}c3tMsgVW8h;ar7|Vd)WCU;#zb%P_L?kB` z=fR6WgOYQNFX;2+ahS-Zk3O1@J{l1Zw5G(>B;xT~xI7Z^_%b~72GFFtczOYd?sM@Z zTz(XY9tBUgf~Q-7Y9CPD3RI5*)o!SG!sYbGpytUqZa>oq$L(kziA?SE}B5*rO1LCEgnIW@L1rh1wK zC?$-#wtAE}sfp!{;?viW1#FSuYgy-WTns%g!{@(}Xol!o!&wL5tTCqoj;h2DQx2o# zdSGkBJ7`8CTcM>y^NnsYu@)0!$%2*=W66s13ZDft2f@rCFmnjZJPT$Hff673p-UVR+KzZr!y4yn#Fv5rVDGnxECLl3+{ zwK&aSh+Yx!NUorGGsPUGlw_<LfLv)LL6;W1^-KujH@SRMJ=3Yq%cHfCjW%eATyT z_X*l9+%L5sqxLsx@0+w&JV?neIR=Kss=Pt_PXL8*#+z`48G9q+0uC4>sx3VhKUz0L zY_W%#lS6zre)xW=(f<7Se)}KYD23<>iKT0VR`rAE2H|d_VSHraj8WPsw3FDw9(vWT z)M}4<%=!rQ`&-r9N8nJ2=SvpI7#w=UWBTUE4Bx$cmn;OyD7A>r)AQiiz;PZ~A7&%a!_r5Q6;8zW@RRu(()gI4HyLYz+Y=%TiW|i&vgN~++>%A`)o z<hn?G>EE0PZTcBNn+_c5K${M<=|GzfwCO-AyCHV+H`aD3Ege|Wfh8SS z(x<@m^radzHx>8ja?k`cwp zCL;C*QJZX{*V#OwIcI2CiE~S2PNK8-aLuneGf?8EpG7|Fkk0_}S!d%VA)|H3XeV`c zxRy?Qb?MWPxro*@R!;1USUHnJH~_tu@O@Gy5BJPSCvi=z!3?8@xbZ>ElE^lDO~T7xC?6Oz$8( zf~0|SKREY;Z$J3U{}TG>%u zq(XABp`N^Lvhwy|iT2_Z>;)tH$^6NKa*~yIE0o)dMcV5~=H~#}-b*+n_Ox{TdS?SL zZshs%$3M$R&OtEL?_4c782=Bb_cGLb6>RlFx$i@{r=w$g_l(~O<;cm!5(*Zdzz;N8 z(tDtoj4bX4UdowxWF$V_ zm3S$&kWzP3>TdLZq?c_*vL!+&87otdEJQ{=B!6Hp-r0Wq_YpkmJ(fd>uTbJEiY?JJ zb*gEMmWj0FcAmH$KF$MM;-~beuM&#}$vDY&YUxM0(@GMbZ4|;m;2*x$dn&F*2XP1?f zz00!pS^QbDfj_OqcksNo@4Q`>{S4pvHHov$IrW*g_Mo@ITV3I;D7U{JzRfNVAMj+H zJle~QAjfJNKWZOmzFrx5aX%lyoo%sNwT4-|TN|yRP-}Q{^NWQnT*> z^yH%gak*8fqrL-Xve&YD1FN@{JN9qh=<^#*gRJNlgY z{G3v1`||7unroAjy{kiO&i}yH_x1L*_UE?cUNCs!`{#vU^>R|WWhCp+}ybIQZUl{DkEUNUatEjk$6o*WB>XMsgTHna$Z?K-yiQ_p&*AsI;xUI*<~mY;n3e z`yASwAM6Tx1GU=f&K4)q@b4zIzQ1jCcWG(&>bB4-U()dKr;FRGa&xQNix;n6y>@fW z;H7Y}W5OExT7M~m0t-OMJ>Xv!96M_cT2VrjI2Dbk*l zxE9AZP#Gs%p2#*WPI2iw0!~V;Y(;5y6brK{C{J6Q6Z8g!zILWsv6lwAmElI>Je0=*P0#2eU5OS6UTis<;Kjo z8?JheQ9NGC9Jta}EQq4UmV=L(ToJFOkvV~`plZ_GKyENM;0Z`B5df5Ku z;QK?12ERENhWk8L<9HKmSuD4@tVPza_0J;=hM#S%QB)S72mAN!vgAAvrA>i=iMJM& z8kfs*`p&x(DkP)Pk{acuJIIX`+RWiBI&POWrxk-oYv=@@6(?!y2MR`?Y1sKJ=tmiS91*w*_kFSk3ZEX>~h`|c?V6TdHi@jREc*ElLQQnkzL7%n4`d`AEE3H)uwD4rR%bP<{Y)#_L zBEeQs9JXS}F)Z4n4PRvSxGcKJu;?OX(H56QTdYM|X|-X|YGu)OeKXr?x2pBWBG72u z8e!HUe#Kx+%d80HWInA;V9lI(uARiEje&n2_WBaIH0<)`OHpo}noBbl_&UntIP}FB zV}>7dxfR_)ZioG{dJC70pjPr!i$-kcU*RLT`b`;Cd<4-{;v-~QGnMBe{s0bNz}qRt zl?xnzoF#LIHw|A~&|H-}EEd11^YRPBKey+9KBJ(zF#JtqX(dMF-+^=%Dt4t<6p|p7 zCf+D#WC|mYZ5x%NNy^nLPk4_HMk=o95TF-lvK>&bw&C4MI4KUhn?#R zeY1Rp`seRXodgbhyhq_k16k`w2$AJm1q#Ou$|Ex2y4^1BVz9V+J*MbghYOV|{<*03 zY)Y6R5Cy%ylt#NNm6sbw$_zo+2yIVxeOm`WXYNx#gZ*|eH7DRn%@s19_2r9qKYa1+tAvJ) z8@~NO__ucIS#)nShiDYI(yXo#oI|?Tad0I`B}rBcH8CGeTv8FTAm#v1C7Ao;hQ{HQ ztyRvKPF*r+%JmfDXEa#f8esv7Myn~VTwBVuY;=8bp2 zX29X%a0sfa+^&*%!DOv-kN$*}3pmoP3+4v47jUO{7}Z#Xokps6y~Nm}a*6lJydH1r$cSTbm&!=4|xayj5-Fp_H_(ODBD zdJ;xl2{{b{G6Vq`5s|rrB29a2gQ}Ryw%bj-8gbuSSF&8qTl4-3KLC(_dY(!_iGl?;7y7;^-6+xUQCj9n1 zJC`1Qu6NyVa^_HfS?j`OPSQoybBEij!{5gUTUGR!ehQ~GTIYxl)MPdDb_9w^K2J*F?4ZYj(>T3 za87NozN)vmu%vx)ZU4IRF7Kj_j$p8@ZvD{vGP+w@YU-Qn{EcZT$+>~fs+u`9IZd@~ z1+|UUHI->8vzE|2u3@+;fQhc6u7UeFxK9UfjgJ5Zc``Gxk1@UO-1DY7ra zh)E=L4MyyVEI}1L<0$UpO{izzE-Op?9?mJ8XRBLLW{Y28{(1tfb|A|Rl&$XWcKR1C z9a!LW^{n{ZmZ4^+Y3O1n>G^{PpO@p*$z$LC_A&643%*_g{#jxHC;C8>dgPPfcWEC3 zH^zce9P6fmesMNHlTtUB;|YRLaf50DskyuV>%tp6pFQsvBNyK2`4S6WT6f*`R(S0G z`+>}hW<3aGUTcGNe2oViq2wgIO|l_rg2*&WJ;oU->N8;qF~brT0FU6#4zlu`_>SF% z%=Rs39hxz_sJ5j3?Al)qf4m^M1jq4H`DL@y20!Q&g#UT%THvYxV?R|6TPki|x;pC- zxLofnM$Z^NBD%+hcu5GNM@2G4n5@gL=&Hyi^ipA0V`i=kKV}C9?2irhhOcL(KP1Ou zg-PkP&a~b?LZdQV*D{TEBu6~}*JCY?vW^SP)Wi`7HA%7IpkR_INw`XaDCu5RUm9F@^aDr3Pb6<2-MiNrIW_2975<6DOEv-BYM{$Slh#{b905TM zR-=|&L8;PQIp;^=bWsw6GoHmoMb!hqE-RNS;=`B+DOVz-yDTh$ho#TT=!_E7`W_cM zIh+r3_ki3bP{Pu)yfTAx8L!}WR}e7A#YxR&I=X~GD!NtcNng_FKe^gumz}#Mud>dY z)7ns4+_tDT{Oh$3hWh$K5B{p7r>Emr&d4QeYC{39C&iv!JHN4Ud8ll8cUNUs_fSV` zWow7%@45JBLySh37!R$~@>73=FI>TiwK>KYMpe(!HcRWJ%@SFaV2(J!32{{o%h~6A z`YT`g^oEaAEY4lOuz6{F(WU1PY|I^~_;|+8ckcY3;brxqg_Zs1hTebGN0-cLST1pH zq0wc~D1)y5iV@g|B`_4BA_=pmr%b#*E3g$Rlo?zVDU>;pV0EM29f^N5+TKlv7hbud zu5QJZ3lAS|9O^7B?Hp?Ssx#7b?hWViziD}C&)J3aYuaXTCE|hh*T$t8Zb=hv@mSCEi@jC($Gx~&?#NGi0q@Xd6Wi!T z5Z!;9>>r1JY%dD`(q8Y3EI+*b&E*DO`xNlbFn!uY4RA*A8Yo3K?y?lh0}9+E2)vu@ z?}dM6w}v0m+QZCUQ$D*IK5LX%anc0e$L-a}ur)~sG>TqqGzLc0kdYUgbEblm$-P`f zWG!c-A!=LiAT%ww!8jA;j|IMB%qc-*9g>o98mGcD>$2emA6VJgu=;}o7hYevq~M}O zEi1eI{_f$9s)g+(-#oJVeeDZd&;QJZb3b!_+u9`!Jqs#&*LH60T-RHXQ!}S_$@1_w zT+Vo(at1wCX98!qO^dbFRr#?S@d1_zKDCTKCAlFk+wciXf(m=w%rCJE!#VDq-SU&% zIiSx-e_N1ZR}i0((MW0e?C^KjuC*`b=ne02M#2ve^dA&1@8!>0Z3_}Ou`QEycT7J> zuUt4hIm+v4s8ksQouRgaN--Yd!1Z2oiCu8XC4)}O;NYo;#cwOYZ`(ngIaa@Pv7gK(&}oG4UP-y(M6l!gmj6i6+^B)R}fI z;~3r`Mp_u}y5xC3{NcRhH6QwI@_kpWaaLX%-e)gd4o(reWCCx}`+^DhJ@3${m{5Pu_8dm+y z;(-s!`GW(^s+?9fyXOp1O&e~!ptbda8#iqD%=xV=%27|-I@k7=M=xBv8UmkWQCj~b zNxKHbGh-_JsThRl+l5%&v_a3pg}|U^5pVihTJZ7vD2qJaFF(qpuFg z1>;CFU3OK+htO!D8L}{LPTqx=U3TH!cXxDmciioad|=b24}>4Lw{^DhPbqN$YmKvJ z9w`etQrKp-D?mlGCo9?>x04d1hRZt2xdqR}G?uu1Mstb3Af1;x=w~a9=;FoE&tCWKD4n7gFu(d5 z%T)sMtsja*WcspDixy@^Tj=(DVl8w@81tp$ZHsu###JRiW7%NrI^>|W03tq!tUb@6 zsUMOMqMqw_x%g@1?%$ic9`c3dXXz;$Zs1H&I3xkDp{2x*BN+jWcJ6nw5XyY8gk9 zR^>s?8Yr1+%@=!Wa)=`Oe3CA6399sqSyD^%6gpHas6DjyIVaos(5WvvA6mX#YS;kY zOwVReJgvmOz1wMtamXa^Bi5BSPAYv7uaDe_kcKuS!2>_a`;+CHHZ5OU+S%;zp`tH)2Gk^C@nFCs=ID zf6vL6H(s+U`K)c{{)xK37kY+kp}(|gwX|J-!`0%y@CVBZ-&VJF+eoKF%+ z7(O*lD)lV)&C)5`;DkO{v6IAg7)H zp$@Ul9%t2M|K*AISzVVXuPN1*gWDH+5BhQXYUB_1Y?`RuK-0AP?Rea#5FtlbY@(y8FMm)Eor*$nrp6;qke9c*IPBW-aTjh^7h+*DaW$PzO}&* z2iMA|hkF4k;-PG{J}RD5#4cvgXvs^gj9QL&0PhI?4l7B)F(2P$)nhI^)-boU^RZJd zq^psw7u3L5XEZ1 zmwD_0Z+}pzJfXGTvaIlLnmZ0v`0bwNpb#4g2qFOiBw(g>-sB$IBrOqBUlD&t6j#zd z8L~}MCjic*<19gi3H`Oy+HM);-0;GtzA7;^3Fk=+EnQ(!sqF5vBT0p%lrq$6{NyaV!pRMXUT9ym zU}1S%AU}0QdZ24XFgP44&99qN@!$5<>mP2uESNEOXm)vHVQJaCmJ)wxd2{_>f3N>v z!5@AGS-1C+&UB}AisoALAY%k}SN+G7YPC2X)g}-jH5&!_|TL=sK?UUilkg+QU0ZH_xi7zYQA1^@t|T=nrMPi^ZS#sQ zzpt_(zb&`2VAeoiTHnAjv}6rD(F9-0Owr3l$D2_%2_wh*tdn}vF%FG9Ds0WHJ#DcA zZ%S7|QhQBET>6)itsrp)0@7W!Fliu{9P5Dnk?>FLs_QPhEd1}bll-~m_Mvd@;O8E+ ze=L5|Dzx});H#5frRXb3QH#*MR>)i%=U>MA0kvS=L^p&3ij^jn+$mNFD_e~SNXBd| z*5XMR)lHy=rby>h*l&jS`cez~yPH?`l$Fmvx4UVevlbeZ23pF8mM&{zRXm58u z6dnsS5RnQ7*UhhtqJ8C(^d&0;1?l!DK)W?S+j41JDKWFZk;y$~tZ|p+2T`$H^+{dj z81C=jCE@I9=qDlJT~@Vl_5p6V3SKS*an(v089Iya#dZfXJ*oMzk?aX$_06Gk=a;uE z+t6@T&xS=UnaPD`EofdDDyx{kzH7;QBz3$@qPU9SZ&v3i6 zdD+UPX-ik?AEDzC8k|L2(5@wF$9U7%PP`>v9L{13p1(r84ro{ zFeQ;vUW#Ep7{k2utE=f(SEB|NCR0(hV&2s&)zlINsoJ^@^mrsa19_ zoUC%YwFkGVj0#{{VIbofj&=nZG0%%@1!QQ-pQScr`L4}x4+^twmmX|tIz5Xu7=(J zHIA`8tRTReRd83cHJ{Ae-^vKp3Tvf`qKr(nz+rOki?-Yyua32RQU{<}v|6(EZ|)^f!W?$c4nE?m<-Wr;=Zuaap*a_OIH3as}2>-1{ol^k$c8b zVsk&eA{H;>x|+PR$Q^%p8&YK9AUZl6^tEM;YvunU(DW4V}ZG zl7jkRaaChc>p*>VA4$GVb1S}`mF;|XX=;J@v+qCA*j?>s&^>R?+~D$}JAKt9-W6+R zRh0PrU4wPCy{%PQHD|R3`kIUKYI`aI-7U4V|Fvd)^Wvse6<>002-Riy=U2`ut*p+? zsBb#;U$qtY&n&2DEY0d(04FXS|BPp@vj@#{j`gU7-Fd&{4WFY|HIl^o zU97Cjwp^G=J2hlj*GOT>XoDKGfqWSuI5w!>?;R|- zl9POMTLS%UB_(bBftFBa(vsqm*0$C)A6hW9eSK@oIop;VdQ(O@LmeG|H}?Zy+qCJM zSNAnuaLeVL7c8l7tEp=#4xQ7}b55wZxqNYWUv2T`wJnRTTG`NX-ba?qTS@`H?r8aF zO=n-{aA%*`2m05`?eoRI6b;RGM9|6-vZ2Ep32zWZk!OiN1?lu zvXkBC^MTKAAODxZL4julYop)8{5aOi6L=CwCgM$s%rzq=C@$~yv*o3w^ z^^Zl1DbZn-F4#n7|JPcp?HQa?t<_Er`^=8ZY$NMIvX=Ord?)TRH||?NQak=Jg~V&s z2qcM_4)JkDi-CYNpy_tgZv%*Vi@5S3AZlwI@K>k#a!RkQD9WtgQe8eLkX+)+EUKX9 zc4{y+pB<}ty8A%1&VIo9HW{cM%O6K8Y^u!5b2}Ymph`q5=v_BtKVTPxUzQefwVL;8 zbS=D8{{9CIvaO}e#eb3eQ?}6US(%JhS~yd(dJVquee6`fExE>@iff^LctR7Ujwbu4 zb-(i(bu>)IqDxP$BaJ%5qtJRLVe$)c^*FChtcNzz7VQcXb3-#CN z+8L?*y-(X782?A>SJsWdRhkGFnk^ob$wZBB@{LnKLdo_`lw4zNR7f_uHC7QuILRsq zDVA4;yHc$*kyHHqR#>ODt2;k6|Ao8mD)`*zhIg#o5&G&^1$&*=FgwY)@7Rg&^xL)F z`MIf`pZi?FU3cC1)vtzlP57C5?BDZF4LjiqCN8iZQcOr$&+2`~o4CJ8?xXF`9$#+# z4*pMOq^Co=$!0uK0yxqMksd=t+q=<2&7(rrYIMCd4JVy!U`e!4iD8I2Q`5yA6x1#>;A2_Ss5U_*h=1>p`m^t<1M z@4qJzg6i=;`(D~zL=S0!@IYjKS8+m{E5)Z^CuGUrDW<|19Ks+ou_)rqnt@m}k)$Jb z14yO_h6I$EtK~_=%WIpis_0x)v1-kx1);f1GM3K>bPeUZK;HenbK917_*1UBEorDf zGdO=yu%vumbCGj)BGmcx=6B&W3DoolyiusVP|H9r+Q6M95c8Far5VM>HL3*sB91~1 z2}XKpMj8$cnCyzgAlz=Yo1~M7+y9J*ztyy<#%;#FMDQbxdM3UVwsp?qA#p(b`t%Fbuv==%vkAON>7o}U0+u%du`C~Ia%7isCs4n zKwA;cR>R7gMeQYa&$7>KyRfW^(!17oQhH6rh1c9DGP!AdyKPf?s#P!S8y(?LpNJYv z_KSEw!XC-$aO6vuonzB&7hQCd=O6k{p6sWj-tp}g>!earwZspiC8bh|!~qx%rxZ!Z zHKpV*A|iPO2PnlkcJlguPg1`?lm|q`lv8Rg9D&Au&9Sl=*P|SZ-g-WG_Au8i9~Mc4 z<}z_uSXg>x%yV@iCBg>>7?WBP=u*F*InIO{WDro)J;|tbb=?gO-F0sxNy?1d4SSk5g1Qz2d~0Z$`!Fj zV9HT*kQdBVpP8{!oir$2H>P}beQ^Rz&ar8L0#h@_uOMYeEGXVZ)Ef~jaZI$L`F7Br zVJ8oTPkhbuv6G(`OxN-LHIet7h&MCM`^mg-H-=9Q*&b7XJ>Eqj7ozn%bRZIIj7e(D z$!Tj3P{i--mj=Q`lG}%NkCcG_b`>fs8DIUV=R)*>hwe)urM6oCA&CT$NVp99OCU+k zv)yy4dv1yLtX$tA2E%CrCob6Tj5YMI85}Xut0cHKTd61G{<&O@kit~t#$C(7vP?g# z(I?8eYE=3LX(fs>+7GYoKr#cB2){k$-T$&*SQRd*Ub$w?N;%fAU+;9se*snY+{-S$ z_%b;G=r$_Gh`S5*-U{xSU%Po{1^0+4 zBxZT(^alxBndp^SiDBX_2vOO!=1D?2?(7I65cbohoy(e<&keK`^w#wBb+`AQJv67Y zqP|4#ZV0qS?=G9uRaM(Gr?(HK?ho{sb5&CHy!yN%e~&M}wZ5h)E2m&}ux)v6YTkn8 zs<{o5e@Mw+xWA#x>vd8*x!nQxDla6uv~&Ce>_IG9aJ_<^Xck;f1fwx2iY{@0(GovL zBr=DyWQ*sx!Iq$8+v&ft`oS(gQIL9j@xZdHm)T9_p`rS^WufxLC;#G^dGarCP>9u1 zA7-5|$!%I}{ZzcaCDtIg-evhHTlygl(@S%_toi^coyW^K`{Xr=cv$3G%Y;66e4~N! z4ZaW=DdUMYc_ItZF5}QAuIA$JIM&OXkkISk4y@tUmYL)xm|{IWwzDo0^-O z%4@Ph-X$|THr;s6IX7cfjC&7Eq6nK{uvUHHq2$x9y_{Rz8=)mkaw>0wG zDi>tl`ZzBzbd<1XD>rNzdMc9(2@zX*M@E{Yz$W=YA8*2P_36ES&L&a5pL^YUF9_6T zL`oEAS3KKIOM_aO$fIH9d?r`I>oa>4jd;EF+p2ni+#oUJiB?bP}b;ISkdASQjZtx^@RrYXkYYAKm!kd0*&X;#u6=VkfORC&{sYaJaeou$}+u zPlsQ*{+w@p>m1SHb@m4P{mxxDkB!!CGQ%k{%9Ba?v9aw~MBKErNeP;U8j;RT8c}bNu>1axW9jQ?1Wuwk}MSbZg`=6XwjcJX^VO7Z+^F#CQWYh%(CZKqezw-276? zWvq{@GHV8oDoNNiT?y+0>DZUfm&JXqRsYo_WZUnrEUieI8EWb3Sv9nDMPImF)d*dMh<)b}QO z=85y&0WFx%vQa*64l_sr)tZvnu;j_II2=!5WlEq%vXF zr8_KR;&HXz#A<38VJ66vT6=TP`Tvx6Q_5hDc_}(*#;EiR8I_idF;>I}XQb`w(ij-}yw(C*%=nCC6iHM{=IQ7A zC3{+zv-&~xoIpvatT2#Y;p=XW|8m6V&Gcn?n+pBW3z4k>tB>4)DrBoRPPXoZSCU07 z0H1JND)<(TOBZ|##~JC!wNrlm>y^L$b>BmaAL753XJj&*Wi2SGB16C&(ZQ;s` zlrg78R^l^y->e;IdR?>k!37bl7%rHJBN16Va5mS4GROe%iSfq7AS#%AB~V-(h&u$c zPnY=ed?otF{#5K*yrBW>Cr}8wnwZ_BzTll=4EUGS7=zEiA&8{Da0}Giws`Sx!65cv zzI78E{*+T=ebTxV9{!|7XHhw82t1U)>BQk!%G=Bpzmq2<+%Kiacuca=B!n#TEpk6m z%k>l45&>skq$}JNshRP8zlL-+#wHhSvgUrYVk*}KpCWn3*X6PH@-Xf2{JXNr!GLLM8pGa+vYh=L2Z4Y^D( z+(->Sl6J^(Ka~vs^1R($Dmm{X<>Y|96(Q7-R(EVtL^xGPTIqG++G9#%r7#|DEMA!jo1t99cNhXy#w9d0~{m0O(jje`Uf1eg6;+#2{cI-&qv4e@Zo5DW`|6qkZ z+nybME&Q6{{?)1n+3i$N;?CrX@x16!^4GlfzVJ2n!>fO_IDCS(GjqY|2JV^GnizjX zJe^67&7}TGJov`3F)J#-VKgA26+sad z^oP6Rjp|?aqo9JYy6)-Q zdwJgH{yZ;_oAp;hqmc{wp;4@aeB0If_q6i}cWJZrQ@*Q)kTNJZ0HfFHFabRGl3F%k zJ~QKVsTNl>?luUnDP;yHZs&YeAi}f;h9y})trn1WeA9q)7z5F57)e;N(+paJy27vr zL^Qx*4emmO?F~Yz zRo&1~{S^9xoo}>n>95$lm|etVJFzeWqB*o%`QrUi{y9@(wjwh9ab`^>X<4T)iB*EQ zQk+83qhH4-Fo7|i5+-7@2Q|3oAt!Y^Wsz3lzp;2EQNcxe`Lz6*+1!d;kE^xFRo7KL zIdyn%bA4;Ct2f8n*4I*1H#}CGy=yizs~{tsTa~X3hNoK#mlyVZW?RcxxWCO?74#SD zU+S2My*761xHE{|#hAxs|AEl|Jm`4P_BF=kblE~;1j;Z1sn0M-?TfZnbq>TwBq@qo znaE9%+_VQOHl!+=2w$+^OI5U)S4o>WmV&Jc?}Z3i+g?h855?>%yt@?dcH!*CnQjV% z`%|U@q=PX>Zj{QSPAo%(wD`)Awl)o!oicaQj!a53Dw#{i0cK_IuI+0sD{JnnRp$#S zJI?K~&+q(?Eq48mra+(x$1c##%S&2D8yiPkN{n;teMpzN>~neq-i!Zp--Rc&kB0p{ z{;>G-*|9O;)-cve7HDM!ntUT=Ya=6*!h@;HB&`)wb)iR%IK+fF861^Eo#Y$+s!Q~1TPO`FDWXgPPj(>JlJzkk<+uc}=4O$_&xy2cLP8T;1kd}MxB{6W79 zAh9p#*NcANMBZZbTl6^>>)ZyS&G2SSBV-gBWMuV79pA|6k(A|$d|XFz46^YXIR;EJ z%mDq&k3(3-t`Ly&`0tr&SwdZ)wjN?J>?9P8!Rjdke5lq+9R7NzP|F-Hdr@(T6OM;pZr`(aTVy!u8mX9>_w^Mo4}ZEV80@<0aL&7r zU-_<_!-rBw1Kz2u*olly^}&(UL)wPkEm_*Btc5;E2aG_T1U;#>eUOvvwfWF%^m={QsVWj30c#ya_V_eXdFCe?c1q~I3 zpNo1Py)vXk`B)|;!9s6$uzLtK!yK?oIK1{;tyxQXPu-pA?{=jQ_q`?k-tvbW54lr^ z`j3xjS4@8g@=-OWK_7vwa`?p>)WQXibUP)L$$-@ z)7_&R3o@VkhP|~~yL^AaTvJY2R-|^kscpWeW+05r*bUSEQFo-MsApSI>PF5$*VI9<(H>x*2C)tW!f`OHViS&CIF8}C3CEo{ z?#J;kj>mC4jpKP7=W(pz$S0QP;X=Dg+K+5M9?h`r21*>qaS{h2{cS0$qm1^%(BN?6 z2;dmO5yg>q2_PAqL+D#Gpc91J|%YA%gNF{VLD_#5<%cJnF$WPCU?w2RiXU zCm!g;1D$xg6K{9o?M^(`iRU`;TqmCE#B-f^uB?hJ+HS)KK9@34K=7^%oHa3Q6sZb+ zjHc&-MbzME$1#j!6OLUt(DV!pRRM;o07F%Pp(FfVyD65>gpz z=hnO6lLf5|p)`B$?BTk8_gwJMF4X2}8JgJV8!U?iGA`Y9Z1>6j$iQUm+x-J!RD4Vw z?Fcmo9hz2h$$Z0bTSdyk=Ct0gs!Gz8O#g+~8MDo7=>sRe~pcuYSk4I5m3 zR8m-o!bJw^@(Obr7M)6cr2#kS(zb3nd-m+<$96uP`pMPDPM5lu#RweO>F1 zeFc|z%_`Q=B-T(Bm|!!;x>xf(3Un~CQUZ7fqg!~U0hMPid7ee43he-PN<6O!a)$|} zGZxezNUF(-RS&Qq#OO6aBPBBEC5nl_Sb_m`{~BH z8D~Z(1aNM{xff%eiXnFj3ua=~t!B+0^14uZTxHEAe$uuNJ@Ld)>GHlpcT;I;u(7-n z6}Uo!M?YE7+1A!sF>v&gHR0jmaLvLY{mh|5JLWtcwM8juDbCvN#>UBDm3HFUXIopV zTU%o(|MqVPW$Fl!3ie?JH(&*09?=`NoKkr385=CZd9(<_NktlH!@%Jh z2Ru1g-8QUl8y2<=3)_Z;ZNnVdKm%SVohF%twPZ^{F-0yG@uXQ;w+&uR|<|N z~k>oIpVP?2yWne=>4S^n5&-=8pR-%vf4NYy$+w`mI$N<^|*&2h%j;} z^e`}tR}{lq#1&lwo#KjC@F1>$)u5zsgb4W)#fBX83&2`RF%;j}p#WpE1XNut zv=^5Y`n?oL3n7qd1G(i{nG@L)(?|DbOk~)>xHBd)n+9Fu*`AVcV8}UMwR0|GqNt~| zy0^ISYc=l9?mkVk+qWL|K5+fLpDkLB>iXhA=R{j$ReRorKV^-!wG1w1Zqc8*@IscR zdsAay=-pnaop)V6N1AKMG6CB|l-)aQoxpX2<|gU9RuP>7T&2k6%Ep--533?uggw;2 zP9hNIym7HfTrgc%39Sx6Fwz7`mW~4wXA%i&J9Riy(r>_-7HBR#O84y|7Yr2wAQ%a$ zh_Vrsopm8b6pb*<_zO#e%cJMSCY!2vE~n->`kUOVZCw^Ru^sd>Dl zxp=(5Ws#H8^U}wQn@h&Si$(OnjYC}_bHuc^ArSFcV z?WBze^?msI3^jD*X;{n{Haheu>%w7&PvmNbo6d{ti@WLMK$8p6)95DW!^SZN>w{U+ z@F;E{fL02<18&Zj4PD!ZWXwaT*`$rEnkm<)K>_T9PF`9BO*rVMj<3tp^&diz=ZM$ zBb*FWLrqB77f|Kb>nt>wlWX-e+b#)p?xPmh?yWY@58q`R#hY$DQSLmf#nIwVh+x&fa2ddEvt^YO8CC1~#}qvy&0pimp+m+qL2Oh*S{R!MWiNL?;8K5cEs<8W~`;) z^xD_qe~kT!_zfigIA()l&ztC-Hma=Cq+{mACe_U|)nYZS)}0ds?pwDcA**o<216?d zwGH^{u-NI5WX8QJd5l2JW?f)0Vhw@5D66TZM(-)|R~JMpJ0=@m{KQL}4@I3-e%Jf; z%2-oYS+hq^iDh@rbe5u6>3&qLJm_gI%ers}WuYnbtQ39+=5n;y9;IQgRY`WF87Y_! zp3NL<)ko86+(=YuB&vJ~+A`alLjCS>ATfp2=W(3JkpkIK8jqbYct}H;6YJP8dq8rP z>?O0kl>V~{;YMKEi!>I(@gQ)Y3Kyvzk%U&%6r9TivgE>mu7Za^*nl_EUCzD1tTr)P zNVU@`u1M$RUAs1SMqDX(-#t4qG5ejp!kS>8TUc6Jh@M-0@t>c0W&bZ0 zw5dt0E%q#r$=H{)Df9)N9K8p)T_USxl_pg1PO8;pDqs|{NOGA`Pjd^EDo3bW9HQ=| ztJ~$kp>12d75|}v)=y8JI`uFAa&}~LWIK)@&CGm$baHh2=p>YXh-5Z>FIrIzM%!R( z(~t#L1&SyA7POd?%kfNcfoGH6z2WfEhDbjKEsDU(2cR{c#qk7=XK+BErk16uy%K`4 zrdTb%)~}*CqY1?lLQMuZa|*~}3R;!|ZbYoc-6wHD0~KRuF_HoP(1s?qp$BbZT~VGj zre7jHeQa{u9Bjox5eY;B2Bv0>(F7&%wRv4%+d?M)iw!G<+c# zJ{Skr-scZz{aKp@$3MMcWIVepJG(S%d~{m7qPp(Ig9mS}b5EjM)TDMmld1-T4d{sF zC|A-YdVtoGsPhc!0lCpZ37}kRQ{@;P#+#R8bjqPkl|!^IheTfviM|{XeK{oha%fZK zpd;m=BjunY3gr*S-w<2;Tv9LnMX zn;I-3uTLY+V9`E+<1CIRa6E(K9FA9Th!uphTtU3Z$Kl2iz%ha&ieonp$Cc9XMJ6R^ zgk=fa#ljX?(2jK@FeZTrtVyUH-AkkzG~8H7jY$bEPIvwn^xvyJSrcR=~eSYh}Tt|9dR^A<<(9W#ZNJkkc!l!Th z)EBhP+nte6qpv&f!V4NI-oqU(slxQ7<$9^RcY#=G$Ulq^+hoT7NL2;+pd|OC^f_zI z8&VR(;kAW51Ghf^WIymdKun zHhuYy9hdEi{HiO^jq=aHgdLFdCLrl~p&oW?we*DdsNG1(i)dLDUc)p91gX-yfo7u< zv|F*6Ksg$^8QTK9qLB0e6&+&iE?!7!NnOxCAs}nU#r^Uk74J>MW8l8vFOL(-ixF`l z*DM5mdO6ZTwlHR({V{lTg7-XdQKK<>W-_wqRQa&NWKy;c$^n( zBdZBAG)D$U72_w}_P2Uz-=k7S9{iLg{j?Fz*$FWmIZkSrV!cH@CBPn}A#YUMwv6?c3R;#w05V27#ge^mA zN&d|}c=N^hQ@$>QmBYFhFSky>Kcrt<0$SDHyqYKa-KaLL_HZ<|>Amop_SM*!b+1WA zN;A4Mgc0!Ltz@AE+Jvmi!kU!!EJRSJ5UK1@mLkFZa)w z56&`f`{Sd)&k5V4Femsh$l>^mE2FD9!PT_mRMU>5IG&n5bKg0W`;4M&5hPUxE4gtP z>1t72@5XT)$4ML+SpN)!f}RbglL@01=>+xMYCs1u^_0K|m6lHnE+quExlu)<`bbL7 z1As-CiUsY19O468V%lV*h{WMDzl8WcvNa#B!nguE%7ytB1yJaI5mq78@<8^6EU-l* zQ9q+D7;uRoMH+;iDl-nh;a(-$pWJ?z!Hwy>P}x#RYL`e?B$f!=a={z3Ttbs^X#c@?m%F1!}NTxyRXUH z+SI>eA@;(@8~iSRQ*L=}(NY}a?Ed&nE?Z~b{^dA)#R}J-i^FHEaQk%%?yz4O#}s0m zfzf_DF{*E{|yQ*c83=$NU#Ze^p|o)%U$Eye+gf-!o`Y~@Gbvgy`Sxs@CEDr zI#;xW&&S~_-04xl(K8MEa)FYpZ_noV{jcJF&eNPju1z^7%hov*Yg58ktZ=b5C49yT z7i)uXtj+kG6L$>U#M;FD3WH3Xu>9_-`0s#2Vr|OjU7Y~u+K})QCR{JKJm=atobNYq z5o>eZ`wOr(&s%=?*7)yU)&6XG|8*AldAs@k8wiKQ2d--G01h+cXAAk#rg%liO~5mX zWjvem@&J){z=FI}1WZ`~O$0Pq7?$a@`l4+Bm=+RDp$S*q7@9#kAyJQ?9!J4e5X42c zl80~Ng%DtK#`=_kCL@_GVELMA5uIErFK_#|6uEyOS7b;R|Dd0MRDqy#E z#l|5|xW4$_ea*dPhsGPnJE~LC>{Wq@=K0m5M-LA4cMcT?idLsu`s)f18&e$^t?$^> zQyqJktG@TwdZWRLwhm-XZYgQ%t#!PzwIMuG;%#&~8@#1krZ#R4boVv*S{et+ybXDP zmH5YZbo)y^y-lT3Ub1%xs`~m4iY8r|g+q3)`)y0Knw7iCuDHfA~V@^f8jDPx&ut{&PS@f)Kj)}+P4= z{><@)&?R}tt9m=&bf$cj?iIu4R*iuvj7x(mUf&evt!4IvFrVZiHuY^PJu;|fl#N9I zGY&TnRx8l(PR8p?>!y_NSP5K)JJ6O{$Z0tzqM&i{fVhx3_;R%|hNnVkRO?s*^;?-Q z4i_I6lqixaGKjSG+Zo?;PjqA?daH#SSV{lcp-5!t!UF^AcQt0@JEia6z`qf)eS(QE z(q2qen_e3OKWmAOwU)it>j|j00F?d&Rx2&z45qHNHDF|5lyK4KS%v#uVx+2&PJkRF zkvqbO9pg#^RHh3sFh_>zmEz2uY#Aybzh%~}+R-weIKuP@L@L$uZxEKY?!+_+?PK#b z18tSHgNvP^rGB@&e<{>4mY0$>8Q4@4agTYf%d2%RT`@X8KZ-;DW>3xh?yJTkN2YxK ziCw+DyC(b?`QF2=J&m2^Ekzlnd4m@=EN&Rvuqgg0Z2p6w1sTLmdsInU9Nj+%?kC}k zR=AMNB;1h9J;6B4kqNV z*SA0)$9qrWpvuKqE17$efwRm+<4#Qjf(usREb~#S$OX>$PkM63@CbSpL_F5|I^Bvh!JI+0%VAN$3getk+h5;ZQ0*&7$*HdjEe(1+gG-^V zg}xfWjeH%`MZGlSHq}>9_o~lmDU-bIXd5p@?Hd~0Kjk->P+N1Ovm~dm zskOb>nM>tM`;)=Sj5!q&nVh2;b50QpPpw1Zz_sx?C2kmV4T%W%D-01hQb?S&{O+ys z-@U56CL|*Hyz4CRKM09P!fzm4;0SRlAH&|jnieIXi83mp1UTY}<46)Awr0%GVU#8W z5oXB9peM#9bDw)m7;{Y?#|xguA-t96aY2g+6=+sIU~-xyM<5yug^Fv$GSiItRfAdy zHEGgUkM=Rh3}Tkbj!btgbNZIMIDN}5#AC46hb{iGfeK1VnhnhSqk5(pH~K-%VC{wx#RP&e$W`AU9Aii+vEYu!h0aUb5eZ(ZD_- zn!~=ZwuqVo3*dn8>Dxhk;Ety$Hjfvyl+tsL3kSq$)5UM+HxI~r8SGqci{cQ*+;fDk z!c&MU(-?-2>)3^rr9&AWA}V&P;ZmL$bA-(S72$o(r6@M%evO#389zQxzM~1-pFO&^ zK#W>@5j`j-1}gZXf&&q?8uA?l-(rOma}<0*!C%4s+2lJ4J}=?6nY9($S^Wi!6{8T+ z>_>0F3GE@Ce#+9G&FcO}z<(TnewzKTynpStczz}=0_yp*ydTqVU+X{}AsMyx0JRT; zb}&}U)S;53k|Z%YsRpE~IU|gIw94wz0FV!vE*~;oKIF%IOj|ytEg!bNeAxQ(G56SN z61bWV{6pjbEOFW37q$3#1&z8vr-c>7t#Mve$s3Y3OBJAUSc1jPSy@-47c?jnFDG=J z`d(d?m$J^*yGFN>pR`_$*Nht9S!CBgi1Cv1!GMZCU>uQ=wALf=ES)>QVsq$(eNB=~ z;L7C`&$?%d8KSM2X0I(q!+l*h>!&V!Iy^=U`w8AyBW9G;o~uP*9xAbf&?Jo(LRl>Iz zaLo8iLe?Z4W1!W<$KWL)m&p5P)cq}3;6Jidi!ZYM4!;9U1V-UGAd(oH6s&n_0*3yf z1V0R(P)$Pe3f7J`7>GdmiABLNfIEVJ zgnL6bYmY02p{Fbg7P2oq!ZCxKtZQP-Tyo5QCC5y_g(M*1i&nT8O9|g%g$oWY;R^|H zT4p7DJ`P{eH8J*tQ;I7UW52#Vo8$MRo$=>W&bQv58Grt!g!?J~%lFO_4zA^0dk$52 zT3{sd!fJazox?^{EsI1jx{qfwhEb6gbGnpjAk@WjF(-bI1*3qX;V3Bu;V%XnJPQ2q zivs3k{qjC;W@CJt3#dojR~x^tUcnfK5l^o`Cb`^y$cr5FZt0h-w-;kKJ!G#SILkX8 ztcA$eG*va!I$l~)JG9ibrGMz#qYLSd7weYuUaapQT}WG;x`G0FdC6SuQtkFIMZm!9 zzUabCX@fKNg6Cs_TCK_xT>xH)aT5HH5j9v#zro4C7qK?vxXy@i723G&&`$`4cR2&H zj4XWG5llfJq(^UX9>iQI_Wr{h4YAR9?j*$$|jBN#FxEf=s zn2v%l<3v4Lca+t+T09&UNXNAtsz&dQPas`#6o-CdZ-uY*(g7h8D=jAb_=Ug2$RN>z ze~i96#Fzx-n8a~yg?$HaBRmn8t@m4T*&#TPyx)q;4*h%TIcfHd@#ka5O`+GwwQ_A7 z_qm2BH4_ef2=}YEi@7QiYnytM{M}pQzvG&x_ejF8OMuftEa5j0PDu|I;uD~6v=B$Q z7gG(ay&D8cXJUZ;8JQqpN;fSuv0#nG9hN}?f);?1e@yp=!UF+dS!8M8ZNU{S#7O(Y zl{EEo7poDm?)m^35zXkMK6MV6p0D6wFiokr0pwgnLo!1HWv|3C8^;~|5iGuP5n=JL zJcnuWWzFEE{eI|+j9Yk>9<7xc=rbjitPlDJ1HP=(lKrCwj*aatO)K6#8C>XBdUWRo zS5Mi2eiO0I8wzpk9}3(}C7saCq!!)Z6B?=;UsdK@p|&Z0zEjX^&JEV(S)2gx2P3*c z&}9kVqTmDIaXaCo0u2)PAG=B3kIFjQ!{Rw*@;Ogg;j{ru_!h!J!+fxtJPaI&Fgv(j z&A-9plu6B;Z>4I9*&OD=#o>@PUIx-}dMS%iD=HS#TaPOl=23-no|vgFyoV%IYFhme zjyPUXJ1UHtY*qtNrJG|OqCqikr2k= z^s11JsEX3Ku$ONI%{ZXH0(?SEjY=4#SbNHNzj9le@Aq+C`z-5Pxh+jh@bC_g#T8`A z!$!zdDdwKpn=G-?sl?%Cz$B$-PGu$3wa z*Tjk>8Q4@9SV4ujz;b<3sB)0FTjFxLXPg5O#f;RKWmIK&oeW)~sLX+oDh3@*RIOMT z)gzP%q6QAqe&L}&aRC$<(AxGlHIIxe1ew-yJZxtwPP`^vTxqiPd*Dok$6r<8+y9;AcZj6P>>NUs0%N634 zE2Q3}l^O9~o<~m^iHwXErnxx4ejS3L4HGE##U(LikS`+)sh+u&9huIEA~6^&X;q2A zU_f`xMM-Iht0q1y+>*u-ceeejm1^es{A!#I4`v&#H7jwPOKJ0JhvneKPDcg}e;Vy0 zTpduebR@F){*NTeiHHS@&qgWaO$&`IW@EpbuGO?UFTUDxR z4^1FsHVgzU7Is)+07)o#hoW8HLPIQ2d-^R!Q;O!oM(D!fwv_1i5wS3#{8jo3v2S;@ z8=(rjV=rhaB0?dryw3GRS$#z=FeeIL`*Xo-;maV;K97?D7dn=NFIwS(mrM8-D_n38 z313KnQ^%6<`8a$<`?=u#gi|t<(JbrRvpIf0+8KX7bu3`I(M~&cEcyIR3HMXSlJHr= zK@Xz9{6E5C(qemrUU#Wq89YQW1al%4Q!xRif~ClZ)t@P*+8PT(ZS8*%3q#k5+^(|} zXVTJ(#JynqO@zI0>rQ`&W+j#Hsr@|BFxKCMD3|n-+JHN{Gx}!izUhi4SjPN=RrbXK zRBu1DQ`;DOiVAtTcEB8A#h-Z zGbX?qATI{gs&t9uQl)H3j*^a7$Rfo2u8KLY)VV+}lE)+z)Wc=|qG;kc?3mJX%j;qt z$-O@=@k;C#M>&nLjCBM{DUJ}uh0{`s2|?x)@}t& zFY|t38<5YRQTKa56r`@AtSz;BGhZ#Lj-EBX=rQ3dDtj9K1mw&zyke$h_j`40QL z67Ih&{``}?A3U)HQG_=kPoWxe;}@x2OSw^M)n=ZH;)!MkTvA-{|9?IM>H;>kA$KK3 z84v>ZGY~02K0QdU0Z9lJUeuRR?{RoF#MEn9m%W-uE)ls~q?JcvFGiNMrqnn8hMSlr z(96PFdJ?|#9sTmyr_FhOCO&@ew2pVmt~mU5E8Ko_9Dbt}o>Hga4*R=}`Qbd<4LtJO ziAQR-&H1+c?oQ)(obQzK`18&rz^mi%_awm0_up;6#rqAs@!N@)Z}k568^2rk{tqO; z&G&zhaNt`Cj5-^EZ+Qsl`I1?ST-t_(pOA;GgUWrhpFb%%n7%HP({SnS-=Yz zj3|WzOQ`2F9i1jnhYEYhqHFST0E9>Kd0x;*DImPK)A&kUK+2W5Tl5V$1;TNk0|eZ~ z|3M0OY9IaAgUi|h?PsxvP#Wwj+DdFW=W}2EM-)h$d3olyGx~8BGY7>GBS1=`-Hs7) z*l*FiVuo2!a)Y2S_)H4p#|igKI4OyQ-$ppP+=rFB0U4{^jErlx$-En5{8S*EIetpg z5fUon;bdMKRox6RRLxja`4}#qxpPz_4zIMDc!kxZQbxwf-KMGh${I#-F&*-W)gWSI z^@>0`ZAM zrcE!89@*H?u<^*~%P%)?=&C|Nzvg@1@eXbCh}PJ$^7a+{-!fCxv$^Z4uFXAF&yS$g z2}W3rjGm_5C9sks=n&XiCr0oVpf&H4aMCdeKb-*Qh)eiw32@Gwgr7=)lOIa>%?WVM zsD!`GfP;QH1fL|FlncItczehv<^8uB_lx!$?d z0Ny+|fay)OejDMHlXL7#o zHpZXxXgB5sd#@Qq^~YdRD<% zbSW)IvX(21C0Oaz@s+L?wn;~=Vh$IbLySI)ARwR>6N%O;QAKQHb)LwB6;O^7@vnn*xHgTjplGhbk>WExE<8PchI{D5IYxT{uz3$jgw*50r$*st$#F7fsOALmrkvAJo1Iu&pboRq14pS@{ot4&t4uAQbj!)l4d{MjZ+-X zQI_yiad?(~O#g<0(<=?FC4N6woxJ~TydR?o9Yy~vRz)G?;OAHYN!E#xu}3BGQB;;; za}<-(bd%V-DkubgMfRQ^XYW9KR+CksM1pLlVkyYFvLayUPJS)9xVn$)my=K;W{BI5 zlnAOUGE&bWC4!loGGLDJQVa!PNC543PME7Sk#i`biakbTu`}dx>8{xQi<6U!+8+Lm z-LDPA{#H*LIf4I1F8r5v>f}j9e+~+KMn*Yi;8a-7zyKPxDCj4ne8BBLEa4r1?-4U5 z;inZGzt)ZjjwRu@CBQk85`Id-`*8nOJL#u{->l&By_`u2f13ecTfx59)H4XjinD!F z%>4Rx-fG-0+HbrU^wVp?e41tJY`5kbQl=^sphgi( zh9N9u3ep5CG$h0$F>Dhe8dHpEZ}p;|dg~3xJLh|Rj@h&l>?IY6e&F91fd#SpV>gzy z4)_X68mgR;joSSiW0#^Am9Ql~ByhP2698QPF;2wswJd$Vz@26QNHwAYz8$^(p}=ua zZNP6?+ad2KT*Utn4r})J;?Dt`I4JKwrr|wu4JE+mY)i4PAWG{`c+O8SdO3`JVbOg0 z?hKx+>`dnHm}Y(k${<5r&;XWM;w~LJ5Qo={4jy>u+eANa38{X9Y9178S;B8K;26h) zqW^?*9QPRg$Nl7?^8OonKi1SL?Af>AmVc@L=71=vMW_TxR%`)KbX!O* z`525841_G%N$jHRSqS>b%3|@5H+nd@|HSH^wMF|vPhWUB4;MhG<@@x>*Z$lyIdh}- z$@?xm#_JM%pt-zs!ny$}D>E>0&SnQfVM>U`JI|eTZTCEdmDZLxmosLcY;~=Oir#tWo`f zzKA?kCA>O*)uevGaDJH?qJmoDF+eN{uK7jumj^|{H4z0K()J#l8t9$y`J3jhn228< zjh%PqX>DDzt+U9N`j9g(_N=_l4lUR1X?xq!)>Av$jmz7%w`=YGu?p>MvwL8%3s%FbXlPhUJH zh--l{LG^+>yg^J*JQ+!Ocl0x5{?I^Y)7;VVi7V!sIC6oecm0B6Roy+?s?PSN{T05@ zJ-fDIeA>6)wv|JM_#hX@=tS4zfIEI+tf@0%oc?LuIIZXy4~!q-i8yb)--`2Ri1X@x zE6$&xTp{3T_M5CYFXVE$M(&QU5v;ZN+JQWe`_{`5Xzqjc{~{ESe!9got?80ZY==M-PExotzBtgi7a2$MI;5k3_k z`7DmGf^(+mH=#`Ns(uj2bWHcordIrJ7sO>7Z z>>gx`K8z=7qzuV4qyAX z`>tpWbWDx)RQHU|{oukG{n3SgO3{z7FVs$((U&~i$H^%3g(K0BkCKY;s(2=$aWd$i zeDem#Jfg1ooe&wZbh$}S3JT4M?G#vfMArKhRU02SZrOzk-X@^u2t`pe8?cV*3U>3v zl4sd7X;U`h&vU3~s^}qEClwn{%q@QW&nPm+-F#r6l`$}^!?n8jKlpE5fzCh|=9zlqyr8F41wc<}+={~~IZOEI1UTuegx{6`Cv}kUQweZN&Juoe z9KON|#|ln9zS;6#T3O}&x5n>hJB{a4a<<-2$ywh2_JsQ>IZOCS!hyeAfxmb!<^xe) zDJomtz~pxFgLVr)NU|=O#i%i1tSzsiI)q}=2z;dtRoG5pum|aL;|Smw!4bu=8^>`R zCvnhr%D{~hVLL7RF>_>7gcuF`o>OdQDB?77b!)0C*ahY2cy6ro(=)59GmDw!t+i#I zqI9FAkiWN}rnxkwBv=vI)mH|sDZ2mAq5ay~*#6FFWTdvVwzM!)RTA>MP)W#{n(6S( z9G}%bWX?W)lydamnJ}u9ktO`b_^7_Be+V*irEQs`S|tpZ#;B^QFy=~08da0l8%AiB zQe!sWN|F#lW6OVsDQhM7+kmv&UzAiGBN!kZb>I z9mcP)50FO*PsB*;{Z@?pkdSNT{Z@?pkdSNT^KVKRyC12sbJ*{-Vz7`~Ii?Q#dtV3s zz67{8{+zoMyafeq%H5th+LrB*C3$KYlrLLv>AhOWgu>!isz2mTFeH!>0t2)TIQfR`eO-Wo$ zWfu$64!Ii5qjE1`@|mQGIW8G4|p&?L9Ly zui@`&FgzpY5Aj9c!}~?%qy7KVwujfT#hJ)KG%a@0w#UL8OctRyKr+&2)&b`*I^Tdy4d1(8 z?IUZ9PLj7nWuTabHmehf$t6-@p%aNN3Mo`{fR3`1D(!7Zedn|VLq?i`^cynXlA^fZ@wHyodvJHEkN*4$Hb|BI!8`m)NbjQOT9&l1j?5Qj)hh9HwPfO2&*AC$d+I;z^h**uW`OvOF-ucAJ## zwis~QWf`n5L#*316t%Z1%FJa&z1dXw*M_zFHbhYxwwK+ljm_!Kl%gG*+h@bo)#2Ip z=uTHkRmIjThQqOs7S~mmXV=tZmsi&nmp0cH71cKTTMz8nS0C9wIJiGjzkC0&={4I| zvogzDYL}L3Tgo$C4MPnZ8V4I(##l9BthhzwZS*d-*jmL{(Yxq~kCmb&=2#_#Pg;jY zNG=WvI}Uo5Ww5&35ky9jrs73)cnvMWbt-_Jx3q9kUlwTde<39z*o9Vtn@ zK!P5erO~Aa8fA@uabqy<*T#6UQsppYycj**0Wk!HU17uP3Y8Mhom`Z*z%H8zycW^t zDu)AR6!o!LTe|Gh*6FUwQh%Vdda$Fqs%KMY=f>ic=ttWJx_bvkhFrctc?2QZU3$jh z8@V63zrV38B_*Y#HPYF>Fi`9B#a`2I914~OdN*v2y|tjKD06zUbaI+hBoj351;i@n z+fFcbIx(+Vd2>wMNa9sWVKaxys>=vuv6fn;@+nKLQf0{i(Gz>ncNW*^K`;cn%lq61 z!mXaBtg-gg(5|^JGc%{G_8TAnxTakINtRib8lvYbF_?!)nB|UPv{G?{9)tQR+GftE z)qqM8C$sBl+TvDfjFN}*T`UeZtPEw-YDo|Qfkw;?Db+kdYGhhXs2*h6j-n*>xpwBx ziFjzu9=S6(*<4_xSbF>Co8N<2h0Kc1df#Ac`NF6hrO@<`q^4ZexM9O|!|?v8I{)PE z{?Yy8wW&9*Mq*p)26}pZsWn|Qf$)~iMU8`?G4NTws=bU=+``>ned}V$la{J!KQJg2 zQjb*e77vhAmIg-7j4DvdoqXiVtb=Qg)knLVQ8%>=C~?$=!2TG`cZ?d9Q*9zHNK z93H9+Z47L@yrQpYuE*U{nbXzw*0)|UH2mh4ea9BY!^2rAX*~gVxS=H6-sWq_E-KH- zb~lYjv+J9ofU&CD9_<0lrO&p+38)i=7>yZJXk^ZyN_UV18?BZ-(Q%d=Z_&+|gSn)` zk#;o^P6F+RZI)SZdDw3h)Rz-Dtc4uj5pDNbcVlU0|KtX*JGFYYc0=!cz?E4M@ZUZ3 zHT{KwpEQj2v=`@wM+yov>dSMAju+lkkXsj=XfN*?oC!RZ3YWdD2CL^+g2o} znDTz%S9+>ZH3b9S1I+p_WV#iCFt*x0OnXI}+E$YS3i&?Ip7^RtniI9XjoV*osybTI{Q??pqA0^RiZ4=jYU}|24vWv2-z6YwE~ulZ!oflgnIH+q{3-$0oL`es%1kxI?;v~!wOr&^ zMGv?8wTF>1rk>2I8U?m180uFjYT_7A{>yYX$>?d8xTe%%?AgcEFP1r{04FO-bjRy! zaQA8CI2C$d8iyj#d2e2|tE2z+pX~X=hR>p=N&m;4*^zr<&#|p(`15J@Sj;dQr7D25b5V${;GMOAU@KQ#a(DXI3C6~!W?=NF7Cu3;;h^f%IHl|wtTg^zx+c3~Rmgk5>Xt$8HMDq1CEFI!zDa7-6%w9g@ zZPM1sTuM|iaWiSDTbB=K&lG0lE|Ux$5!;?g45L9`>blx5M*5qYpNa0$!-pb~cCU7M zYzz|`p|;QmPR5#V+(!`lWElh?S&C2io8vqniRLL0#9Sz9DS;`FR%D6#Sa5hj1|}Pm zB@Ac=V3k@dagn7=)3aCxmh3~$5+V^Rd$;slaqRg1;9OBk^m{WKrpLyni+usDA+R`H zcl%9mzq773c0o(oGCwoFWy}0W3aSbbNH1iIC()Z~+eU`&CFX}El_;_<2YN+homO%m zxm64o2D83WQKwx-BB;`=Y-1dew3WAPU8(8a+&QtMbUb&cc`$Nvhrpd2Ps!B>hxbj^ zjr7(wv@B0fT;(lO7{ie#cC-N-TtHXsCQ_^})n9R`<}3el0WhhnXc71#x?{uR2P$PxtSg^!q3G_VXOs zyfDOqAVb|V5Rf$xIh*zsv_0E4#ig4g_JcCke^Sb-b)0GYP<|-1m}AZKWpGTU7#gu} znzO0-6WT+cyBd7+a3q3UTD+6ln=j#=PFsYomI7O$h2|)#Y_1-qtC|2s4295Q7q9F# z4dy}!b_O5l8yoA39>jmqm$xr2Zr93Vzdd#R^{2F4%vUEk%lidxwcFlHJCz}&&kOFUtP|A`yE@q^p;6IrOf>!ttj@1*t3x`_itn0*N$l=poGM)9{m*T zY9+LqkXT#$kwpI#xiig>NjjODX0v0an5aYvt877AiA?0@gj1Bjl!mw{gfSO?899mT zG_Ok=fAbB|=ob8o-tgvce)-)eH9hv?@+JE17v6NqGH^C_^4(u%kGeo%J`Icwv!+Ek zjPtZm7&B8xE?s9SVWAXu6Hk-UkInWPYnaX`S@f4NP_+MG1Gx6lEZcRk8{UrNJ{+II z@feO&c&~DxVu$crTE@9+GOE!Ci-!nLViZH%E@IfyEEp}2IH-NVK+;QFBO6OwhwFzX zvs1Dshw6u0O9fIJ-$(z&K+~=d1bf`?c+>dqp{hu4Z=`By_xP1}2;}ZEZn=dVy99)p z8INgo<$f%0`aQ(9hKU%mhh87x`Iu5X5I#ZPoXTvP^@% zBct+UCO{z~mRq@Vt1YgJaT6snpr$xwQT*RTIg^kW;S7|eYlJ-21Z-ltO+0||)Git> zWnj9va6lt#f)3UM9jpmeJ#ovOyal3EvoQEdazcB6wD(%dSt~0hZ6VrTBY155D1*q3 zj;{+KJEFB^8-Zi(J5Ft7Alb%vm{0uT!psatX8=gcIPf&aZ>!N_Y;PLcM11D#?1WuD z!?uAwL+Ot&@L91%b95Blm6iiKUQHtjS>+cIZVN_P$W6xaf1!5#*ITdNn!0lJ(yy72 zsqNOXW3R>@!0S{?o)#@>jkiqBBco#Nwh^=}9k<${$z;(&g={}nW1PkRX#D3nD?XQM z>de-f;*%ur3@w+bInwFkfE7n(+fbZh{D!b}cuK(89XLj`Z^n8Wv}8l<)mnND-KGZ2K7!F{A6~D zoyNXUp>gLcA79b_G4}pfUen$*s}*Uvvoo>Z#$Mv=i?|Ze4#bb(v+xp%&-B*W zZQ-?_+pG2OL&9mc^=dBW9roG!1&T9qkei|M+{-a$Dkc&wv*0<`Y$tJ?!SMi&vp7P11+P_F4)2o~*+U)6N1ym@l+%_|*&fN?dTUtc@0xqYa8^FVFgM z!qF8HJjVsX5$oQN*N~Nx-N=nzU0!X^@ZpV3i#6TTO^Z#_-8G9%8xIdJe#&9wg1F|Eo8M{UBc(rE)npT z0B^C}zq+iuU}ge7=ya#r-lXV#mK(;NtlbKK~mF+;acwA0%8z90E>S zg6DJUF%E*S5>CE~_TPajtZYBpse7=8A2Q_11w8iMIQ*o5H>`(icM5o8zvX`VL@$Z9Yfs%tj3#kC*eUao;64 z=W(BI3*!B$`hNi3+ieGkriRX7*4b2q-?XEd6jiQwsoYajl2wk1L3>#C1d1YXU2b1N z`GGJ)4WOyp1uMA2QsqZ+aKEbir&Weg$*XE)-_*xG-7-+`N=+%59_U!;W2wkMO_#rT zVRFONLbh-AEz8F~axj>dvpF}VynEYtsLMCLZ@7PV#6MNk&{sdaxG>ebV{w5LnppZ< zXacMV>!Z!E0%DL~G?fKZ$QXDwbD33FO_9?yt{LU9e0Y|$^!w0T8V_hXLFqN|SdNM; zhgm4Llw`1`kRUy(QYZr3%&R3WWq8AZf&M~YmnU}qPrjxm-$VC%>gqiA>nT$Md$Lnf zM*}rIO=V+#Z;99c(952h;u_CA=#=Q$edt-L4IVxw@X)$s(5|FjC}lxP9%!LdH<9KF zd(4s+`2&i9M`#V!ZRu+#u-7W>c`n-?S)fU#2Qn@-B`z%_X&+W)R+@nrWkG8%>Z*b} zFxY{{78&kJD(C_g>;^WVWIipBV8`A%rx*4YM|yvaUt3+Cj_sP(-t{$aX{7U>J$J{( zp1tFaXSHj$9C}YH@EUZ3RwCea29Q|D2>K7v?rz&ZaTBA&{Qo4gW0DCYsW4ABm62{s z&T@c&fCbP%K!XHyqi5_jx0TLTn_YGSJJ?%kSnCwn!SR403gh7vBS7?%9(z`zb=u@z z4S>SSfn~rH?Q$pa2SYm0v*tD~HplGUVcrX+= zxyO612W%%D`%l&<(+>g9((FsG;iTG2H-m?}W3XrqEv2v9 z-XwFQhbRoZi&uv=?cx-O3=dij=13MiC~04hl1tG; z`?HFQigVkCHm7H2=VrQUoSXXl%A1RJ9RmG%?jr>y*{P9}Ir&)*dy3sveMh9i_YlPf z=oU8Z9C}%7TcoF5#xfhdOfsvPHUUUm)UvErYML^n-=ABovMYiJA!taXHIq_{g_Ay! zQJ14}NgrwO{-~(r{6E-0(&a%V|$_*k(vH(}ju6nCGOSGvBU;F2Oy4 z*`-kzjSv${Hg{L_cVg2EZh*@*1?yUY;2=_BCP%^EYTzhL>yZ}azZI<+q}rR<8l}0L zgJW%t=}DwQ58t8SvwwS5JA0OKB;>SszpM?Gg7+oFZnI_8b{>lmis1 z7cfRVgv5QcfrbQ(d`*@SuEx0nFzSLdp)t0D&Q!s{)j_ z!n-N@HxKWuaeoIcS4mIwzZWC6orWf9Uou*p)WE+?3{3)K@EeB5g31~HJWJ6h@$bSN z#<*!;RV`UNVXr|;@<@f#*YWM7W${0qOlHJqt4W1JF=0~W#OnWi;U>{Ub86-Ef?L8v zr8l6B%*jCxZn5HH(z|9#)=7wEO4eqK0&65-KIQ7;6x#sE$H6+h68k7>(h(;JkeO9u z>K^yq_Jh0TcWm4A!gH;iovo)qm>%0YJHHaCZD?xnd_`$bsD?+gW)W;BcTmzRQ-PGZ z7z(l@p3Q3WN%SU(Xj^%)V9sVhBg2*uO(6PIDEm~1J{5{SN%4ckhXFZ63fPilo{-ri zlpXUfMc=_r{qQ^N)Q#FZqagW@ZJnE6R{fF~gX*_H;Ge0!?Iq`y^#Z8i(mHBj@f&pD zf8XAvsC5Do+sXCC3KP#j%C5Do5ML5&SSRT;rrcvx+@+09?rdj+^^pi6{hZWMN!K}y zvQoDcrsEZORPyGa=KbKg>5ZX?tFLU|e9y{2P0hec&t|c$XV=E*bDBSWa=Ep&zGuv+ zx;q{geq|ahz+Ye0k+g<}`&eJNHm-Sd&!f!v2q#4uC{Ai}F*OG!k5cOw08{maatgVF z36_+R41YP}DrLQGX52w9Vt$$2K!BoNy}@Dx!_i*b`xeKWqS0$Iuh|t`t^h$YoLcf7A} zFlS1Ju__FdRi#qt#)IWVy3t8fsic8LPAtt3lw_5f2o~Fq{K=442(wy9vD9FFuLt_z zWCW`|dMaGdT+yv9v4X5z}6ZVhM;?wz~v>pATYYqrMPnUQba_m3COoV(|qbGrW>_dgXj zE0Bq~tP@fXYRcF@ftGh`*s$t#>?US=m2_wVl+O9Zz&92*R*lSjx3)4ZHLa@pTQly4UumJ(w|>>&p7~aF z6@Zns-<_#xdNuZxHu!22)B?>`2P#?st)N|6S`y>hl%>TSeUns5Z&$LVg_tBQEnIP? zrNzuheq&3E2tU`#maeTIbgztTT--2!c;C#}_~h_>>8St6@>R#DhHAnMrL`lg+2g$( z?ZLs3obc$(z(8)Wr^VM4?%%&#Zz8@0cKqxEm@yfN0RsK-H8AJcEcT1m6N zgGB>Wi!Vout88Z(#gJGPAc^WJerC4#4Wbxmpa$0#WW9o3@;d<#=>NQN@p!_8bd%#A z$bB-ajCKvgKVfniB1FZD5~eKFA%*GJN9fhX(|44#xZ8%WFDNM}sV%yBaHzDU7;O5&ifLm*0EYc!{e>&E3WQ z;|;Vsept1ALDZ6M50X`|@njZ%UW|PPqsT^rVW{@SecbrW_Mm<( zv{A2UA2=cKjy`bsp3y#P55s7m)3%kik;GUt^>(v;NudWS76_|^G6k^%8)T|d@+|B{ zMGMjcqLxZT{!6aCSvzyU6N_zse^+YDjmxiQ6<0S_cF%0lt71>SrIF^RkxdYrGXnL0Mt&^UK&s(P_Ha(u3_ zaqf7edQo?`&-I}8&|Ld_#6{0syL+%@_VCc)k=d4Q+gfIi3=SQ})dSk+D?2BU@HWv| z8NZ0lbCydnYgUi*D&&MmF^eLPbiIv1X@2G`CegY?8w1Bc+8AgiR2ByKQfOh&uek8a zqPAsmFW!zSAV9iv#3Fblp@T9cd?#0HVvRIKNzL~wq%i^JCcON0x(esXfw0Cv5Ly#( z2E{=Xi!}8JYXXvzP?d+~gzu$RMB8tE%i_{fXS95AQ7g>Ke#=eY_{NTf>@02df{1wo zH?Z##BXkj)LK1CF3jRpyL!wQAL#AvB94K+DE^2oE|60r#Dh!uw%i0n9*U*+cR@7T> zRrt%ZrHGw5d>5ZS)2e{rWa~7lskEPX?cY@s&Dm5ls#9Xtzk)W>ssPFJFIW}KwwRKq zVO21e6f1E^SzOu|EV4K(nJA_#A~-Fw__zN?%lx4b#h=yMD2o3O1xaErCCK8S6P(#x zv{YIXuA|A=uqH6}iKPX3HmwOsv#rbvW+zPJ0q8=asb9vQk<5W|3MQxnOi!X%kY0&e{k z&A)&5xCTwSZdNQy5~h^-!0eQ198fr6%EZKKhuZgDS__Q6$tq^F z7LRfn_x`lG0N`)KUj zAO1g&eBld^Y`o@*6IWa#{$QCRBEp7DAc~AWS_xcniwF}1eQ~{6*?P?`nO-^7CDYa` z6ILWg_rY2w_v!K}^_f%)!TbXKnGeK5?9xhLhclTwwFN0&t+x_14lJkV<`rhQPqw%Y zu4=`L_rBRxUp1ut)sw++I5_jy`NjE}_EfE^W1?Zt0m#cOFE&0gt zJ6m6KHOb(ua8;-(G9Hm8c!=#Hcmr?5v`ObAMY1?+r)UPRKfOpSap3YEnwde&#)A(= zUmQ9Y`QXrtqOXW~r|+!Vc9hFFG0!9^klNZ3K{(C$era=}W!KQGiy?H9tIP17bXb~b z`YaX|+7aF(LO29Xzy^O1)zL_?W)Sm_Do&brIoBB+fd2qZrZ-_>X>OwHX6I=Cu8B~M z`#}Vre7C~8bl|E(yMZ|(szdCf!>Eol`{w_^$$$$Ck?{EhI59-Rmk7rg@;N_;?Xiw@ z5F4@zN0mVb6$!q$fsrO=BSyuDZz=&zV!9=w{V_vGqQfFGqmfkx4r7oxJ0f_TyFqAW zy(|4SHT^5S(VZpZxuZdUkFVg|xdLC0|3GtJ+5YSVqiIQFZ*BT`PHk^v$u<~N(P!u> zh-hIX-2rp~s{-iEv5;`a0!a80;plS%{8z661A1*gp&BD)aHG#Ep~LL6m#%-WCD^`+ zfF=vTsz(bPNz$}Ud4_zjQp9Y~-A)-xZZ#tFmpG;}E4LW;$*f$ai7=xUX}!SpI^5p` zNUK1uj`&@4pM}L;+_HB$<;d8#_wALF5b)ai1EVFMosJnbqiYW?EOv8^zCz zFQwlsX|C<#$iqbRGJS&ZMOk{RSg{#dXsXRZDueeXs=sid5+h35{hwk)WyH%oBVG)+ zp!E{I*$UUO1D=YInYF-U;{L;8W}=EhEMc{jVYPT|@1i-_CsIX>nMn$iN!lgz4c7u= z($WRJNW-kjcrRl!Oj>x-RM{e8HzO!nB8-cX^A^W$dMYjwOrt%MEhA)YRlE@sG^!1lR_xX$ponU9MjTf$|X#>wW(|yFZwLqbt&MW(zrmk zn#5mU_Kc?ykCZ z>(;%u?!9#@zGAvGR35G?Tg!N&%55FXdLW~}f9tJZY70#sj#lOcoT|ppPDb0FI(YD> z#00G=6YlIcWz2q-2Q~{6hI#s!NIfs-Mt?A(&o)O_nejrqWqmwU;d32RL0+gGI6P;b zbJ`8dgU|LXK~!+z&KpIA$WDxT4r8u|w+iRU${|R)gh&~R*x_lPS?;$ibER)f(z*Y% zkE$IlG6q$STTx$YhdSCW&Rgx3qhU|$+06C97!seN#1;xzvE5r|@cvbN5?Z9MRA&)Q`&LmZw=&zUpsw1{qQ{|}55=TEqMPQR_- z+~dnqVExcbTG!x!mRTwCc@e;8P6xwVBqEED175~I16V+b$gDGGjJ}D;H10@3A~iPr z5-*f#u+l2X^GcwijrJB-x5T|cB7TuT*_)*-QZmC5BP_!h=s~D5nq@s8B@cl91W2`a z-q$hR6K@dau!UE5m`!*{McnJ{hqtb1;pypBo09*$X_IQ-v})C+V)p|3_O-j0uefGy z``X#f3l?mi{h7^^)BZTIld`{wp-^u=z!*44C1k=u_-ER^PDbYWYsDXrmS8%LmpVv9 zMnbKG3B0xSz-T3D$JTX9pP@nO%g{pJ-g#}~McYPaB*LJ-b+ol&YVB3sORHy>P8Aj% zxp~Fz$##h_ptAg-iS3tm^p6$X&2i{hI^KWFSh{@Y;*)ss>N$_PKJA`Oxkp#mZ%q3> z_Y=B)E9-$5=HFv> zj^vGAf#g#NcbaokPo+RpZrwsnKiwCQ#R{^>&{w()Z!ip9!1L2MIG8H)=kIq!SXc6gGpy-M z>nJtgsQ3z9n$A*rjHAw<6_dyi%uHw3(8pg&>9pJksR!o{0}o3vs8W$4WWMAnxHerz zO|s_+)O;w3yx*tHyjFn37$^#MfWzi8s4$cwo)e)9;b2~AZ*l&P${dq-0 z{^i>kmbfi=^r+JuMQEblB_MK*^LLw`zZG~veJl29&x+-!1{IAO;Z5 z;dq@YCgcj9Rh;YEFt=GCS96Qa_sRtFkl1^E3`uc}94S3E%vccpeU{PG{n<0~>uazr z-2S&%-~rkIv@(cpqR;`N5C&14$JUlc9W`3QdPBQB+*mC70rJ^nn11z%KC} zT8J3aiv(FTHOj?d0G5C~08F$7dgTM5hcJT{3c)I$^Se*}GOuPOf;4 zxx=j6RU@5gg=%@|m|t=PY57CwFo zeEc4kOWw?i_8*Y<@Ls4NFe5L|+2i-07LC9}6gjitJ@eZbeM_!kb{g$KRECX_7pjT7 zI6fo6MUR|@vsiIN$gxD18}i}IV`cRF@Kqz+vKSa!Bla(~0LgF7vSzxrouXKTThE`k0@Nh8t+Qf*+p2KjBk|pr@sx4cZ+O}+pZ-{Q;u<~j*^xXOJx}nKMeV2x|PE67vnMCx!^l#~) zoLshZtcf%M8c4h4^B$VFy?WACo2IR_`p>}g4F0(8hi)5 z&NpDvMWhXwnmn70!mbUN{50Kw$!`r{C1`^&<-jPWNz1q;Fl`tEkLPyDVZNl>DMyfw zb7ysG9ND>|&aR&EBgxJYb9S0kERkk1xA$W1z#)H&7f@>(Vip*I*3a1b5|iiD)f3Ju z0Yz;6_J+-Nm3Bv-0ImI};&xPg*^0ZZP$SQ|dn=Qsh3t@uw+mgpXct ze;(_kk+;rAz)oo-cX6B*%#-CH^oicA0)JW1@#R}1WfdSlI|C};#3yDsq!#olKn>U` zHqw|Z_nIfl^iKTb8%L*|&O}v2P-VeOAS^qGv z#nR^vMyc^D&f8)Mbeynov$qa3HHA0b8u>`$1t0mcGt0cmwa<3C2c?DR}2OET;aTvLeUMVKKE#F3>WL@&xGBj0pvf=}ouhNLs<;720}A`e0&? zI-w6bhj`PSxV|LV%LFAcWYn{$mLooG#*Ir#er=2WUm1jf(+)&}o^>K6ZN5R_w*e;$ zc|TC5Z8dA)M!)n?ld7VN55j zQ^7IH;Bd5pBcq&^XkE#I5*N8Ccb9^&OcXEdvCJGT_EfdkSDtQQ_?`^&OnyjjY};5v-(f&RhGGPkk!=i3QM)N+`Y-t z9lK=qd0TXarO?L^DGXiV651@%dHV(I9=KD`+7?4}sdZ6|=P|LUoX_=k4&JT-T9)cN zaQLBnJ|r85mAz{RqPs6!jZH)S-gPqziogEllzqcq*)^=%RQNfJf&R8J-h*vFDD!ui z)&;Mg`w3ltS6cnoz52V;>bcL*-@h+kx5EQxyr(B0F#^=5%zJP=oV3ixl1$CxkhKDg z`s5Razs=A-Y$l`7E*|>2v`LgZ1e!*9NQcPdp?rqvz%tHw9?GkCfp@3WsP_{6QR zyt3(%g2$f>R5FAbGX$O4DUlg^6f?s;I`$fF;|=OZJ#*3|!$wFCc1 zFoOcKwDnY7T*R}_tr%|M9wf{I)W}Wl-utKrNaKd~!jmm7u$ZtIf;fE;F%#ii9(zX* zASGtsgZ!J{)I$+U0{pO*0!gy=(@zy-sTcks0<&55ZP5hEGN%giHN@PAVs2i>Cj^}{ z;&TJhAzZ_r5BAP2Y0Dnk#4r7W2FWjzi@^fNJJ0jg6X*~(i>cLWgZ(nrLXEYWt3i81 z==gGZSk?kC0}Ih&UMwbXTIVWJ0$8s74YrB&z~OJKpPXFJr#lww#-mnWbJ^wB@EKY< zuySCj`~gigsVTKaRwwMrnK>_w8QEW*2899(61#wCZSWYnR{{`Al}y4C>_{;5Ao0=s zOIxqqd9|7vRK+{mKAij(4pCYy=q-Wq*HWjTb365(xcQj1^cF>L6q2}dMA$R)e-i>G zZr5xahe4W0u#4llLLE5n=raVRYDguLzrL%!xw$D8D;UiWHTN~FST(Zfs_&|)CD(z@ z^P`O|k*bQOn$qR{Ju92m1JVd)Dh@~&X%AetT;+Qy6|sK5<#le7qo zomg)Apf+v^;RUCiNR5dbK)8!Nih|k?KgcN*PUHDC9%nyI)*K#G8mm(;AMX^o9~5tL zQhBlQjKb?yBY)c77Hg>QEa@&^KDcD6uc>8lW>sQEWxS*_*4{DGYq!*g12wggP)kkg zU~lW9pp)OzIdD;Dw57VPsXjje#*Om~hB6jlvjdHnfi1jqfhkT?=`~Bs@#&QW1rxRW zh%v|7fkTCcP5`>EbW^09*hm5qNl<2-Sa9gIZ+vCz;>F7XcipR|)(!vm_xo&)FVAroj6&IBn5=v)fR7YgIiBAr9f zP1Wy5ISO?phE(ipMS+smmf^|u6C=wjdQ015?f4gMEE+EPvHh8Qs%w{zE}j&mwl?K8 zwN?}bUj;@wF@{wbLm1Ykz2pHpYB=>oN|vJNWbk}t7les zPF@r*4KL~$K%&8>w0m?E(R{2muv$ zw-2wrc;%|;&lwuB`%@^Wx@iR{Xy%p{-UcIoFutC-chv^j%l(HeI+pZv&lxkuT-_zcz zja}+OWg{eGe>9h5#4N=D=h-Bq4`*tgFB+%LUow)Zb%LpNf~ip;LR3;RsvMHhq~=LG zF82N;;}6ay80DOw(8T%4MIRGBrJlcB9GXuqrb|W4NCH&aq%*0eOGR_y#)reFQXXd3 zYKD%Rt`Pp0hmdV17X)7hPsBMr@JXB&k`N^DzjFx1(7yR)q8iI769>uLIx&V-7{j@x zqCXNJqb|F;K&dDU;{8j-{BsCJUc-Zc2#o4%GBMY9GG*dWCHA%>DKc?v^+6*MfwzmX z8f)NXm`5V|mPsQKbM@%zKd?X=4Z9Pw-)tmer#K2J5p{{-H#`ACiKw}3Ziy&|La;0; z2NRxr%#w&k8n#0)=I0iO{k|l8M$1OZLtu9W#(sYC&>yvthvIg6-}12SkClgK&MpqI zdxZ3HxHoHe;7h{%enc@!FzAGA9edO?_pY-%$LH1N^A>#G4}GECLC#G1JKCJ#l{~qm+=lFfZE|kyN|4@$pBMOIR*gih* z%F%vAy)BQNQ#0=WZYqKQ#vaR{Xw2J_o+!_gBg9Yt(7|dyFp^ z{-P=P-I}BQS~EVvPkpQ%`P6m$8b7rLe)g~Nliq)=dPn+i#OICDK4a}TzvFlfI<@M* zd+@Ez(SIHL2T#5e@K@O1fvUZTny_~(hy#aUfg2g+D+*vL*rYedoP;Fb2&->y{yP=yPX z{gdQd$+w17z5G%2L&>*P{lfIOs7tnUORj@Tff~$ez+LrQA^+hvuFKO^TRm>%a}$!RC?Xa3Zb} zVY@E_-akq00xdpmeaL>nzEo_t6Mz!L*8z21?MVY`PevDP6H%J>EugzHW_l}ulO;7Tvr$m|9jG5b za~#VxgW4IYW$1lV|F%Kg!&5Wy#x6Ao3b$X8X?*XDdc%-BdIlBV0xHbebC%`KH{NFV z40~OsPsBJ`O$vAHAM$SyPAvY&NS( zy^+z3dR&J1#)PWT9igGLc0F7k2c_qMHwYc+wF+_vJ;`c)F9R{A-Q*b;b<*x0z`ISu zo6@ciZ)HN(C1V%$%1lVJc1^Ndk6I09%!po{Deb16SyDq<3>$koE?vXz(fChjM#~ZnOHc!sE>@~EYd@)3=P%MkjGm>F0D z==D1y0bYUD4QT@(WZIdAto$eb5e82JXzC4Xa!wTn+5H*0(3A$`X3dBu>DO2_N!&KJr6J2o7cnK`hbW1{Y&%f`nqyQoe> zlN7`ZPu_7wB5}nXlZibW`uaBPNeufiKoU9~E(}&W3^C zO@MM`C59j3c?G6&$dKRv>h|rzq8c>}GXg>w-S$n!!xJtn1_Who0cF046+B4)QmHj$ z4Pz_sT44tn_&jL&yu+6YyaU8NPt6<%`edLIU7$gdF}fFQF|J!@pU`-u_5?k_es2Gy z8faKK5*yrpaP^vxUpf?xuWWB!v%YKHm7^m&CpyAii(7`BJcLh7rIMg4*qeoxDo#+ctXeM|!!(?H6Y z%n1{*2aH7FI@ve0eY`C;e%X?(`+J7ME7ou8 zpV+@S9>3(qv1OO8T^#Ae=*hD_ZSPjE+usM{Kz1G{g?rEy*+jNRztAiT^hq9d3;U$N zqfGE2%|g`f!eir3u|mAk&VL7k0V8z!)7j#{pw969N|f}02fASoF}+Fzs6aX;#_YQp zmco+6L4x)VM%&9G%?rz;rOhRMvD7#A?uvqiMI{S6tD3z6NA#e*SG{7tju9bt`+be* z10Tc<;pURcNJ&|3NpneWQ|cRgZ)tGB0vUu?z!;9%cc>TaZvp&^bTp31C?WBNWvG@} z>1RQEicQUPQbRkML;nDDh+`^}{Hgsdnd{#JGgsOtF&!P;qxt8LIoI4SN~=fA%m(5A zz{J3jK;HtaCi$u-T2m9nWACjA6@_Z#4{RS_vaeS!+OMJATC11A7220dL!Nuj6n1Gr zM1IgIQgTXrX?YhCe8ws552d|384ZV{c#fG@`+C1qzeIc8*X(KaOV}lN?;~vE4n00% zG-Rw&p7>xmLL4^J=wduwIyFCM#w?!W4v2=1MEI@#t!qZ{*wfWdH$R34^D<{osV~BU z;aDTYpr7d@cl)|oZ`lB!XjcslZ=JHIB2OcIgtCsK#T{;oDY-*rrs4f?AvOg)!O|jY zfWbsKczkN>u>I56(+K6T9_S|H@cck&)!Nw!f*LL+?hkEv*w7w+UWf@U=voHq> z%mMSnH^)#QR>a%vO~_Hy2snpXAj9d`g*^H4%XlMaME9{4{vb#A2@jH)2@3-Y?;7~F zd+Ya!QRlqSbJq{Wl1p98?0;|vA0B8dqUOC)%67n zD~p<|Lp`k#fMFd0q<;rU%dLwEseiipLLn^_NEu|s*gPy>D!sx@snsAsQ_tvlWz}S? zxULxg$0n;P$L%fMvG&Hz4*qR!Y>#zwMZI8;t7A?(*mbkDnGm`6(N}q^X`_oIZ#8*{ zJmr3*5y?Q)0Pwc}Bn8ETB;~3c-nF)=##z-9>29p3XzY%-ueFVhwRr6D^2S9qHH#X{ z-PeKoXmzw+{(vZ6utx#)ODNF_`!U7|xc+RCG;fpPE4-5sPJws?(|JVGKM(B&U?C4+ zegg=H2;e+#04y4vIO;Ej;um;rARID8V`V025v7mtE%$ z&V4n5bo!zP+LDjCBXnO=N2;uM?Mu`?Cm-|zJ=>#~LjZ*$m-i>7aBn!;Rj@$`2k)(k zwnmm#MQ|QDYF|=QT@)J&hg!mcaQTAj8c?F@!AZe~C6`ev_tS>Mp=HIECAPstXW^tR z1{*`{!Br#0JMC`9G`ul4pq|8Z*IK(6ifv+QfbCNLy6Q)`3-$y)K8fc|Jio%jKv~=c zTZkE`0tTxv167y-kPL2GC3b_hp@KekKDyHhg6zpn+7w(}brV&p4i0JiGAh!*du9YN(fecSTWHt z1YRLW6h+y|>sY)ro;O<1)E)|!m(*8w7WSNM?d)9MQc+#sSzB39zA(~J7RD@vAvHb? zORqyo&cGHo;}rQt#)1S-rzEH3nO#ypYflAVf(hQS?nfK1q79rq1>SL@y#!<687vYr zhzP5NuOY5@9M>nKnb#)le zH3RkQmYH&@tZxRq|G^jdI4{1#-fcYvoi*r8C*J@B*t5?awC}J!2aPG{Ty~X;E;P63bi&ytKd)zt*E*o^V={ifzJ!7x5u0(r9 z)@8tZL44&xP*(wFrU2Ac0O~3LbrpcR3aorBy$ak(F@?kUNCexjS>Sw~k^=dHs~LLH zXdQ{zmXEeKMZ=N4rMKGeHHE8(>l?y*iP4kxCDt17n4t3^7h+4<-PZNs4nb#!2l3a` zN$hqHppPcXR-S-15jJx4o(Zw?Kni3?l|1;))9^Dj?U!A$)-H**jqGDzPtOg&B3gxZ zFZJ5}?%a0V5B5#aXA#;Bg1Rg;5lW*SqmMr2lLvU%+&6HqEq__AA!0-c|GBG_=laPa z3)r02Y!OVN5{y3{9!+78t1|f`AiWZhl1~Jk%aX(SH+o5OFAan)X4qO;$ zCpVCZIIIgntRQBo#K(BdZSVLBr)VR;!op3uz&(}bA)+Y}bTg;?9z!}jjl?_C_({=7 z(8iePC{#_j)k4fG)+ac)Y_-a>R26Cnog*<(R@$JfRF#Ud5*uk9*g6S4wM`V3mcp_s zQCQj{H;12Y`FB3*8h_L^++b#p+JVNHbJUMaZXL)qYE{8z^y`vEr*iDmgLWMx=rV;g4)2#)0U0!WSkrKhRWL7J7-eJDg|`CwrJ1x9a5kKP?6K7AAgLOmj#OhM z0J=uvhKJc>vW$3DL>Edg;!@X`B#6Um>B&tuiFr*GIdRzJSu7e;%@=r+3#Z4mA*0o` zXrKT_G4~OBtMw503ob9fC{}|T%5KivyOoMYiiNK?aVYGQ8qMYu#!t1EGMO84k;$T? z&cF9A#?t?R*>^wV?!RBex=;SWXSIF_Fzy13$DB`q{;IH9*d!bqfIJ7CP54@=TVQHp zso5t5t>ams)6`9!)*eEDm?}sevmlu>}yR{-u`0C58UHO0vh6pUQSR1f<35mksXDNsU7vq2~q zTG6JEp@z3Wj0jj0vb*5ncezghGZNIcfk#0u|ERHVlS=k!j1&5+?RD0doWr1tI_rKy zulHU3Bv5vKSQp3@{0*3qjb_8OQHUAey-621_5gqkXe&Y)YuVJV<>PD<21iESn-Y_^ zY=kjQl>+!!_Qt($U-KPzH1F%nxti_QKHRc>d&`GwvxOqYn*4*k25W%p^#9LHv0s{d zFjEdWoI6tx@Im}fD^Btcpud06Qzc{zlrWuP%+I@UC14g}wX8W0=jrwsE`=FX2az^P_|=bbTGr_rAIZYjR2^JO7k9CO4g zfJ>md6abJCJsgre)8LSXQ}x)&6d4xMBOKJ~Y|paW%qaJ{a%#q+u1foq<& zF*wP}8q*4VDh5 zT5Xg9X9-s`;fdoJ!?O_&W{Gps06aIib7C4ej2g~KyPN8=z3N=Lpt*s+&l6s)a1nO?^X+uy0&`>lyWVLc}xoGo}WFxo%!T`9(92 z2eO6Z1MZB%kKvT4*KzKzhIe*mTK!K_XV9dI!hT?biq~U!WT>9$8x5(KDhw8}4q^^J6$Sh#%t}r&#TFK8>9rZXwC^W0<)PTA##6 z?lg1D2k};jGj%-M6hu!!$P0umacPXBFpI~AJw08)P(Agvwe@(M;`&HQq+b5O;POSM zN*%{c(BlE$W=@YsCY9Y}Xv(#boWCC=5{X75kz;uH>QqHT#i3}%ACNNqAn(8r@^v6F zXtfi=x&0t<0s@5ObauSsIy*35bM|lG?f6SH6eXT>S(%JsNn9Ggp-Y1vjo-kdVSbf9 z%d}0UyDgjt>9)YH99?RkR`^|9L_9Ei3Wd{nWc^YVAQQ8pi&4{c zC}2)XPbkc?fGZPodNZ6SJ#WDSjsgVF;(IvDlL7&}1$khL+L|Z3alR3DqA`h&Posug z6?{zCEU6IKj^RzJ%R(Tt_0MN9XM{W3iQy;%7BKUWomAg;K99ZCeVm0s3y_6Tc1HW%jbNak>O(BF|% ze}^%ZTT3~nbbm+oFisPC$fEb--ALy0Zu|^>f>Yw%ko+0h-VJm}ROUgJYIBV*C@4oB z6M#?{*Wcrgi$D0_Tpd4i4gc&y~8sf$I&D4I)05Db#t=Glkl7d+m3uF9h1eF~FUza0Jf$EFM`g z9wR^nv|Lkr3I*cSHP&ghwhHUWSmdfQYz(8~JJbd_@g5epwzszyYu}-muH;p1o^_ao(n)KM-~I5x>Zs1LA)NXynO219Y=q>r)sT0*(lL6u?Ja z8i{hC9G}iHE0l8zZwP0rsM$@}p3<9`k1<|&APuvNzF>87dz-3ZW6Zwp9n2i{{EGJt zIk4b-HCqdRF&iJw+zs}e^)S|qwppzOM!R9Ee#KxIE!-#Pj~_R$5Pb z#?_a0i`^xjZ649x)JEF(FAP? zWa@M!AJR;nn!9W7$ztf*Mg&He!qDe20QrpDH2@jzbS0cnGln#S-$JCBhn4M45fceuP7fIYqu)6Ty?YfhjcTaI|v z9NRiP_dDl%_TM7B2Tyn?V`OBgu=?fCce0w=&+gH6`A*j}?6>71OMkw*0J~ zsn-}y!;H1kDtL#d_4yYkJ7Cl6Lv2FdBeOPY>+zSwSua5r%+sJtNbi7ecF3olfMTTp z$djs|TgCxNT<<6YJKS((N@9~@P6f-GgUkp|l?0WJWQ#YU!0vB4V)jr~OFY`LxO}XB z`*8RA#Z66%*LM$ZuOBO4+!BqqR3#r?r{c?>{!DQBuG=SfJTf>|(SOnE*3ms1;_(f8 zMq5{3)L$_+_{fgQ+jlJwen#!A>yK46MSHvAY=+InyLzKdRk8l$H-_yOF8(=!i3eua z^wsn| zW@a(*zBpwfOeRr3+}li*KQpNpeAWZAmKDToFt-lwio^`$0q-;|GQ5C^H2Ep#3i)hM zT8z>PlxV?0atLH^X#i#up>*Vj+Vcd(+4V$!psIKCs=mV4UMuWdwYj&lB0p3#eb?1X zmRx<;bWte3;tzLsuGu-9Rb4r}b4{mxdBf;b_l@0CqYcgtN-eqi?)B^MzIusLH#l=6 Omrr(PR(4MAwEho+ftIfT literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/ibm_plex_sans_semi_bold.ttf b/app/src/main/res/font/ibm_plex_sans_semi_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a5bd9ee62898e170f975ac7a7bb2e255bfbd7ab4 GIT binary patch literal 177272 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 XcWv*}^{dU + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..56460a0 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 55f80aaab361d41da1c44515155cd5269e1a6879 Mon Sep 17 00:00:00 2001 From: Daxesh Date: Mon, 6 Mar 2023 18:28:52 +0530 Subject: [PATCH 05/14] Viewholder added --- app/build.gradle | 10 +- .../com/bulletin/FormRecyclerViewAdapter.kt | 119 +++++++++++ .../java/com/bulletin/models/BulletinItem.kt | 1 - .../com/bulletin/viewHolder/BaseViewHolder.kt | 42 ++++ .../FormSectionActionButtonViewHolder.kt | 45 ++++ .../FormSectionBulletPointViewHolder.kt | 99 +++++++++ .../viewHolder/FormSectionMediaViewHolder.kt | 45 ++++ .../FormSectionMessageViewHolder.kt | 197 ++++++++++++++++++ .../viewHolder/FormSectionTitleViewHolder.kt | 55 +++++ .../res/layout/layout_form_bullet_point.xml | 37 ++++ .../layout_form_section_action_button.xml | 37 ++++ .../res/layout/layout_form_section_media.xml | 25 +++ .../layout/layout_form_section_message.xml | 22 ++ ...on_1.xml => layout_form_section_title.xml} | 3 +- 14 files changed, 732 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt create mode 100644 app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt create mode 100644 app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt create mode 100644 app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt create mode 100644 app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt create mode 100644 app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt create mode 100644 app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt create mode 100644 app/src/main/res/layout/layout_form_bullet_point.xml create mode 100644 app/src/main/res/layout/layout_form_section_action_button.xml create mode 100644 app/src/main/res/layout/layout_form_section_media.xml create mode 100644 app/src/main/res/layout/layout_form_section_message.xml rename app/src/main/res/layout/{layout_form_section_1.xml => layout_form_section_title.xml} (96%) diff --git a/app/build.gradle b/app/build.gradle index 95d47e9..7b4243c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,11 +23,14 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = 11 + } + buildFeatures { + viewBinding true } } @@ -50,6 +53,7 @@ dependencies { implementation "androidx.vectordrawable:vectordrawable:$vectorDrawable" implementation "androidx.multidex:multidex:$multiDex" implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: []) + implementation 'androidx.databinding:viewbinding:7.4.0' testImplementation "junit:junit:$jUnit" androidTestImplementation "androidx.test:runner:$runner" implementation "com.google.android.play:core:$playCore" diff --git a/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt new file mode 100644 index 0000000..d4c8372 --- /dev/null +++ b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt @@ -0,0 +1,119 @@ +//package com.app.BitRabbit.Classes.Components.FormCollection +// +//import android.view.LayoutInflater +//import android.view.ViewGroup +//import androidx.recyclerview.widget.RecyclerView +//import com.app.BitRabbit.Classes.Components.FormCollection.Views.* +//import com.bulletin.models.BulletinItem +// +// +//class FormRecyclerViewAdapter(var formSection: List) : +// RecyclerView.Adapter>() { +// +// // region Variables +// private lateinit var listener : OnItemClickListener +// +// fun setRecyclerViewItems(formData: List) { +// formSection = formData +// notifyDataSetChanged() +// } +// +// // region RecyclerView Adapter Methods +// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { +// +// // Based on the view type initilaize the viewholder +// when(viewType) { +// ITEM_VIEW_TYPE_TITLE -> { +// val view = +// LayoutFormSectionBigTitleItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) +// return FormSectionTitleViewHolder(view,listener) as BaseViewHolder +// } +// ITEM_VIEW_TYPE_MESSAGE -> { +// val view = +// LayoutFormSectionDefaultItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) +// return FormSectionMessageViewHolder(view,listener) as BaseViewHolder +// } +// ITEM_VIEW_TYPE_MEDIA -> { +// val view = +// LayoutFormSectionEditTextItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) +// return FormSectionMediaViewHolder(view,listener) as BaseViewHolder +// } +// ITEM_VIEW_TYPE_ACTION_BUTTON -> { +// val view = +// LayoutFormSectionBigTitleItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) +// return FormSectionActionButtonViewHolder(view,listener) as BaseViewHolder +// } +// ITEM_VIEW_TYPE_BULLET_POINT -> { +// val view = +// LayoutFormSectionAppInfoBinding.inflate(LayoutInflater.from(parent.context), parent, false) +// return FormSectionBulletPointViewHolder(view,listener) as BaseViewHolder +// } +// else -> { +// val view = +// LayoutFormSectionBigTitleItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) +// return FormSectionBigTitleItemViewHolder(view,listener) as BaseViewHolder +// } +// } +// } +// +// override fun getItemCount(): Int { +// // Item Count +// return formSection.size ?: 0 +// } +// +// override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { +// // Bind the viewholder +// holder.bind(formSection[position]) +// } +// +// override fun getItemViewType(position: Int): Int { +// +// val item = formSection[position].also { } +// +// return when (item.type){ +// BIGTITLE -> ITEM_VIEW_TYPE_BIGTITLE +// DEFAULT -> ITEM_VIEW_TYPE_DEFAULT +// TEXT_FIELD -> ITEM_VIEW_TYPE_TEXTFIELD +// TEXT_VIEW -> ITEM_VIEW_TYPE_TEXTVIEW +// APP_INFO -> ITEM_VIEW_TYPE_APPINFO +// STATUS_MESSAGE -> ITEM_VIEW_TYPE_STATUS_MESSAGE +// ACCOUNT_BALANCE -> ITEM_VIEW_TYPE_ACCOUNT_BALANCE +// ACCOUNT -> ITEM_VIEW_TYPE_ACCOUNT +// WALLET -> ITEM_VIEW_TYPE_WALLET +// COIN_NETWORK -> ITEM_VIEW_TYPE_COIN_NETWORK +// WITHDRAW_AMOUNT_FIELD -> ITEM_VIEW_TYPE_WITHDRAW_AMOUNT_FIELD +// ADDRESS_FIELD -> ITEM_VIEW_TYPE_ADDRESS_FIELD +// ZERO_TRANSACTION -> ITEM_VIEW_TYPE_ZERO_TRANSACTION +// TRANSACTION -> ITEM_VIEW_TYPE_TRANSACTION +// WALLET_TRANSACTIONS_FOOTER -> ITEM_VIEW_TYPE_WALLET_TRANSACTIONS_FOOTER +// RPC_NETWORK -> ITEM_VIEW_TYPE_RPC_NETWORK +// RPC_NETWORK_INFO -> ITEM_VIEW_TYPE_RPC_NETWORK_INFO +// HEADER -> ITEM_VIEW_TYPE_HEADER +// FOOTER -> ITEM_VIEW_TYPE_FOOTER +// } +// } +// // endregion +// +// // region Constant Value For Adapter Class +// companion object { +// private const val ITEM_VIEW_TYPE_TITLE = 0 +// private const val ITEM_VIEW_TYPE_MESSAGE = 1 +// private const val ITEM_VIEW_TYPE_MEDIA = 2 +// private const val ITEM_VIEW_TYPE_BULLET_POINT = 3 +// private const val ITEM_VIEW_TYPE_ACTION_BUTTON = 4 +// } +// // endregion +// +// // region Methods +// fun setListener(context : OnItemClickListener){ +// listener = context +// } +// +// // endregion +// +// // region Interface Methods +// interface OnItemClickListener { +// fun formDidTriggerEvent(eventType: FormSectionBaseItem.EventType, baseItem : FormSectionBaseItem, index : Int) : Boolean +// } +// // endregion +//} diff --git a/app/src/main/java/com/bulletin/models/BulletinItem.kt b/app/src/main/java/com/bulletin/models/BulletinItem.kt index 68c1db1..02fd0bc 100644 --- a/app/src/main/java/com/bulletin/models/BulletinItem.kt +++ b/app/src/main/java/com/bulletin/models/BulletinItem.kt @@ -5,7 +5,6 @@ import com.wrx.wazirx.views.bulletin.model.Media abstract class BulletinItem() { companion object { - @JvmStatic val runtimeTypeAdapterFactory: RuntimeTypeAdapterFactory<*> get() { val mediaRuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of( diff --git a/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt new file mode 100644 index 0000000..e31879f --- /dev/null +++ b/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt @@ -0,0 +1,42 @@ +package com.app.BitRabbit.Classes.Components.FormCollection.Views + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.bulletin.models.BulletinItem + + +abstract class BaseViewHolder( + VB: ViewBinding, + listener: FormRecyclerViewAdapter.OnItemClickListener +) : RecyclerView.ViewHolder(VB.root) { + + var _listener: FormRecyclerViewAdapter.OnItemClickListener? = null + + /** The view binding instance. */ + protected var _binding: ViewBinding? = null + protected var topCellSeparatorView: View? = null + protected var bottomCellSeparatorView: View? = null + protected var bgView: View? = null + lateinit var baseItem: T + + init { + _listener = listener + _binding = VB + } + + // MARK: - Override Methods + open fun updateAppearance() { + + } + + // region Abstract Method + open fun bind(item: T) { + baseItem = item + updateAppearance() + } + + abstract fun getBackgroundView(): View? + // endregion +} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt new file mode 100644 index 0000000..01fcc6d --- /dev/null +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt @@ -0,0 +1,45 @@ +//package com.app.BitRabbit.Classes.Components.FormCollection.Views +// +//import android.graphics.Color +//import android.view.View +//import com.bulletin.models.ActionButton +// +// +//class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionHeaderItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : +// BaseViewHolder(viewBinding,listener) { +// +// // region Methods +// override fun bind(item: ActionButton) { +// super.bind(item) +// +// // Set Title +// if (!item.title.isNullOrBlank()) { +// viewBinding.titleLabel.text = item.title +// viewBinding.titleLabel.setVisibility(View.VISIBLE) +// +// if (!item.titleColor.isNullOrBlank()) { +// viewBinding.titleLabel.setTextColor(Color.parseColor(item.titleColor)) +// } else { +// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.titleLabel.getContext())) +// } +// } else { +// viewBinding.titleLabel.text = "" +// viewBinding.titleLabel.setVisibility(View.GONE) +// } +// +// } +// +// override fun getBackgroundView(): View? { +// return null +// } +// +// override fun updateAppearance() { +// super.updateAppearance() +// +// // Set Default Properties +// viewBinding.titleLabel.typeface = AppStyle.Font.DemiBold() +// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.titleLabel.context)) +// } +// // endregion +// +//} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt new file mode 100644 index 0000000..9a791b9 --- /dev/null +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt @@ -0,0 +1,99 @@ +//package com.app.BitRabbit.Classes.Components.FormCollection.Views +// +//import android.graphics.drawable.BitmapDrawable +//import android.graphics.drawable.Drawable +//import android.view.View +//import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +//import com.app.BitRabbit.Classes.Components.FormCollection.Model.SectionItems.FormSectionBigTitleItem +//import com.app.BitRabbit.Classes.Constants.AppStyle +//import com.app.BitRabbit.Core.Extensions.ThemeUtils +//import com.app.BitRabbit.Core.Extensions.loadImageWithUrl +//import com.app.BitRabbit.R +//import com.app.BitRabbit.databinding.LayoutFormSectionBigTitleItemBinding +//import com.bulletin.models.BulletPoint +//import com.bumptech.glide.request.target.CustomTarget +//import com.bumptech.glide.request.transition.Transition +// +// +//class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormSectionBigTitleItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : +// BaseViewHolder(viewBinding,listener) { +// +// // region Methods +// override fun bind(item: BulletPoint) { +// super.bind(item) +// +// // Set Pre Title +// if (!item.pretitle.isNullOrBlank()) { +// viewBinding.pretitleLabel.text = item.pretitle +// viewBinding.pretitleLabel.setVisibility(View.VISIBLE) +// } else { +// viewBinding.pretitleLabel.text = "" +// viewBinding.pretitleLabel.setVisibility(View.GONE) +// } +// +// // Set Title +// if (!item.title.isNullOrBlank()) { +// viewBinding.titleLabel.text = item.title +// viewBinding.titleLabel.setVisibility(View.VISIBLE) +// } else { +// viewBinding.titleLabel.text = "" +// viewBinding.titleLabel.setVisibility(View.GONE) +// } +// +// // Set Icon Background Color +// item.iconBackgroundColor?.also { +// viewBinding.iconContainerView.setBackgroundColor(it) +// viewBinding.iconContainerView.setVisibility(View.VISIBLE) +// } ?: run { +// viewBinding.iconContainerView.setVisibility(View.GONE) +// } +// +// +// // Set Image +// viewBinding.iconImageView.setVisibility(View.GONE) +// if(!item.iconImageUrl.isNullOrBlank()) { +// +// viewBinding.iconImageView.loadImageWithUrl( +// viewBinding.iconImageView.getContext(), +// item.iconImageUrl!!, +// null, +// object : CustomTarget() { +// +// override fun onResourceReady( +// resource: Drawable, +// transition: Transition? +// ) { +// val bitmap = (resource as BitmapDrawable).bitmap +// viewBinding.iconImageView.setImageBitmap(bitmap) +// viewBinding.iconImageView.setVisibility(View.VISIBLE) +// } +// +// override fun onLoadCleared(placeholder: Drawable?) {} +// }) +// } +// +// itemView.setOnClickListener { +// +// } +// } +// +// override fun updateAppearance() { +// super.updateAppearance() +// +// // Set Default Properties +// viewBinding.pretitleLabel.typeface = AppStyle.Font.Medium() +// viewBinding.pretitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.titleLabel.context)) +// +// viewBinding.titleLabel.typeface = AppStyle.Font.Bold() +// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.pretitleLabel.context)) +// +// viewBinding.iconContainerView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.iconContainerView.context)) +// +// } +// +// override fun getBackgroundView(): View? { +// return null +// } +// // endregion +// +//} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt new file mode 100644 index 0000000..67690eb --- /dev/null +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -0,0 +1,45 @@ +//package com.app.BitRabbit.Classes.Components.FormCollection.Views +// +//import android.graphics.Color +//import android.view.View +//import com.wrx.wazirx.views.bulletin.model.Media +// +// +//class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionHeaderItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : +// BaseViewHolder(viewBinding,listener) { +// +// // region Methods +// override fun bind(item: Media) { +// super.bind(item) +// +// // Set Title +// if (!item.title.isNullOrBlank()) { +// viewBinding.titleLabel.text = item.title +// viewBinding.titleLabel.setVisibility(View.VISIBLE) +// +// if (!item.titleColor.isNullOrBlank()) { +// viewBinding.titleLabel.setTextColor(Color.parseColor(item.titleColor)) +// } else { +// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.titleLabel.getContext())) +// } +// } else { +// viewBinding.titleLabel.text = "" +// viewBinding.titleLabel.setVisibility(View.GONE) +// } +// +// } +// +// override fun getBackgroundView(): View? { +// return null +// } +// +// override fun updateAppearance() { +// super.updateAppearance() +// +// // Set Default Properties +// viewBinding.titleLabel.typeface = AppStyle.Font.DemiBold() +// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.titleLabel.context)) +// } +// // endregion +// +//} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt new file mode 100644 index 0000000..3d7aeb6 --- /dev/null +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt @@ -0,0 +1,197 @@ +//package com.app.BitRabbit.Classes.Components.FormCollection.Views +// +//import android.graphics.Color +//import android.graphics.PorterDuff +//import android.graphics.drawable.BitmapDrawable +//import android.graphics.drawable.Drawable +//import android.view.View +//import androidx.core.content.ContextCompat +//import com.bulletin.models.Message +//import com.bumptech.glide.request.target.CustomTarget +//import com.bumptech.glide.request.transition.Transition +// +// +//class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionDefaultItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : +// BaseViewHolder(viewBinding,listener) { +// +// // region Methods +// override fun bind(item: Message) { +//// topCellSeparatorView = viewBinding.topCellSeparatorView +//// bottomCellSeparatorView = viewBinding.bottomCellSeparatorView +// +// super.bind(item) +// +// viewBinding.titleLabel.text = item.title +// +// itemView.setOnClickListener { +// _listener?.formDidTriggerEvent(item.eventType, item, bindingAdapterPosition) +// } +// +// // Set Image +// viewBinding.iconImageView.setVisibility(View.GONE) +// if(!item.iconUrl.isNullOrBlank()) { +// +// val itemColor = if (!item.iconColor.isNullOrBlank()) Color.parseColor(item.iconColor) +// else ThemeUtils.getAttributedColor(R.attr.navigation_item, viewBinding.iconImageView.getContext()) +// +// viewBinding.iconImageView.loadImageWithUrl( +// viewBinding.iconImageView.getContext(), +// item.iconUrl!!, +// ColorFilterTransformation(viewBinding.iconImageView.getContext(), itemColor, true), +// object : CustomTarget() { +// +// override fun onResourceReady( +// resource: Drawable, +// transition: Transition? +// ) { +// val bitmap = (resource as BitmapDrawable).bitmap +// viewBinding.iconImageView.setImageBitmap(bitmap) +// viewBinding.iconImageView.setVisibility(View.VISIBLE) +// } +// +// override fun onLoadCleared(placeholder: Drawable?) {} +// }) +// } +// +// // Set Title +// if (!item.title.isNullOrBlank()) { +// viewBinding.titleLabel.text = item.title +// viewBinding.titleLabel.setVisibility(View.VISIBLE) +// +// if (!item.titleColor.isNullOrBlank()) { +// viewBinding.titleLabel.setTextColor(Color.parseColor(item.titleColor)) +// } else { +// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.iconImageView.getContext())) +// } +// } else { +// viewBinding.titleLabel.text = "" +// viewBinding.titleLabel.setVisibility(View.GONE) +// } +// +// // Set Subttitle +// if (!item.subtitle.isNullOrBlank()) { +// viewBinding.subtitleLabel.text = item.subtitle +// viewBinding.subtitleLabel.setVisibility(View.VISIBLE) +// +// if (!item.subtitleColor.isNullOrBlank()) { +// viewBinding.subtitleLabel.setTextColor(Color.parseColor(item.subtitleColor)) +// } else { +// viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.iconImageView.getContext())) +// } +// } else { +// viewBinding.subtitleLabel.text = "" +// viewBinding.subtitleLabel.setVisibility(View.GONE) +// } +// +// // Set Value +// if (!item.value.isNullOrBlank()) { +// viewBinding.valueLabel.text = item.value +// viewBinding.valueLabel.setVisibility(View.VISIBLE) +// +// if (!item.valueColor.isNullOrBlank()) { +// viewBinding.valueLabel.setTextColor(Color.parseColor(item.valueColor)) +// } else { +// viewBinding.valueLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.iconImageView.getContext())) +// } +// } else { +// viewBinding.valueLabel.text = "" +// viewBinding.valueLabel.setVisibility(View.GONE) +// } +// +// // Set Accessory +// when(item.accessoryType){ +// FormSectionDefaultItem.AccessoryType.SWITCH -> { +// viewBinding.switchButton.setChecked(item.isSwitchAccessoryOn) +// viewBinding.switchButton.setVisibility(View.VISIBLE) +// } +// FormSectionDefaultItem.AccessoryType.NONE -> { +// viewBinding.switchButton.setVisibility(View.GONE) +// } +// else -> { +// viewBinding.switchButton.setVisibility(View.GONE) +// } +// } +// +// // Set Selection Accessory +// +// when(item.selectionAccessoryType){ +// FormSectionDefaultItem.SelectionAccessoryType.DISCLOSURE_INDICATOR -> { +// viewBinding.selectionAccessoryImageView.setImageDrawable(ContextCompat.getDrawable(viewBinding.selectionAccessoryImageView.context, R.drawable.ic_chevron_right)); +// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) +// } +// FormSectionDefaultItem.SelectionAccessoryType.CHECKMARK -> { +// viewBinding.selectionAccessoryImageView.setImageDrawable(ContextCompat.getDrawable(viewBinding.selectionAccessoryImageView.context, R.drawable.ic_checkmark)); +// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) +// } +// else -> { +// viewBinding.selectionAccessoryImageView.setVisibility(View.GONE) +// } +// } +// +// viewBinding.switchButton.setOnCheckedChangeListener({ _ , isChecked -> +// if (isChecked) { +// _listener?.formDidTriggerEvent(item.switchOnAccessoryEventType, item, adapterPosition) +// } else { +// _listener?.formDidTriggerEvent(item.switchOffAccessoryEventType, item, adapterPosition) +// } +// }) +// +// when(item.selectionAccessoryType){ +// +// FormSectionDefaultItem.SelectionAccessoryType.DISCLOSURE_INDICATOR -> { +// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) +// viewBinding.selectionAccessoryImageView.setImageDrawable(ContextCompat.getDrawable(viewBinding.selectionAccessoryImageView.context, R.drawable.ic_chevron_right)); +// viewBinding.selectionAccessoryImageView.setColorFilter( +// ThemeUtils.getAttributedColor( +// R.attr.text_2, +// viewBinding.selectionAccessoryImageView.context +// ), PorterDuff.Mode.SRC_IN +// ) +// } +// FormSectionDefaultItem.SelectionAccessoryType.CHECKMARK -> { +// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) +// viewBinding.selectionAccessoryImageView.setColorFilter( +// ThemeUtils.getAttributedColor( +// R.attr.highlight_1, +// viewBinding.selectionAccessoryImageView.context +// ), PorterDuff.Mode.SRC_IN +// ) +// } +// else -> { +// viewBinding.selectionAccessoryImageView.setVisibility(View.GONE) +// } +// } +// +// } +// +// override fun getCellFirstSeparatorView() : View { +// return viewBinding.topCellSeparatorView +// } +// +// override fun getCellBottomSeparatorView() : View { +// return viewBinding.bottomCellSeparatorView +// } +// +// override fun getBackgroundView(): View { +// return viewBinding.itemBackground +// } +// +// override fun updateAppearance() { +// super.updateAppearance() +// +// // Set Default Properties +// viewBinding.backgroundContainerView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.background_1, viewBinding.backgroundContainerView.context)) +// +// viewBinding.titleLabel.typeface = AppStyle.Font.DemiBold() +// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.titleLabel.context)) +// +// viewBinding.subtitleLabel.typeface = AppStyle.Font.DemiBold() +// viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.subtitleLabel.context)) +// +// viewBinding.valueLabel.typeface = AppStyle.Font.Medium() +// viewBinding.valueLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.valueLabel.context)) +// +// } +// // endregion +// +//} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt new file mode 100644 index 0000000..80d7614 --- /dev/null +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt @@ -0,0 +1,55 @@ +//package com.app.BitRabbit.Classes.Components.FormCollection.Views +// +//import android.view.View +//import com.bulletin.models.Title +// +// +//class FormSectionTitleViewHolder(val viewBinding : LayoutFormSectionAppInfoBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : +// BaseViewHolder(viewBinding,listener) { +// +// // region Methods +// override fun bind(item: Title) { +// super.bind(item) +// +// itemView.setOnClickListener { +// +// } +// +// // Set App Title +// if (!item.appName.isNullOrBlank()) { +// viewBinding.appNameLabel.text = item.appName +// viewBinding.appNameLabel.setVisibility(View.VISIBLE) +// } else { +// viewBinding.appNameLabel.text = "" +// viewBinding.appNameLabel.setVisibility(View.GONE) +// } +// +// // Set App Version +// if (!item.appVersion.isNullOrBlank()) { +// viewBinding.appVersionLabel.text = item.appVersion +// viewBinding.appVersionLabel.setVisibility(View.VISIBLE) +// } else { +// viewBinding.appVersionLabel.text = "" +// viewBinding.appVersionLabel.setVisibility(View.GONE) +// } +// +// } +// +// override fun getBackgroundView(): View? { +// return null +// } +// +// override fun updateAppearance() { +// super.updateAppearance() +// +// // Set Default Properties +// viewBinding.appNameLabel.typeface = AppStyle.Font.Bold() +// viewBinding.appNameLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.appNameLabel.context)) +// +// viewBinding.appVersionLabel.typeface = AppStyle.Font.DemiBold() +// viewBinding.appVersionLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.appVersionLabel.context)) +// +// } +// // endregion +// +//} diff --git a/app/src/main/res/layout/layout_form_bullet_point.xml b/app/src/main/res/layout/layout_form_bullet_point.xml new file mode 100644 index 0000000..dcf0a34 --- /dev/null +++ b/app/src/main/res/layout/layout_form_bullet_point.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:id="@+id/version_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="20dp" + android:layout_marginTop="16dp" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + tools:text="Name" /> + + <TextView + android:id="@+id/version_title1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="10dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="20dp" + android:text="test" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toEndOf="@id/version_title" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + tools:text="Name name Name name Name name Name name Na me name" /> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_section_action_button.xml b/app/src/main/res/layout/layout_form_section_action_button.xml new file mode 100644 index 0000000..dcf0a34 --- /dev/null +++ b/app/src/main/res/layout/layout_form_section_action_button.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:id="@+id/version_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="20dp" + android:layout_marginTop="16dp" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + tools:text="Name" /> + + <TextView + android:id="@+id/version_title1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="10dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="20dp" + android:text="test" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toEndOf="@id/version_title" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + tools:text="Name name Name name Name name Name name Na me name" /> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_section_media.xml b/app/src/main/res/layout/layout_form_section_media.xml new file mode 100644 index 0000000..881e5bc --- /dev/null +++ b/app/src/main/res/layout/layout_form_section_media.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <ImageView + android:id="@+id/banner_image" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_marginLeft="20dp" + android:layout_marginTop="16dp" + android:layout_marginRight="20dp" + android:scaleType="centerInside" + app:layout_constraintBottom_toBottomOf="@id/horiz_guideline_35" + app:layout_constraintTop_toTopOf="parent" /> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/horiz_guideline_35" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_percent="0.35" /> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_section_message.xml b/app/src/main/res/layout/layout_form_section_message.xml new file mode 100644 index 0000000..4a4ea25 --- /dev/null +++ b/app/src/main/res/layout/layout_form_section_message.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:id="@+id/version_title" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginStart="20dp" + android:layout_marginEnd="20dp" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="Name" /> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_section_1.xml b/app/src/main/res/layout/layout_form_section_title.xml similarity index 96% rename from app/src/main/res/layout/layout_form_section_1.xml rename to app/src/main/res/layout/layout_form_section_title.xml index 2656217..722a52b 100644 --- a/app/src/main/res/layout/layout_form_section_1.xml +++ b/app/src/main/res/layout/layout_form_section_title.xml @@ -11,7 +11,7 @@ android:layout_height="wrap_content" android:paddingStart="20dp" android:paddingTop="16dp" - android:paddingEnd="16dp" + android:paddingEnd="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -33,6 +33,7 @@ android:layout_height="wrap_content" android:textSize="22sp" android:layout_gravity="start" + android:textColor="?attr/success_text_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/version_title" From 600e58d7b469020507d4ea9f0f74fb148c6141bf Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Tue, 14 Mar 2023 17:51:12 +0530 Subject: [PATCH 06/14] Added baseviewholder --- app/build.gradle | 4 + .../com/bulletin/FormRecyclerViewAdapter.kt | 232 ++++++++------- .../com/bulletin/extension/ImageExtension.kt | 27 ++ .../java/com/bulletin/models/ActionButton.kt | 2 +- .../java/com/bulletin/models/BulletPoint.kt | 5 + .../java/com/bulletin/models/BulletinItem.kt | 14 + .../com/bulletin/models/BulletinVersion.kt | 1 + .../main/java/com/bulletin/models/Media.kt | 58 +++- .../main/java/com/bulletin/models/Message.kt | 6 +- .../main/java/com/bulletin/models/Title.kt | 5 + .../com/bulletin/utilities/DeviceUtils.kt | 64 ++++ .../java/com/bulletin/utilities/ThemeUtils.kt | 95 ++++++ .../com/bulletin/viewHolder/BaseViewHolder.kt | 2 +- .../FormSectionActionButtonViewHolder.kt | 97 ++++--- .../FormSectionBulletPointViewHolder.kt | 160 ++++------ .../viewHolder/FormSectionMediaViewHolder.kt | 101 ++++--- .../FormSectionMessageViewHolder.kt | 274 +++++------------- .../viewHolder/FormSectionTitleViewHolder.kt | 132 +++++---- .../main/res/drawable/image_loading_bg.xml | 7 + .../res/layout/layout_form_bullet_point.xml | 37 ++- .../layout_form_section_action_button.xml | 37 +-- .../res/layout/layout_form_section_media.xml | 2 +- .../layout/layout_form_section_message.xml | 2 +- .../res/layout/layout_form_section_title.xml | 4 +- app/src/main/res/values/colors.xml | 2 + 25 files changed, 759 insertions(+), 611 deletions(-) create mode 100644 app/src/main/java/com/bulletin/extension/ImageExtension.kt create mode 100644 app/src/main/java/com/bulletin/utilities/DeviceUtils.kt create mode 100644 app/src/main/java/com/bulletin/utilities/ThemeUtils.kt create mode 100644 app/src/main/res/drawable/image_loading_bg.xml diff --git a/app/build.gradle b/app/build.gradle index 7b4243c..de92fa5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' } android { @@ -61,5 +62,8 @@ dependencies { implementation "com.squareup.retrofit2:converter-gson:$retrofit" + implementation 'com.github.bumptech.glide:glide:4.13.2' + kapt 'com.github.bumptech.glide:compiler:4.13.2' + } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt index d4c8372..b6936c0 100644 --- a/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt +++ b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt @@ -1,119 +1,113 @@ -//package com.app.BitRabbit.Classes.Components.FormCollection -// -//import android.view.LayoutInflater -//import android.view.ViewGroup -//import androidx.recyclerview.widget.RecyclerView -//import com.app.BitRabbit.Classes.Components.FormCollection.Views.* -//import com.bulletin.models.BulletinItem -// -// -//class FormRecyclerViewAdapter(var formSection: List<BulletinItem>) : -// RecyclerView.Adapter<BaseViewHolder<BulletinItem>>() { -// -// // region Variables -// private lateinit var listener : OnItemClickListener -// -// fun setRecyclerViewItems(formData: List<BulletinItem>) { -// formSection = formData -// notifyDataSetChanged() -// } -// -// // region RecyclerView Adapter Methods -// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<BulletinItem> { -// -// // Based on the view type initilaize the viewholder -// when(viewType) { -// ITEM_VIEW_TYPE_TITLE -> { -// val view = -// LayoutFormSectionBigTitleItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) -// return FormSectionTitleViewHolder(view,listener) as BaseViewHolder<BulletinItem> -// } -// ITEM_VIEW_TYPE_MESSAGE -> { -// val view = -// LayoutFormSectionDefaultItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) -// return FormSectionMessageViewHolder(view,listener) as BaseViewHolder<BulletinItem> -// } -// ITEM_VIEW_TYPE_MEDIA -> { -// val view = -// LayoutFormSectionEditTextItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) -// return FormSectionMediaViewHolder(view,listener) as BaseViewHolder<BulletinItem> -// } -// ITEM_VIEW_TYPE_ACTION_BUTTON -> { -// val view = -// LayoutFormSectionBigTitleItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) -// return FormSectionActionButtonViewHolder(view,listener) as BaseViewHolder<BulletinItem> -// } -// ITEM_VIEW_TYPE_BULLET_POINT -> { -// val view = -// LayoutFormSectionAppInfoBinding.inflate(LayoutInflater.from(parent.context), parent, false) -// return FormSectionBulletPointViewHolder(view,listener) as BaseViewHolder<FormSectionBaseItem> -// } -// else -> { -// val view = -// LayoutFormSectionBigTitleItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) -// return FormSectionBigTitleItemViewHolder(view,listener) as BaseViewHolder<FormSectionBaseItem> -// } -// } -// } -// -// override fun getItemCount(): Int { -// // Item Count -// return formSection.size ?: 0 -// } -// -// override fun onBindViewHolder(holder: BaseViewHolder<FormSectionBaseItem>, position: Int) { -// // Bind the viewholder -// holder.bind(formSection[position]) -// } -// -// override fun getItemViewType(position: Int): Int { -// -// val item = formSection[position].also { } -// -// return when (item.type){ -// BIGTITLE -> ITEM_VIEW_TYPE_BIGTITLE -// DEFAULT -> ITEM_VIEW_TYPE_DEFAULT -// TEXT_FIELD -> ITEM_VIEW_TYPE_TEXTFIELD -// TEXT_VIEW -> ITEM_VIEW_TYPE_TEXTVIEW -// APP_INFO -> ITEM_VIEW_TYPE_APPINFO -// STATUS_MESSAGE -> ITEM_VIEW_TYPE_STATUS_MESSAGE -// ACCOUNT_BALANCE -> ITEM_VIEW_TYPE_ACCOUNT_BALANCE -// ACCOUNT -> ITEM_VIEW_TYPE_ACCOUNT -// WALLET -> ITEM_VIEW_TYPE_WALLET -// COIN_NETWORK -> ITEM_VIEW_TYPE_COIN_NETWORK -// WITHDRAW_AMOUNT_FIELD -> ITEM_VIEW_TYPE_WITHDRAW_AMOUNT_FIELD -// ADDRESS_FIELD -> ITEM_VIEW_TYPE_ADDRESS_FIELD -// ZERO_TRANSACTION -> ITEM_VIEW_TYPE_ZERO_TRANSACTION -// TRANSACTION -> ITEM_VIEW_TYPE_TRANSACTION -// WALLET_TRANSACTIONS_FOOTER -> ITEM_VIEW_TYPE_WALLET_TRANSACTIONS_FOOTER -// RPC_NETWORK -> ITEM_VIEW_TYPE_RPC_NETWORK -// RPC_NETWORK_INFO -> ITEM_VIEW_TYPE_RPC_NETWORK_INFO -// HEADER -> ITEM_VIEW_TYPE_HEADER -// FOOTER -> ITEM_VIEW_TYPE_FOOTER -// } -// } -// // endregion -// -// // region Constant Value For Adapter Class -// companion object { -// private const val ITEM_VIEW_TYPE_TITLE = 0 -// private const val ITEM_VIEW_TYPE_MESSAGE = 1 -// private const val ITEM_VIEW_TYPE_MEDIA = 2 -// private const val ITEM_VIEW_TYPE_BULLET_POINT = 3 -// private const val ITEM_VIEW_TYPE_ACTION_BUTTON = 4 -// } -// // endregion -// -// // region Methods -// fun setListener(context : OnItemClickListener){ -// listener = context -// } -// -// // endregion -// -// // region Interface Methods -// interface OnItemClickListener { -// fun formDidTriggerEvent(eventType: FormSectionBaseItem.EventType, baseItem : FormSectionBaseItem, index : Int) : Boolean -// } -// // endregion -//} +package com.app.BitRabbit.Classes.Components.FormCollection + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bulletin.models.* +import com.bulletin.viewHolder.* +import com.example.bulletin.databinding.* +import com.wrx.wazirx.views.bulletin.model.Media + + +class FormRecyclerViewAdapter(var formSection: List<BulletinItem>) : + RecyclerView.Adapter<BaseViewHolder<BulletinItem>>() { + + // region Variables + private lateinit var listener : OnItemClickListener + + fun setRecyclerViewItems(formData: List<BulletinItem>) { + formSection = formData + notifyDataSetChanged() + } + + // region RecyclerView Adapter Methods + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<BulletinItem> { + + // Based on the view type initilaize the viewholder + when(viewType) { + ITEM_VIEW_TYPE_TITLE -> { + val view = + LayoutFormSectionTitleBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return FormSectionTitleViewHolder(view,listener) as BaseViewHolder<BulletinItem> + } + ITEM_VIEW_TYPE_MESSAGE -> { + val view = + LayoutFormSectionMessageBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return FormSectionMessageViewHolder(view,listener) as BaseViewHolder<BulletinItem> + } + ITEM_VIEW_TYPE_MEDIA -> { + val view = + LayoutFormSectionMediaBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return FormSectionMediaViewHolder(view,listener) as BaseViewHolder<BulletinItem> + } + ITEM_VIEW_TYPE_ACTION_BUTTON -> { + val view = + LayoutFormSectionActionButtonBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return FormSectionActionButtonViewHolder(view,listener) as BaseViewHolder<BulletinItem> + } + ITEM_VIEW_TYPE_BULLET_POINT -> { + val view = + LayoutFormBulletPointBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return FormSectionBulletPointViewHolder(view,listener) as BaseViewHolder<BulletinItem> + } + else -> { + val view = + LayoutFormSectionTitleBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return FormSectionTitleViewHolder(view,listener) as BaseViewHolder<BulletinItem> + } + } + } + + override fun getItemCount(): Int { + // Item Count + return formSection.size ?: 0 + } + + override fun onBindViewHolder(holder: BaseViewHolder<BulletinItem>, position: Int) { + // Bind the viewholder + holder.bind(formSection[position]) + } + + override fun getItemViewType(position: Int): Int { + + val item = formSection[position].also { } + + return if (item is Title) { + ITEM_VIEW_TYPE_TITLE + } else if (item is Message) { + ITEM_VIEW_TYPE_MESSAGE + } else if (item is Media) { + ITEM_VIEW_TYPE_MEDIA + } else if (item is BulletPoint) { + ITEM_VIEW_TYPE_BULLET_POINT + } else if (item is ActionButton) { + ITEM_VIEW_TYPE_ACTION_BUTTON + } else { + ITEM_VIEW_TYPE_TITLE + } + } + // endregion + + // region Constant Value For Adapter Class + companion object { + private const val ITEM_VIEW_TYPE_TITLE = 0 + private const val ITEM_VIEW_TYPE_MESSAGE = 1 + private const val ITEM_VIEW_TYPE_MEDIA = 2 + private const val ITEM_VIEW_TYPE_BULLET_POINT = 3 + private const val ITEM_VIEW_TYPE_ACTION_BUTTON = 4 + } + // endregion + + // region Methods + fun setListener(context : OnItemClickListener){ + listener = context + } + + // endregion + + // region Interface Methods + interface OnItemClickListener { + // fun formDidTriggerEvent(eventType: FormSectionBaseItem.EventType, baseItem : FormSectionBaseItem, index : Int) : Boolean + } + // endregion +} diff --git a/app/src/main/java/com/bulletin/extension/ImageExtension.kt b/app/src/main/java/com/bulletin/extension/ImageExtension.kt new file mode 100644 index 0000000..d4d9f3f --- /dev/null +++ b/app/src/main/java/com/bulletin/extension/ImageExtension.kt @@ -0,0 +1,27 @@ +package com.app.BitRabbit.Core.Extensions + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.drawable.Drawable +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.RequestBuilder +import com.bumptech.glide.load.Transformation +import com.bumptech.glide.request.target.CustomTarget +import com.example.bulletin.R + + +fun View.loadImageWithUrl( + context: Context, + url: String, + transform: Transformation<Bitmap?>?, + completion: CustomTarget<Drawable?> +) { + var builder: RequestBuilder<Drawable?> = Glide.with(context) + .load(url) + .error(R.drawable.image_loading_bg) + if (transform != null) { + builder = builder.transform(transform) + } + builder.into(completion) +} diff --git a/app/src/main/java/com/bulletin/models/ActionButton.kt b/app/src/main/java/com/bulletin/models/ActionButton.kt index c2d2381..fe8bd33 100644 --- a/app/src/main/java/com/bulletin/models/ActionButton.kt +++ b/app/src/main/java/com/bulletin/models/ActionButton.kt @@ -11,7 +11,7 @@ data class ActionButton(val title: String?, var clickPayload: Any?) : BulletinIt // region Init Methods init { - + type = ItemType.ACTION_BUTTON } companion object { diff --git a/app/src/main/java/com/bulletin/models/BulletPoint.kt b/app/src/main/java/com/bulletin/models/BulletPoint.kt index ca46aea..a68bb62 100644 --- a/app/src/main/java/com/bulletin/models/BulletPoint.kt +++ b/app/src/main/java/com/bulletin/models/BulletPoint.kt @@ -15,6 +15,11 @@ import com.google.gson.annotations.SerializedName data class BulletPoint(var bullet: Bullet?, var titleText: String?, var subTitleText: String?) : BulletinItem() { + // region Init Methods + init { + type = ItemType.BULLET_POINT + } + companion object { @Suppress("UNCHECKED_CAST") diff --git a/app/src/main/java/com/bulletin/models/BulletinItem.kt b/app/src/main/java/com/bulletin/models/BulletinItem.kt index 02fd0bc..2c467e7 100644 --- a/app/src/main/java/com/bulletin/models/BulletinItem.kt +++ b/app/src/main/java/com/bulletin/models/BulletinItem.kt @@ -4,6 +4,20 @@ import com.bulletin.utilities.RuntimeTypeAdapterFactory import com.wrx.wazirx.views.bulletin.model.Media abstract class BulletinItem() { + + // MARK: - Declarations + enum class ItemType(val value: String) { + UNDEFINED("Undefined"), + TITLE("title"), + MESSAGE("message"), + MEDIA("media"), + BULLET_POINT("bulletPoint"), + ACTION_BUTTON("actionButton"), + } + + // MARK: - Variables + var type: ItemType = ItemType.UNDEFINED + companion object { val runtimeTypeAdapterFactory: RuntimeTypeAdapterFactory<*> get() { diff --git a/app/src/main/java/com/bulletin/models/BulletinVersion.kt b/app/src/main/java/com/bulletin/models/BulletinVersion.kt index 4da560c..e3998da 100644 --- a/app/src/main/java/com/bulletin/models/BulletinVersion.kt +++ b/app/src/main/java/com/bulletin/models/BulletinVersion.kt @@ -3,6 +3,7 @@ package com.bulletin.models import com.bulletin.utilities.VersionUtil data class BulletinVersion(val versionNumber: String, val items: MutableList<BulletinItem>) { + companion object { var descendingSort: Comparator<BulletinVersion> = Comparator { t2: BulletinVersion, t1: BulletinVersion -> diff --git a/app/src/main/java/com/bulletin/models/Media.kt b/app/src/main/java/com/bulletin/models/Media.kt index 01c8e03..64836d1 100644 --- a/app/src/main/java/com/bulletin/models/Media.kt +++ b/app/src/main/java/com/bulletin/models/Media.kt @@ -1,32 +1,66 @@ package com.wrx.wazirx.views.bulletin.model +import android.util.Size import com.bulletin.models.BulletinItem +import com.bulletin.models.Message import com.bulletin.utilities.RuntimeTypeAdapterFactory import com.google.gson.annotations.SerializedName -open class Media() : BulletinItem() { +open class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, val size: Size?) : BulletinItem() { - @SerializedName("imageType") - lateinit var imageType: String - @SerializedName("size") - var size: Int = 0 - @SerializedName("url") - lateinit var url: String +// @SerializedName("imageType") +// lateinit var imageType: String +// @SerializedName("size") +// var size: Int = 0 +// @SerializedName("url") +// lateinit var url: String + + // region Init Methods + init { + type = BulletinItem.ItemType.MEDIA + } + + enum class MediaType(val value: String) { + IMAGE("image"), + } companion object { - @JvmStatic + val runtimeTypeAdapterFactory: RuntimeTypeAdapterFactory<*> get() { val mediaRuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of( Media::class.java, "type" ) - mediaRuntimeTypeAdapterFactory.registerSubtype(ImageMedia::class.java, "Image") + // mediaRuntimeTypeAdapterFactory.registerSubtype(ImageMedia::class.java, "Image") return mediaRuntimeTypeAdapterFactory } - } -} -class ImageMedia(val versionNumber :String) : Media() { + fun init(attributes: Map<String, Any>): Media? { + // Set Media Type + val mediaTypeString = attributes["mediaType"] as? String + var mediaType = MediaType.IMAGE + if (!mediaTypeString.isNullOrEmpty()) { + (MediaType.valueOf(mediaTypeString.uppercase())).let { + mediaType = it + } + } + // Set Url + val urlString = (attributes["url"] as? String) ?: return null + + var size: Size? = null + + // Set Size + val width = (attributes["width"] as? Float)?.toInt() + val height = (attributes["height"] as? Float)?.toInt() + size = width?.let { height?.let { it1 -> Size(it, it1) } } + + return Media(mediaType, urlString, size) + } + } } + +//class ImageMedia(val versionNumber :String) : Media() { +// +//} diff --git a/app/src/main/java/com/bulletin/models/Message.kt b/app/src/main/java/com/bulletin/models/Message.kt index 2d3fc12..763f6c2 100644 --- a/app/src/main/java/com/bulletin/models/Message.kt +++ b/app/src/main/java/com/bulletin/models/Message.kt @@ -21,6 +21,11 @@ data class Message(var messageType: MessageType = MessageType.TEXT, val text: St TEXT("text"); } + // region Init Methods + init { + type = ItemType.MESSAGE + } + companion object { fun init(attributes: Map<String, Any>): Message? { @@ -36,7 +41,6 @@ data class Message(var messageType: MessageType = MessageType.TEXT, val text: St // Set Text val text = (attributes["text"] as? String) ?: return null - return Message(messageType, text) } } diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt index c65ed88..56dc736 100644 --- a/app/src/main/java/com/bulletin/models/Title.kt +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -8,6 +8,11 @@ import com.bulletin.extension.validVersion data class Title(val preTitleText: String?, val titleText: String?, val subTitleText: String?) : BulletinItem() { + // region Init Methods + init { + type = ItemType.TITLE + } + companion object { fun init(attributes: Map<String, Any>): Title? { diff --git a/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt new file mode 100644 index 0000000..c04da0d --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt @@ -0,0 +1,64 @@ +package com.app.BitRabbit.Core.Extensions + +import android.content.Context +import android.util.DisplayMetrics + +object DeviceUtil { + + /** + * This method converts dp unit to equivalent pixels, depending on device density. + * + * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels + * @return A float value to represent px equivalent to dp depending on device density + */ + fun convertDpToPixel(context: Context, dp: Float): Int { + val resources = context.resources + val metrics = resources.displayMetrics + return dp.toInt() * (metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT) + } + + /** + * This method converts device specific pixels to density independent pixels. + * + * @param px A value in px (pixels) unit. Which we need to convert into db + * @return A float value to represent dp equivalent to px value + */ + fun convertPixelsToDp(context: Context, px: Float): Float { + val resources = context.resources + val metrics = resources.displayMetrics + return px / (metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT) + } + + /** + * This method converts sp unit to equivalent pixels, depending on device density. + * + * @param sp A value in sp (scale independent pixels) unit. Which we need to convert into pixels + * @return A float value to represent px equivalent to sp depending on device scale + */ + fun convertSpToPixel(context: Context, sp: Float): Int { + val scaledDensity = context.resources.displayMetrics.scaledDensity + return (sp * scaledDensity).toInt() + } + + /** + * This method converts device specific pixels to scale independent pixels. + * + * @param px A value in px (pixels) unit. Which we need to convert into db + * @return A float value to represent sp equivalent to px value + */ + fun convertPixelsToSp(context: Context, px: Float): Float { + val scaledDensity = context.resources.displayMetrics.scaledDensity + return px / scaledDensity + } + + fun getDensity(context: Context): String { + val density = context.resources.displayMetrics.density + return if (density <= 1.0f) { + "1x" + } else if (density > 1.0f && density <= 2.0f) { + "2x" + } else { + "3x" + } + } +} diff --git a/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt b/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt new file mode 100644 index 0000000..302e541 --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt @@ -0,0 +1,95 @@ +package com.bulletin.utilities + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.graphics.drawable.GradientDrawable +import android.graphics.drawable.StateListDrawable +import android.util.TypedValue +import android.view.View +import androidx.annotation.AttrRes +import androidx.annotation.ColorInt +import androidx.core.graphics.drawable.DrawableCompat + + +object ThemeUtils { + @ColorInt + fun getAttributedColor(@AttrRes attr: Int, context: Context): Int { +// val a = context.theme.obtainStyledAttributes( Appearance.valueOf(Appearance.Current.value).ordinal, intArrayOf(attr)) +// return a.getColor(0, 0) + val value = TypedValue() + context.theme.resolveAttribute(attr, value, true) + return value.data + } + + fun applyThemeDrawable(view: View, @AttrRes attr: Int) { + val color = getAttributedColor(attr, view.context) + if (color != 0) { + val drawable = view.background + if (drawable is GradientDrawable) { + drawable.setColor(color) + } + view.setBackgroundDrawable(drawable) + } + } + + fun applyThemeBorder( + view: View, + @AttrRes borderColor: Int, + borderWidth: Int + ): GradientDrawable? { + val drawable = view.background as? GradientDrawable + val color = getAttributedColor(borderColor, view.context) + if (color != 0) { + drawable?.setStroke(borderWidth, color) + } + return drawable + } + + fun applyThemeDrawable(drawable: Drawable, context: Context, @AttrRes attr: Int): Drawable { + val color = getAttributedColor(attr, context) + if (color != 0) { + if (drawable is GradientDrawable) { + drawable.setColor(color) + } + } + return drawable + } + + fun applyThemeStateDrawable(view: View, @AttrRes attrs: IntArray, states: Array<IntArray>) { + val colors = IntArray(attrs.size) + for (i in attrs.indices) { + colors[i] = getAttributedColor(attrs[i], view.context) + } + val drawable = view.background as StateListDrawable + DrawableCompat.setTintList(drawable, ColorStateList(states, colors)) + view.setBackgroundDrawable(drawable) + } + + fun getHexStringofAttrs( + @AttrRes attr: Int, + context: Context + ): String { + val color = getAttributedColor(attr, context) + return String.format("#%06X", 0xFFFFFF and color) + } + + fun createGradientDrawable( + colorArr: Array<String?>, + orientation: GradientDrawable.Orientation?, + cornerRadius: Float + ): GradientDrawable { + val colors = IntArray(colorArr.size) + for (i in colorArr.indices) { + colors[i] = Color.parseColor(colorArr[i]) + } + + //create a new gradient color + val gd = GradientDrawable( + orientation, colors + ) + gd.cornerRadius = cornerRadius + return gd + } +} diff --git a/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt index e31879f..6105eab 100644 --- a/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt @@ -1,4 +1,4 @@ -package com.app.BitRabbit.Classes.Components.FormCollection.Views +package com.bulletin.viewHolder import android.view.View import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt index 01fcc6d..727bb56 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt @@ -1,45 +1,52 @@ -//package com.app.BitRabbit.Classes.Components.FormCollection.Views -// -//import android.graphics.Color -//import android.view.View -//import com.bulletin.models.ActionButton -// -// -//class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionHeaderItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : -// BaseViewHolder<ActionButton>(viewBinding,listener) { -// -// // region Methods -// override fun bind(item: ActionButton) { -// super.bind(item) -// -// // Set Title -// if (!item.title.isNullOrBlank()) { -// viewBinding.titleLabel.text = item.title -// viewBinding.titleLabel.setVisibility(View.VISIBLE) -// -// if (!item.titleColor.isNullOrBlank()) { -// viewBinding.titleLabel.setTextColor(Color.parseColor(item.titleColor)) -// } else { -// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.titleLabel.getContext())) -// } -// } else { -// viewBinding.titleLabel.text = "" -// viewBinding.titleLabel.setVisibility(View.GONE) -// } -// -// } -// -// override fun getBackgroundView(): View? { -// return null -// } -// -// override fun updateAppearance() { -// super.updateAppearance() -// -// // Set Default Properties -// viewBinding.titleLabel.typeface = AppStyle.Font.DemiBold() -// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.titleLabel.context)) -// } -// // endregion -// -//} +package com.bulletin.viewHolder + +import android.os.Build +import android.view.View +import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.app.BitRabbit.Core.Extensions.DeviceUtil +import com.bulletin.models.ActionButton +import com.bulletin.utilities.ThemeUtils +import com.example.bulletin.R +import com.example.bulletin.databinding.LayoutFormSectionActionButtonBinding + + +class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionActionButtonBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : + BaseViewHolder<ActionButton>(viewBinding,listener) { + + // region Methods + override fun bind(item: ActionButton) { + super.bind(item) + + // Set Title + if (!item.title.isNullOrBlank()) { + viewBinding.actionButton.text = item.title + viewBinding.actionButton.setVisibility(View.VISIBLE) + } else { + viewBinding.actionButton.text = "" + viewBinding.actionButton.setVisibility(View.GONE) + } + + } + + override fun getBackgroundView(): View? { + return null + } + + override fun updateAppearance() { + super.updateAppearance() + + // Set Default Properties + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewBinding.actionButton.setTextAppearance(R.style.base_semi_bold) + } else { + viewBinding.actionButton.setTextAppearance(viewBinding.actionButton.context, R.style.large_bold) + } + viewBinding.actionButton.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.actionButton.context)) + viewBinding.actionButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, viewBinding.actionButton.context)) + ThemeUtils.applyThemeBorder(viewBinding.actionButton,R.attr.main_bg_surface_alt, + DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 1f)) + + } + // endregion + +} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt index 9a791b9..61715bc 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt @@ -1,99 +1,61 @@ -//package com.app.BitRabbit.Classes.Components.FormCollection.Views -// -//import android.graphics.drawable.BitmapDrawable -//import android.graphics.drawable.Drawable -//import android.view.View -//import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter -//import com.app.BitRabbit.Classes.Components.FormCollection.Model.SectionItems.FormSectionBigTitleItem -//import com.app.BitRabbit.Classes.Constants.AppStyle -//import com.app.BitRabbit.Core.Extensions.ThemeUtils -//import com.app.BitRabbit.Core.Extensions.loadImageWithUrl -//import com.app.BitRabbit.R -//import com.app.BitRabbit.databinding.LayoutFormSectionBigTitleItemBinding -//import com.bulletin.models.BulletPoint -//import com.bumptech.glide.request.target.CustomTarget -//import com.bumptech.glide.request.transition.Transition -// -// -//class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormSectionBigTitleItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : -// BaseViewHolder<FormSectionBigTitleItem>(viewBinding,listener) { -// -// // region Methods -// override fun bind(item: BulletPoint) { -// super.bind(item) -// -// // Set Pre Title -// if (!item.pretitle.isNullOrBlank()) { -// viewBinding.pretitleLabel.text = item.pretitle -// viewBinding.pretitleLabel.setVisibility(View.VISIBLE) -// } else { -// viewBinding.pretitleLabel.text = "" -// viewBinding.pretitleLabel.setVisibility(View.GONE) -// } -// -// // Set Title -// if (!item.title.isNullOrBlank()) { -// viewBinding.titleLabel.text = item.title -// viewBinding.titleLabel.setVisibility(View.VISIBLE) -// } else { -// viewBinding.titleLabel.text = "" -// viewBinding.titleLabel.setVisibility(View.GONE) -// } -// -// // Set Icon Background Color -// item.iconBackgroundColor?.also { -// viewBinding.iconContainerView.setBackgroundColor(it) -// viewBinding.iconContainerView.setVisibility(View.VISIBLE) -// } ?: run { -// viewBinding.iconContainerView.setVisibility(View.GONE) -// } -// -// -// // Set Image -// viewBinding.iconImageView.setVisibility(View.GONE) -// if(!item.iconImageUrl.isNullOrBlank()) { -// -// viewBinding.iconImageView.loadImageWithUrl( -// viewBinding.iconImageView.getContext(), -// item.iconImageUrl!!, -// null, -// object : CustomTarget<Drawable?>() { -// -// override fun onResourceReady( -// resource: Drawable, -// transition: Transition<in Drawable?>? -// ) { -// val bitmap = (resource as BitmapDrawable).bitmap -// viewBinding.iconImageView.setImageBitmap(bitmap) -// viewBinding.iconImageView.setVisibility(View.VISIBLE) -// } -// -// override fun onLoadCleared(placeholder: Drawable?) {} -// }) -// } -// -// itemView.setOnClickListener { -// -// } -// } -// -// override fun updateAppearance() { -// super.updateAppearance() -// -// // Set Default Properties -// viewBinding.pretitleLabel.typeface = AppStyle.Font.Medium() -// viewBinding.pretitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.titleLabel.context)) -// -// viewBinding.titleLabel.typeface = AppStyle.Font.Bold() -// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.pretitleLabel.context)) -// -// viewBinding.iconContainerView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.iconContainerView.context)) -// -// } -// -// override fun getBackgroundView(): View? { -// return null -// } -// // endregion -// -//} +package com.bulletin.viewHolder + +import android.os.Build +import android.view.View +import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.bulletin.models.BulletPoint +import com.bulletin.utilities.ThemeUtils +import com.example.bulletin.R +import com.example.bulletin.databinding.LayoutFormBulletPointBinding + + +class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormBulletPointBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : + BaseViewHolder<BulletPoint>(viewBinding,listener) { + + // region Methods + override fun bind(item: BulletPoint) { + super.bind(item) + + // Set Pre Title + if (!item.titleText.isNullOrBlank()) { + viewBinding.titleLabel.text = item.titleText + viewBinding.titleLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.titleLabel.text = "" + viewBinding.titleLabel.setVisibility(View.GONE) + } + + // Set Title + if (!item.subTitleText.isNullOrBlank()) { + viewBinding.subtitleLabel.text = item.subTitleText + viewBinding.subtitleLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.subtitleLabel.text = "" + viewBinding.subtitleLabel.setVisibility(View.GONE) + } + + } + + override fun updateAppearance() { + super.updateAppearance() + + // Set Default Properties + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewBinding.titleLabel.setTextAppearance(R.style.large_semi_bold) + viewBinding.subtitleLabel.setTextAppearance(R.style.base_regular) + } else { + viewBinding.titleLabel.setTextAppearance(viewBinding.titleLabel.context, R.style.large_semi_bold) + viewBinding.subtitleLabel.setTextAppearance(viewBinding.subtitleLabel.context, R.style.base_regular) + } + + viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.titleLabel.context)) + viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_secondary, viewBinding.subtitleLabel.context)) + + } + + override fun getBackgroundView(): View? { + return null + } + // endregion + +} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt index 67690eb..d80bf55 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -1,45 +1,56 @@ -//package com.app.BitRabbit.Classes.Components.FormCollection.Views -// -//import android.graphics.Color -//import android.view.View -//import com.wrx.wazirx.views.bulletin.model.Media -// -// -//class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionHeaderItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : -// BaseViewHolder<Media>(viewBinding,listener) { -// -// // region Methods -// override fun bind(item: Media) { -// super.bind(item) -// -// // Set Title -// if (!item.title.isNullOrBlank()) { -// viewBinding.titleLabel.text = item.title -// viewBinding.titleLabel.setVisibility(View.VISIBLE) -// -// if (!item.titleColor.isNullOrBlank()) { -// viewBinding.titleLabel.setTextColor(Color.parseColor(item.titleColor)) -// } else { -// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.titleLabel.getContext())) -// } -// } else { -// viewBinding.titleLabel.text = "" -// viewBinding.titleLabel.setVisibility(View.GONE) -// } -// -// } -// -// override fun getBackgroundView(): View? { -// return null -// } -// -// override fun updateAppearance() { -// super.updateAppearance() -// -// // Set Default Properties -// viewBinding.titleLabel.typeface = AppStyle.Font.DemiBold() -// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.titleLabel.context)) -// } -// // endregion -// -//} +package com.bulletin.viewHolder + +import android.graphics.Color +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.view.View +import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.app.BitRabbit.Core.Extensions.loadImageWithUrl +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition +import com.example.bulletin.databinding.LayoutFormSectionMediaBinding +import com.wrx.wazirx.views.bulletin.model.Media + + +class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionMediaBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : + BaseViewHolder<Media>(viewBinding,listener) { + + // region Methods + override fun bind(item: Media) { + super.bind(item) + + // Set Image + viewBinding.bannerImageView.setVisibility(View.GONE) + if(!item.url.isNullOrBlank()) { + + viewBinding.bannerImageView.loadImageWithUrl( + viewBinding.bannerImageView.getContext(), + item.url, + null, + object : CustomTarget<Drawable?>() { + + override fun onResourceReady( + resource: Drawable, + transition: Transition<in Drawable?>? + ) { + val bitmap = (resource as BitmapDrawable).bitmap + viewBinding.bannerImageView.setImageBitmap(bitmap) + viewBinding.bannerImageView.setVisibility(View.VISIBLE) + } + + override fun onLoadCleared(placeholder: Drawable?) {} + }) + } + + } + + override fun getBackgroundView(): View? { + return null + } + + override fun updateAppearance() { + super.updateAppearance() + } + // endregion + +} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt index 3d7aeb6..6579020 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt @@ -1,197 +1,77 @@ -//package com.app.BitRabbit.Classes.Components.FormCollection.Views -// -//import android.graphics.Color -//import android.graphics.PorterDuff -//import android.graphics.drawable.BitmapDrawable -//import android.graphics.drawable.Drawable -//import android.view.View -//import androidx.core.content.ContextCompat -//import com.bulletin.models.Message -//import com.bumptech.glide.request.target.CustomTarget -//import com.bumptech.glide.request.transition.Transition -// -// -//class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionDefaultItemBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : -// BaseViewHolder<Message>(viewBinding,listener) { -// -// // region Methods -// override fun bind(item: Message) { -//// topCellSeparatorView = viewBinding.topCellSeparatorView -//// bottomCellSeparatorView = viewBinding.bottomCellSeparatorView -// -// super.bind(item) -// -// viewBinding.titleLabel.text = item.title -// -// itemView.setOnClickListener { -// _listener?.formDidTriggerEvent(item.eventType, item, bindingAdapterPosition) -// } -// -// // Set Image -// viewBinding.iconImageView.setVisibility(View.GONE) -// if(!item.iconUrl.isNullOrBlank()) { -// -// val itemColor = if (!item.iconColor.isNullOrBlank()) Color.parseColor(item.iconColor) -// else ThemeUtils.getAttributedColor(R.attr.navigation_item, viewBinding.iconImageView.getContext()) -// -// viewBinding.iconImageView.loadImageWithUrl( -// viewBinding.iconImageView.getContext(), -// item.iconUrl!!, -// ColorFilterTransformation(viewBinding.iconImageView.getContext(), itemColor, true), -// object : CustomTarget<Drawable?>() { -// -// override fun onResourceReady( -// resource: Drawable, -// transition: Transition<in Drawable?>? -// ) { -// val bitmap = (resource as BitmapDrawable).bitmap -// viewBinding.iconImageView.setImageBitmap(bitmap) -// viewBinding.iconImageView.setVisibility(View.VISIBLE) -// } -// -// override fun onLoadCleared(placeholder: Drawable?) {} -// }) -// } -// -// // Set Title -// if (!item.title.isNullOrBlank()) { -// viewBinding.titleLabel.text = item.title -// viewBinding.titleLabel.setVisibility(View.VISIBLE) -// -// if (!item.titleColor.isNullOrBlank()) { -// viewBinding.titleLabel.setTextColor(Color.parseColor(item.titleColor)) -// } else { -// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.iconImageView.getContext())) -// } -// } else { -// viewBinding.titleLabel.text = "" -// viewBinding.titleLabel.setVisibility(View.GONE) -// } -// -// // Set Subttitle -// if (!item.subtitle.isNullOrBlank()) { -// viewBinding.subtitleLabel.text = item.subtitle -// viewBinding.subtitleLabel.setVisibility(View.VISIBLE) -// -// if (!item.subtitleColor.isNullOrBlank()) { -// viewBinding.subtitleLabel.setTextColor(Color.parseColor(item.subtitleColor)) -// } else { -// viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.iconImageView.getContext())) -// } -// } else { -// viewBinding.subtitleLabel.text = "" -// viewBinding.subtitleLabel.setVisibility(View.GONE) -// } -// -// // Set Value -// if (!item.value.isNullOrBlank()) { -// viewBinding.valueLabel.text = item.value -// viewBinding.valueLabel.setVisibility(View.VISIBLE) -// -// if (!item.valueColor.isNullOrBlank()) { -// viewBinding.valueLabel.setTextColor(Color.parseColor(item.valueColor)) -// } else { -// viewBinding.valueLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.iconImageView.getContext())) -// } -// } else { -// viewBinding.valueLabel.text = "" -// viewBinding.valueLabel.setVisibility(View.GONE) -// } -// -// // Set Accessory -// when(item.accessoryType){ -// FormSectionDefaultItem.AccessoryType.SWITCH -> { -// viewBinding.switchButton.setChecked(item.isSwitchAccessoryOn) -// viewBinding.switchButton.setVisibility(View.VISIBLE) -// } -// FormSectionDefaultItem.AccessoryType.NONE -> { -// viewBinding.switchButton.setVisibility(View.GONE) -// } -// else -> { -// viewBinding.switchButton.setVisibility(View.GONE) -// } -// } -// -// // Set Selection Accessory -// -// when(item.selectionAccessoryType){ -// FormSectionDefaultItem.SelectionAccessoryType.DISCLOSURE_INDICATOR -> { -// viewBinding.selectionAccessoryImageView.setImageDrawable(ContextCompat.getDrawable(viewBinding.selectionAccessoryImageView.context, R.drawable.ic_chevron_right)); -// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) -// } -// FormSectionDefaultItem.SelectionAccessoryType.CHECKMARK -> { -// viewBinding.selectionAccessoryImageView.setImageDrawable(ContextCompat.getDrawable(viewBinding.selectionAccessoryImageView.context, R.drawable.ic_checkmark)); -// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) -// } -// else -> { -// viewBinding.selectionAccessoryImageView.setVisibility(View.GONE) -// } -// } -// -// viewBinding.switchButton.setOnCheckedChangeListener({ _ , isChecked -> -// if (isChecked) { -// _listener?.formDidTriggerEvent(item.switchOnAccessoryEventType, item, adapterPosition) -// } else { -// _listener?.formDidTriggerEvent(item.switchOffAccessoryEventType, item, adapterPosition) -// } -// }) -// -// when(item.selectionAccessoryType){ -// -// FormSectionDefaultItem.SelectionAccessoryType.DISCLOSURE_INDICATOR -> { -// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) -// viewBinding.selectionAccessoryImageView.setImageDrawable(ContextCompat.getDrawable(viewBinding.selectionAccessoryImageView.context, R.drawable.ic_chevron_right)); -// viewBinding.selectionAccessoryImageView.setColorFilter( -// ThemeUtils.getAttributedColor( -// R.attr.text_2, -// viewBinding.selectionAccessoryImageView.context -// ), PorterDuff.Mode.SRC_IN -// ) -// } -// FormSectionDefaultItem.SelectionAccessoryType.CHECKMARK -> { -// viewBinding.selectionAccessoryImageView.setVisibility(View.VISIBLE) -// viewBinding.selectionAccessoryImageView.setColorFilter( -// ThemeUtils.getAttributedColor( -// R.attr.highlight_1, -// viewBinding.selectionAccessoryImageView.context -// ), PorterDuff.Mode.SRC_IN -// ) -// } -// else -> { -// viewBinding.selectionAccessoryImageView.setVisibility(View.GONE) -// } -// } -// -// } -// -// override fun getCellFirstSeparatorView() : View { -// return viewBinding.topCellSeparatorView -// } -// -// override fun getCellBottomSeparatorView() : View { -// return viewBinding.bottomCellSeparatorView -// } -// -// override fun getBackgroundView(): View { -// return viewBinding.itemBackground -// } -// -// override fun updateAppearance() { -// super.updateAppearance() -// -// // Set Default Properties -// viewBinding.backgroundContainerView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.background_1, viewBinding.backgroundContainerView.context)) -// -// viewBinding.titleLabel.typeface = AppStyle.Font.DemiBold() -// viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_1, viewBinding.titleLabel.context)) -// -// viewBinding.subtitleLabel.typeface = AppStyle.Font.DemiBold() -// viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.subtitleLabel.context)) -// -// viewBinding.valueLabel.typeface = AppStyle.Font.Medium() -// viewBinding.valueLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.valueLabel.context)) -// -// } -// // endregion -// -//} +package com.bulletin.viewHolder + +import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.os.Build +import android.view.LayoutInflater +import android.view.View +import androidx.core.content.ContextCompat +import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.bulletin.models.BulletinItem +import com.bulletin.models.Message +import com.bulletin.utilities.ThemeUtils +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition +import com.example.bulletin.R +import com.example.bulletin.databinding.LayoutFormSectionMessageBinding +import com.example.bulletin.databinding.LayoutFormSectionTitleBinding + + +class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionMessageBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : + BaseViewHolder<Message>(viewBinding,listener) { + + // region Methods + override fun bind(item: Message) { + + super.bind(item) + + when(item.messageType) { + Message.MessageType.HTML -> { + // Set Subttitle + if (!item.text.isNullOrBlank()) { + viewBinding.messageLabel.text = item.text + viewBinding.messageLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.messageLabel.text = "" + viewBinding.messageLabel.setVisibility(View.GONE) + } + } + Message.MessageType.TEXT -> { + // Set Subttitle + if (!item.text.isNullOrBlank()) { + viewBinding.messageLabel.text = item.text + viewBinding.messageLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.messageLabel.text = "" + viewBinding.messageLabel.setVisibility(View.GONE) + } + } + else -> { + viewBinding.messageLabel.text = "" + viewBinding.messageLabel.setVisibility(View.GONE) + } + } + + } + + override fun getBackgroundView(): View? { + return null + } + + override fun updateAppearance() { + super.updateAppearance() + + // Set Default Properties + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewBinding.messageLabel.setTextAppearance(R.style.base_semi_bold) + } else { + viewBinding.messageLabel.setTextAppearance(viewBinding.messageLabel.context, R.style.large_bold) + } + + viewBinding.messageLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.messageLabel.context)) + } + // endregion + +} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt index 80d7614..2a512c3 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt @@ -1,55 +1,77 @@ -//package com.app.BitRabbit.Classes.Components.FormCollection.Views -// -//import android.view.View -//import com.bulletin.models.Title -// -// -//class FormSectionTitleViewHolder(val viewBinding : LayoutFormSectionAppInfoBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : -// BaseViewHolder<Title>(viewBinding,listener) { -// -// // region Methods -// override fun bind(item: Title) { -// super.bind(item) -// -// itemView.setOnClickListener { -// -// } -// -// // Set App Title -// if (!item.appName.isNullOrBlank()) { -// viewBinding.appNameLabel.text = item.appName -// viewBinding.appNameLabel.setVisibility(View.VISIBLE) -// } else { -// viewBinding.appNameLabel.text = "" -// viewBinding.appNameLabel.setVisibility(View.GONE) -// } -// -// // Set App Version -// if (!item.appVersion.isNullOrBlank()) { -// viewBinding.appVersionLabel.text = item.appVersion -// viewBinding.appVersionLabel.setVisibility(View.VISIBLE) -// } else { -// viewBinding.appVersionLabel.text = "" -// viewBinding.appVersionLabel.setVisibility(View.GONE) -// } -// -// } -// -// override fun getBackgroundView(): View? { -// return null -// } -// -// override fun updateAppearance() { -// super.updateAppearance() -// -// // Set Default Properties -// viewBinding.appNameLabel.typeface = AppStyle.Font.Bold() -// viewBinding.appNameLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.appNameLabel.context)) -// -// viewBinding.appVersionLabel.typeface = AppStyle.Font.DemiBold() -// viewBinding.appVersionLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.text_2, viewBinding.appVersionLabel.context)) -// -// } -// // endregion -// -//} +package com.bulletin.viewHolder + +import android.os.Build +import android.view.View +import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.bulletin.models.Title +import com.bulletin.utilities.ThemeUtils +import com.example.bulletin.R +import com.example.bulletin.databinding.LayoutFormSectionTitleBinding + + +class FormSectionTitleViewHolder(val viewBinding : LayoutFormSectionTitleBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : + BaseViewHolder<Title>(viewBinding,listener) { + + // region Methods + override fun bind(item: Title) { + super.bind(item) + + itemView.setOnClickListener { + + } + + // Set App Title + if (!item.preTitleText.isNullOrBlank()) { + viewBinding.preTitleLabel.text = item.preTitleText + viewBinding.preTitleLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.preTitleLabel.text = "" + viewBinding.preTitleLabel.setVisibility(View.GONE) + } + + // Set App Version + if (!item.titleText.isNullOrBlank()) { + viewBinding.titleLabel.text = item.titleText + viewBinding.titleLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.titleLabel.text = "" + viewBinding.titleLabel.setVisibility(View.GONE) + } + + // Set App Version + if (!item.subTitleText.isNullOrBlank()) { + viewBinding.subtitleLabel.text = item.subTitleText + viewBinding.subtitleLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.subtitleLabel.text = "" + viewBinding.subtitleLabel.setVisibility(View.GONE) + } + + } + + override fun getBackgroundView(): View? { + return null + } + + override fun updateAppearance() { + super.updateAppearance() + + // Set Default Properties + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewBinding.preTitleLabel.setTextAppearance(R.style.base_semi_bold) + viewBinding.titleLabel.setTextAppearance(R.style.base_semi_bold) + viewBinding.subtitleLabel.setTextAppearance(R.style.base_semi_bold) + } else { + viewBinding.preTitleLabel.setTextAppearance(viewBinding.preTitleLabel.context, R.style.large_bold) + viewBinding.titleLabel.setTextAppearance(viewBinding.titleLabel.context, R.style.large_bold) + viewBinding.subtitleLabel.setTextAppearance(viewBinding.subtitleLabel.context, R.style.large_bold) + } + + viewBinding.preTitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.preTitleLabel.context)) + viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.titleLabel.context)) + viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.subtitleLabel.context)) + + } + // endregion + +} diff --git a/app/src/main/res/drawable/image_loading_bg.xml b/app/src/main/res/drawable/image_loading_bg.xml new file mode 100644 index 0000000..0d0ca2b --- /dev/null +++ b/app/src/main/res/drawable/image_loading_bg.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <corners android:radius="3dp" /> + <solid android:color="@color/transparent" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_form_bullet_point.xml b/app/src/main/res/layout/layout_form_bullet_point.xml index dcf0a34..b1c4838 100644 --- a/app/src/main/res/layout/layout_form_bullet_point.xml +++ b/app/src/main/res/layout/layout_form_bullet_point.xml @@ -15,23 +15,42 @@ android:textSize="14sp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintBottom_toBottomOf="parent" tools:text="Name" /> - <TextView - android:id="@+id/version_title1" + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/item_text_container" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="10dp" android:layout_marginTop="16dp" android:layout_marginEnd="20dp" - android:text="test" - android:textColor="?attr/main_text_primary" - android:textSize="14sp" + android:layout_marginStart="10dp" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toEndOf="@id/version_title" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - tools:text="Name name Name name Name name Name name Na me name" /> + app:layout_constraintStart_toEndOf="@id/version_title"> + + <TextView + android:id="@+id/title_label" + android:layout_width="0dp" + android:layout_height="wrap_content" + tools:text="Name" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toTopOf="@id/subtitle_label"/> + + <TextView + android:id="@+id/subtitle_label" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="2dp" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="@id/title_label" + app:layout_constraintTop_toBottomOf="@id/title_label" + tools:text="Subtitle" /> + </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_section_action_button.xml b/app/src/main/res/layout/layout_form_section_action_button.xml index dcf0a34..055204c 100644 --- a/app/src/main/res/layout/layout_form_section_action_button.xml +++ b/app/src/main/res/layout/layout_form_section_action_button.xml @@ -5,33 +5,24 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - <TextView - android:id="@+id/version_title" - android:layout_width="wrap_content" + <Button + android:id="@+id/action_button" + style="@style/Widget.MaterialComponents.Button.UnelevatedButton" + android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="20dp" android:layout_marginTop="16dp" - android:textColor="?attr/main_text_primary" - android:textSize="14sp" - app:layout_constraintTop_toTopOf="parent" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:layout_marginBottom="16dp" + android:insetTop="0dp" + android:insetBottom="0dp" + android:textAllCaps="false" + android:textSize="18sp" + app:cornerRadius="20dp" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" - tools:text="Name" /> - - <TextView - android:id="@+id/version_title1" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="10dp" - android:layout_marginTop="16dp" - android:layout_marginEnd="20dp" - android:text="test" - android:textColor="?attr/main_text_primary" - android:textSize="14sp" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toEndOf="@id/version_title" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - tools:text="Name name Name name Name name Name name Na me name" /> + tools:text="Create account" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_section_media.xml b/app/src/main/res/layout/layout_form_section_media.xml index 881e5bc..8c66537 100644 --- a/app/src/main/res/layout/layout_form_section_media.xml +++ b/app/src/main/res/layout/layout_form_section_media.xml @@ -5,7 +5,7 @@ android:layout_height="wrap_content"> <ImageView - android:id="@+id/banner_image" + android:id="@+id/banner_image_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginLeft="20dp" diff --git a/app/src/main/res/layout/layout_form_section_message.xml b/app/src/main/res/layout/layout_form_section_message.xml index 4a4ea25..2fcb417 100644 --- a/app/src/main/res/layout/layout_form_section_message.xml +++ b/app/src/main/res/layout/layout_form_section_message.xml @@ -6,7 +6,7 @@ android:layout_height="wrap_content"> <TextView - android:id="@+id/version_title" + android:id="@+id/message_label" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" diff --git a/app/src/main/res/layout/layout_form_section_title.xml b/app/src/main/res/layout/layout_form_section_title.xml index 722a52b..3954302 100644 --- a/app/src/main/res/layout/layout_form_section_title.xml +++ b/app/src/main/res/layout/layout_form_section_title.xml @@ -18,7 +18,7 @@ app:layout_constraintTop_toTopOf="parent"> <TextView - android:id="@+id/version_title" + android:id="@+id/pre_title_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" @@ -36,7 +36,7 @@ android:textColor="?attr/success_text_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/version_title" + app:layout_constraintTop_toBottomOf="@+id/pre_title_label" tools:text="Daxesh Nagar Daxesh Nagar" /> <TextView diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f303616..8e6cda0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -8,6 +8,8 @@ <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> + <color name="transparent">#00000000</color> + ------------------ New Color ------------------------ <color name="colors_black">#000000</color> <color name="colors_white">#ffffff</color> From 0b1a1b32ae9611ba2d9c024975d5a4e3cd094000 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Thu, 16 Mar 2023 08:54:26 +0530 Subject: [PATCH 07/14] VIew holder added --- .../com/bulletin/FormRecyclerViewAdapter.kt | 50 ++++--- .../main/java/com/bulletin/MainActivity.kt | 138 ++++++++++++++---- .../com/bulletin/extension/ImageExtension.kt | 2 +- .../java/com/bulletin/models/BulletPoint.kt | 3 + .../main/java/com/bulletin/models/Title.kt | 37 ++++- .../com/bulletin/utilities/DeviceUtils.kt | 2 +- .../java/com/bulletin/utilities/ViewUtil.kt | 106 ++++++++++++++ .../com/bulletin/viewHolder/BaseViewHolder.kt | 2 +- .../FormSectionActionButtonViewHolder.kt | 4 +- .../FormSectionBulletPointViewHolder.kt | 2 +- .../viewHolder/FormSectionMediaViewHolder.kt | 5 +- .../FormSectionMessageViewHolder.kt | 12 +- .../viewHolder/FormSectionTitleViewHolder.kt | 2 +- .../main/res/drawable/header_background.xml | 7 + app/src/main/res/values-night/themes.xml | 2 +- app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/themes.xml | 2 +- 17 files changed, 306 insertions(+), 75 deletions(-) create mode 100644 app/src/main/java/com/bulletin/utilities/ViewUtil.kt create mode 100644 app/src/main/res/drawable/header_background.xml diff --git a/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt index b6936c0..0769caf 100644 --- a/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt +++ b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt @@ -1,19 +1,16 @@ -package com.app.BitRabbit.Classes.Components.FormCollection +package com.bulletin import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.bulletin.models.* +import com.bulletin.models.BulletinItem import com.bulletin.viewHolder.* import com.example.bulletin.databinding.* -import com.wrx.wazirx.views.bulletin.model.Media -class FormRecyclerViewAdapter(var formSection: List<BulletinItem>) : +class FormRecyclerViewAdapter(var formSection: List<BulletinItem>,var listener: OnItemClickListener) : RecyclerView.Adapter<BaseViewHolder<BulletinItem>>() { - // region Variables - private lateinit var listener : OnItemClickListener fun setRecyclerViewItems(formData: List<BulletinItem>) { formSection = formData @@ -72,18 +69,27 @@ class FormRecyclerViewAdapter(var formSection: List<BulletinItem>) : val item = formSection[position].also { } - return if (item is Title) { - ITEM_VIEW_TYPE_TITLE - } else if (item is Message) { - ITEM_VIEW_TYPE_MESSAGE - } else if (item is Media) { - ITEM_VIEW_TYPE_MEDIA - } else if (item is BulletPoint) { - ITEM_VIEW_TYPE_BULLET_POINT - } else if (item is ActionButton) { - ITEM_VIEW_TYPE_ACTION_BUTTON - } else { - ITEM_VIEW_TYPE_TITLE +// return if (item is Title) { +// ITEM_VIEW_TYPE_TITLE +// } else if (item is Message) { +// ITEM_VIEW_TYPE_MESSAGE +// } else if (item is Media) { +// ITEM_VIEW_TYPE_MEDIA +// } else if (item is BulletPoint) { +// ITEM_VIEW_TYPE_BULLET_POINT +// } else if (item is ActionButton) { +// ITEM_VIEW_TYPE_ACTION_BUTTON +// } else { +// ITEM_VIEW_TYPE_TITLE +// } + + return when (item.type){ + BulletinItem.ItemType.UNDEFINED -> ITEM_VIEW_TYPE_TITLE + BulletinItem.ItemType.TITLE -> ITEM_VIEW_TYPE_TITLE + BulletinItem.ItemType.MESSAGE -> ITEM_VIEW_TYPE_MESSAGE + BulletinItem.ItemType.MEDIA -> ITEM_VIEW_TYPE_MEDIA + BulletinItem.ItemType.BULLET_POINT -> ITEM_VIEW_TYPE_BULLET_POINT + BulletinItem.ItemType.ACTION_BUTTON -> ITEM_VIEW_TYPE_ACTION_BUTTON } } // endregion @@ -99,15 +105,15 @@ class FormRecyclerViewAdapter(var formSection: List<BulletinItem>) : // endregion // region Methods - fun setListener(context : OnItemClickListener){ - listener = context - } +// fun setListener(context : OnItemClickListener){ +// listener = context +// } // endregion // region Interface Methods interface OnItemClickListener { - // fun formDidTriggerEvent(eventType: FormSectionBaseItem.EventType, baseItem : FormSectionBaseItem, index : Int) : Boolean + fun formDidTriggerEvent(eventType: BulletinItem.ItemType, baseItem : BulletinItem, index : Int) : Boolean } // endregion } diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt index 0596d82..1a6c433 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -1,42 +1,122 @@ package com.example.bulletin +import android.os.Build import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import com.bulletin.BulletinDataStore +import androidx.recyclerview.widget.LinearLayoutManager import com.bulletin.BulletinSdk -import com.bulletin.extension.validVersion -import com.bulletin.models.ActionButton -import com.bulletin.models.BulletinItem -import com.bulletin.models.PreTitle +import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.models.* +import com.bulletin.utilities.ThemeUtils +import com.bulletin.utilities.ViewUtil +import com.example.bulletin.databinding.ActivityMainBinding + +class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickListener { + + // region Variables + private lateinit var binding: ActivityMainBinding + private lateinit var formRecyclerViewAdapter: FormRecyclerViewAdapter + // endregion -class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - - val value = "11".validVersion() - - val bulletinItem = PreTitle("text") - val bulletinItem1 = ActionButton("actionButton","") - val bulletinItem2 = bulletinItem.copy(text = "Hello") - val bulletinItem3 = bulletinItem1.copy(title = "New Action button") - val bulletinItem4 = bulletinItem.copy(text = "Hello boss") - val bulletinItem5 = bulletinItem.copy(text = "Hello boss") - val bulletinItemListTwo: MutableList<BulletinItem> = mutableListOf() - - bulletinItemListTwo.add(bulletinItem) - bulletinItemListTwo.add(bulletinItem2) - bulletinItemListTwo.add(bulletinItem3) - bulletinItemListTwo.add(bulletinItem4) - bulletinItemListTwo.add(bulletinItem5) - - BulletinDataStore.registerVersionInfo("1.0", bulletinItemListTwo) - BulletinDataStore.registerVersionInfo("1.3", bulletinItemListTwo) - BulletinDataStore.registerVersionInfo("1.4", bulletinItemListTwo) - BulletinDataStore.registerVersionInfo("1.1", bulletinItemListTwo) - BulletinDataStore.registerVersionInfo("1.2", bulletinItemListTwo) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) + + loadDisplayContent() + updateAppearance() + recyclerViewSetUp() + } + + fun loadDisplayContent() { + ViewUtil.addBounceEffect(binding.goItButton) + setupButtonClickEvent() + } + + fun updateAppearance() { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + binding.headerTitle.setTextAppearance(R.style.large_semi_bold) + binding.goItButton.setTextAppearance(R.style.base_bold) + } else { + binding.headerTitle.setTextAppearance(binding.headerTitle.context,R.style.large_semi_bold) + binding.goItButton.setTextAppearance(binding.goItButton.context,R.style.base_bold) + } + + binding.headerTitle.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_navigation_onNavigation, binding.headerTitle.context)) + + binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) + binding.goItButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, binding.goItButton.context)) + + ThemeUtils.applyThemeDrawable(binding.headerView, R.attr.main_navigation_bg) + +// viewBinding.emojiButton.strokeWidth = 2 +// viewBinding.emojiButton.setStrokeColor(ColorStateList.valueOf(ThemeUtils.getAttributedColor(R.attr.cell_separator_1, viewBinding.emojiButton.context))) + + } + fun recyclerViewSetUp(){ + val layoutManager = LinearLayoutManager(this) + layoutManager.orientation = LinearLayoutManager.VERTICAL + binding.listView.setLayoutManager(layoutManager) + + formRecyclerViewAdapter = FormRecyclerViewAdapter(setUpItems(),this) +// formRecyclerViewAdapter.setListener(this) + binding.listView.setAdapter(formRecyclerViewAdapter) + } + + fun setUpItems() : ArrayList<BulletinItem> { +// val bulletinItem = PreTitle("text") +// val bulletinItem1 = ActionButton("actionButton","") +// val bulletinItem2 = bulletinItem.copy(text = "Hello") +// val bulletinItem3 = bulletinItem1.copy(title = "New Action button") +// val bulletinItem4 = bulletinItem.copy(text = "Hello boss") +// val bulletinItem5 = bulletinItem.copy(text = "Hello boss") +// val bulletinItemListTwo: MutableList<BulletinItem> = mutableListOf() +// +// bulletinItemListTwo.add(bulletinItem) +// bulletinItemListTwo.add(bulletinItem2) +// bulletinItemListTwo.add(bulletinItem3) +// bulletinItemListTwo.add(bulletinItem4) +// bulletinItemListTwo.add(bulletinItem5) +// +// BulletinDataStore.registerVersionInfo("1.0", bulletinItemListTwo) +// BulletinDataStore.registerVersionInfo("1.3", bulletinItemListTwo) +// BulletinDataStore.registerVersionInfo("1.4", bulletinItemListTwo) +// BulletinDataStore.registerVersionInfo("1.1", bulletinItemListTwo) +// BulletinDataStore.registerVersionInfo("1.2", bulletinItemListTwo) +// val items = BulletinSdk().showUnseenBulletin(4) + + val title = Title("Version " + "1.21","In this update","loreum ipsum loreum ipsum loreum ipsum") + + val message = Message(Message.MessageType.TEXT,"Vestibulum id ligula porta felis euismod semper.") + + val bullet = Bullet(Bullet.BulletType.UNICODE,"U+0031",null) + + val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") + + val bulletPoint2 = BulletPoint(bullet,"Justo Condimentum","Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.") + + return arrayListOf(title, message, bulletPoint, bulletPoint2) + + } + + fun setupButtonClickEvent() { + binding.goItButton.setOnClickListener { + // Back event need to handle + finish() + } + } + + override fun formDidTriggerEvent( + eventType: BulletinItem.ItemType, + baseItem: BulletinItem, + index: Int + ): Boolean { + return true } } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/extension/ImageExtension.kt b/app/src/main/java/com/bulletin/extension/ImageExtension.kt index d4d9f3f..21de049 100644 --- a/app/src/main/java/com/bulletin/extension/ImageExtension.kt +++ b/app/src/main/java/com/bulletin/extension/ImageExtension.kt @@ -1,4 +1,4 @@ -package com.app.BitRabbit.Core.Extensions +package com.bulletin.extension import android.content.Context import android.graphics.Bitmap diff --git a/app/src/main/java/com/bulletin/models/BulletPoint.kt b/app/src/main/java/com/bulletin/models/BulletPoint.kt index a68bb62..aadf94d 100644 --- a/app/src/main/java/com/bulletin/models/BulletPoint.kt +++ b/app/src/main/java/com/bulletin/models/BulletPoint.kt @@ -48,6 +48,9 @@ data class Bullet(val bulletType: BulletType?, val unicode: String?, val imageUr IMAGE; } + // region Init Methods + + companion object { fun init(attributes: Map<String, Any>?): Bullet? { diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt index 56dc736..4b835b7 100644 --- a/app/src/main/java/com/bulletin/models/Title.kt +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -29,4 +29,39 @@ data class Title(val preTitleText: String?, val titleText: String?, val subTitle return Title(preTitleText, titleText, subTitleText) } } -} \ No newline at end of file +} + + +//class Title() : BulletinItem() { +// +// var preTitleText: String? = null +// var titleText: String? = null +// var subTitleText: String? = null +// +// +// // region Init Methods +// init { +// type = ItemType.TITLE +// } +// +// companion object { +// +// fun init(attributes: Map<String, Any>): Title? { +// +// // init the object +// val obj = Title() +// +// // Set PreTitle +// obj.preTitleText = (attributes["preTitleText"] as? String) ?: return null +// +// // Set Title +// obj.titleText = (attributes["titleText"] as? String) ?: return null +// +// // Set SubTitle +// obj.subTitleText = (attributes["subTitleText"] as? String) ?: return null +// +// return obj +// +// } +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt index c04da0d..4952964 100644 --- a/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt +++ b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt @@ -1,4 +1,4 @@ -package com.app.BitRabbit.Core.Extensions +package com.bulletin.utilities import android.content.Context import android.util.DisplayMetrics diff --git a/app/src/main/java/com/bulletin/utilities/ViewUtil.kt b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt new file mode 100644 index 0000000..f080703 --- /dev/null +++ b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt @@ -0,0 +1,106 @@ +package com.bulletin.utilities + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.view.Gravity +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.DecelerateInterpolator +import android.view.animation.ScaleAnimation +import android.widget.TextView + + +object ViewUtil { + @SuppressLint("ClickableViewAccessibility") + fun addBounceEffectListener(view: View, touchListener: TouchListener) { + view.setOnTouchListener { v: View, event: MotionEvent -> + onButtonTouchListener( + v, + event, + touchListener + ) + } + } + + @SuppressLint("ClickableViewAccessibility") + fun addBounceEffect(view: View) { + view.setOnTouchListener { v: View, event: MotionEvent -> + onButtonTouch( + v, + event + ) + } + } + + private fun onButtonTouch(button: View, event: MotionEvent): Boolean { + if (event.action == MotionEvent.ACTION_DOWN) { + onButtonPressed(button) + return true + } else if (event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL || event.action == MotionEvent.ACTION_OUTSIDE) { + onButtonReleased(button) + } + + // Handle click event + if (event.action == MotionEvent.ACTION_UP) { + button.performClick() + } + return false + } + + private fun onButtonTouchListener( + button: View, + event: MotionEvent, + touchListener: TouchListener + ): Boolean { + if (event.action == MotionEvent.ACTION_DOWN) { + // onButtonPressed(button); + touchListener.onButtonPressed() + return true + } else if (event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL || event.action == MotionEvent.ACTION_OUTSIDE) { + // onButtonReleased(button); + touchListener.onButtonReleased() + } + + // Handle click event + if (event.action == MotionEvent.ACTION_UP) { + button.performClick() + } + return false + } + + fun onButtonPressed(button: View) { + val scaleAnimation = ScaleAnimation( + 1f, 0.9f, + 1f, 0.9f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ) + scaleAnimation.interpolator = DecelerateInterpolator() + scaleAnimation.duration = 100 + scaleAnimation.fillAfter = true + button.startAnimation(scaleAnimation) + } + + fun onButtonReleased(button: View) { + val scaleAnimation = ScaleAnimation( + 0.9f, 1f, + 0.9f, 1f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ) + scaleAnimation.interpolator = DecelerateInterpolator() + scaleAnimation.duration = 100 + scaleAnimation.fillAfter = true + button.startAnimation(scaleAnimation) + } + + interface TouchListener { + fun onButtonPressed() + fun onButtonReleased() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt index 6105eab..4ba4297 100644 --- a/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/BaseViewHolder.kt @@ -3,7 +3,7 @@ package com.bulletin.viewHolder import android.view.View import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding -import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.BulletinItem diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt index 727bb56..e326142 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt @@ -2,9 +2,9 @@ package com.bulletin.viewHolder import android.os.Build import android.view.View -import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter -import com.app.BitRabbit.Core.Extensions.DeviceUtil +import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.ActionButton +import com.bulletin.utilities.DeviceUtil import com.bulletin.utilities.ThemeUtils import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionActionButtonBinding diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt index 61715bc..7fc989e 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt @@ -2,7 +2,7 @@ package com.bulletin.viewHolder import android.os.Build import android.view.View -import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.BulletPoint import com.bulletin.utilities.ThemeUtils import com.example.bulletin.R diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt index d80bf55..818499d 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -1,11 +1,10 @@ package com.bulletin.viewHolder -import android.graphics.Color import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.view.View -import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter -import com.app.BitRabbit.Core.Extensions.loadImageWithUrl +import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.extension.loadImageWithUrl import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition import com.example.bulletin.databinding.LayoutFormSectionMediaBinding diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt index 6579020..31ce07a 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt @@ -1,22 +1,12 @@ package com.bulletin.viewHolder -import android.graphics.Color -import android.graphics.PorterDuff -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable import android.os.Build -import android.view.LayoutInflater import android.view.View -import androidx.core.content.ContextCompat -import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter -import com.bulletin.models.BulletinItem +import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.Message import com.bulletin.utilities.ThemeUtils -import com.bumptech.glide.request.target.CustomTarget -import com.bumptech.glide.request.transition.Transition import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionMessageBinding -import com.example.bulletin.databinding.LayoutFormSectionTitleBinding class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionMessageBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt index 2a512c3..9176a46 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt @@ -2,7 +2,7 @@ package com.bulletin.viewHolder import android.os.Build import android.view.View -import com.app.BitRabbit.Classes.Components.FormCollection.FormRecyclerViewAdapter +import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.Title import com.bulletin.utilities.ThemeUtils import com.example.bulletin.R diff --git a/app/src/main/res/drawable/header_background.xml b/app/src/main/res/drawable/header_background.xml new file mode 100644 index 0000000..975c8eb --- /dev/null +++ b/app/src/main/res/drawable/header_background.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <corners + android:topLeftRadius="10dp" + android:topRightRadius="10dp" /> + <solid android:color="?attr/main_navigation_bg" /> +</shape> diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index ce266f8..5539eed 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,6 +1,6 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> - <style name="Theme.Bulletin" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> + <style name="Theme.Bulletin" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_200</item> <item name="colorPrimaryVariant">@color/purple_700</item> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b573182..3d45ab9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,8 @@ <resources> <string name="app_name">Bulletin</string> + + <string name="okay_go_it">OKay, Go it</string> + <string name="whats_new_title">What’s new in this update?</string> + + </resources> \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index e27af6b..c651231 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> - <style name="Theme.Bulletin" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> + <style name="Theme.Bulletin" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> From c85c7391028958502e12a7f0a743fa9c082ffa11 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Fri, 17 Mar 2023 10:20:13 +0530 Subject: [PATCH 08/14] extension and viewholder updated --- app/src/main/AndroidManifest.xml | 2 + .../com/bulletin/FormRecyclerViewAdapter.kt | 2 +- .../main/java/com/bulletin/MainActivity.kt | 27 ++++-- .../com/bulletin/extension/ImageExtension.kt | 3 +- .../java/com/bulletin/models/BulletinItem.kt | 4 + .../com/bulletin/utilities/DeviceUtils.kt | 3 + .../java/com/bulletin/utilities/ThemeUtils.kt | 35 -------- .../FormSectionActionButtonViewHolder.kt | 18 +++- .../FormSectionBulletPointViewHolder.kt | 59 +++++++++++++ .../viewHolder/FormSectionMediaViewHolder.kt | 26 +++++- .../FormSectionMessageViewHolder.kt | 12 ++- .../viewHolder/FormSectionTitleViewHolder.kt | 18 ++-- .../res/layout/layout_form_bullet_point.xml | 86 +++++++++++-------- .../layout_form_section_action_button.xml | 14 +-- .../res/layout/layout_form_section_media.xml | 20 +++-- app/src/main/res/values/styles.xml | 6 ++ 16 files changed, 222 insertions(+), 113 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d92ea6..512290b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" package="com.example.bulletin"> + <uses-permission android:name="android.permission.INTERNET"/> + <application android:name="com.bulletin.BulletinApp" android:allowBackup="true" diff --git a/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt index 0769caf..7d7ba29 100644 --- a/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt +++ b/app/src/main/java/com/bulletin/FormRecyclerViewAdapter.kt @@ -113,7 +113,7 @@ class FormRecyclerViewAdapter(var formSection: List<BulletinItem>,var listener: // region Interface Methods interface OnItemClickListener { - fun formDidTriggerEvent(eventType: BulletinItem.ItemType, baseItem : BulletinItem, index : Int) : Boolean + fun formDidTriggerEvent(eventType: BulletinItem.EventType, baseItem : BulletinItem, index : Int) : Boolean } // endregion } diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt index 1a6c433..1ea3f58 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -2,6 +2,7 @@ package com.example.bulletin import android.os.Build import android.os.Bundle +import android.util.Size import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import com.bulletin.BulletinSdk @@ -10,6 +11,7 @@ import com.bulletin.models.* import com.bulletin.utilities.ThemeUtils import com.bulletin.utilities.ViewUtil import com.example.bulletin.databinding.ActivityMainBinding +import com.wrx.wazirx.views.bulletin.model.Media class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickListener { @@ -52,9 +54,6 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis ThemeUtils.applyThemeDrawable(binding.headerView, R.attr.main_navigation_bg) -// viewBinding.emojiButton.strokeWidth = 2 -// viewBinding.emojiButton.setStrokeColor(ColorStateList.valueOf(ThemeUtils.getAttributedColor(R.attr.cell_separator_1, viewBinding.emojiButton.context))) - } fun recyclerViewSetUp(){ @@ -91,17 +90,27 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis val items = BulletinSdk().showUnseenBulletin(4) - val title = Title("Version " + "1.21","In this update","loreum ipsum loreum ipsum loreum ipsum") + val title = Title("Version " + "1.21","In this update","loreum ipsum loreum ipsum loreum ipsum loreum ipsum loreum ipsum") + + val message = Message(Message.MessageType.HTML,"<header>\n" + + " <h1>Harry Potter's House</h1>\n" + + " <p class=\"address\">\n" + + "Privet Drive, 4<br>Little Whinging<br>Surrey<br>England<br>Great Britain\n" + + " </p>\n" + + "</header>") - val message = Message(Message.MessageType.TEXT,"Vestibulum id ligula porta felis euismod semper.") + val size = Size(700,500) + val media = Media(Media.MediaType.IMAGE,"https://media.istockphoto.com/id/517188688/photo/mountain-landscape.jpg?s=612x612&w=0&k=20&c=A63koPKaCyIwQWOTFBRWXj_PwCrR4cEoOw2S9Q7yVl8=",size) - val bullet = Bullet(Bullet.BulletType.UNICODE,"U+0031",null) + val bullet = Bullet(Bullet.BulletType.UNICODE,"\uD83D\uDE01",null) //"\u00F6" //"✋" val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") val bulletPoint2 = BulletPoint(bullet,"Justo Condimentum","Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.") - return arrayListOf(title, message, bulletPoint, bulletPoint2) + val actionButton = ActionButton("Take me to Crypto Gifts",null) + + return arrayListOf(title, message, media, bulletPoint, bulletPoint2, actionButton) } @@ -113,10 +122,12 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis } override fun formDidTriggerEvent( - eventType: BulletinItem.ItemType, + eventType: BulletinItem.EventType, baseItem: BulletinItem, index: Int ): Boolean { return true } + + } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/extension/ImageExtension.kt b/app/src/main/java/com/bulletin/extension/ImageExtension.kt index 21de049..ac0906e 100644 --- a/app/src/main/java/com/bulletin/extension/ImageExtension.kt +++ b/app/src/main/java/com/bulletin/extension/ImageExtension.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.view.View +import android.widget.ImageView import com.bumptech.glide.Glide import com.bumptech.glide.RequestBuilder import com.bumptech.glide.load.Transformation @@ -11,7 +12,7 @@ import com.bumptech.glide.request.target.CustomTarget import com.example.bulletin.R -fun View.loadImageWithUrl( +fun ImageView.loadImageWithUrl( context: Context, url: String, transform: Transformation<Bitmap?>?, diff --git a/app/src/main/java/com/bulletin/models/BulletinItem.kt b/app/src/main/java/com/bulletin/models/BulletinItem.kt index 2c467e7..8d4d51e 100644 --- a/app/src/main/java/com/bulletin/models/BulletinItem.kt +++ b/app/src/main/java/com/bulletin/models/BulletinItem.kt @@ -15,6 +15,10 @@ abstract class BulletinItem() { ACTION_BUTTON("actionButton"), } + enum class EventType(val value: String) { + TRIGGER_ACTION("triggerAppAction"), + } + // MARK: - Variables var type: ItemType = ItemType.UNDEFINED diff --git a/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt index 4952964..5208ff8 100644 --- a/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt +++ b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt @@ -2,6 +2,9 @@ package com.bulletin.utilities import android.content.Context import android.util.DisplayMetrics +import android.util.TypedValue +import com.example.bulletin.R + object DeviceUtil { diff --git a/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt b/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt index 302e541..b054e49 100644 --- a/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt +++ b/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt @@ -57,39 +57,4 @@ object ThemeUtils { return drawable } - fun applyThemeStateDrawable(view: View, @AttrRes attrs: IntArray, states: Array<IntArray>) { - val colors = IntArray(attrs.size) - for (i in attrs.indices) { - colors[i] = getAttributedColor(attrs[i], view.context) - } - val drawable = view.background as StateListDrawable - DrawableCompat.setTintList(drawable, ColorStateList(states, colors)) - view.setBackgroundDrawable(drawable) - } - - fun getHexStringofAttrs( - @AttrRes attr: Int, - context: Context - ): String { - val color = getAttributedColor(attr, context) - return String.format("#%06X", 0xFFFFFF and color) - } - - fun createGradientDrawable( - colorArr: Array<String?>, - orientation: GradientDrawable.Orientation?, - cornerRadius: Float - ): GradientDrawable { - val colors = IntArray(colorArr.size) - for (i in colorArr.indices) { - colors[i] = Color.parseColor(colorArr[i]) - } - - //create a new gradient color - val gd = GradientDrawable( - orientation, colors - ) - gd.cornerRadius = cornerRadius - return gd - } } diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt index e326142..4494ce4 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt @@ -1,11 +1,14 @@ package com.bulletin.viewHolder +import android.content.res.ColorStateList import android.os.Build import android.view.View import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.ActionButton +import com.bulletin.models.BulletinItem import com.bulletin.utilities.DeviceUtil import com.bulletin.utilities.ThemeUtils +import com.bulletin.utilities.ViewUtil import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionActionButtonBinding @@ -26,6 +29,12 @@ class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionActio viewBinding.actionButton.setVisibility(View.GONE) } + viewBinding.actionButton.setOnClickListener { + _listener?.formDidTriggerEvent(BulletinItem.EventType.TRIGGER_ACTION, item, adapterPosition) + } + + ViewUtil.addBounceEffect(viewBinding.actionButton) + } override fun getBackgroundView(): View? { @@ -39,12 +48,15 @@ class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionActio if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { viewBinding.actionButton.setTextAppearance(R.style.base_semi_bold) } else { - viewBinding.actionButton.setTextAppearance(viewBinding.actionButton.context, R.style.large_bold) + viewBinding.actionButton.setTextAppearance(viewBinding.actionButton.context, R.style.base_semi_bold) } viewBinding.actionButton.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.actionButton.context)) viewBinding.actionButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, viewBinding.actionButton.context)) - ThemeUtils.applyThemeBorder(viewBinding.actionButton,R.attr.main_bg_surface_alt, - DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 1f)) + // ThemeUtils.applyThemeBorder(viewBinding.actionButton,R.attr.brand_bg_primary, +// DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 3f)) + + viewBinding.actionButton.strokeWidth = DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 1f) + viewBinding.actionButton.setStrokeColor(ColorStateList.valueOf(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, viewBinding.actionButton.context))) } // endregion diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt index 7fc989e..fcf406a 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt @@ -1,10 +1,18 @@ package com.bulletin.viewHolder +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable import android.os.Build import android.view.View +import androidx.core.text.HtmlCompat import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.extension.loadImageWithUrl +import com.bulletin.models.Bullet import com.bulletin.models.BulletPoint +import com.bulletin.models.Message import com.bulletin.utilities.ThemeUtils +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormBulletPointBinding @@ -16,6 +24,57 @@ class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormBulletPointBi override fun bind(item: BulletPoint) { super.bind(item) + viewBinding.bulletImageView.setVisibility(View.GONE) + viewBinding.bulletLabel.setVisibility(View.GONE) + + when(item.bullet?.bulletType) { + Bullet.BulletType.UNICODE -> { + + val unicode = item.bullet?.unicode + if (!unicode.isNullOrBlank()) { + val fromHtml = HtmlCompat.fromHtml(unicode, HtmlCompat.FROM_HTML_MODE_COMPACT) + viewBinding.bulletLabel.text = fromHtml + viewBinding.bulletLabel.setVisibility(View.VISIBLE) + } else { + viewBinding.bulletLabel.text = "" + viewBinding.bulletLabel.setVisibility(View.GONE) + } + + } + Bullet.BulletType.IMAGE -> { + (item.bullet?.imageUrl)?.let { + + viewBinding.bulletImageView.loadImageWithUrl( + viewBinding.bulletImageView.getContext(), + it, + null, + object : CustomTarget<Drawable?>() { + + override fun onResourceReady( + resource: Drawable, + transition: Transition<in Drawable?>? + ) { + val bitmap = (resource as BitmapDrawable).bitmap + viewBinding.bulletImageView.setImageBitmap(bitmap) + viewBinding.bulletImageView.setVisibility(View.VISIBLE) + } + + override fun onLoadFailed(errorDrawable: Drawable?) { + print("onLoadFailed") + } + override fun onLoadCleared(placeholder: Drawable?) { + print("onLoadCleared") + } + + }) + } + } + else -> { + viewBinding.bulletLabel.text = "" + viewBinding.bulletLabel.setVisibility(View.GONE) + } + } + // Set Pre Title if (!item.titleText.isNullOrBlank()) { viewBinding.titleLabel.text = item.titleText diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt index 818499d..9d6c411 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -2,11 +2,15 @@ package com.bulletin.viewHolder import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable +import android.util.TypedValue import android.view.View import com.bulletin.FormRecyclerViewAdapter import com.bulletin.extension.loadImageWithUrl +import com.bulletin.utilities.DeviceUtil +import com.bulletin.utilities.ThemeUtils import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition +import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionMediaBinding import com.wrx.wazirx.views.bulletin.model.Media @@ -20,11 +24,21 @@ class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionMediaBinding // Set Image viewBinding.bannerImageView.setVisibility(View.GONE) - if(!item.url.isNullOrBlank()) { + + item.size?.let { + viewBinding.bannerImageView.layoutParams.width = it.width + // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.width.toFloat()).toInt() + viewBinding.bannerImageView.layoutParams.height = it.height + // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.height.toFloat()).toInt() + } + + viewBinding.bannerImageView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_brand_primary, viewBinding.bannerImageView.context)) + + (item.url)?.let { viewBinding.bannerImageView.loadImageWithUrl( viewBinding.bannerImageView.getContext(), - item.url, + it, null, object : CustomTarget<Drawable?>() { @@ -37,7 +51,13 @@ class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionMediaBinding viewBinding.bannerImageView.setVisibility(View.VISIBLE) } - override fun onLoadCleared(placeholder: Drawable?) {} + override fun onLoadFailed(errorDrawable: Drawable?) { + print("onLoadFailed") + } + override fun onLoadCleared(placeholder: Drawable?) { + print("onLoadCleared") + } + }) } diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt index 31ce07a..54021c7 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt @@ -1,7 +1,9 @@ package com.bulletin.viewHolder import android.os.Build +import android.text.Html import android.view.View +import androidx.core.text.HtmlCompat import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.Message import com.bulletin.utilities.ThemeUtils @@ -17,11 +19,13 @@ class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionMessageBin super.bind(item) + when(item.messageType) { Message.MessageType.HTML -> { // Set Subttitle if (!item.text.isNullOrBlank()) { - viewBinding.messageLabel.text = item.text + val fromHtml = HtmlCompat.fromHtml(item.text, HtmlCompat.FROM_HTML_MODE_COMPACT) + viewBinding.messageLabel.text = fromHtml viewBinding.messageLabel.setVisibility(View.VISIBLE) } else { viewBinding.messageLabel.text = "" @@ -55,12 +59,12 @@ class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionMessageBin // Set Default Properties if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewBinding.messageLabel.setTextAppearance(R.style.base_semi_bold) + viewBinding.messageLabel.setTextAppearance(R.style.base_regular) } else { - viewBinding.messageLabel.setTextAppearance(viewBinding.messageLabel.context, R.style.large_bold) + viewBinding.messageLabel.setTextAppearance(viewBinding.messageLabel.context, R.style.base_regular) } - viewBinding.messageLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.messageLabel.context)) + viewBinding.messageLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.messageLabel.context)) } // endregion diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt index 9176a46..9e1310e 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt @@ -58,18 +58,18 @@ class FormSectionTitleViewHolder(val viewBinding : LayoutFormSectionTitleBinding // Set Default Properties if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewBinding.preTitleLabel.setTextAppearance(R.style.base_semi_bold) - viewBinding.titleLabel.setTextAppearance(R.style.base_semi_bold) - viewBinding.subtitleLabel.setTextAppearance(R.style.base_semi_bold) + viewBinding.preTitleLabel.setTextAppearance(R.style.small_medium) + viewBinding.titleLabel.setTextAppearance(R.style.heading_4_semi_bold) + viewBinding.subtitleLabel.setTextAppearance(R.style.base_regular) } else { - viewBinding.preTitleLabel.setTextAppearance(viewBinding.preTitleLabel.context, R.style.large_bold) - viewBinding.titleLabel.setTextAppearance(viewBinding.titleLabel.context, R.style.large_bold) - viewBinding.subtitleLabel.setTextAppearance(viewBinding.subtitleLabel.context, R.style.large_bold) + viewBinding.preTitleLabel.setTextAppearance(viewBinding.preTitleLabel.context, R.style.small_medium) + viewBinding.titleLabel.setTextAppearance(viewBinding.titleLabel.context, R.style.heading_4_semi_bold) + viewBinding.subtitleLabel.setTextAppearance(viewBinding.subtitleLabel.context, R.style.base_regular) } - viewBinding.preTitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.preTitleLabel.context)) - viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.titleLabel.context)) - viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.subtitleLabel.context)) + viewBinding.preTitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.success_text_primary, viewBinding.preTitleLabel.context)) + viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.titleLabel.context)) + viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.subtitleLabel.context)) } // endregion diff --git a/app/src/main/res/layout/layout_form_bullet_point.xml b/app/src/main/res/layout/layout_form_bullet_point.xml index b1c4838..2d7b926 100644 --- a/app/src/main/res/layout/layout_form_bullet_point.xml +++ b/app/src/main/res/layout/layout_form_bullet_point.xml @@ -5,52 +5,70 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/bullet_container" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="20dp" + android:layout_marginTop="19dp" + app:layout_constraintEnd_toStartOf="@+id/item_container" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + <TextView - android:id="@+id/version_title" + android:id="@+id/bullet_label" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="20dp" - android:layout_marginTop="16dp" android:textColor="?attr/main_text_primary" android:textSize="14sp" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + tools:text="Name" /> + + <ImageView + android:id="@+id/bullet_image_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" tools:text="Name" /> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/item_text_container" + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/item_container" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="10dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="20dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/bullet_container" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:id="@+id/title_label" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:layout_marginEnd="20dp" - android:layout_marginStart="10dp" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" + app:layout_constraintBottom_toTopOf="@id/subtitle_label" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + tools:text="Name" /> + + <TextView + android:id="@+id/subtitle_label" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="2dp" + android:textColor="?attr/main_text_primary" + android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/version_title"> - - <TextView - android:id="@+id/title_label" - android:layout_width="0dp" - android:layout_height="wrap_content" - tools:text="Name" - android:textColor="?attr/main_text_primary" - android:textSize="14sp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintBottom_toTopOf="@id/subtitle_label"/> - - <TextView - android:id="@+id/subtitle_label" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginTop="2dp" - android:textColor="?attr/main_text_primary" - android:textSize="14sp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="@id/title_label" - app:layout_constraintTop_toBottomOf="@id/title_label" - tools:text="Subtitle" /> - </androidx.constraintlayout.widget.ConstraintLayout> + app:layout_constraintStart_toStartOf="@id/title_label" + app:layout_constraintTop_toBottomOf="@id/title_label" + tools:text="Subtitle" /> + </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_section_action_button.xml b/app/src/main/res/layout/layout_form_section_action_button.xml index 055204c..068902a 100644 --- a/app/src/main/res/layout/layout_form_section_action_button.xml +++ b/app/src/main/res/layout/layout_form_section_action_button.xml @@ -5,20 +5,22 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - <Button + <com.google.android.material.button.MaterialButton android:id="@+id/action_button" - style="@style/Widget.MaterialComponents.Button.UnelevatedButton" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:layout_marginStart="16dp" - android:layout_marginEnd="16dp" + android:layout_marginStart="20dp" + android:layout_marginEnd="20dp" android:layout_marginBottom="16dp" + android:textAllCaps="false" android:insetTop="0dp" + android:insetRight="0dp" android:insetBottom="0dp" - android:textAllCaps="false" + android:insetLeft="0dp" android:textSize="18sp" - app:cornerRadius="20dp" + android:stateListAnimator="@null" + app:cornerRadius="4dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/layout_form_section_media.xml b/app/src/main/res/layout/layout_form_section_media.xml index 8c66537..f762ce0 100644 --- a/app/src/main/res/layout/layout_form_section_media.xml +++ b/app/src/main/res/layout/layout_form_section_media.xml @@ -6,20 +6,22 @@ <ImageView android:id="@+id/banner_image_view" - android:layout_width="match_parent" - android:layout_height="0dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginTop="16dp" android:layout_marginRight="20dp" android:scaleType="centerInside" - app:layout_constraintBottom_toBottomOf="@id/horiz_guideline_35" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <androidx.constraintlayout.widget.Guideline - android:id="@+id/horiz_guideline_35" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - app:layout_constraintGuide_percent="0.35" /> +<!-- <androidx.constraintlayout.widget.Guideline--> +<!-- android:id="@+id/horiz_guideline_35"--> +<!-- android:layout_width="wrap_content"--> +<!-- android:layout_height="wrap_content"--> +<!-- android:orientation="horizontal"--> +<!-- app:layout_constraintGuide_percent="0.35" />--> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 56460a0..7fa541b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,6 +5,12 @@ <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> + <style name="default_button"> + <item name="android:insetTop">0dp</item> + <item name="android:insetBottom">0dp</item> + <item name="android:insetLeft">0dp</item> + <item name="android:insetRight">0dp</item> + </style> <style name="heading_1_bold"> <item name="android:fontFamily">@font/ibm_plex_sans_bold</item> From 379ea77853eea51d8fd3e65293cbeceece7bf890 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Mon, 20 Mar 2023 21:09:00 +0530 Subject: [PATCH 09/14] update the model --- .../main/java/com/bulletin/MainActivity.kt | 23 ++++++++-------- .../com/bulletin/extension/ImageExtension.kt | 1 - .../com/bulletin/extension/JsonExtension.kt | 27 ------------------- .../java/com/bulletin/models/ActionButton.kt | 6 ----- .../java/com/bulletin/models/BulletPoint.kt | 14 ---------- .../java/com/bulletin/models/BulletinItem.kt | 1 - .../com/bulletin/models/BulletinVersion.kt | 3 +-- .../main/java/com/bulletin/models/Media.kt | 13 +-------- .../main/java/com/bulletin/models/Message.kt | 13 --------- .../main/java/com/bulletin/models/PreTitle.kt | 6 ----- .../main/java/com/bulletin/models/Title.kt | 2 +- .../main/java/com/bulletin/models/Version.kt | 5 ---- .../viewHolder/FormSectionMediaViewHolder.kt | 2 -- .../main/res/drawable/header_background.xml | 1 - 14 files changed, 15 insertions(+), 102 deletions(-) delete mode 100644 app/src/main/java/com/bulletin/extension/JsonExtension.kt delete mode 100644 app/src/main/java/com/bulletin/models/PreTitle.kt diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt index 1ea3f58..664d54c 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -53,6 +53,7 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis binding.goItButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, binding.goItButton.context)) ThemeUtils.applyThemeDrawable(binding.headerView, R.attr.main_navigation_bg) + ThemeUtils.applyThemeDrawable(binding.mainBackgroundView, R.attr.main_bg_surface_alt) } @@ -99,18 +100,18 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis " </p>\n" + "</header>") - val size = Size(700,500) - val media = Media(Media.MediaType.IMAGE,"https://media.istockphoto.com/id/517188688/photo/mountain-landscape.jpg?s=612x612&w=0&k=20&c=A63koPKaCyIwQWOTFBRWXj_PwCrR4cEoOw2S9Q7yVl8=",size) - - val bullet = Bullet(Bullet.BulletType.UNICODE,"\uD83D\uDE01",null) //"\u00F6" //"✋" - - val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") - - val bulletPoint2 = BulletPoint(bullet,"Justo Condimentum","Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.") - - val actionButton = ActionButton("Take me to Crypto Gifts",null) +// val size = Size(700,500) +// val media = Media(Media.MediaType.IMAGE,"https://media.istockphoto.com/id/517188688/photo/mountain-landscape.jpg?s=612x612&w=0&k=20&c=A63koPKaCyIwQWOTFBRWXj_PwCrR4cEoOw2S9Q7yVl8=",null) +// +// val bullet = Bullet(Bullet.BulletType.UNICODE,"\uD83D\uDE01",null) //"\u00F6" //"✋" +// +// val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") +// +// val bulletPoint2 = BulletPoint(bullet,"Justo Condimentum","Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.") +// +// val actionButton = ActionButton("Take me to Crypto Gifts",null) - return arrayListOf(title, message, media, bulletPoint, bulletPoint2, actionButton) + return arrayListOf(title, message) // media, bulletPoint, bulletPoint2, actionButton } diff --git a/app/src/main/java/com/bulletin/extension/ImageExtension.kt b/app/src/main/java/com/bulletin/extension/ImageExtension.kt index ac0906e..bba0a6f 100644 --- a/app/src/main/java/com/bulletin/extension/ImageExtension.kt +++ b/app/src/main/java/com/bulletin/extension/ImageExtension.kt @@ -3,7 +3,6 @@ package com.bulletin.extension import android.content.Context import android.graphics.Bitmap import android.graphics.drawable.Drawable -import android.view.View import android.widget.ImageView import com.bumptech.glide.Glide import com.bumptech.glide.RequestBuilder diff --git a/app/src/main/java/com/bulletin/extension/JsonExtension.kt b/app/src/main/java/com/bulletin/extension/JsonExtension.kt deleted file mode 100644 index 2937ed9..0000000 --- a/app/src/main/java/com/bulletin/extension/JsonExtension.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.bulletin.extension - -import com.google.gson.Gson - -fun String.toJsonObj() : Any? { - return toJsonObj(Any::class.java) -} - -fun <T> String.toJsonObj(classOfT : Class<T>) : T? { - try { - return Gson().fromJson(this, classOfT) - } catch (e : Throwable) { - print("Json object conversion failed: $e") - } - return null -} - -fun Any.toJsonString() : String? { - try { - return Gson().toJson(this) - } catch (e : Throwable) { - print("Json string conversion failed: $e") - } - return null -} - - diff --git a/app/src/main/java/com/bulletin/models/ActionButton.kt b/app/src/main/java/com/bulletin/models/ActionButton.kt index fe8bd33..3f7103b 100644 --- a/app/src/main/java/com/bulletin/models/ActionButton.kt +++ b/app/src/main/java/com/bulletin/models/ActionButton.kt @@ -1,11 +1,5 @@ package com.bulletin.models -import com.google.gson.annotations.SerializedName - -//data class ActionButton(val title: String) : BulletinItem() { -// @SerializedName("clickPayload") -// var clickPayload: Any? = null -//} data class ActionButton(val title: String?, var clickPayload: Any?) : BulletinItem() { diff --git a/app/src/main/java/com/bulletin/models/BulletPoint.kt b/app/src/main/java/com/bulletin/models/BulletPoint.kt index aadf94d..3b48538 100644 --- a/app/src/main/java/com/bulletin/models/BulletPoint.kt +++ b/app/src/main/java/com/bulletin/models/BulletPoint.kt @@ -1,18 +1,5 @@ package com.bulletin.models -import com.google.gson.annotations.SerializedName - -//data class BulletPoint(var bulletType: BulletType) : BulletinItem() { -// enum class BulletType { -// UNICODE, -// IMAGE; -// } -// @SerializedName("title") -// var title: String? = null; -// @SerializedName("subtitle") -// var subtitle: String? = null -//} - data class BulletPoint(var bullet: Bullet?, var titleText: String?, var subTitleText: String?) : BulletinItem() { // region Init Methods @@ -89,5 +76,4 @@ data class Bullet(val bulletType: BulletType?, val unicode: String?, val imageUr } } - } diff --git a/app/src/main/java/com/bulletin/models/BulletinItem.kt b/app/src/main/java/com/bulletin/models/BulletinItem.kt index 8d4d51e..29b71d9 100644 --- a/app/src/main/java/com/bulletin/models/BulletinItem.kt +++ b/app/src/main/java/com/bulletin/models/BulletinItem.kt @@ -28,7 +28,6 @@ abstract class BulletinItem() { val mediaRuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of( BulletinItem::class.java, "type" ) - mediaRuntimeTypeAdapterFactory.registerSubtype(PreTitle::class.java, "preTitle") mediaRuntimeTypeAdapterFactory.registerSubtype(Title::class.java, "title") mediaRuntimeTypeAdapterFactory.registerSubtype(Message::class.java, "message") mediaRuntimeTypeAdapterFactory.registerSubtype(Media::class.java, "media") diff --git a/app/src/main/java/com/bulletin/models/BulletinVersion.kt b/app/src/main/java/com/bulletin/models/BulletinVersion.kt index e3998da..06010e4 100644 --- a/app/src/main/java/com/bulletin/models/BulletinVersion.kt +++ b/app/src/main/java/com/bulletin/models/BulletinVersion.kt @@ -9,7 +9,6 @@ data class BulletinVersion(val versionNumber: String, val items: MutableList<Bul Comparator { t2: BulletinVersion, t1: BulletinVersion -> VersionUtil.versionCompare(t1.versionNumber, t2.versionNumber) } - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/models/Media.kt b/app/src/main/java/com/bulletin/models/Media.kt index 64836d1..a0844df 100644 --- a/app/src/main/java/com/bulletin/models/Media.kt +++ b/app/src/main/java/com/bulletin/models/Media.kt @@ -7,14 +7,7 @@ import com.bulletin.utilities.RuntimeTypeAdapterFactory import com.google.gson.annotations.SerializedName -open class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, val size: Size?) : BulletinItem() { - -// @SerializedName("imageType") -// lateinit var imageType: String -// @SerializedName("size") -// var size: Int = 0 -// @SerializedName("url") -// lateinit var url: String +data class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, val size: Size?) : BulletinItem() { // region Init Methods init { @@ -60,7 +53,3 @@ open class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, v } } } - -//class ImageMedia(val versionNumber :String) : Media() { -// -//} diff --git a/app/src/main/java/com/bulletin/models/Message.kt b/app/src/main/java/com/bulletin/models/Message.kt index 763f6c2..620990f 100644 --- a/app/src/main/java/com/bulletin/models/Message.kt +++ b/app/src/main/java/com/bulletin/models/Message.kt @@ -1,18 +1,5 @@ package com.bulletin.models -import com.google.gson.annotations.SerializedName - -//data class Message(val message: String) : BulletinItem() { -// -// enum class MessageType(type: String) { -// HTML("html"), -// TEXT("text"); -// } -// -// @SerializedName("imageType") -// var messageType: MessageType? = null -// -//} data class Message(var messageType: MessageType = MessageType.TEXT, val text: String?) : BulletinItem() { diff --git a/app/src/main/java/com/bulletin/models/PreTitle.kt b/app/src/main/java/com/bulletin/models/PreTitle.kt deleted file mode 100644 index bf4c3de..0000000 --- a/app/src/main/java/com/bulletin/models/PreTitle.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.bulletin.models - - -data class PreTitle(val text: String) : BulletinItem() { - -} diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt index 4b835b7..7789e46 100644 --- a/app/src/main/java/com/bulletin/models/Title.kt +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -32,7 +32,7 @@ data class Title(val preTitleText: String?, val titleText: String?, val subTitle } -//class Title() : BulletinItem() { +//class Title1() : BulletinItem() { // // var preTitleText: String? = null // var titleText: String? = null diff --git a/app/src/main/java/com/bulletin/models/Version.kt b/app/src/main/java/com/bulletin/models/Version.kt index 3ae40be..0968ff1 100644 --- a/app/src/main/java/com/bulletin/models/Version.kt +++ b/app/src/main/java/com/bulletin/models/Version.kt @@ -2,11 +2,6 @@ package com.bulletin.models import com.bulletin.extension.validVersion -//data class Version(val versionNumber: String) { -// lateinit var version :String -// -//} - data class Version(val version: String) { companion object { diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt index 9d6c411..fc6c083 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -32,8 +32,6 @@ class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionMediaBinding // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.height.toFloat()).toInt() } - viewBinding.bannerImageView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_brand_primary, viewBinding.bannerImageView.context)) - (item.url)?.let { viewBinding.bannerImageView.loadImageWithUrl( diff --git a/app/src/main/res/drawable/header_background.xml b/app/src/main/res/drawable/header_background.xml index 975c8eb..afbb247 100644 --- a/app/src/main/res/drawable/header_background.xml +++ b/app/src/main/res/drawable/header_background.xml @@ -3,5 +3,4 @@ <corners android:topLeftRadius="10dp" android:topRightRadius="10dp" /> - <solid android:color="?attr/main_navigation_bg" /> </shape> From 8feffe86525863d32f6153d182eafe9901d2e957 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Mon, 20 Mar 2023 22:44:57 +0530 Subject: [PATCH 10/14] remove unwanted code --- .../main/java/com/bulletin/MainActivity.kt | 4 +- .../main/java/com/bulletin/models/Title.kt | 40 ------------------- .../bulletin/utilities/AppStorageHelper.kt | 33 --------------- .../FormSectionBulletPointViewHolder.kt | 4 +- .../viewHolder/FormSectionMediaViewHolder.kt | 7 +++- app/src/main/res/drawable/view_background.xml | 5 +++ .../res/layout/layout_form_bullet_point.xml | 2 +- .../res/layout/layout_form_section_media.xml | 12 ++---- 8 files changed, 18 insertions(+), 89 deletions(-) create mode 100644 app/src/main/res/drawable/view_background.xml diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt index 664d54c..3e7603c 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -101,9 +101,9 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis "</header>") // val size = Size(700,500) -// val media = Media(Media.MediaType.IMAGE,"https://media.istockphoto.com/id/517188688/photo/mountain-landscape.jpg?s=612x612&w=0&k=20&c=A63koPKaCyIwQWOTFBRWXj_PwCrR4cEoOw2S9Q7yVl8=",null) +// val media = Media(Media.MediaType.IMAGE,"https://media.wazirx.com/test_resources/crypto_gifts.png",null) // -// val bullet = Bullet(Bullet.BulletType.UNICODE,"\uD83D\uDE01",null) //"\u00F6" //"✋" +// val bullet = Bullet(Bullet.BulletType.IMAGE,"\uD83D\uDE01","https://s3.amazonaws.com/p.hellopye.com/app_assets/dashboard_deposit/3x.png") //"\u00F6" //"✋" // // val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") // diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt index 7789e46..2d3b6c0 100644 --- a/app/src/main/java/com/bulletin/models/Title.kt +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -1,10 +1,5 @@ package com.bulletin.models -import com.bulletin.extension.validVersion - -//data class Title( val text: String) : BulletinItem() { -// -//} data class Title(val preTitleText: String?, val titleText: String?, val subTitleText: String?) : BulletinItem() { @@ -30,38 +25,3 @@ data class Title(val preTitleText: String?, val titleText: String?, val subTitle } } } - - -//class Title1() : BulletinItem() { -// -// var preTitleText: String? = null -// var titleText: String? = null -// var subTitleText: String? = null -// -// -// // region Init Methods -// init { -// type = ItemType.TITLE -// } -// -// companion object { -// -// fun init(attributes: Map<String, Any>): Title? { -// -// // init the object -// val obj = Title() -// -// // Set PreTitle -// obj.preTitleText = (attributes["preTitleText"] as? String) ?: return null -// -// // Set Title -// obj.titleText = (attributes["titleText"] as? String) ?: return null -// -// // Set SubTitle -// obj.subTitleText = (attributes["subTitleText"] as? String) ?: return null -// -// return obj -// -// } -// } -//} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt index a5d5cac..ae97daf 100644 --- a/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt +++ b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt @@ -4,39 +4,6 @@ import android.content.Context import android.content.SharedPreferences import com.bulletin.BulletinApp.Companion.applicationContext -//object AppStorageHelper { -// private const val SHARED_PREFS_NAME = "Bulletin_Shared_Prefs" -// private const val SHARED_PREFS_PARAMS_LATEST_APP_VERSION = "latest_app_version" -// -// // App version -// var lastAppVersion: String? -// get() { -// return if (AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] == null) { -// "" -// } else { -// AppStorageHelper[SHARED_PREFS_PARAMS_LATEST_APP_VERSION] -// } -// } -// set(value) { -// save(SHARED_PREFS_PARAMS_LATEST_APP_VERSION, value) -// } -// -// //region Shared Prefs methods -// private val sharedPreferences: SharedPreferences -// get() = applicationContext.getSharedPreferences( -// SHARED_PREFS_NAME, -// Context.MODE_PRIVATE -// ) -// -// public fun save(key: String, value: String?) { -// sharedPreferences.edit().putString(key, value).apply() -// } -// -// public operator fun get(key: String): String? { -// return sharedPreferences.getString(key, null) -// } //endregion -//} - object AppStorageHelper { private const val SHARED_PREFS_NAME = "Bulletin_Shared_Prefs" diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt index fcf406a..3d261f9 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt @@ -56,6 +56,7 @@ class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormBulletPointBi ) { val bitmap = (resource as BitmapDrawable).bitmap viewBinding.bulletImageView.setImageBitmap(bitmap) + viewBinding.bulletLabel.setVisibility(View.GONE) viewBinding.bulletImageView.setVisibility(View.VISIBLE) } @@ -70,8 +71,7 @@ class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormBulletPointBi } } else -> { - viewBinding.bulletLabel.text = "" - viewBinding.bulletLabel.setVisibility(View.GONE) + } } diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt index fc6c083..60b64fb 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -25,10 +25,13 @@ class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionMediaBinding // Set Image viewBinding.bannerImageView.setVisibility(View.GONE) + // viewBinding.bannerImageView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, viewBinding.bannerImageView.context)) + + item.size?.let { - viewBinding.bannerImageView.layoutParams.width = it.width + // viewBinding.bannerImageView.layoutParams.width = it.width // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.width.toFloat()).toInt() - viewBinding.bannerImageView.layoutParams.height = it.height + // viewBinding.bannerImageView.layoutParams.height = it.height // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.height.toFloat()).toInt() } diff --git a/app/src/main/res/drawable/view_background.xml b/app/src/main/res/drawable/view_background.xml new file mode 100644 index 0000000..783b849 --- /dev/null +++ b/app/src/main/res/drawable/view_background.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <corners + android:radius="10dp" /> +</shape> diff --git a/app/src/main/res/layout/layout_form_bullet_point.xml b/app/src/main/res/layout/layout_form_bullet_point.xml index 2d7b926..290fbcf 100644 --- a/app/src/main/res/layout/layout_form_bullet_point.xml +++ b/app/src/main/res/layout/layout_form_bullet_point.xml @@ -10,7 +10,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="20dp" - android:layout_marginTop="19dp" + android:layout_marginTop="17dp" app:layout_constraintEnd_toStartOf="@+id/item_container" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> diff --git a/app/src/main/res/layout/layout_form_section_media.xml b/app/src/main/res/layout/layout_form_section_media.xml index f762ce0..e24d801 100644 --- a/app/src/main/res/layout/layout_form_section_media.xml +++ b/app/src/main/res/layout/layout_form_section_media.xml @@ -6,22 +6,16 @@ <ImageView android:id="@+id/banner_image_view" - android:layout_width="wrap_content" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginTop="16dp" android:layout_marginRight="20dp" - android:scaleType="centerInside" + android:layout_marginBottom="0dp" + android:adjustViewBounds="true" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" /> -<!-- <androidx.constraintlayout.widget.Guideline--> -<!-- android:id="@+id/horiz_guideline_35"--> -<!-- android:layout_width="wrap_content"--> -<!-- android:layout_height="wrap_content"--> -<!-- android:orientation="horizontal"--> -<!-- app:layout_constraintGuide_percent="0.35" />--> - </androidx.constraintlayout.widget.ConstraintLayout> From ef4765dc15dae11b32f7f9c6a3484778093aa6a5 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Thu, 23 Mar 2023 08:05:32 +0530 Subject: [PATCH 11/14] Few class updated --- app/build.gradle | 4 +- .../java/com/bulletin/BulletinDataStore.kt | 110 ++++++++++++++---- app/src/main/java/com/bulletin/BulletinSdk.kt | 88 ++++++++++++-- .../main/java/com/bulletin/MainActivity.kt | 37 ++++-- .../java/com/bulletin/models/BulletinInfo.kt | 19 +++ .../java/com/bulletin/models/BulletinItem.kt | 23 +++- .../com/bulletin/models/BulletinVersion.kt | 14 --- .../main/java/com/bulletin/models/Media.kt | 2 +- .../main/java/com/bulletin/models/Version.kt | 3 +- .../java/com/bulletin/utilities/GsonHelper.kt | 30 ----- .../java/com/bulletin/utilities/ThemeUtils.kt | 31 ----- .../java/com/bulletin/utilities/ViewUtil.kt | 10 -- app/src/main/res/values/styles.xml | 9 ++ build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 15 files changed, 247 insertions(+), 139 deletions(-) create mode 100644 app/src/main/java/com/bulletin/models/BulletinInfo.kt delete mode 100644 app/src/main/java/com/bulletin/models/BulletinVersion.kt diff --git a/app/build.gradle b/app/build.gradle index de92fa5..7a31617 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,12 +5,12 @@ plugins { } android { - compileSdk 32 + compileSdk 33 defaultConfig { applicationId "com.bulletin" minSdk 21 - targetSdk 32 + targetSdk 33 versionCode 1 versionName "1.0" diff --git a/app/src/main/java/com/bulletin/BulletinDataStore.kt b/app/src/main/java/com/bulletin/BulletinDataStore.kt index b3fcea5..47cb9c4 100644 --- a/app/src/main/java/com/bulletin/BulletinDataStore.kt +++ b/app/src/main/java/com/bulletin/BulletinDataStore.kt @@ -1,27 +1,89 @@ package com.bulletin import com.bulletin.extension.lastSeenVersion +import com.bulletin.models.BulletinInfo import com.bulletin.models.BulletinItem -import com.bulletin.models.BulletinVersion import com.bulletin.models.Version import com.bulletin.utilities.AppStorageHelper import com.bulletin.utilities.VersionUtil import java.util.* -import java.util.prefs.Preferences -object BulletinDataStore { - var data: MutableList<BulletinVersion> = mutableListOf() - fun registerVersionInfo(version: String, map: HashMap<String, Any>) { - for ((key, value) in map) { +//object BulletinDataStore { +// var data: MutableList<BulletinVersion> = mutableListOf() +// fun registerVersionInfo(version: String, map: HashMap<String, Any>) { +// for ((key, value) in map) { +// +// } +// } +// +// fun registerVersionInfo(version: String, items: MutableList<BulletinItem>?) { +// if (items != null && items.isNotEmpty()) { +// data.add(BulletinVersion(version, items)) +// Collections.sort(data, BulletinVersion.descendingSort) +// } +// } +// +// +// fun getData( +// fromNewVersion: Version?, +// toOldVersion: Version?, +// limit: Int? = null +// ): MutableList<BulletinVersion> { +// val finalMap: MutableList<BulletinVersion> = mutableListOf() +// +// if (fromNewVersion == null && toOldVersion == null && limit == null) { +// return data +// } else if (fromNewVersion == null && toOldVersion == null && limit != null) { +// return finalMap.take(limit).toMutableList() +// } +// +// val sortedList = data.sortedWith(compareBy({ +// it.versionNumber +// })) +// +// for (indice in sortedList.indices) { +// +// if (indice == 0) AppStorageHelper.shared.lastSeenVersion = Version.init(sortedList[indice].versionNumber) +// if (VersionUtil.versionCompare(fromNewVersion?.version, sortedList[indice].versionNumber) >= 0) { +// finalMap.add(sortedList[indice]) +// } else if (VersionUtil.versionCompare(toOldVersion?.version, sortedList[indice].versionNumber) < 0) { +// finalMap.add(sortedList[indice]) +// } +// +// if (limit != null && finalMap.size >= limit) break +// +// } +// return finalMap +// } +//} +class BulletinDataStore { + + var data: MutableList<BulletinInfo> = mutableListOf() + private set + + fun registerVersionInfo11(version: Version, items: MutableList<HashMap<String, Any>>) { + + val bulletinItems = ArrayList<BulletinItem>() + for (itemAttributes in items) { + val bulletinItem = BulletinItem.createBulletinItem(itemAttributes) ?: return continue + bulletinItems.add(bulletinItem) } + + registerVersionInfo(version, bulletinItems) } - fun registerVersionInfo(version: String, items: MutableList<BulletinItem>?) { - if (items != null && items.isNotEmpty()) { - data.add(BulletinVersion(version, items)) - Collections.sort(data, BulletinVersion.descendingSort) + fun registerVersionInfo(version: Version, items: MutableList<BulletinItem>?) { + + if (items == null || items.isEmpty()) { + return } + + // Create Bulletin Info Object + val bulletinInfo = BulletinInfo.init(version, items) + + data.add(bulletinInfo) + Collections.sort(data, BulletinInfo.descendingSort) } @@ -29,31 +91,35 @@ object BulletinDataStore { fromNewVersion: Version?, toOldVersion: Version?, limit: Int? = null - ): MutableList<BulletinVersion> { - val finalMap: MutableList<BulletinVersion> = mutableListOf() + ): ArrayList<BulletinInfo> { + // val finalMap: MutableList<BulletinInfo> = mutableListOf() + val bulletinInfo = arrayListOf<BulletinInfo>() if (fromNewVersion == null && toOldVersion == null && limit == null) { - return data + + bulletinInfo.addAll(data) + return bulletinInfo } else if (fromNewVersion == null && toOldVersion == null && limit != null) { - return finalMap.take(limit).toMutableList() + bulletinInfo.addAll(data.take(limit)) + return bulletinInfo } val sortedList = data.sortedWith(compareBy({ - it.versionNumber + it.version.version })) for (indice in sortedList.indices) { - if (indice == 0) AppStorageHelper.shared.lastSeenVersion = Version.init(sortedList[indice].versionNumber) - if (VersionUtil.versionCompare(fromNewVersion?.version, sortedList[indice].versionNumber) >= 0) { - finalMap.add(sortedList[indice]) - } else if (VersionUtil.versionCompare(toOldVersion?.version, sortedList[indice].versionNumber) < 0) { - finalMap.add(sortedList[indice]) + if (indice == 0) AppStorageHelper.shared.lastSeenVersion = Version.init(sortedList[indice].version.version) + if (VersionUtil.versionCompare(fromNewVersion?.version, sortedList[indice].version.version) >= 0) { + bulletinInfo.add(sortedList[indice]) + } else if (VersionUtil.versionCompare(toOldVersion?.version, sortedList[indice].version.version) < 0) { + bulletinInfo.add(sortedList[indice]) } - if (limit != null && finalMap.size >= limit) break + if (limit != null && bulletinInfo.size >= limit) break } - return finalMap + return bulletinInfo } } \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/BulletinSdk.kt b/app/src/main/java/com/bulletin/BulletinSdk.kt index 4c153e9..ed8ea09 100644 --- a/app/src/main/java/com/bulletin/BulletinSdk.kt +++ b/app/src/main/java/com/bulletin/BulletinSdk.kt @@ -1,30 +1,94 @@ package com.bulletin +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.content.ContextCompat import com.bulletin.extension.lastSeenVersion -import com.bulletin.models.BulletinVersion +import com.bulletin.models.BulletinInfo import com.bulletin.utilities.AppStorageHelper +import com.example.bulletin.MainActivity -class BulletinSdk { +//enum class Appearance(val value: String) { +// DARK("dark"), +// LIGHT("light"), +// SYSTEM("system"); +//} +// +//class BulletinSdk(val theme : Appearance) { +// +// init { +// when (theme) { +// Appearance.DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) +// Appearance.LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) +// Appearance.SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) +// } +// } +// +// fun showFullBulletin() : Boolean{ +// val items = BulletinDataStore.getData(null, null) +// return showBulletin(items) +// } +// +// fun showLastBulletins(limit: Int? = 1): Boolean { +// val items = BulletinDataStore.getData(null, null, limit) +// return showBulletin(items) +// } +// +// fun showUnseenBulletin(limit: Int? = null): Boolean { +// val lastseenVersion = AppStorageHelper.shared.lastSeenVersion ?: return false +// val items = BulletinDataStore.getData(lastseenVersion, null, limit) +// return showBulletin(items) +// } +// +// fun showBulletin(item: MutableList<BulletinVersion>?): Boolean { +// if (item == null || item.isEmpty()) return false; +// +// return true +// } +// +//} - fun showFullBulletin() : Boolean{ - val items = BulletinDataStore.getData(null, null) - return showBulletin(items) +enum class Appearance(val value: String) { + DARK("dark"), + LIGHT("light"), + SYSTEM("system"); +} + +class BulletinSdk(val dataStore: BulletinDataStore, val theme : Appearance) { + + fun showFullBulletin(context: Context) : Boolean { + val items = dataStore.getData(null, null) + return showBulletin(context, items) } - fun showLastBulletins(limit: Int? = 1): Boolean { - val items = BulletinDataStore.getData(null, null, limit) - return showBulletin(items) + fun showLastBulletins(context: Context, limit: Int? = 1): Boolean { + val items = dataStore.getData(null, null, limit) + return showBulletin(context, items) } - fun showUnseenBulletin(limit: Int? = null): Boolean { + fun showUnseenBulletin(context: Context, limit: Int? = null): Boolean { val lastseenVersion = AppStorageHelper.shared.lastSeenVersion ?: return false - val items = BulletinDataStore.getData(lastseenVersion, null, limit) - return showBulletin(items) + val items = dataStore.getData(lastseenVersion, null, limit) + return showBulletin(context, items) } - fun showBulletin(item: MutableList<BulletinVersion>?): Boolean { + fun showBulletin(context: Context, item: ArrayList<BulletinInfo>?): Boolean { if (item == null || item.isEmpty()) return false; + + when (theme) { + Appearance.DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + Appearance.LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + Appearance.SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + } + + val mainIntent = Intent(context, MainActivity::class.java) + val bundle = Bundle() + bundle.putSerializable("BulletinInfo", item) + mainIntent.putExtras(bundle) + ContextCompat.startActivity(context, mainIntent, null) return true } diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt index 3e7603c..f35a343 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -1,10 +1,12 @@ package com.example.bulletin +import android.content.Intent import android.os.Build import android.os.Bundle import android.util.Size import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager +import com.bulletin.Appearance import com.bulletin.BulletinSdk import com.bulletin.FormRecyclerViewAdapter import com.bulletin.models.* @@ -18,15 +20,27 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis // region Variables private lateinit var binding: ActivityMainBinding private lateinit var formRecyclerViewAdapter: FormRecyclerViewAdapter + private var bulletinInfo: ArrayList<BulletinItem> = ArrayList() // endregion override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) + (intent.extras?.getSerializable("ABC") as? ArrayList<BulletinInfo>)?.let { + for (dict in it) { + for (bulletinfo in dict.items) { + bulletinInfo.add(bulletinfo) + } + } + + } + loadDisplayContent() updateAppearance() recyclerViewSetUp() @@ -63,7 +77,6 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis binding.listView.setLayoutManager(layoutManager) formRecyclerViewAdapter = FormRecyclerViewAdapter(setUpItems(),this) -// formRecyclerViewAdapter.setListener(this) binding.listView.setAdapter(formRecyclerViewAdapter) } @@ -88,7 +101,7 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis // BulletinDataStore.registerVersionInfo("1.1", bulletinItemListTwo) // BulletinDataStore.registerVersionInfo("1.2", bulletinItemListTwo) // - val items = BulletinSdk().showUnseenBulletin(4) +// val items = BulletinSdk().showUnseenBulletin(4) val title = Title("Version " + "1.21","In this update","loreum ipsum loreum ipsum loreum ipsum loreum ipsum loreum ipsum") @@ -100,16 +113,16 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis " </p>\n" + "</header>") -// val size = Size(700,500) -// val media = Media(Media.MediaType.IMAGE,"https://media.wazirx.com/test_resources/crypto_gifts.png",null) -// -// val bullet = Bullet(Bullet.BulletType.IMAGE,"\uD83D\uDE01","https://s3.amazonaws.com/p.hellopye.com/app_assets/dashboard_deposit/3x.png") //"\u00F6" //"✋" -// -// val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") -// -// val bulletPoint2 = BulletPoint(bullet,"Justo Condimentum","Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.") -// -// val actionButton = ActionButton("Take me to Crypto Gifts",null) + val size = Size(700,500) + val media = Media(Media.MediaType.IMAGE,"https://media.wazirx.com/test_resources/crypto_gifts.png",null) + + val bullet = Bullet(Bullet.BulletType.IMAGE,"\uD83D\uDE01","https://s3.amazonaws.com/p.hellopye.com/app_assets/dashboard_deposit/3x.png") //"\u00F6" //"✋" + + val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") + + val bulletPoint2 = BulletPoint(bullet,"Justo Condimentum","Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.") + + val actionButton = ActionButton("Take me to Crypto Gifts",null) return arrayListOf(title, message) // media, bulletPoint, bulletPoint2, actionButton diff --git a/app/src/main/java/com/bulletin/models/BulletinInfo.kt b/app/src/main/java/com/bulletin/models/BulletinInfo.kt new file mode 100644 index 0000000..6101587 --- /dev/null +++ b/app/src/main/java/com/bulletin/models/BulletinInfo.kt @@ -0,0 +1,19 @@ +package com.bulletin.models + +import com.bulletin.utilities.VersionUtil +import java.io.Serializable + +class BulletinInfo(var version: Version, var items: List<BulletinItem>) : Serializable { + + companion object { + fun init(version: Version, items: MutableList<BulletinItem>): BulletinInfo { + return BulletinInfo(version,items) + } + + var descendingSort: Comparator<BulletinInfo> = + Comparator { t2: BulletinInfo, t1: BulletinInfo -> + VersionUtil.versionCompare(t1.version.version, t2.version.version) + } + } + +} diff --git a/app/src/main/java/com/bulletin/models/BulletinItem.kt b/app/src/main/java/com/bulletin/models/BulletinItem.kt index 29b71d9..90a1441 100644 --- a/app/src/main/java/com/bulletin/models/BulletinItem.kt +++ b/app/src/main/java/com/bulletin/models/BulletinItem.kt @@ -2,8 +2,9 @@ package com.bulletin.models import com.bulletin.utilities.RuntimeTypeAdapterFactory import com.wrx.wazirx.views.bulletin.model.Media +import java.io.Serializable -abstract class BulletinItem() { +abstract class BulletinItem() : Serializable { // MARK: - Declarations enum class ItemType(val value: String) { @@ -42,6 +43,26 @@ abstract class BulletinItem() { return mediaRuntimeTypeAdapterFactory } + // It Will Return Action Card Creatd With Proper Classes + fun createBulletinItem(attributes: Map<String, Any>?): BulletinItem? { + + // Validation + val attributes = attributes ?: return null + + // Validations + val typeString = attributes["type"] as? String ?: return null + val itemType = ItemType.valueOf(typeString) ?: return null + if (itemType != ItemType.UNDEFINED) { + return null + } + + // Get Bulletin Item +// itemType.classFromString() as? BulletinItem.ItemType { +// return bulletinItem.init(attributes: attributes) +// } + return null + } + } //endregion diff --git a/app/src/main/java/com/bulletin/models/BulletinVersion.kt b/app/src/main/java/com/bulletin/models/BulletinVersion.kt deleted file mode 100644 index 06010e4..0000000 --- a/app/src/main/java/com/bulletin/models/BulletinVersion.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.bulletin.models - -import com.bulletin.utilities.VersionUtil - -data class BulletinVersion(val versionNumber: String, val items: MutableList<BulletinItem>) { - - companion object { - var descendingSort: Comparator<BulletinVersion> = - Comparator { t2: BulletinVersion, t1: BulletinVersion -> - VersionUtil.versionCompare(t1.versionNumber, t2.versionNumber) - } - } - -} diff --git a/app/src/main/java/com/bulletin/models/Media.kt b/app/src/main/java/com/bulletin/models/Media.kt index a0844df..aa84877 100644 --- a/app/src/main/java/com/bulletin/models/Media.kt +++ b/app/src/main/java/com/bulletin/models/Media.kt @@ -25,7 +25,7 @@ data class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, v val mediaRuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of( Media::class.java, "type" ) - // mediaRuntimeTypeAdapterFactory.registerSubtype(ImageMedia::class.java, "Image") + mediaRuntimeTypeAdapterFactory.registerSubtype(Media::class.java, "Image") return mediaRuntimeTypeAdapterFactory } diff --git a/app/src/main/java/com/bulletin/models/Version.kt b/app/src/main/java/com/bulletin/models/Version.kt index 0968ff1..3baba42 100644 --- a/app/src/main/java/com/bulletin/models/Version.kt +++ b/app/src/main/java/com/bulletin/models/Version.kt @@ -1,8 +1,9 @@ package com.bulletin.models import com.bulletin.extension.validVersion +import java.io.Serializable -data class Version(val version: String) { +data class Version(val version: String) : Serializable { companion object { diff --git a/app/src/main/java/com/bulletin/utilities/GsonHelper.kt b/app/src/main/java/com/bulletin/utilities/GsonHelper.kt index 812d15f..8fe3ec0 100644 --- a/app/src/main/java/com/bulletin/utilities/GsonHelper.kt +++ b/app/src/main/java/com/bulletin/utilities/GsonHelper.kt @@ -5,36 +5,6 @@ import com.google.gson.Gson import com.google.gson.GsonBuilder import com.wrx.wazirx.views.bulletin.model.Media - -//object GsonHelper { -// private var gsonBuilder: GsonBuilder? = null -// private var gsonInstance: Gson? = null -// -// private fun getGsonBuilder(): GsonBuilder { -// if (gsonBuilder == null) { -// gsonBuilder = GsonBuilder() -// setupGsonBuilder() -// } -// return gsonBuilder as GsonBuilder -// } -// -// fun getGsonInstance(): Gson? { -// if (gsonInstance == null) { -// gsonInstance = getGsonBuilder().create() -// } -// return gsonInstance -// } -// -// private fun setupGsonBuilder() { -// gsonBuilder!!.setDateFormat("yyyy-MM-dd'T'HH:mm:ss+Z") -// gsonBuilder!!.enableComplexMapKeySerialization() -// -// gsonBuilder!!.registerTypeAdapterFactory(Media.runtimeTypeAdapterFactory) -// gsonBuilder!!.registerTypeAdapterFactory(BulletinItem.runtimeTypeAdapterFactory) -// } -// -//} - object GsonHelper { private val gsonBuilder: GsonBuilder by lazy { diff --git a/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt b/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt index b054e49..69c93fa 100644 --- a/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt +++ b/app/src/main/java/com/bulletin/utilities/ThemeUtils.kt @@ -1,23 +1,16 @@ package com.bulletin.utilities import android.content.Context -import android.content.res.ColorStateList -import android.graphics.Color -import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable -import android.graphics.drawable.StateListDrawable import android.util.TypedValue import android.view.View import androidx.annotation.AttrRes import androidx.annotation.ColorInt -import androidx.core.graphics.drawable.DrawableCompat object ThemeUtils { @ColorInt fun getAttributedColor(@AttrRes attr: Int, context: Context): Int { -// val a = context.theme.obtainStyledAttributes( Appearance.valueOf(Appearance.Current.value).ordinal, intArrayOf(attr)) -// return a.getColor(0, 0) val value = TypedValue() context.theme.resolveAttribute(attr, value, true) return value.data @@ -33,28 +26,4 @@ object ThemeUtils { view.setBackgroundDrawable(drawable) } } - - fun applyThemeBorder( - view: View, - @AttrRes borderColor: Int, - borderWidth: Int - ): GradientDrawable? { - val drawable = view.background as? GradientDrawable - val color = getAttributedColor(borderColor, view.context) - if (color != 0) { - drawable?.setStroke(borderWidth, color) - } - return drawable - } - - fun applyThemeDrawable(drawable: Drawable, context: Context, @AttrRes attr: Int): Drawable { - val color = getAttributedColor(attr, context) - if (color != 0) { - if (drawable is GradientDrawable) { - drawable.setColor(color) - } - } - return drawable - } - } diff --git a/app/src/main/java/com/bulletin/utilities/ViewUtil.kt b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt index f080703..bb24836 100644 --- a/app/src/main/java/com/bulletin/utilities/ViewUtil.kt +++ b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt @@ -16,16 +16,6 @@ import android.widget.TextView object ViewUtil { - @SuppressLint("ClickableViewAccessibility") - fun addBounceEffectListener(view: View, touchListener: TouchListener) { - view.setOnTouchListener { v: View, event: MotionEvent -> - onButtonTouchListener( - v, - event, - touchListener - ) - } - } @SuppressLint("ClickableViewAccessibility") fun addBounceEffect(view: View) { diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 7fa541b..e759221 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,6 +5,15 @@ <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> + <style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar"> + <item name="android:windowIsTranslucent">true</item> + <item name="android:windowFullscreen">true</item> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:windowContentOverlay">@null</item> + <item name="android:windowNoTitle">true</item> + <item name="android:backgroundDimEnabled">false</item> + </style> + <style name="default_button"> <item name="android:insetTop">0dp</item> <item name="android:insetBottom">0dp</item> diff --git a/build.gradle b/build.gradle index 7b9b67d..7565e1c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.2.1' apply false - id 'com.android.library' version '7.2.1' apply false + id 'com.android.application' version '7.2.2' apply false + id 'com.android.library' version '7.2.2' apply false id 'org.jetbrains.kotlin.android' version '1.6.10' apply false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 76d567d..150f49e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Sep 20 16:28:33 IST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 9904590f7b62cd33d92bae33a03d952120a44da5 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Sun, 26 Mar 2023 20:16:11 +0530 Subject: [PATCH 12/14] Added new line --- app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 2 +- app/src/main/java/com/bulletin/BulletinApp.kt | 2 +- .../java/com/bulletin/BulletinDataStore.kt | 21 +++++--- app/src/main/java/com/bulletin/BulletinSdk.kt | 2 +- .../main/java/com/bulletin/MainActivity.kt | 3 +- .../java/com/bulletin/extension/Storage.kt | 11 +--- .../com/bulletin/extension/StringExtension.kt | 2 +- .../java/com/bulletin/models/ActionButton.kt | 2 +- .../java/com/bulletin/models/BulletPoint.kt | 26 +++++----- .../java/com/bulletin/models/BulletinInfo.kt | 2 +- .../java/com/bulletin/models/BulletinItem.kt | 8 +-- .../main/java/com/bulletin/models/Media.kt | 37 +++++++------- .../main/java/com/bulletin/models/Message.kt | 5 +- .../main/java/com/bulletin/models/Title.kt | 3 +- .../main/java/com/bulletin/models/Version.kt | 14 +++--- .../bulletin/utilities/AppStorageHelper.kt | 5 +- .../bulletin/utilities/AppUpdatedChecker.kt | 2 +- .../java/com/bulletin/utilities/ViewUtil.kt | 2 +- .../FormSectionActionButtonViewHolder.kt | 50 +++++++++++++++---- .../FormSectionBulletPointViewHolder.kt | 36 ++++++++++--- .../viewHolder/FormSectionMediaViewHolder.kt | 20 +++++--- .../FormSectionMessageViewHolder.kt | 23 ++++++--- .../viewHolder/FormSectionTitleViewHolder.kt | 45 +++++++++++++---- build.gradle | 2 +- 25 files changed, 212 insertions(+), 116 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7a31617..0565346 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,5 +65,4 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.13.2' kapt 'com.github.bumptech.glide:compiler:4.13.2' - -} \ No newline at end of file +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 512290b..ff25a2f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,4 +28,4 @@ </activity> </application> -</manifest> \ No newline at end of file +</manifest> diff --git a/app/src/main/java/com/bulletin/BulletinApp.kt b/app/src/main/java/com/bulletin/BulletinApp.kt index caa78fe..bbd8065 100644 --- a/app/src/main/java/com/bulletin/BulletinApp.kt +++ b/app/src/main/java/com/bulletin/BulletinApp.kt @@ -26,4 +26,4 @@ class BulletinApp : Application() { gsonInstance = GsonHelper.gsonInstance } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/BulletinDataStore.kt b/app/src/main/java/com/bulletin/BulletinDataStore.kt index 47cb9c4..937e507 100644 --- a/app/src/main/java/com/bulletin/BulletinDataStore.kt +++ b/app/src/main/java/com/bulletin/BulletinDataStore.kt @@ -65,7 +65,7 @@ class BulletinDataStore { fun registerVersionInfo11(version: Version, items: MutableList<HashMap<String, Any>>) { val bulletinItems = ArrayList<BulletinItem>() - for (itemAttributes in items) { + for (itemAttributes in items) { val bulletinItem = BulletinItem.createBulletinItem(itemAttributes) ?: return continue bulletinItems.add(bulletinItem) } @@ -101,7 +101,7 @@ class BulletinDataStore { return bulletinInfo } else if (fromNewVersion == null && toOldVersion == null && limit != null) { bulletinInfo.addAll(data.take(limit)) - return bulletinInfo + return bulletinInfo } val sortedList = data.sortedWith(compareBy({ @@ -110,10 +110,19 @@ class BulletinDataStore { for (indice in sortedList.indices) { - if (indice == 0) AppStorageHelper.shared.lastSeenVersion = Version.init(sortedList[indice].version.version) - if (VersionUtil.versionCompare(fromNewVersion?.version, sortedList[indice].version.version) >= 0) { + if (indice == 0) AppStorageHelper.shared.lastSeenVersion = + Version.init(sortedList[indice].version.version) + if (VersionUtil.versionCompare( + fromNewVersion?.version, + sortedList[indice].version.version + ) >= 0 + ) { bulletinInfo.add(sortedList[indice]) - } else if (VersionUtil.versionCompare(toOldVersion?.version, sortedList[indice].version.version) < 0) { + } else if (VersionUtil.versionCompare( + toOldVersion?.version, + sortedList[indice].version.version + ) < 0 + ) { bulletinInfo.add(sortedList[indice]) } @@ -122,4 +131,4 @@ class BulletinDataStore { } return bulletinInfo } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/BulletinSdk.kt b/app/src/main/java/com/bulletin/BulletinSdk.kt index ed8ea09..d32226a 100644 --- a/app/src/main/java/com/bulletin/BulletinSdk.kt +++ b/app/src/main/java/com/bulletin/BulletinSdk.kt @@ -92,4 +92,4 @@ class BulletinSdk(val dataStore: BulletinDataStore, val theme : Appearance) { return true } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/MainActivity.kt index f35a343..824920e 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/MainActivity.kt @@ -143,5 +143,4 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis return true } - -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/extension/Storage.kt b/app/src/main/java/com/bulletin/extension/Storage.kt index b4cb560..bb83fc7 100644 --- a/app/src/main/java/com/bulletin/extension/Storage.kt +++ b/app/src/main/java/com/bulletin/extension/Storage.kt @@ -5,16 +5,9 @@ import com.bulletin.models.Version import com.bulletin.utilities.AppStorageHelper import com.bulletin.utilities.AppStorageHelper.edit -class Storage { -} - -fun Any.saveToStorage(key: Any) { -// AppStorageHelper.save(key, this) -} - private const val SHARED_PREFS_PARAMS_LATEST_APP_VERSION = "latest_app_version" -var SharedPreferences.lastSeenVersion : Version? +var SharedPreferences.lastSeenVersion: Version? set(newValue) { edit { if (newValue == null) { @@ -27,4 +20,4 @@ var SharedPreferences.lastSeenVersion : Version? get() { val versionString = getString(SHARED_PREFS_PARAMS_LATEST_APP_VERSION, null) ?: return null return Version(versionString) - } \ No newline at end of file + } diff --git a/app/src/main/java/com/bulletin/extension/StringExtension.kt b/app/src/main/java/com/bulletin/extension/StringExtension.kt index 00d7c82..30d1ac2 100644 --- a/app/src/main/java/com/bulletin/extension/StringExtension.kt +++ b/app/src/main/java/com/bulletin/extension/StringExtension.kt @@ -43,7 +43,7 @@ fun String.toCamelCaseMultipleWords(): String { return camelCaseString } -private fun toProperCase(s: String): String? { +private fun toProperCase(s: String): String { return s.substring(0, 1).uppercase(Locale.getDefault()) + s.substring(1).lowercase(Locale.getDefault()) } diff --git a/app/src/main/java/com/bulletin/models/ActionButton.kt b/app/src/main/java/com/bulletin/models/ActionButton.kt index 3f7103b..70d90af 100644 --- a/app/src/main/java/com/bulletin/models/ActionButton.kt +++ b/app/src/main/java/com/bulletin/models/ActionButton.kt @@ -18,7 +18,7 @@ data class ActionButton(val title: String?, var clickPayload: Any?) : BulletinIt // Set Click Payload val clickPayload = attributes["clickPayload"] - return ActionButton(title,clickPayload) + return ActionButton(title, clickPayload) } } } diff --git a/app/src/main/java/com/bulletin/models/BulletPoint.kt b/app/src/main/java/com/bulletin/models/BulletPoint.kt index 3b48538..d0c9d39 100644 --- a/app/src/main/java/com/bulletin/models/BulletPoint.kt +++ b/app/src/main/java/com/bulletin/models/BulletPoint.kt @@ -1,6 +1,7 @@ package com.bulletin.models -data class BulletPoint(var bullet: Bullet?, var titleText: String?, var subTitleText: String?) : BulletinItem() { +data class BulletPoint(var bullet: Bullet?, var titleText: String?, var subTitleText: String?) : + BulletinItem() { // region Init Methods init { @@ -28,7 +29,8 @@ data class BulletPoint(var bullet: Bullet?, var titleText: String?, var subTitle } } -data class Bullet(val bulletType: BulletType?, val unicode: String?, val imageUrl: String?) : BulletinItem() { +data class Bullet(val bulletType: BulletType?, val unicode: String?, val imageUrl: String?) : + BulletinItem() { enum class BulletType { UNICODE, @@ -54,22 +56,22 @@ data class Bullet(val bulletType: BulletType?, val unicode: String?, val imageUr var visualSymbol = "" var imageUrlString = "" - when(bulletType) { - BulletType.UNICODE -> { + when (bulletType) { + BulletType.UNICODE -> { - // Set Unicode + // Set Unicode visualSymbol = attributes["unicode"] as? String ?: return null - } - BulletType.IMAGE -> { + } + BulletType.IMAGE -> { - // Set ImageUrl + // Set ImageUrl imageUrlString = attributes["imageUrl"] as? String ?: return null - } - else -> { + } + else -> { return null - } - } + } + } return Bullet(bulletType, visualSymbol, imageUrlString) diff --git a/app/src/main/java/com/bulletin/models/BulletinInfo.kt b/app/src/main/java/com/bulletin/models/BulletinInfo.kt index 6101587..2f5f9a1 100644 --- a/app/src/main/java/com/bulletin/models/BulletinInfo.kt +++ b/app/src/main/java/com/bulletin/models/BulletinInfo.kt @@ -7,7 +7,7 @@ class BulletinInfo(var version: Version, var items: List<BulletinItem>) : Serial companion object { fun init(version: Version, items: MutableList<BulletinItem>): BulletinInfo { - return BulletinInfo(version,items) + return BulletinInfo(version, items) } var descendingSort: Comparator<BulletinInfo> = diff --git a/app/src/main/java/com/bulletin/models/BulletinItem.kt b/app/src/main/java/com/bulletin/models/BulletinItem.kt index 90a1441..6e6c6fa 100644 --- a/app/src/main/java/com/bulletin/models/BulletinItem.kt +++ b/app/src/main/java/com/bulletin/models/BulletinItem.kt @@ -21,7 +21,7 @@ abstract class BulletinItem() : Serializable { } // MARK: - Variables - var type: ItemType = ItemType.UNDEFINED + var type: ItemType = ItemType.UNDEFINED companion object { val runtimeTypeAdapterFactory: RuntimeTypeAdapterFactory<*> @@ -44,10 +44,10 @@ abstract class BulletinItem() : Serializable { } // It Will Return Action Card Creatd With Proper Classes - fun createBulletinItem(attributes: Map<String, Any>?): BulletinItem? { + fun createBulletinItem(attributes: Map<String, Any>?): BulletinItem? { // Validation - val attributes = attributes ?: return null + val attributes = attributes ?: return null // Validations val typeString = attributes["type"] as? String ?: return null @@ -66,4 +66,4 @@ abstract class BulletinItem() : Serializable { } //endregion - } +} diff --git a/app/src/main/java/com/bulletin/models/Media.kt b/app/src/main/java/com/bulletin/models/Media.kt index aa84877..40d64cb 100644 --- a/app/src/main/java/com/bulletin/models/Media.kt +++ b/app/src/main/java/com/bulletin/models/Media.kt @@ -7,7 +7,8 @@ import com.bulletin.utilities.RuntimeTypeAdapterFactory import com.google.gson.annotations.SerializedName -data class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, val size: Size?) : BulletinItem() { +data class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, val size: Size?) : + BulletinItem() { // region Init Methods init { @@ -29,27 +30,27 @@ data class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, v return mediaRuntimeTypeAdapterFactory } - fun init(attributes: Map<String, Any>): Media? { - // Set Media Type - val mediaTypeString = attributes["mediaType"] as? String - var mediaType = MediaType.IMAGE - if (!mediaTypeString.isNullOrEmpty()) { - (MediaType.valueOf(mediaTypeString.uppercase())).let { - mediaType = it - } + fun init(attributes: Map<String, Any>): Media? { + // Set Media Type + val mediaTypeString = attributes["mediaType"] as? String + var mediaType = MediaType.IMAGE + if (!mediaTypeString.isNullOrEmpty()) { + (MediaType.valueOf(mediaTypeString.uppercase())).let { + mediaType = it } + } - // Set Url - val urlString = (attributes["url"] as? String) ?: return null + // Set Url + val urlString = (attributes["url"] as? String) ?: return null - var size: Size? = null + var size: Size? = null - // Set Size - val width = (attributes["width"] as? Float)?.toInt() - val height = (attributes["height"] as? Float)?.toInt() - size = width?.let { height?.let { it1 -> Size(it, it1) } } + // Set Size + val width = (attributes["width"] as? Float)?.toInt() + val height = (attributes["height"] as? Float)?.toInt() + size = width?.let { height?.let { it1 -> Size(it, it1) } } - return Media(mediaType, urlString, size) - } + return Media(mediaType, urlString, size) + } } } diff --git a/app/src/main/java/com/bulletin/models/Message.kt b/app/src/main/java/com/bulletin/models/Message.kt index 620990f..33562e3 100644 --- a/app/src/main/java/com/bulletin/models/Message.kt +++ b/app/src/main/java/com/bulletin/models/Message.kt @@ -1,7 +1,8 @@ package com.bulletin.models -data class Message(var messageType: MessageType = MessageType.TEXT, val text: String?) : BulletinItem() { +data class Message(var messageType: MessageType = MessageType.TEXT, val text: String?) : + BulletinItem() { enum class MessageType(type: String) { HTML("html"), @@ -31,4 +32,4 @@ data class Message(var messageType: MessageType = MessageType.TEXT, val text: St return Message(messageType, text) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt index 2d3b6c0..cba6bff 100644 --- a/app/src/main/java/com/bulletin/models/Title.kt +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -1,7 +1,8 @@ package com.bulletin.models -data class Title(val preTitleText: String?, val titleText: String?, val subTitleText: String?) : BulletinItem() { +data class Title(val preTitleText: String?, val titleText: String?, val subTitleText: String?) : + BulletinItem() { // region Init Methods init { diff --git a/app/src/main/java/com/bulletin/models/Version.kt b/app/src/main/java/com/bulletin/models/Version.kt index 3baba42..31bf615 100644 --- a/app/src/main/java/com/bulletin/models/Version.kt +++ b/app/src/main/java/com/bulletin/models/Version.kt @@ -5,15 +5,15 @@ import java.io.Serializable data class Version(val version: String) : Serializable { - companion object { + companion object { - fun init(version: String): Version? { + fun init(version: String): Version? { - // Set Title - val validVersion = version.validVersion() ?: return null + // Set Title + val validVersion = version.validVersion() ?: return null - return Version(validVersion) - } - } + return Version(validVersion) + } + } } diff --git a/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt index ae97daf..ccd86ab 100644 --- a/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt +++ b/app/src/main/java/com/bulletin/utilities/AppStorageHelper.kt @@ -7,7 +7,8 @@ import com.bulletin.BulletinApp.Companion.applicationContext object AppStorageHelper { private const val SHARED_PREFS_NAME = "Bulletin_Shared_Prefs" - val shared: SharedPreferences = applicationContext.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE) + val shared: SharedPreferences = + applicationContext.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE) inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) { val edit = edit() @@ -22,4 +23,4 @@ object AppStorageHelper { } } get() = run { } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt b/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt index 2118dc5..d7dc56e 100644 --- a/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt +++ b/app/src/main/java/com/bulletin/utilities/AppUpdatedChecker.kt @@ -39,4 +39,4 @@ object AppUpdatedChecker { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/utilities/ViewUtil.kt b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt index bb24836..a945020 100644 --- a/app/src/main/java/com/bulletin/utilities/ViewUtil.kt +++ b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt @@ -93,4 +93,4 @@ object ViewUtil { fun onButtonPressed() fun onButtonReleased() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt index 4494ce4..5343782 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt @@ -13,11 +13,14 @@ import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionActionButtonBinding -class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionActionButtonBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : - BaseViewHolder<ActionButton>(viewBinding,listener) { +class FormSectionActionButtonViewHolder( + val viewBinding: LayoutFormSectionActionButtonBinding, + listener: FormRecyclerViewAdapter.OnItemClickListener +) : + BaseViewHolder<ActionButton>(viewBinding, listener) { // region Methods - override fun bind(item: ActionButton) { + override fun bind(item: ActionButton) { super.bind(item) // Set Title @@ -30,10 +33,14 @@ class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionActio } viewBinding.actionButton.setOnClickListener { - _listener?.formDidTriggerEvent(BulletinItem.EventType.TRIGGER_ACTION, item, adapterPosition) + _listener?.formDidTriggerEvent( + BulletinItem.EventType.TRIGGER_ACTION, + item, + adapterPosition + ) } - ViewUtil.addBounceEffect(viewBinding.actionButton) + ViewUtil.addBounceEffect(viewBinding.actionButton) } @@ -48,15 +55,36 @@ class FormSectionActionButtonViewHolder(val viewBinding : LayoutFormSectionActio if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { viewBinding.actionButton.setTextAppearance(R.style.base_semi_bold) } else { - viewBinding.actionButton.setTextAppearance(viewBinding.actionButton.context, R.style.base_semi_bold) + viewBinding.actionButton.setTextAppearance( + viewBinding.actionButton.context, + R.style.base_semi_bold + ) } - viewBinding.actionButton.setTextColor(ThemeUtils.getAttributedColor(R.attr.brand_text_primary, viewBinding.actionButton.context)) - viewBinding.actionButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, viewBinding.actionButton.context)) - // ThemeUtils.applyThemeBorder(viewBinding.actionButton,R.attr.brand_bg_primary, + viewBinding.actionButton.setTextColor( + ThemeUtils.getAttributedColor( + R.attr.brand_text_primary, + viewBinding.actionButton.context + ) + ) + viewBinding.actionButton.setBackgroundColor( + ThemeUtils.getAttributedColor( + R.attr.main_bg_surface_alt, + viewBinding.actionButton.context + ) + ) + // ThemeUtils.applyThemeBorder(viewBinding.actionButton,R.attr.brand_bg_primary, // DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 3f)) - viewBinding.actionButton.strokeWidth = DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 1f) - viewBinding.actionButton.setStrokeColor(ColorStateList.valueOf(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, viewBinding.actionButton.context))) + viewBinding.actionButton.strokeWidth = + DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 1f) + viewBinding.actionButton.setStrokeColor( + ColorStateList.valueOf( + ThemeUtils.getAttributedColor( + R.attr.brand_bg_primary, + viewBinding.actionButton.context + ) + ) + ) } // endregion diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt index 3d261f9..0a94d58 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt @@ -17,17 +17,20 @@ import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormBulletPointBinding -class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormBulletPointBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : - BaseViewHolder<BulletPoint>(viewBinding,listener) { +class FormSectionBulletPointViewHolder( + val viewBinding: LayoutFormBulletPointBinding, + listener: FormRecyclerViewAdapter.OnItemClickListener +) : + BaseViewHolder<BulletPoint>(viewBinding, listener) { // region Methods - override fun bind(item: BulletPoint) { + override fun bind(item: BulletPoint) { super.bind(item) viewBinding.bulletImageView.setVisibility(View.GONE) viewBinding.bulletLabel.setVisibility(View.GONE) - when(item.bullet?.bulletType) { + when (item.bullet?.bulletType) { Bullet.BulletType.UNICODE -> { val unicode = item.bullet?.unicode @@ -63,6 +66,7 @@ class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormBulletPointBi override fun onLoadFailed(errorDrawable: Drawable?) { print("onLoadFailed") } + override fun onLoadCleared(placeholder: Drawable?) { print("onLoadCleared") } @@ -103,12 +107,28 @@ class FormSectionBulletPointViewHolder(val viewBinding : LayoutFormBulletPointBi viewBinding.titleLabel.setTextAppearance(R.style.large_semi_bold) viewBinding.subtitleLabel.setTextAppearance(R.style.base_regular) } else { - viewBinding.titleLabel.setTextAppearance(viewBinding.titleLabel.context, R.style.large_semi_bold) - viewBinding.subtitleLabel.setTextAppearance(viewBinding.subtitleLabel.context, R.style.base_regular) + viewBinding.titleLabel.setTextAppearance( + viewBinding.titleLabel.context, + R.style.large_semi_bold + ) + viewBinding.subtitleLabel.setTextAppearance( + viewBinding.subtitleLabel.context, + R.style.base_regular + ) } - viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.titleLabel.context)) - viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_secondary, viewBinding.subtitleLabel.context)) + viewBinding.titleLabel.setTextColor( + ThemeUtils.getAttributedColor( + R.attr.main_text_primary, + viewBinding.titleLabel.context + ) + ) + viewBinding.subtitleLabel.setTextColor( + ThemeUtils.getAttributedColor( + R.attr.main_text_secondary, + viewBinding.subtitleLabel.context + ) + ) } diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt index 60b64fb..f2c7343 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -15,24 +15,27 @@ import com.example.bulletin.databinding.LayoutFormSectionMediaBinding import com.wrx.wazirx.views.bulletin.model.Media -class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionMediaBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : - BaseViewHolder<Media>(viewBinding,listener) { +class FormSectionMediaViewHolder( + val viewBinding: LayoutFormSectionMediaBinding, + listener: FormRecyclerViewAdapter.OnItemClickListener +) : + BaseViewHolder<Media>(viewBinding, listener) { // region Methods - override fun bind(item: Media) { + override fun bind(item: Media) { super.bind(item) // Set Image viewBinding.bannerImageView.setVisibility(View.GONE) - // viewBinding.bannerImageView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, viewBinding.bannerImageView.context)) + // viewBinding.bannerImageView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, viewBinding.bannerImageView.context)) item.size?.let { - // viewBinding.bannerImageView.layoutParams.width = it.width - // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.width.toFloat()).toInt() - // viewBinding.bannerImageView.layoutParams.height = it.height - // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.height.toFloat()).toInt() + // viewBinding.bannerImageView.layoutParams.width = it.width + // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.width.toFloat()).toInt() + // viewBinding.bannerImageView.layoutParams.height = it.height + // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.height.toFloat()).toInt() } (item.url)?.let { @@ -55,6 +58,7 @@ class FormSectionMediaViewHolder(val viewBinding : LayoutFormSectionMediaBinding override fun onLoadFailed(errorDrawable: Drawable?) { print("onLoadFailed") } + override fun onLoadCleared(placeholder: Drawable?) { print("onLoadCleared") } diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt index 54021c7..5347d02 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt @@ -11,16 +11,19 @@ import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionMessageBinding -class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionMessageBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : - BaseViewHolder<Message>(viewBinding,listener) { +class FormSectionMessageViewHolder( + val viewBinding: LayoutFormSectionMessageBinding, + listener: FormRecyclerViewAdapter.OnItemClickListener +) : + BaseViewHolder<Message>(viewBinding, listener) { // region Methods - override fun bind(item: Message) { + override fun bind(item: Message) { super.bind(item) - when(item.messageType) { + when (item.messageType) { Message.MessageType.HTML -> { // Set Subttitle if (!item.text.isNullOrBlank()) { @@ -61,10 +64,18 @@ class FormSectionMessageViewHolder(val viewBinding : LayoutFormSectionMessageBin if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { viewBinding.messageLabel.setTextAppearance(R.style.base_regular) } else { - viewBinding.messageLabel.setTextAppearance(viewBinding.messageLabel.context, R.style.base_regular) + viewBinding.messageLabel.setTextAppearance( + viewBinding.messageLabel.context, + R.style.base_regular + ) } - viewBinding.messageLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.messageLabel.context)) + viewBinding.messageLabel.setTextColor( + ThemeUtils.getAttributedColor( + R.attr.main_text_primary, + viewBinding.messageLabel.context + ) + ) } // endregion diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt index 9e1310e..5d03478 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt @@ -9,11 +9,14 @@ import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionTitleBinding -class FormSectionTitleViewHolder(val viewBinding : LayoutFormSectionTitleBinding, listener : FormRecyclerViewAdapter.OnItemClickListener) : - BaseViewHolder<Title>(viewBinding,listener) { +class FormSectionTitleViewHolder( + val viewBinding: LayoutFormSectionTitleBinding, + listener: FormRecyclerViewAdapter.OnItemClickListener +) : + BaseViewHolder<Title>(viewBinding, listener) { // region Methods - override fun bind(item: Title) { + override fun bind(item: Title) { super.bind(item) itemView.setOnClickListener { @@ -62,14 +65,38 @@ class FormSectionTitleViewHolder(val viewBinding : LayoutFormSectionTitleBinding viewBinding.titleLabel.setTextAppearance(R.style.heading_4_semi_bold) viewBinding.subtitleLabel.setTextAppearance(R.style.base_regular) } else { - viewBinding.preTitleLabel.setTextAppearance(viewBinding.preTitleLabel.context, R.style.small_medium) - viewBinding.titleLabel.setTextAppearance(viewBinding.titleLabel.context, R.style.heading_4_semi_bold) - viewBinding.subtitleLabel.setTextAppearance(viewBinding.subtitleLabel.context, R.style.base_regular) + viewBinding.preTitleLabel.setTextAppearance( + viewBinding.preTitleLabel.context, + R.style.small_medium + ) + viewBinding.titleLabel.setTextAppearance( + viewBinding.titleLabel.context, + R.style.heading_4_semi_bold + ) + viewBinding.subtitleLabel.setTextAppearance( + viewBinding.subtitleLabel.context, + R.style.base_regular + ) } - viewBinding.preTitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.success_text_primary, viewBinding.preTitleLabel.context)) - viewBinding.titleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.titleLabel.context)) - viewBinding.subtitleLabel.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_text_primary, viewBinding.subtitleLabel.context)) + viewBinding.preTitleLabel.setTextColor( + ThemeUtils.getAttributedColor( + R.attr.success_text_primary, + viewBinding.preTitleLabel.context + ) + ) + viewBinding.titleLabel.setTextColor( + ThemeUtils.getAttributedColor( + R.attr.main_text_primary, + viewBinding.titleLabel.context + ) + ) + viewBinding.subtitleLabel.setTextColor( + ThemeUtils.getAttributedColor( + R.attr.main_text_primary, + viewBinding.subtitleLabel.context + ) + ) } // endregion diff --git a/build.gradle b/build.gradle index 7565e1c..eaf7c0c 100644 --- a/build.gradle +++ b/build.gradle @@ -7,4 +7,4 @@ plugins { task clean(type: Delete) { delete rootProject.buildDir -} \ No newline at end of file +} From dbdee0149be650e4200e114d2184fe600658b637 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Sun, 26 Mar 2023 23:29:16 +0530 Subject: [PATCH 13/14] PR feedback --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/bulletin/BulletinDataStore.kt | 48 ------------------- app/src/main/java/com/bulletin/BulletinSdk.kt | 43 +---------------- .../{MainActivity.kt => DefaultActivity.kt} | 37 ++------------ .../java/com/bulletin/extension/Storage.kt | 1 - .../{String_Compare.kt => StringCompare.kt} | 0 .../extension/TextAppearenceExtension.kt | 15 ++++++ .../main/java/com/bulletin/models/Media.kt | 2 - .../com/bulletin/utilities/DeviceUtils.kt | 2 - .../java/com/bulletin/utilities/ViewUtil.kt | 7 --- .../FormSectionActionButtonViewHolder.kt | 15 ++---- .../FormSectionBulletPointViewHolder.kt | 18 ++----- .../viewHolder/FormSectionMediaViewHolder.kt | 12 +---- .../FormSectionMessageViewHolder.kt | 12 +---- .../viewHolder/FormSectionTitleViewHolder.kt | 22 ++------- 15 files changed, 36 insertions(+), 200 deletions(-) rename app/src/main/java/com/bulletin/{MainActivity.kt => DefaultActivity.kt} (69%) rename app/src/main/java/com/bulletin/extension/{String_Compare.kt => StringCompare.kt} (100%) create mode 100644 app/src/main/java/com/bulletin/extension/TextAppearenceExtension.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ff25a2f..ff2a306 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ android:theme="@style/Theme.Bulletin" tools:targetApi="31"> <activity - android:name=".MainActivity" + android:name=".DefaultActivity" android:exported="true" > <intent-filter> diff --git a/app/src/main/java/com/bulletin/BulletinDataStore.kt b/app/src/main/java/com/bulletin/BulletinDataStore.kt index 937e507..94d5120 100644 --- a/app/src/main/java/com/bulletin/BulletinDataStore.kt +++ b/app/src/main/java/com/bulletin/BulletinDataStore.kt @@ -8,54 +8,6 @@ import com.bulletin.utilities.AppStorageHelper import com.bulletin.utilities.VersionUtil import java.util.* -//object BulletinDataStore { -// var data: MutableList<BulletinVersion> = mutableListOf() -// fun registerVersionInfo(version: String, map: HashMap<String, Any>) { -// for ((key, value) in map) { -// -// } -// } -// -// fun registerVersionInfo(version: String, items: MutableList<BulletinItem>?) { -// if (items != null && items.isNotEmpty()) { -// data.add(BulletinVersion(version, items)) -// Collections.sort(data, BulletinVersion.descendingSort) -// } -// } -// -// -// fun getData( -// fromNewVersion: Version?, -// toOldVersion: Version?, -// limit: Int? = null -// ): MutableList<BulletinVersion> { -// val finalMap: MutableList<BulletinVersion> = mutableListOf() -// -// if (fromNewVersion == null && toOldVersion == null && limit == null) { -// return data -// } else if (fromNewVersion == null && toOldVersion == null && limit != null) { -// return finalMap.take(limit).toMutableList() -// } -// -// val sortedList = data.sortedWith(compareBy({ -// it.versionNumber -// })) -// -// for (indice in sortedList.indices) { -// -// if (indice == 0) AppStorageHelper.shared.lastSeenVersion = Version.init(sortedList[indice].versionNumber) -// if (VersionUtil.versionCompare(fromNewVersion?.version, sortedList[indice].versionNumber) >= 0) { -// finalMap.add(sortedList[indice]) -// } else if (VersionUtil.versionCompare(toOldVersion?.version, sortedList[indice].versionNumber) < 0) { -// finalMap.add(sortedList[indice]) -// } -// -// if (limit != null && finalMap.size >= limit) break -// -// } -// return finalMap -// } -//} class BulletinDataStore { diff --git a/app/src/main/java/com/bulletin/BulletinSdk.kt b/app/src/main/java/com/bulletin/BulletinSdk.kt index d32226a..cd6b5bb 100644 --- a/app/src/main/java/com/bulletin/BulletinSdk.kt +++ b/app/src/main/java/com/bulletin/BulletinSdk.kt @@ -8,47 +8,8 @@ import androidx.core.content.ContextCompat import com.bulletin.extension.lastSeenVersion import com.bulletin.models.BulletinInfo import com.bulletin.utilities.AppStorageHelper -import com.example.bulletin.MainActivity +import com.example.bulletin.DefaultActivity -//enum class Appearance(val value: String) { -// DARK("dark"), -// LIGHT("light"), -// SYSTEM("system"); -//} -// -//class BulletinSdk(val theme : Appearance) { -// -// init { -// when (theme) { -// Appearance.DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) -// Appearance.LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) -// Appearance.SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) -// } -// } -// -// fun showFullBulletin() : Boolean{ -// val items = BulletinDataStore.getData(null, null) -// return showBulletin(items) -// } -// -// fun showLastBulletins(limit: Int? = 1): Boolean { -// val items = BulletinDataStore.getData(null, null, limit) -// return showBulletin(items) -// } -// -// fun showUnseenBulletin(limit: Int? = null): Boolean { -// val lastseenVersion = AppStorageHelper.shared.lastSeenVersion ?: return false -// val items = BulletinDataStore.getData(lastseenVersion, null, limit) -// return showBulletin(items) -// } -// -// fun showBulletin(item: MutableList<BulletinVersion>?): Boolean { -// if (item == null || item.isEmpty()) return false; -// -// return true -// } -// -//} enum class Appearance(val value: String) { DARK("dark"), @@ -84,7 +45,7 @@ class BulletinSdk(val dataStore: BulletinDataStore, val theme : Appearance) { Appearance.SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) } - val mainIntent = Intent(context, MainActivity::class.java) + val mainIntent = Intent(context, DefaultActivity::class.java) val bundle = Bundle() bundle.putSerializable("BulletinInfo", item) mainIntent.putExtras(bundle) diff --git a/app/src/main/java/com/bulletin/MainActivity.kt b/app/src/main/java/com/bulletin/DefaultActivity.kt similarity index 69% rename from app/src/main/java/com/bulletin/MainActivity.kt rename to app/src/main/java/com/bulletin/DefaultActivity.kt index 824920e..3ddef22 100644 --- a/app/src/main/java/com/bulletin/MainActivity.kt +++ b/app/src/main/java/com/bulletin/DefaultActivity.kt @@ -1,21 +1,19 @@ package com.example.bulletin -import android.content.Intent import android.os.Build import android.os.Bundle import android.util.Size import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager -import com.bulletin.Appearance -import com.bulletin.BulletinSdk import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.extension.textAppearence import com.bulletin.models.* import com.bulletin.utilities.ThemeUtils import com.bulletin.utilities.ViewUtil import com.example.bulletin.databinding.ActivityMainBinding import com.wrx.wazirx.views.bulletin.model.Media -class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickListener { +class DefaultActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickListener { // region Variables private lateinit var binding: ActivityMainBinding @@ -53,13 +51,8 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis fun updateAppearance() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - binding.headerTitle.setTextAppearance(R.style.large_semi_bold) - binding.goItButton.setTextAppearance(R.style.base_bold) - } else { - binding.headerTitle.setTextAppearance(binding.headerTitle.context,R.style.large_semi_bold) - binding.goItButton.setTextAppearance(binding.goItButton.context,R.style.base_bold) - } + binding.headerTitle.textAppearence(R.style.large_semi_bold) + binding.goItButton.textAppearence(R.style.base_bold) binding.headerTitle.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_navigation_onNavigation, binding.headerTitle.context)) @@ -81,28 +74,6 @@ class MainActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickLis } fun setUpItems() : ArrayList<BulletinItem> { -// val bulletinItem = PreTitle("text") -// val bulletinItem1 = ActionButton("actionButton","") -// val bulletinItem2 = bulletinItem.copy(text = "Hello") -// val bulletinItem3 = bulletinItem1.copy(title = "New Action button") -// val bulletinItem4 = bulletinItem.copy(text = "Hello boss") -// val bulletinItem5 = bulletinItem.copy(text = "Hello boss") -// val bulletinItemListTwo: MutableList<BulletinItem> = mutableListOf() -// -// bulletinItemListTwo.add(bulletinItem) -// bulletinItemListTwo.add(bulletinItem2) -// bulletinItemListTwo.add(bulletinItem3) -// bulletinItemListTwo.add(bulletinItem4) -// bulletinItemListTwo.add(bulletinItem5) -// -// BulletinDataStore.registerVersionInfo("1.0", bulletinItemListTwo) -// BulletinDataStore.registerVersionInfo("1.3", bulletinItemListTwo) -// BulletinDataStore.registerVersionInfo("1.4", bulletinItemListTwo) -// BulletinDataStore.registerVersionInfo("1.1", bulletinItemListTwo) -// BulletinDataStore.registerVersionInfo("1.2", bulletinItemListTwo) -// -// val items = BulletinSdk().showUnseenBulletin(4) - val title = Title("Version " + "1.21","In this update","loreum ipsum loreum ipsum loreum ipsum loreum ipsum loreum ipsum") diff --git a/app/src/main/java/com/bulletin/extension/Storage.kt b/app/src/main/java/com/bulletin/extension/Storage.kt index bb83fc7..821a023 100644 --- a/app/src/main/java/com/bulletin/extension/Storage.kt +++ b/app/src/main/java/com/bulletin/extension/Storage.kt @@ -2,7 +2,6 @@ package com.bulletin.extension import android.content.SharedPreferences import com.bulletin.models.Version -import com.bulletin.utilities.AppStorageHelper import com.bulletin.utilities.AppStorageHelper.edit private const val SHARED_PREFS_PARAMS_LATEST_APP_VERSION = "latest_app_version" diff --git a/app/src/main/java/com/bulletin/extension/String_Compare.kt b/app/src/main/java/com/bulletin/extension/StringCompare.kt similarity index 100% rename from app/src/main/java/com/bulletin/extension/String_Compare.kt rename to app/src/main/java/com/bulletin/extension/StringCompare.kt diff --git a/app/src/main/java/com/bulletin/extension/TextAppearenceExtension.kt b/app/src/main/java/com/bulletin/extension/TextAppearenceExtension.kt new file mode 100644 index 0000000..facf982 --- /dev/null +++ b/app/src/main/java/com/bulletin/extension/TextAppearenceExtension.kt @@ -0,0 +1,15 @@ +package com.bulletin.extension + +import android.os.Build +import android.widget.TextView +import androidx.annotation.StyleRes + + +fun TextView.textAppearence(@StyleRes resId : Int) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + this.setTextAppearance(resId) + } else { + this.setTextAppearance(this.context, resId) + } +} + diff --git a/app/src/main/java/com/bulletin/models/Media.kt b/app/src/main/java/com/bulletin/models/Media.kt index 40d64cb..c667729 100644 --- a/app/src/main/java/com/bulletin/models/Media.kt +++ b/app/src/main/java/com/bulletin/models/Media.kt @@ -2,9 +2,7 @@ package com.wrx.wazirx.views.bulletin.model import android.util.Size import com.bulletin.models.BulletinItem -import com.bulletin.models.Message import com.bulletin.utilities.RuntimeTypeAdapterFactory -import com.google.gson.annotations.SerializedName data class Media(var mediaType: MediaType = MediaType.IMAGE, val url: String?, val size: Size?) : diff --git a/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt index 5208ff8..90c5488 100644 --- a/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt +++ b/app/src/main/java/com/bulletin/utilities/DeviceUtils.kt @@ -2,8 +2,6 @@ package com.bulletin.utilities import android.content.Context import android.util.DisplayMetrics -import android.util.TypedValue -import com.example.bulletin.R object DeviceUtil { diff --git a/app/src/main/java/com/bulletin/utilities/ViewUtil.kt b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt index a945020..4132216 100644 --- a/app/src/main/java/com/bulletin/utilities/ViewUtil.kt +++ b/app/src/main/java/com/bulletin/utilities/ViewUtil.kt @@ -1,18 +1,11 @@ package com.bulletin.utilities import android.annotation.SuppressLint -import android.content.Context -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.Color -import android.view.Gravity import android.view.MotionEvent import android.view.View -import android.view.ViewGroup import android.view.animation.Animation import android.view.animation.DecelerateInterpolator import android.view.animation.ScaleAnimation -import android.widget.TextView object ViewUtil { diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt index 5343782..e07cfe7 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionActionButtonViewHolder.kt @@ -1,9 +1,9 @@ package com.bulletin.viewHolder import android.content.res.ColorStateList -import android.os.Build import android.view.View import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.extension.textAppearence import com.bulletin.models.ActionButton import com.bulletin.models.BulletinItem import com.bulletin.utilities.DeviceUtil @@ -51,15 +51,8 @@ class FormSectionActionButtonViewHolder( override fun updateAppearance() { super.updateAppearance() - // Set Default Properties - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewBinding.actionButton.setTextAppearance(R.style.base_semi_bold) - } else { - viewBinding.actionButton.setTextAppearance( - viewBinding.actionButton.context, - R.style.base_semi_bold - ) - } + viewBinding.actionButton.textAppearence(R.style.base_semi_bold) + viewBinding.actionButton.setTextColor( ThemeUtils.getAttributedColor( R.attr.brand_text_primary, @@ -72,8 +65,6 @@ class FormSectionActionButtonViewHolder( viewBinding.actionButton.context ) ) - // ThemeUtils.applyThemeBorder(viewBinding.actionButton,R.attr.brand_bg_primary, -// DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 3f)) viewBinding.actionButton.strokeWidth = DeviceUtil.convertDpToPixel(viewBinding.actionButton.context, 1f) diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt index 0a94d58..cedfaa5 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionBulletPointViewHolder.kt @@ -2,14 +2,13 @@ package com.bulletin.viewHolder import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import android.os.Build import android.view.View import androidx.core.text.HtmlCompat import com.bulletin.FormRecyclerViewAdapter import com.bulletin.extension.loadImageWithUrl +import com.bulletin.extension.textAppearence import com.bulletin.models.Bullet import com.bulletin.models.BulletPoint -import com.bulletin.models.Message import com.bulletin.utilities.ThemeUtils import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition @@ -103,19 +102,8 @@ class FormSectionBulletPointViewHolder( super.updateAppearance() // Set Default Properties - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewBinding.titleLabel.setTextAppearance(R.style.large_semi_bold) - viewBinding.subtitleLabel.setTextAppearance(R.style.base_regular) - } else { - viewBinding.titleLabel.setTextAppearance( - viewBinding.titleLabel.context, - R.style.large_semi_bold - ) - viewBinding.subtitleLabel.setTextAppearance( - viewBinding.subtitleLabel.context, - R.style.base_regular - ) - } + viewBinding.titleLabel.textAppearence(R.style.large_semi_bold) + viewBinding.subtitleLabel.textAppearence(R.style.base_regular) viewBinding.titleLabel.setTextColor( ThemeUtils.getAttributedColor( diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt index f2c7343..1afe615 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMediaViewHolder.kt @@ -2,15 +2,12 @@ package com.bulletin.viewHolder import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import android.util.TypedValue import android.view.View import com.bulletin.FormRecyclerViewAdapter import com.bulletin.extension.loadImageWithUrl import com.bulletin.utilities.DeviceUtil -import com.bulletin.utilities.ThemeUtils import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition -import com.example.bulletin.R import com.example.bulletin.databinding.LayoutFormSectionMediaBinding import com.wrx.wazirx.views.bulletin.model.Media @@ -28,14 +25,9 @@ class FormSectionMediaViewHolder( // Set Image viewBinding.bannerImageView.setVisibility(View.GONE) - // viewBinding.bannerImageView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, viewBinding.bannerImageView.context)) - - item.size?.let { - // viewBinding.bannerImageView.layoutParams.width = it.width - // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.width.toFloat()).toInt() - // viewBinding.bannerImageView.layoutParams.height = it.height - // DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.height.toFloat()).toInt() + viewBinding.bannerImageView.layoutParams.width = DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.width.toFloat()).toInt() + viewBinding.bannerImageView.layoutParams.height = DeviceUtil.convertPixelsToDp(viewBinding.bannerImageView.context,it.height.toFloat()).toInt() } (item.url)?.let { diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt index 5347d02..321039a 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionMessageViewHolder.kt @@ -1,10 +1,9 @@ package com.bulletin.viewHolder -import android.os.Build -import android.text.Html import android.view.View import androidx.core.text.HtmlCompat import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.extension.textAppearence import com.bulletin.models.Message import com.bulletin.utilities.ThemeUtils import com.example.bulletin.R @@ -61,14 +60,7 @@ class FormSectionMessageViewHolder( super.updateAppearance() // Set Default Properties - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewBinding.messageLabel.setTextAppearance(R.style.base_regular) - } else { - viewBinding.messageLabel.setTextAppearance( - viewBinding.messageLabel.context, - R.style.base_regular - ) - } + viewBinding.messageLabel.textAppearence(R.style.base_regular) viewBinding.messageLabel.setTextColor( ThemeUtils.getAttributedColor( diff --git a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt index 5d03478..0b43637 100644 --- a/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt +++ b/app/src/main/java/com/bulletin/viewHolder/FormSectionTitleViewHolder.kt @@ -3,6 +3,7 @@ package com.bulletin.viewHolder import android.os.Build import android.view.View import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.extension.textAppearence import com.bulletin.models.Title import com.bulletin.utilities.ThemeUtils import com.example.bulletin.R @@ -60,24 +61,9 @@ class FormSectionTitleViewHolder( super.updateAppearance() // Set Default Properties - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewBinding.preTitleLabel.setTextAppearance(R.style.small_medium) - viewBinding.titleLabel.setTextAppearance(R.style.heading_4_semi_bold) - viewBinding.subtitleLabel.setTextAppearance(R.style.base_regular) - } else { - viewBinding.preTitleLabel.setTextAppearance( - viewBinding.preTitleLabel.context, - R.style.small_medium - ) - viewBinding.titleLabel.setTextAppearance( - viewBinding.titleLabel.context, - R.style.heading_4_semi_bold - ) - viewBinding.subtitleLabel.setTextAppearance( - viewBinding.subtitleLabel.context, - R.style.base_regular - ) - } + viewBinding.preTitleLabel.textAppearence(R.style.small_medium) + viewBinding.titleLabel.textAppearence(R.style.heading_4_semi_bold) + viewBinding.subtitleLabel.textAppearence(R.style.base_regular) viewBinding.preTitleLabel.setTextColor( ThemeUtils.getAttributedColor( From 2b0820e51240269ec6e937d7f55c418e4ebaead8 Mon Sep 17 00:00:00 2001 From: Daxesh <daxesh.n@wazirx.com> Date: Wed, 2 Aug 2023 10:57:32 +0530 Subject: [PATCH 14/14] Bulletin minor fixes --- app/src/main/AndroidManifest.xml | 1 - .../main/java/com/bulletin/BulletinDialog.kt | 179 ++++++++++++++++++ app/src/main/java/com/bulletin/BulletinSdk.kt | 72 ++++--- .../main/java/com/bulletin/DefaultActivity.kt | 104 +++++----- .../main/java/com/bulletin/models/Title.kt | 11 +- app/src/main/res/layout/bulletin_dialog.xml | 84 ++++++++ .../res/layout/layout_form_bullet_point.xml | 3 - .../layout_form_section_action_button.xml | 1 + .../layout/layout_form_section_message.xml | 1 - .../res/layout/layout_form_section_title.xml | 2 - app/src/main/res/values-night/themes.xml | 85 --------- app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/styles.xml | 55 +++++- app/src/main/res/values/themes.xml | 99 +++++++++- 14 files changed, 528 insertions(+), 171 deletions(-) create mode 100644 app/src/main/java/com/bulletin/BulletinDialog.kt create mode 100644 app/src/main/res/layout/bulletin_dialog.xml delete mode 100644 app/src/main/res/values-night/themes.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ff2a306..0d1de19 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,7 +14,6 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/Theme.Bulletin" tools:targetApi="31"> <activity android:name=".DefaultActivity" diff --git a/app/src/main/java/com/bulletin/BulletinDialog.kt b/app/src/main/java/com/bulletin/BulletinDialog.kt new file mode 100644 index 0000000..e494049 --- /dev/null +++ b/app/src/main/java/com/bulletin/BulletinDialog.kt @@ -0,0 +1,179 @@ +package com.example.bulletin + +import android.graphics.Color +import android.os.Build +import android.os.Bundle +import android.util.Size +import android.view.* +import androidx.fragment.app.DialogFragment +import androidx.recyclerview.widget.LinearLayoutManager +import com.bulletin.FormRecyclerViewAdapter +import com.bulletin.models.* +import com.bulletin.utilities.ThemeUtils +import com.bulletin.utilities.ViewUtil +import com.example.bulletin.databinding.BulletinDialogBinding +import com.wrx.wazirx.views.bulletin.model.Media +import java.util.* + + +class BulletinDialog(var bulletinInfo: ArrayList<BulletinItem> = ArrayList()) : DialogFragment() , FormRecyclerViewAdapter.OnItemClickListener { + + // region Variables +// private lateinit var binding: BulletinDialogBinding + private var _binding: BulletinDialogBinding? = null + // This property is only valid between onCreateDialog and + // onDestroyView. + private val binding get() = _binding!! + private lateinit var formRecyclerViewAdapter: FormRecyclerViewAdapter + public var bulletinListener : BulletinListener? = null + // private var bulletinInfo: ArrayList<BulletinItem> = ArrayList() + // endregion + + override fun onCreate(savedInstanceState: Bundle?) { +// setStyle(STYLE_NO_TITLE, R.style.Theme_Transparent) + +// Window.setLayout( +// WindowManager.LayoutParams.MATCH_PARENT, +// WindowManager.LayoutParams.MATCH_PARENT); + + setStyle(STYLE_NO_TITLE, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + // context?.setTheme(R.style.AppThemeBase_WhiteKnight) + super.onCreate(savedInstanceState) + + setupClickEvent() + +// (intent.extras?.getSerializable("BulletinInfo") as? ArrayList<BulletinInfo>)?.let { +// for (dict in it) { +// for (bulletinfo in dict.items) { +// bulletinInfo.add(bulletinfo) +// } +// } +// +// } + + + } + +// override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { +// _binding = DialogExampleBinding.inflate(LayoutInflater.from(context)) +// return AlertDialog.Builder(requireActivity()) +// .setView(binding.root) +// .create() +// } + + private fun setupClickEvent() { + binding.goItButton.setOnClickListener { closeClicked() } + } + + private fun closeClicked() { + bulletinListener?.backButtonClick() + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreateView(inflater, container, savedInstanceState) +// val view: View = inflater.inflate(R.layout.bulletin_dialog, container, false) +// _binding = BulletinDialogBinding.inflate(LayoutInflater.from(context)) +// binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) +// return view + _binding = BulletinDialogBinding.inflate(inflater, container, false) + val root: View = binding.root + return root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + loadDisplayContent() + updateAppearance() + recyclerViewSetUp() + } + + fun loadDisplayContent() { + ViewUtil.addBounceEffect(binding.goItButton) + setupButtonClickEvent() + } + + fun updateAppearance() { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + binding.headerTitle.setTextAppearance(R.style.large_semi_bold) + binding.goItButton.setTextAppearance(R.style.base_bold) + } else { + binding.headerTitle.setTextAppearance(binding.headerTitle.context,R.style.large_semi_bold) + binding.goItButton.setTextAppearance(binding.goItButton.context,R.style.base_bold) + } + + binding.headerTitle.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_navigation_onNavigation, binding.headerTitle.context)) + + binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) + binding.goItButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, binding.goItButton.context)) + + ThemeUtils.applyThemeDrawable(binding.headerView, R.attr.main_navigation_bg) + ThemeUtils.applyThemeDrawable(binding.mainBackgroundView, R.attr.main_bg_surface_alt) + + } + + fun recyclerViewSetUp(){ + val layoutManager = LinearLayoutManager(context) + layoutManager.orientation = LinearLayoutManager.VERTICAL + binding.listView.setLayoutManager(layoutManager) + + formRecyclerViewAdapter = FormRecyclerViewAdapter(bulletinInfo,this) + binding.listView.setAdapter(formRecyclerViewAdapter) + } + + fun setUpItems() : ArrayList<BulletinItem> { + val title = Title("Version " + "1.21",Color.RED,"In this update","loreum ipsum loreum ipsum loreum ipsum loreum ipsum loreum ipsum") + + val message = Message(Message.MessageType.HTML,"<header>\n" + + " <h1>Harry Potter's House</h1>\n" + + " <p class=\"address\">\n" + + "Privet Drive, 4<br>Little Whinging<br>Surrey<br>England<br>Great Britain\n" + + " </p>\n" + + "</header>") + + val size = Size(700,500) + val media = Media(Media.MediaType.IMAGE,"https://media.wazirx.com/test_resources/crypto_gifts.png",null) + + val bullet = Bullet(Bullet.BulletType.IMAGE,"\uD83D\uDE01","https://s3.amazonaws.com/p.hellopye.com/app_assets/dashboard_deposit/3x.png") //"\u00F6" //"✋" + + val bulletPoint = BulletPoint(bullet,"Vestibulum","Etiam porta sem malesuada magna mollis euismod.") + + val bulletPoint2 = BulletPoint(bullet,"Justo Condimentum","Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.") + + val actionButton = ActionButton("Take me to Crypto Gifts",null) + + return arrayListOf(title, message) // media, bulletPoint, bulletPoint2, actionButton + + } + + fun setupButtonClickEvent() { + binding.goItButton.setOnClickListener { + // Back event need to handle + } + } + + override fun formDidTriggerEvent( + eventType: BulletinItem.EventType, + baseItem: BulletinItem, + index: Int + ): Boolean { + bulletinListener?.onButtonClick("") + return true + } + + interface BulletinListener { + fun onButtonClick(response: String) + fun backButtonClick() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/BulletinSdk.kt b/app/src/main/java/com/bulletin/BulletinSdk.kt index cd6b5bb..f99e069 100644 --- a/app/src/main/java/com/bulletin/BulletinSdk.kt +++ b/app/src/main/java/com/bulletin/BulletinSdk.kt @@ -7,50 +7,78 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import com.bulletin.extension.lastSeenVersion import com.bulletin.models.BulletinInfo +import com.bulletin.models.BulletinItem import com.bulletin.utilities.AppStorageHelper +import com.example.bulletin.BulletinDialog import com.example.bulletin.DefaultActivity +import com.example.bulletin.R enum class Appearance(val value: String) { DARK("dark"), - LIGHT("light"), - SYSTEM("system"); + LIGHT("light"); +} + +object AppTheme { + var appearance: Appearance = Appearance.DARK + + fun getCurrentTheme(): Int { + + return when (appearance) { + Appearance.DARK -> R.style.AppThemeBase_DarkKnight + Appearance.LIGHT -> R.style.AppThemeBase_WhiteKnight + } + } } class BulletinSdk(val dataStore: BulletinDataStore, val theme : Appearance) { - fun showFullBulletin(context: Context) : Boolean { + fun getFullBulletin(context: Context,listner : BulletinDialog.BulletinListener) : BulletinDialog? { val items = dataStore.getData(null, null) - return showBulletin(context, items) + return getBulletin(context, items,listner) } - fun showLastBulletins(context: Context, limit: Int? = 1): Boolean { + + fun getLastBulletins(context: Context, limit: Int? = 1,listner : BulletinDialog.BulletinListener): BulletinDialog? { val items = dataStore.getData(null, null, limit) - return showBulletin(context, items) + return getBulletin(context, items,listner) } - fun showUnseenBulletin(context: Context, limit: Int? = null): Boolean { - val lastseenVersion = AppStorageHelper.shared.lastSeenVersion ?: return false + fun getUnseenBulletin(context: Context, limit: Int? = null,listner : BulletinDialog.BulletinListener): BulletinDialog? { + val lastseenVersion = AppStorageHelper.shared.lastSeenVersion ?: return null val items = dataStore.getData(lastseenVersion, null, limit) - return showBulletin(context, items) + return getBulletin(context, items,listner) } - fun showBulletin(context: Context, item: ArrayList<BulletinInfo>?): Boolean { - if (item == null || item.isEmpty()) return false; + fun getBulletin(context: Context,item: ArrayList<BulletinInfo>?, listner : BulletinDialog.BulletinListener): BulletinDialog? { + if (item == null || item.isEmpty()) return null; + +// when (theme) { +// Appearance.DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) +// Appearance.LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) +// Appearance.SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) +// } + + AppTheme.appearance = theme +// val mainIntent = Intent(context, MainActivity::class.java) +// val bundle = Bundle() +// bundle.putSerializable("BulletinInfo", item) +// mainIntent.putExtras(bundle) +// startActivity(context, mainIntent, null) - when (theme) { - Appearance.DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - Appearance.LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - Appearance.SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + val bulletinItems: ArrayList<BulletinItem> = ArrayList() + + item.forEach { bulletItem -> + for (bulletinItem in bulletItem.items) { + bulletinItems.add(bulletinItem) + } } - val mainIntent = Intent(context, DefaultActivity::class.java) - val bundle = Bundle() - bundle.putSerializable("BulletinInfo", item) - mainIntent.putExtras(bundle) - ContextCompat.startActivity(context, mainIntent, null) - return true + val bulletinDialog = BulletinDialog(bulletinItems) + bulletinDialog.bulletinListener = listner + + return bulletinDialog } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/bulletin/DefaultActivity.kt b/app/src/main/java/com/bulletin/DefaultActivity.kt index 3ddef22..10df314 100644 --- a/app/src/main/java/com/bulletin/DefaultActivity.kt +++ b/app/src/main/java/com/bulletin/DefaultActivity.kt @@ -1,10 +1,13 @@ package com.example.bulletin +import android.graphics.Color import android.os.Build import android.os.Bundle import android.util.Size import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager +import com.bulletin.AppTheme +import com.bulletin.Appearance import com.bulletin.FormRecyclerViewAdapter import com.bulletin.extension.textAppearence import com.bulletin.models.* @@ -13,7 +16,7 @@ import com.bulletin.utilities.ViewUtil import com.example.bulletin.databinding.ActivityMainBinding import com.wrx.wazirx.views.bulletin.model.Media -class DefaultActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClickListener { +class DefaultActivity : AppCompatActivity(){ // region Variables private lateinit var binding: ActivityMainBinding @@ -23,12 +26,17 @@ class DefaultActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClick override fun onCreate(savedInstanceState: Bundle?) { + when (AppTheme.appearance) { + Appearance.DARK -> setTheme(R.style.AppThemeBase_DarkKnight) + Appearance.LIGHT -> setTheme(R.style.AppThemeBase_WhiteKnight) + } + super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) + // binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) (intent.extras?.getSerializable("ABC") as? ArrayList<BulletinInfo>)?.let { for (dict in it) { @@ -39,43 +47,43 @@ class DefaultActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClick } - loadDisplayContent() - updateAppearance() - recyclerViewSetUp() +// loadDisplayContent() +// updateAppearance() +// recyclerViewSetUp() } - fun loadDisplayContent() { - ViewUtil.addBounceEffect(binding.goItButton) - setupButtonClickEvent() - } - - fun updateAppearance() { - - binding.headerTitle.textAppearence(R.style.large_semi_bold) - binding.goItButton.textAppearence(R.style.base_bold) - - binding.headerTitle.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_navigation_onNavigation, binding.headerTitle.context)) - - binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) - binding.goItButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, binding.goItButton.context)) - - ThemeUtils.applyThemeDrawable(binding.headerView, R.attr.main_navigation_bg) - ThemeUtils.applyThemeDrawable(binding.mainBackgroundView, R.attr.main_bg_surface_alt) - - } - - fun recyclerViewSetUp(){ - val layoutManager = LinearLayoutManager(this) - layoutManager.orientation = LinearLayoutManager.VERTICAL - binding.listView.setLayoutManager(layoutManager) - - formRecyclerViewAdapter = FormRecyclerViewAdapter(setUpItems(),this) - binding.listView.setAdapter(formRecyclerViewAdapter) - } +// fun loadDisplayContent() { +// // ViewUtil.addBounceEffect(binding.goItButton) +// setupButtonClickEvent() +// } + +// fun updateAppearance() { +// +// binding.headerTitle.textAppearence(R.style.large_semi_bold) +// binding.goItButton.textAppearence(R.style.base_bold) +// +// binding.headerTitle.setTextColor(ThemeUtils.getAttributedColor(R.attr.main_navigation_onNavigation, binding.headerTitle.context)) +// +// binding.listView.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.main_bg_surface_alt, binding.listView.context)) +// binding.goItButton.setBackgroundColor(ThemeUtils.getAttributedColor(R.attr.brand_bg_primary, binding.goItButton.context)) +// +// ThemeUtils.applyThemeDrawable(binding.headerView, R.attr.main_navigation_bg) +// ThemeUtils.applyThemeDrawable(binding.mainBackgroundView, R.attr.main_bg_surface_alt) +// +// } + +// fun recyclerViewSetUp(){ +// val layoutManager = LinearLayoutManager(this) +// layoutManager.orientation = LinearLayoutManager.VERTICAL +// binding.listView.setLayoutManager(layoutManager) +// +// formRecyclerViewAdapter = FormRecyclerViewAdapter(setUpItems(),this) +// binding.listView.setAdapter(formRecyclerViewAdapter) +// } fun setUpItems() : ArrayList<BulletinItem> { - val title = Title("Version " + "1.21","In this update","loreum ipsum loreum ipsum loreum ipsum loreum ipsum loreum ipsum") + val title = Title("Version " + "1.21", Color.RED,"In this update","loreum ipsum loreum ipsum loreum ipsum loreum ipsum loreum ipsum") val message = Message(Message.MessageType.HTML,"<header>\n" + " <h1>Harry Potter's House</h1>\n" + @@ -99,19 +107,19 @@ class DefaultActivity : AppCompatActivity(), FormRecyclerViewAdapter.OnItemClick } - fun setupButtonClickEvent() { - binding.goItButton.setOnClickListener { - // Back event need to handle - finish() - } - } - - override fun formDidTriggerEvent( - eventType: BulletinItem.EventType, - baseItem: BulletinItem, - index: Int - ): Boolean { - return true - } +// fun setupButtonClickEvent() { +// binding.goItButton.setOnClickListener { +// // Back event need to handle +// finish() +// } +// } +// +// override fun formDidTriggerEvent( +// eventType: BulletinItem.EventType, +// baseItem: BulletinItem, +// index: Int +// ): Boolean { +// return true +// } } diff --git a/app/src/main/java/com/bulletin/models/Title.kt b/app/src/main/java/com/bulletin/models/Title.kt index cba6bff..a1feff4 100644 --- a/app/src/main/java/com/bulletin/models/Title.kt +++ b/app/src/main/java/com/bulletin/models/Title.kt @@ -1,8 +1,9 @@ package com.bulletin.models +import android.graphics.Color -data class Title(val preTitleText: String?, val titleText: String?, val subTitleText: String?) : - BulletinItem() { + +data class Title(val preTitleText: String?,val preTitleTextColor: Int?, val titleText: String?, val subTitleText: String?) : BulletinItem() { // region Init Methods init { @@ -16,13 +17,17 @@ data class Title(val preTitleText: String?, val titleText: String?, val subTitle // Set PreTitle val preTitleText = (attributes["preTitleText"] as? String) ?: return null + // Set PreTitle Color + val preTitleTextColor = (attributes["preTitleTextColor"] as? String) ?: return null + val preTitleTextColor1 = Color.parseColor(preTitleTextColor) + // Set Title val titleText = (attributes["titleText"] as? String) ?: return null // Set SubTitle val subTitleText = (attributes["subTitleText"] as? String) ?: return null - return Title(preTitleText, titleText, subTitleText) + return Title(preTitleText,preTitleTextColor1, titleText, subTitleText) } } } diff --git a/app/src/main/res/layout/bulletin_dialog.xml b/app/src/main/res/layout/bulletin_dialog.xml new file mode 100644 index 0000000..040f3e2 --- /dev/null +++ b/app/src/main/res/layout/bulletin_dialog.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="20dp" + tools:context=".BulletinDialog"> + + <LinearLayout + android:id="@+id/main_background_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/view_background" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + android:orientation="vertical"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/header_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/header_background" + android:paddingStart="20dp" + android:paddingTop="12dp" + android:paddingEnd="20dp" + android:paddingBottom="8dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:id="@+id/header_title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="2dp" + android:gravity="center" + android:text="@string/whats_new_title" + android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/list_view" + android:layout_width="match_parent" + android:layout_height="0dp" + app:layout_constraintVertical_weight="1" + android:clipToPadding="false" + android:overScrollMode="never" + android:layout_weight="1" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/header_view" + app:layout_constraintVertical_chainStyle="spread"/> + + <Button + android:id="@+id/go_it_button" + style="@style/Widget.MaterialComponents.Button.UnelevatedButton" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="20dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="20dp" + android:layout_marginBottom="20dp" + android:insetTop="0dp" + android:insetBottom="0dp" + android:text="@string/okay_go_it" + android:textSize="14sp" + app:cornerRadius="5dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/list_view" + app:layout_constraintVertical_chainStyle="spread"/> + + </LinearLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/layout_form_bullet_point.xml b/app/src/main/res/layout/layout_form_bullet_point.xml index 290fbcf..1d9d159 100644 --- a/app/src/main/res/layout/layout_form_bullet_point.xml +++ b/app/src/main/res/layout/layout_form_bullet_point.xml @@ -19,7 +19,6 @@ android:id="@+id/bullet_label" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="?attr/main_text_primary" android:textSize="14sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -51,7 +50,6 @@ android:id="@+id/title_label" android:layout_width="0dp" android:layout_height="wrap_content" - android:textColor="?attr/main_text_primary" android:textSize="14sp" app:layout_constraintBottom_toTopOf="@id/subtitle_label" app:layout_constraintStart_toStartOf="parent" @@ -63,7 +61,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" - android:textColor="?attr/main_text_primary" android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@id/title_label" diff --git a/app/src/main/res/layout/layout_form_section_action_button.xml b/app/src/main/res/layout/layout_form_section_action_button.xml index 068902a..c98c027 100644 --- a/app/src/main/res/layout/layout_form_section_action_button.xml +++ b/app/src/main/res/layout/layout_form_section_action_button.xml @@ -9,6 +9,7 @@ android:id="@+id/action_button" android:layout_width="0dp" android:layout_height="wrap_content" + android:textAppearance="@style/TextStyle" android:layout_marginTop="16dp" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" diff --git a/app/src/main/res/layout/layout_form_section_message.xml b/app/src/main/res/layout/layout_form_section_message.xml index 2fcb417..c2cc8ed 100644 --- a/app/src/main/res/layout/layout_form_section_message.xml +++ b/app/src/main/res/layout/layout_form_section_message.xml @@ -12,7 +12,6 @@ android:layout_marginTop="16dp" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" - android:textColor="?attr/main_text_primary" android:textSize="14sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/layout_form_section_title.xml b/app/src/main/res/layout/layout_form_section_title.xml index 3954302..3794581 100644 --- a/app/src/main/res/layout/layout_form_section_title.xml +++ b/app/src/main/res/layout/layout_form_section_title.xml @@ -22,7 +22,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" - android:textColor="?attr/success_text_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="Name" /> @@ -33,7 +32,6 @@ android:layout_height="wrap_content" android:textSize="22sp" android:layout_gravity="start" - android:textColor="?attr/success_text_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/pre_title_label" diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml deleted file mode 100644 index 5539eed..0000000 --- a/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,85 +0,0 @@ -<resources xmlns:tools="http://schemas.android.com/tools"> - <!-- Base application theme. --> - <style name="Theme.Bulletin" parent="Theme.MaterialComponents.DayNight.NoActionBar"> - <!-- Primary brand color. --> - <item name="colorPrimary">@color/purple_200</item> - <item name="colorPrimaryVariant">@color/purple_700</item> - <item name="colorOnPrimary">@color/black</item> - <!-- Secondary brand color. --> - <item name="colorSecondary">@color/teal_200</item> - <item name="colorSecondaryVariant">@color/teal_200</item> - <item name="colorOnSecondary">@color/black</item> - <!-- Status bar color. --> - <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> - <!-- Customize your theme here. --> - - ------------------ New Dark theme Color ------------------------ - <item name="main_text_primary">@color/colors_gray_30</item> - <item name="main_text_secondary">@color/colors_gray_50</item> - <item name="main_text_tertiary">@color/colors_gray_60</item> - - <item name="main_brand_primary">@color/colors_blue_40</item> - - <item name="main_navigation_onNavigation">@color/colors_gray_30</item> <!-- //?attr/main_text_primary--> - <item name="main_navigation_bg">@color/colors_gray_80</item> - - <item name="main_bg_surface">@color/colors_gray_100</item> - <item name="main_bg_surface_alt">@color/colors_gray_100</item> - <item name="main_bg_primary">@color/colors_gray_80</item> - <item name="main_bg_secondary">@color/colors_gray_90</item> - <item name="main_bg_tertiary">@color/colors_gray_70</item> - - <item name="brand_text_secondary">@color/colors_blue_20</item> - - <item name="brand_text_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> - <item name="brand_text_onMuted">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> - <item name="brand_text_onPrimary">@color/colors_white</item> - - <item name="brand_bg_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> - <item name="brand_bg_muted">@color/colors_blue_90</item> - <item name="brand_bg_muted_border">@color/colors_blue_80</item> - - <item name="success_text_primary">@color/colors_green_40</item> - <item name="success_text_onMuted">@color/colors_green_30</item> - <item name="success_text_onPrimary">@color/colors_white</item> - - <item name="success_bg_primary">@color/colors_green_50</item> - <item name="success_bg_muted">@color/colors_green_80</item> - <item name="success_bg_muted_border">@color/colors_green_70</item> - - <item name="danger_text_primary">@color/colors_red_50</item> - <item name="danger_text_onMuted">@color/colors_red_30</item> - <item name="danger_text_onPrimary">@color/colors_white</item> - - <item name="danger_bg_primary">@color/colors_red_50</item> - <item name="danger_bg_muted">@color/colors_red_100</item> - <item name="danger_bg_muted_border">@color/colors_red_90</item> - - <item name="warning_text_onMuted">@color/colors_yellow_20</item> - <item name="warning_text_primary">@color/colors_yellow_50</item> - <item name="warning_text_onPrimary">@color/colors_yellow_100</item> - - <item name="warning_bg_muted">@color/colors_yellow_100</item> - <item name="warning_bg_primary">@color/colors_yellow_50</item> - <item name="warning_bg_muted_border">@color/colors_yellow_90</item> - - <item name="brand_alt_text_secondary">@color/colors_blue_20</item> - <item name="brand_alt_text_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> - <item name="brand_alt_text_onMuted">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> - <item name="brand_alt_text_onPrimary">@color/colors_white</item> - - <item name="brand_alt_bg_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> - <item name="brand_alt_bg_muted">@color/colors_blue_90</item> - <item name="brand_alt_bg_disabled">@color/colors_blue_40</item> <!-- ?attr/brand_bg_primary--> - - <item name="attention_text_onMuted">@color/colors_orange_30</item> - <item name="attention_text_primary">@color/colors_orange_50</item> - <item name="attention_text_onPrimary">@color/colors_orange_100</item> - - <item name="attention_bg_muted">@color/colors_orange_100</item> - <item name="attention_bg_muted_border">@color/colors_orange_90</item> - <item name="attention_bg_primary">@color/colors_orange_50</item> - - <item name="misc_home_bar">@color/colors_white</item> - </style> -</resources> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8e6cda0..86c04a6 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,6 +10,8 @@ <color name="transparent">#00000000</color> + <color name="colorPrimaryBackground">#18222C</color> + ------------------ New Color ------------------------ <color name="colors_black">#000000</color> <color name="colors_white">#ffffff</color> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e759221..0476db3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,9 +1,43 @@ <resources xmlns:tools="http://schemas.android.com/tools"> + <!-- <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />--> + + <!-- <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />--> + + <!-- <style name="TransactionDetailsDialog" parent="Theme.AppCompat.Light.NoActionBar">--> + <!-- <item name="windowNoTitle">true</item>--> + <!-- <item name="android:windowAnimationStyle">@style/TransactionDetailsDialog.Animation</item>--> + <!-- <item name="android:backgroundDimEnabled">true</item>--> + <!-- <item name="android:windowFullscreen">true</item>--> + <!-- <item name="android:windowIsFloating">false</item>--> + <!-- <item name="android:backgroundDimAmount">0.0</item>--> + <!-- </style>--> + <!-- <style name="Theme.Transparent" parent="Theme.MaterialComponents.DayNight.NoActionBar">--> + <!-- <item name="android:windowIsTranslucent">true</item>--> + <!-- <item name="android:windowFrame">@null</item>--> + <!-- <item name="android:windowFullscreen">true</item>--> + <!-- <item name="android:windowBackground">@android:color/transparent</item>--> + <!-- <item name="android:windowContentOverlay">@null</item>--> + <!-- <item name="android:windowNoTitle">true</item>--> + <!-- <item name="android:windowIsFloating">true</item>--> + <!-- <item name="android:backgroundDimEnabled">false</item>--> + <!-- <item name="android:windowAnimationStyle">@style/WDConfirmDialog.Animation</item>--> + <!-- </style>--> + + <style name="TextStyle" parent="@android:style/TextAppearance"> + <item name="android:textSize">20sp</item> + <item name="android:textColor">#aacbb4</item> + </style> - <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> - - <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> + <!-- <style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">--> + <!-- <item name="android:background">#33000000</item>--> + <!-- <item name="android:windowIsTranslucent">true</item>--> + <!-- <item name="android:windowFullscreen">true</item>--> + <!-- <item name="android:windowBackground">@android:color/transparent</item>--> + <!-- <item name="android:windowContentOverlay">@null</item>--> + <!-- <item name="android:windowNoTitle">true</item>--> + <!-- <item name="android:backgroundDimEnabled">false</item>--> + <!-- </style>--> <style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowIsTranslucent">true</item> @@ -14,6 +48,21 @@ <item name="android:backgroundDimEnabled">false</item> </style> + <style name="SheetDialog" parent="Theme.Material3.Light.Dialog"> + <item name="android:windowIsTranslucent">true</item> + <item name="android:windowContentOverlay">@null</item> + <item name="android:colorBackground">@android:color/transparent</item> + <item name="android:backgroundDimEnabled">true</item> + <item name="android:backgroundDimAmount">0.3</item> + <item name="android:windowFrame">@null</item> + <item name="android:windowIsFloating">true</item> + </style> + + <!-- <style name="DialogStyle" parent="SheetDialog">--> + <!-- <item name="android:titleColor">@android:color/transparent</item>--> + <!-- <item name="android:subTitleColor">@android:color/transparent</item>--> + <!-- </style>--> + <style name="default_button"> <item name="android:insetTop">0dp</item> <item name="android:insetBottom">0dp</item> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index c651231..9ece324 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,11 @@ + <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> - <style name="Theme.Bulletin" parent="Theme.MaterialComponents.DayNight.NoActionBar"> + + <style name="AppThemeBase" parent="Theme.MaterialComponents.Light.NoActionBar"> + </style> + + <style name="AppThemeBase.WhiteKnight"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> @@ -8,9 +13,11 @@ <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> - <item name="colorOnSecondary">@color/black</item> + <item name="colorOnSecondary">@color/transparent</item> + + <item name="colorPrimaryDark">@android:color/transparent</item> <!-- Status bar color. --> - <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> + <item name="android:statusBarColor" tools:targetApi="l">@color/colors_gray_100</item> <!-- Customize your theme here. --> @@ -82,4 +89,90 @@ <item name="misc_home_bar">@color/colors_black</item> </style> + + <style name="AppThemeBase.DarkKnight"> + <!-- Primary brand color. --> + <item name="colorPrimary">@color/purple_200</item> + <item name="colorPrimaryVariant">@color/purple_700</item> + <item name="colorOnPrimary">@color/black</item> + <!-- Secondary brand color. --> + <item name="colorSecondary">@color/teal_200</item> + <item name="colorSecondaryVariant">@color/teal_200</item> + <item name="colorOnSecondary">@color/black</item> + + <item name="colorPrimaryDark">@android:color/transparent</item> + <!-- Status bar color. --> + <item name="android:statusBarColor" tools:targetApi="l">@color/colors_gray_100</item> + <!-- Customize your theme here. --> + + ------------------ New Dark theme Color ------------------------ + <item name="main_text_primary">@color/colors_gray_30</item> + <item name="main_text_secondary">@color/colors_gray_50</item> + <item name="main_text_tertiary">@color/colors_gray_60</item> + + <item name="main_brand_primary">@color/colors_blue_40</item> + + <item name="main_navigation_onNavigation">@color/colors_gray_30</item> <!-- //?attr/main_text_primary--> + <item name="main_navigation_bg">@color/colors_gray_80</item> + + <item name="main_bg_surface">@color/colors_gray_100</item> + <item name="main_bg_surface_alt">@color/colors_gray_100</item> + <item name="main_bg_primary">@color/colors_gray_80</item> + <item name="main_bg_secondary">@color/colors_gray_90</item> + <item name="main_bg_tertiary">@color/colors_gray_70</item> + + <item name="brand_text_secondary">@color/colors_blue_20</item> + + <item name="brand_text_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> + <item name="brand_text_onMuted">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> + <item name="brand_text_onPrimary">@color/colors_white</item> + + <item name="brand_bg_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> + <item name="brand_bg_muted">@color/colors_blue_90</item> + <item name="brand_bg_muted_border">@color/colors_blue_80</item> + + <item name="success_text_primary">@color/colors_green_40</item> + <item name="success_text_onMuted">@color/colors_green_30</item> + <item name="success_text_onPrimary">@color/colors_white</item> + + <item name="success_bg_primary">@color/colors_green_50</item> + <item name="success_bg_muted">@color/colors_green_80</item> + <item name="success_bg_muted_border">@color/colors_green_70</item> + + <item name="danger_text_primary">@color/colors_red_50</item> + <item name="danger_text_onMuted">@color/colors_red_30</item> + <item name="danger_text_onPrimary">@color/colors_white</item> + + <item name="danger_bg_primary">@color/colors_red_50</item> + <item name="danger_bg_muted">@color/colors_red_100</item> + <item name="danger_bg_muted_border">@color/colors_red_90</item> + + <item name="warning_text_onMuted">@color/colors_yellow_20</item> + <item name="warning_text_primary">@color/colors_yellow_50</item> + <item name="warning_text_onPrimary">@color/colors_yellow_100</item> + + <item name="warning_bg_muted">@color/colors_yellow_100</item> + <item name="warning_bg_primary">@color/colors_yellow_50</item> + <item name="warning_bg_muted_border">@color/colors_yellow_90</item> + + <item name="brand_alt_text_secondary">@color/colors_blue_20</item> + <item name="brand_alt_text_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> + <item name="brand_alt_text_onMuted">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> + <item name="brand_alt_text_onPrimary">@color/colors_white</item> + + <item name="brand_alt_bg_primary">@color/colors_blue_40</item> <!-- ?attr/main_brand_primary--> + <item name="brand_alt_bg_muted">@color/colors_blue_90</item> + <item name="brand_alt_bg_disabled">@color/colors_blue_40</item> <!-- ?attr/brand_bg_primary--> + + <item name="attention_text_onMuted">@color/colors_orange_30</item> + <item name="attention_text_primary">@color/colors_orange_50</item> + <item name="attention_text_onPrimary">@color/colors_orange_100</item> + + <item name="attention_bg_muted">@color/colors_orange_100</item> + <item name="attention_bg_muted_border">@color/colors_orange_90</item> + <item name="attention_bg_primary">@color/colors_orange_50</item> + + <item name="misc_home_bar">@color/colors_white</item> + </style> + </resources> \ No newline at end of file