Skip to content

Commit 063eac8

Browse files
Merge pull request #623 from Kommunicate-io/patch/2.13.3
Patch/2.13.3
2 parents 651400e + 7b21e49 commit 063eac8

File tree

11 files changed

+310
-39
lines changed

11 files changed

+310
-39
lines changed

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
androidDatabaseSqlcipher = "4.5.0"
33
androidGradlePlugin = '8.5.2'
44
appcompat = "1.7.0"
5+
browser = "1.8.0"
56
circleimageview = "2.2.0"
67
cardview = "1.0.0"
78
constraintlayout = "2.0.4"
@@ -42,6 +43,7 @@ sentryPluginVersion = "4.11.0"
4243

4344
[libraries]
4445
android-database-sqlcipher = { module = "net.zetetic:android-database-sqlcipher", version.ref = "androidDatabaseSqlcipher" }
46+
browser = { module = "androidx.browser:browser", version.ref = "browser" }
4547
cardview = { module = "androidx.cardview:cardview", version.ref = "cardview" }
4648
circleimageview = { module = "de.hdodenhof:circleimageview", version.ref = "circleimageview" }
4749
constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }

kommunicate/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ android {
1818
compileSdk 34
1919
targetSdkVersion 35
2020
versionCode 1
21-
versionName "2.13.2"
21+
versionName "2.13.3"
2222
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2323
buildConfigField "String", "KOMMUNICATE_VERSION", "\"" + versionName + "\""
2424
buildConfigField "String", "CHAT_SERVER_URL", '"https://chat.kommunicate.io"'

kommunicateui/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ android {
1616
targetSdkVersion 35
1717
minSdkVersion 21
1818
versionCode 1
19-
versionName "2.13.2"
19+
versionName "2.13.3"
2020
buildToolsVersion = '34.0.0'
2121
consumerProguardFiles 'proguard-rules.txt'
2222
vectorDrawables.useSupportLibrary = true
@@ -53,6 +53,7 @@ dependencies {
5353
api libs.glide
5454
api libs.cardview
5555
api libs.material
56+
implementation libs.browser
5657
api libs.swiperefreshlayout
5758
implementation libs.media3.exoplayer
5859
implementation libs.media3.ui

kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/fragment/MobiComConversationFragment.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,6 +1502,13 @@ public void sendMessage(String message, Map<String, String> messageMetaData, Fil
15021502
MobiComUserPreference userPreferences = MobiComUserPreference.getInstance(getActivity());
15031503
Message messageToSend = new Message();
15041504

1505+
// check for conversation closed or not.
1506+
if (channel.getKmStatus() == Channel.CLOSED_CONVERSATIONS
1507+
&& !alCustomizationSettings.isRestartConversationButtonVisibility()
1508+
) {
1509+
return;
1510+
}
1511+
15051512
if (channel != null) {
15061513
messageToSend.setGroupId(channel.getKey());
15071514
if (!TextUtils.isEmpty(channel.getClientGroupId())) {
@@ -4170,7 +4177,6 @@ public void onDestroyView() {
41704177
if (KommunicateAudioManager.getInstance(getContext()) != null) {
41714178
KommunicateAudioManager.getInstance(getContext()).audiostop();
41724179
}
4173-
KmFormStateHelper.clearInstance();
41744180
}
41754181

41764182
public ViewGroup.LayoutParams getImageLayoutParam(boolean outBoxType) {

kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/richmessaging/RichMessageActionProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ public void handleKmSubmitButton(final Context context, final Message message, f
329329
Utils.printLog(context, TAG, "Submitting data : " + GsonUtils.getJsonFromObject(formStateModel != null ? dataMap : submitButtonModel.getFormData(), Map.class));
330330

331331
if (submitButtonModel.getPostBackToKommunicate() != null && submitButtonModel.getPostBackToKommunicate().equalsIgnoreCase("true")) {
332-
sendFormDataAsMessage(message, metadata, dataMap, "", "");
332+
sendFormDataAsMessage(message, metadata, dataMap, submitButtonModel.getMessage(), submitButtonModel.getAddFormLabelInMessage());
333333

334334
if (richMessageListener != null) {
335335
richMessageListener.onAction(context, NOTIFY_ITEM_CHANGE, message, dataMap, submitButtonModel.getReplyMetadata());

kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/richmessaging/adapters/KmFormItemAdapter.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ public KmFormItemAdapter(Context context, List<KmFormPayloadModel> payloadList,
9696
this.formStateModel = KmFormStateHelper.getFormState(messageKey);
9797
this.alCustomizationSettings = alCustomizationSettings;
9898

99-
KmFormStateHelper.initFormState();
100-
10199
if (formStateModel == null) {
102100
formStateModel = new KmFormStateModel();
103101
}
@@ -404,11 +402,12 @@ public void onGlobalLayout() {
404402

405403
formItemViewHolder.formDropdownList.setAdapter(dropdownItemAdapter);
406404
dropdownItemAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
407-
formItemViewHolder.formDropdownList.setSelection(filterDropdownList(dropdownList.getOptions()));
408405
formItemViewHolder.formDropdownList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
409406
@Override
410407
public void onItemSelected(AdapterView<?> parent, View view, int dropdownItemPosition, long id) {
411-
dropdownFieldArray.put(position, dropdownList.getOptions().get(dropdownItemPosition));
408+
KmFormPayloadModel.Options options = dropdownList.getOptions().get(dropdownItemPosition);
409+
options.setSelected(true);
410+
dropdownFieldArray.put(position, options);
412411
formStateModel.setDropdownFieldArray(dropdownFieldArray);
413412
KmFormStateHelper.addFormState(messageKey, formStateModel);
414413
}
@@ -417,6 +416,7 @@ public void onItemSelected(AdapterView<?> parent, View view, int dropdownItemPos
417416
public void onNothingSelected(AdapterView<?> parent) {
418417
}
419418
});
419+
formItemViewHolder.formDropdownList.setSelection(filterDropdownList(dropdownList.getOptions(), dropdownFieldArray.valueAt(position)));
420420
}
421421
}
422422
}
@@ -444,10 +444,10 @@ private void processCheckBoxSelectedState(boolean isChecked, int index, int posi
444444
}
445445

446446
//Returns the position of the item to be selected by default
447-
private int filterDropdownList(List<KmFormPayloadModel.Options> dropdownList) {
447+
private int filterDropdownList(List<KmFormPayloadModel.Options> dropdownList, KmFormPayloadModel.Options dropdownFieldArray) {
448448
int selectedIndex = 0;
449449
for (int i = 0; i < dropdownList.size(); i++) {
450-
if (dropdownList.get(i).isSelected()) {
450+
if (dropdownList.get(i).isSelected() || dropdownList.get(i).getLabel().equals(dropdownFieldArray.getLabel())) {
451451
selectedIndex = i;
452452
break;
453453
}

kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/richmessaging/helpers/KmFormStateHelper.java

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.applozic.mobicommons.json.GsonUtils;
88
import com.google.gson.Gson;
99
import com.google.gson.reflect.TypeToken;
10+
import com.applozic.mobicomkit.uiwidgets.utils.RichMessageSharedPreference;
1011

1112
import java.util.HashMap;
1213
import java.util.HashSet;
@@ -18,35 +19,12 @@
1819

1920
public class KmFormStateHelper {
2021

21-
private static Map<String, KmFormStateModel> formStateModelMap;
22-
23-
public static void initFormState() {
24-
if (formStateModelMap == null) {
25-
formStateModelMap = new HashMap<>();
26-
}
27-
}
28-
2922
public static void addFormState(String messageKey, KmFormStateModel formStateModel) {
30-
initFormState();
31-
32-
formStateModelMap.put(messageKey, formStateModel);
23+
RichMessageSharedPreference.setFormData(messageKey, formStateModel);
3324
}
3425

3526
public static KmFormStateModel getFormState(String messageKey) {
36-
if (formStateModelMap != null) {
37-
return formStateModelMap.get(messageKey);
38-
}
39-
return null;
40-
}
41-
42-
public static void removeFormState(String messageKey) {
43-
if (formStateModelMap != null) {
44-
formStateModelMap.remove(messageKey);
45-
}
46-
}
47-
48-
public static void clearInstance() {
49-
formStateModelMap = null;
27+
return RichMessageSharedPreference.getFormData(messageKey);
5028
}
5129

5230
public static Map<String, Object> getKmFormMap(Message message, KmFormStateModel formStateModel) {

kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/richmessaging/models/KmFormStateModel.java

Lines changed: 181 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,22 @@
55

66
import com.applozic.mobicomkit.uiwidgets.conversation.richmessaging.models.v2.KmFormPayloadModel;
77
import com.applozic.mobicommons.json.JsonMarker;
8+
import com.google.gson.Gson;
9+
import com.google.gson.GsonBuilder;
10+
import com.google.gson.JsonArray;
11+
import com.google.gson.JsonDeserializationContext;
12+
import com.google.gson.JsonDeserializer;
13+
import com.google.gson.JsonElement;
14+
import com.google.gson.JsonObject;
15+
import com.google.gson.JsonParseException;
16+
import com.google.gson.JsonSerializationContext;
17+
import com.google.gson.JsonSerializer;
18+
import com.google.gson.reflect.TypeToken;
819

20+
import com.applozic.mobicommons.json.GsonUtils;
21+
22+
23+
import java.lang.reflect.Type;
924
import java.util.HashSet;
1025
import java.util.Map;
1126

@@ -19,7 +34,7 @@ public class KmFormStateModel extends JsonMarker {
1934
private Map<String, String> hiddenFields;
2035
private SparseIntArray validationArray;
2136
private SparseArray<Long> dateFieldArray;
22-
private SparseArray<KmFormPayloadModel.Options> dropdownFieldArray;
37+
private SparseArray<String> dropdownFieldArray;
2338

2439
public SparseArray<String> getTextFields() {
2540
return textFields;
@@ -86,10 +101,172 @@ public void setDateFieldArray(SparseArray<Long> dateFieldArray) {
86101
}
87102

88103
public SparseArray<KmFormPayloadModel.Options> getDropdownFieldArray() {
89-
return dropdownFieldArray;
104+
if (dropdownFieldArray == null) {
105+
return null;
106+
}
107+
SparseArray<KmFormPayloadModel.Options> result = new SparseArray<>();
108+
for (int i=0; i<dropdownFieldArray.size(); i++) {
109+
result.put(dropdownFieldArray.keyAt(i), GsonUtils.getObjectFromJson(dropdownFieldArray.get(i), KmFormPayloadModel.Options.class));
110+
}
111+
return result;
90112
}
91113

92114
public void setDropdownFieldArray(SparseArray<KmFormPayloadModel.Options> dropdownFieldArray) {
93-
this.dropdownFieldArray = dropdownFieldArray;
115+
SparseArray<String> result = new SparseArray<>();
116+
for (int i=0; i<dropdownFieldArray.size(); i++) {
117+
result.put(dropdownFieldArray.keyAt(i), GsonUtils.getJsonFromObject(dropdownFieldArray.get(i), KmFormPayloadModel.Options.class));
118+
}
119+
this.dropdownFieldArray = result;
120+
}
121+
122+
public static class SparseArrayStringAdapter implements JsonSerializer<SparseArray<String>>, JsonDeserializer<SparseArray<String>> {
123+
@Override
124+
public JsonElement serialize(SparseArray<String> src, Type typeOfSrc, JsonSerializationContext context) {
125+
JsonObject jsonObject = new JsonObject();
126+
for (int i = 0; i < src.size(); i++) {
127+
int key = src.keyAt(i);
128+
String value = src.valueAt(i);
129+
jsonObject.addProperty(String.valueOf(key), value);
130+
}
131+
return jsonObject;
132+
}
133+
134+
@Override
135+
public SparseArray<String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
136+
SparseArray<String> result = new SparseArray<>();
137+
JsonObject jsonObject = json.getAsJsonObject();
138+
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
139+
int key = Integer.parseInt(entry.getKey());
140+
String value = entry.getValue().getAsString();
141+
result.put(key, value);
142+
}
143+
return result;
144+
}
145+
}
146+
147+
public static class SparseIntArrayAdapter implements JsonSerializer<SparseIntArray>, JsonDeserializer<SparseIntArray> {
148+
@Override
149+
public JsonElement serialize(SparseIntArray src, Type typeOfSrc, JsonSerializationContext context) {
150+
JsonObject jsonObject = new JsonObject();
151+
for (int i = 0; i < src.size(); i++) {
152+
int key = src.keyAt(i);
153+
int value = src.valueAt(i);
154+
jsonObject.addProperty(String.valueOf(key), value);
155+
}
156+
return jsonObject;
157+
}
158+
159+
@Override
160+
public SparseIntArray deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
161+
SparseIntArray result = new SparseIntArray();
162+
JsonObject jsonObject = json.getAsJsonObject();
163+
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
164+
int key = Integer.parseInt(entry.getKey());
165+
int value = entry.getValue().getAsInt();
166+
result.put(key, value);
167+
}
168+
return result;
169+
}
170+
}
171+
172+
public static class SparseArrayHashSetAdapter implements JsonSerializer<SparseArray<HashSet<Integer>>>, JsonDeserializer<SparseArray<HashSet<Integer>>> {
173+
@Override
174+
public JsonElement serialize(SparseArray<HashSet<Integer>> src, Type typeOfSrc, JsonSerializationContext context) {
175+
JsonObject jsonObject = new JsonObject();
176+
for (int i = 0; i < src.size(); i++) {
177+
int key = src.keyAt(i);
178+
HashSet<Integer> value = src.valueAt(i);
179+
JsonArray jsonArray = new JsonArray();
180+
for (Integer item : value) {
181+
jsonArray.add(item);
182+
}
183+
jsonObject.add(String.valueOf(key), jsonArray);
184+
}
185+
return jsonObject;
186+
}
187+
188+
@Override
189+
public SparseArray<HashSet<Integer>> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
190+
SparseArray<HashSet<Integer>> result = new SparseArray<>();
191+
JsonObject jsonObject = json.getAsJsonObject();
192+
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
193+
int key = Integer.parseInt(entry.getKey());
194+
JsonArray jsonArray = entry.getValue().getAsJsonArray();
195+
HashSet<Integer> hashSet = new HashSet<>();
196+
for (JsonElement element : jsonArray) {
197+
hashSet.add(element.getAsInt());
198+
}
199+
result.put(key, hashSet);
200+
}
201+
return result;
202+
}
203+
}
204+
205+
public static class SparseArrayLongAdapter implements JsonSerializer<SparseArray<Long>>, JsonDeserializer<SparseArray<Long>> {
206+
@Override
207+
public JsonElement serialize(SparseArray<Long> src, Type typeOfSrc, JsonSerializationContext context) {
208+
JsonObject jsonObject = new JsonObject();
209+
for (int i = 0; i < src.size(); i++) {
210+
int key = src.keyAt(i);
211+
Long value = src.valueAt(i);
212+
jsonObject.addProperty(String.valueOf(key), value);
213+
}
214+
return jsonObject;
215+
}
216+
217+
@Override
218+
public SparseArray<Long> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
219+
SparseArray<Long> result = new SparseArray<>();
220+
JsonObject jsonObject = json.getAsJsonObject();
221+
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
222+
int key = Integer.parseInt(entry.getKey());
223+
Long value = entry.getValue().getAsLong();
224+
result.put(key, value);
225+
}
226+
return result;
227+
}
228+
}
229+
230+
public static class SparseArrayOptionsAdapter implements JsonSerializer<SparseArray<KmFormPayloadModel.Options>>, JsonDeserializer<SparseArray<KmFormPayloadModel.Options>> {
231+
@Override
232+
public JsonElement serialize(SparseArray<KmFormPayloadModel.Options> src, Type typeOfSrc, JsonSerializationContext context) {
233+
JsonObject jsonObject = new JsonObject();
234+
for (int i = 0; i < src.size(); i++) {
235+
int key = src.keyAt(i);
236+
KmFormPayloadModel.Options value = src.valueAt(i);
237+
jsonObject.add(String.valueOf(key), context.serialize(value));
238+
}
239+
return jsonObject;
240+
}
241+
242+
@Override
243+
public SparseArray<KmFormPayloadModel.Options> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
244+
SparseArray<KmFormPayloadModel.Options> result = new SparseArray<>();
245+
JsonObject jsonObject = json.getAsJsonObject();
246+
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
247+
int key = Integer.parseInt(entry.getKey());
248+
KmFormPayloadModel.Options value = context.deserialize(entry.getValue(), KmFormPayloadModel.Options.class);
249+
result.put(key, value);
250+
}
251+
return result;
252+
}
253+
}
254+
255+
public static Gson getGson() {
256+
return new GsonBuilder()
257+
.registerTypeAdapter(new TypeToken<SparseArray<String>>() {}.getType(), new SparseArrayStringAdapter())
258+
.registerTypeAdapter(new TypeToken<SparseIntArray>() {}.getType(), new SparseIntArrayAdapter())
259+
.registerTypeAdapter(new TypeToken<SparseArray<HashSet<Integer>>>() {}.getType(), new SparseArrayHashSetAdapter())
260+
.registerTypeAdapter(new TypeToken<SparseArray<Long>>() {}.getType(), new SparseArrayLongAdapter())
261+
.registerTypeAdapter(new TypeToken<SparseArray<KmFormPayloadModel.Options>>() {}.getType(), new SparseArrayOptionsAdapter())
262+
.create();
263+
}
264+
265+
public String toJson() {
266+
return getGson().toJson(this);
267+
}
268+
269+
public static KmFormStateModel fromJson(String json) {
270+
return getGson().fromJson(json, KmFormStateModel.class);
94271
}
95-
}
272+
}

0 commit comments

Comments
 (0)