Skip to content

Commit c3553b7

Browse files
Merge pull request #1709 from smartdevicelink/release/5.2.0_RC
5.2.0 Release
2 parents 65c43df + 405d9a4 commit c3553b7

40 files changed

+1132
-167
lines changed

.github/workflows/android.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: GitHub CI
22

3-
on: [push, pull_request]
3+
on: [push, pull_request, workflow_dispatch]
44

55
jobs:
66
test:

CHANGELOG.md

+33-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 5.1.1 Release Notes
1+
# 5.2.0 Release Notes
22

33
## Summary:
44
||Version|
@@ -8,13 +8,41 @@
88
| **Tested Targeting** | Android 30
99

1010

11-
## Bug Fixes:
11+
## Bug Fixes / Enhancements:
1212

13-
- [Add null checks and synch around session in LCM](https://github.com/smartdevicelink/sdl_java_suite/pull/1659)
13+
- [MenuManager sending secondary image with menuCells when menuCommandSecondaryImage is not supported.](https://github.com/smartdevicelink/sdl_java_suite/issues/1688)
1414

15-
- [Add NPE check in BaseChoiceSetManager](https://github.com/smartdevicelink/sdl_java_suite/pull/1648)
15+
- [IllegalArgumentException when starting video stream with custom RPC MTU](https://github.com/smartdevicelink/sdl_java_suite/issues/1667)
1616

17-
- [Attempt to fix unreproducible ClassCastException](https://github.com/smartdevicelink/sdl_java_suite/pull/1660)
17+
- [Send voiceCommand with duplicate strings](https://github.com/smartdevicelink/sdl_java_suite/issues/1664)
18+
19+
- [Two voiceCommands contains the same string](https://github.com/smartdevicelink/sdl_java_suite/issues/1677)
20+
21+
- [java.lang.NegativeArraySizeException Crash at SdlPsm.java line 241 com.smartdevicelink.transport.SdlPsm.transitionOnInput](https://github.com/smartdevicelink/sdl_java_suite/issues/1678)
22+
23+
- [Exception handling variances](https://github.com/smartdevicelink/sdl_java_suite/issues/1687)
24+
25+
- [Allow SdlDeviceListener to start after BT connection](https://github.com/smartdevicelink/sdl_java_suite/pull/1685)
26+
27+
- [voiceCommand that contains no string should be removed](https://github.com/smartdevicelink/sdl_java_suite/issues/1675)
28+
29+
- [Image returned as "not uploaded" in certain circumstances when it's already uploaded, leading to the image being unusable](https://github.com/smartdevicelink/sdl_java_suite/issues/1692)
30+
31+
- [Primary Graphic not sent to SDL Core for Media Template ](https://github.com/smartdevicelink/sdl_java_suite/issues/1690)
32+
33+
- [Race condition leads to NPE in TransportManager](https://github.com/smartdevicelink/sdl_java_suite/issues/1703)
34+
35+
- [Avoid deleting and setting identical voice commands](https://github.com/smartdevicelink/sdl_java_suite/issues/1676)
36+
37+
- [Sdl disconnection is not notified to the app](https://github.com/smartdevicelink/sdl_java_suite/issues/1697)
38+
39+
- [PredefinedLayout.NON_MEDIA not found in templatesAvailable](https://github.com/smartdevicelink/sdl_java_suite/issues/1705)
40+
41+
- [Lockscreen should show again after dismissal if a DD notification is received where DismissalEnabled is false](https://github.com/smartdevicelink/sdl_java_suite/issues/1695)
42+
43+
- [Choice Cells and Menu Cells do not take which properties are available into account for uniqueness](https://github.com/smartdevicelink/sdl_java_suite/issues/1682)
44+
45+
- [BSON library should be updated to the latest version (1.2.5)](https://github.com/smartdevicelink/sdl_java_suite/issues/1712)
1846

1947

2048

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.1.1
1+
5.2.0

android/sdl_android/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ android {
55
defaultConfig {
66
minSdkVersion 16
77
targetSdkVersion 30
8-
versionCode 19
8+
versionCode 20
99
versionName new File(projectDir.path, ('/../../VERSION')).text.trim()
1010
buildConfigField "String", "VERSION_NAME", '\"' + versionName + '\"'
1111
resValue "string", "SDL_LIB_VERSION", '\"' + versionName + '\"'
@@ -43,7 +43,7 @@ android {
4343
dependencies {
4444
api fileTree(dir: 'libs', include: ['*.jar'])
4545
//api 'com.livio.taskmaster:taskmaster:0.4.0'
46-
api 'com.smartdevicelink:bson_java_port:1.2.4'
46+
api 'com.smartdevicelink:bson_java_port:1.2.5'
4747
api 'androidx.lifecycle:lifecycle-extensions:2.2.0'
4848
api 'androidx.annotation:annotation:1.1.0'
4949
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0'

android/sdl_android/gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
GROUP=com.smartdevicelink
22
POM_ARTIFACT_ID=sdl_android
3-
VERSION_NAME=5.1.1
3+
VERSION_NAME=5.2.0
44

55
POM_NAME=sdl_android
66
POM_PACKAGING=aar

android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java

+58
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.smartdevicelink.proxy.rpc.GetSystemCapability;
2323
import com.smartdevicelink.proxy.rpc.GetSystemCapabilityResponse;
2424
import com.smartdevicelink.proxy.rpc.HMICapabilities;
25+
import com.smartdevicelink.proxy.rpc.ImageField;
2526
import com.smartdevicelink.proxy.rpc.OnHMIStatus;
2627
import com.smartdevicelink.proxy.rpc.OnSystemCapabilityUpdated;
2728
import com.smartdevicelink.proxy.rpc.PhoneCapability;
@@ -37,10 +38,13 @@
3738
import com.smartdevicelink.proxy.rpc.enums.AppServiceType;
3839
import com.smartdevicelink.proxy.rpc.enums.AudioStreamingState;
3940
import com.smartdevicelink.proxy.rpc.enums.DisplayType;
41+
import com.smartdevicelink.proxy.rpc.enums.FileType;
4042
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
4143
import com.smartdevicelink.proxy.rpc.enums.HmiZoneCapabilities;
44+
import com.smartdevicelink.proxy.rpc.enums.ImageFieldName;
4245
import com.smartdevicelink.proxy.rpc.enums.ImageType;
4346
import com.smartdevicelink.proxy.rpc.enums.MediaClockFormat;
47+
import com.smartdevicelink.proxy.rpc.enums.PredefinedLayout;
4448
import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
4549
import com.smartdevicelink.proxy.rpc.enums.PrerecordedSpeech;
4650
import com.smartdevicelink.proxy.rpc.enums.Result;
@@ -938,6 +942,31 @@ public void testManagerBeforeDisplayUpdate() {
938942
assertNull(systemCapabilityManager.getWindowCapability(PredefinedWindows.PRIMARY_WIDGET.getValue()));
939943
}
940944

945+
/**
946+
* Test that when we receive template "NON_MEDIA" it gets converted to "NON-MEDIA"
947+
*/
948+
@Test
949+
public void testSyncNonMediaBug() {
950+
InternalSDLInterface iSDL = new InternalSDLInterface();
951+
SystemCapabilityManager systemCapabilityManager = createSampleManager(iSDL);
952+
OnRPCListener dlRpcListener = iSDL.rpcListeners.get(FunctionID.SET_DISPLAY_LAYOUT.getId()).get(0);
953+
954+
DisplayCapabilities displayCapabilities = new DisplayCapabilities();
955+
displayCapabilities.setGraphicSupported(true);
956+
List<String> templatesAvailable = new ArrayList<>();
957+
templatesAvailable.add("NON_MEDIA");
958+
templatesAvailable.add("MEDIA");
959+
displayCapabilities.setTemplatesAvailable(templatesAvailable);
960+
961+
SetDisplayLayoutResponse newLayout = new SetDisplayLayoutResponse();
962+
newLayout.setDisplayCapabilities(displayCapabilities);
963+
newLayout.setSuccess(true);
964+
newLayout.setResultCode(Result.SUCCESS);
965+
dlRpcListener.onReceived(newLayout);
966+
967+
assertTrue(systemCapabilityManager.getDefaultMainWindowCapability().getTemplatesAvailable().contains("NON-MEDIA"));
968+
}
969+
941970
private class InternalSDLInterface implements ISdl {
942971
private final Object RPC_LISTENER_LOCK = new Object();
943972
SparseArray<CopyOnWriteArrayList<OnRPCListener>> rpcListeners = new SparseArray<>();
@@ -1075,4 +1104,33 @@ public PermissionManager getPermissionManager() {
10751104
return null;
10761105
}
10771106
}
1107+
1108+
@Test
1109+
public void testFixingIncorrectCapabilities() {
1110+
SetDisplayLayoutResponse setDisplayLayoutResponse;
1111+
1112+
DisplayCapabilities RegisterAppInterFaceCapabilities = new DisplayCapabilities()
1113+
.setImageFields(Collections.singletonList(new ImageField(ImageFieldName.graphic, Collections.singletonList(FileType.GRAPHIC_PNG))));
1114+
1115+
DisplayCapabilities setDisplayLayoutCapabilities = new DisplayCapabilities()
1116+
.setImageFields(new ArrayList<ImageField>());
1117+
1118+
LifecycleManager lcm = new LifecycleManager(new BaseLifecycleManager.AppConfig(), null, null);
1119+
lcm.initialMediaCapabilities = RegisterAppInterFaceCapabilities;
1120+
1121+
1122+
// Test switching to MEDIA template - Capabilities in setDisplayLayoutResponse should be replaced with the ones from RAIR
1123+
lcm.lastDisplayLayoutRequestTemplate = PredefinedLayout.MEDIA.toString();
1124+
setDisplayLayoutResponse = new SetDisplayLayoutResponse()
1125+
.setDisplayCapabilities(setDisplayLayoutCapabilities);
1126+
lcm.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
1127+
assertEquals(RegisterAppInterFaceCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
1128+
1129+
// Test switching to non-MEDIA template - Capabilities in setDisplayLayoutResponse should not be altered
1130+
lcm.lastDisplayLayoutRequestTemplate = PredefinedLayout.TEXT_WITH_GRAPHIC.toString();
1131+
setDisplayLayoutResponse = new SetDisplayLayoutResponse()
1132+
.setDisplayCapabilities(setDisplayLayoutCapabilities);
1133+
lcm.fixIncorrectDisplayCapabilities(setDisplayLayoutResponse);
1134+
assertEquals(setDisplayLayoutCapabilities, setDisplayLayoutResponse.getDisplayCapabilities());
1135+
}
10781136
}

android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lockscreen/LockScreenManagerTests.java

+32
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.smartdevicelink.managers.lockscreen;
22

33
import android.content.Context;
4+
import android.content.Intent;
5+
import android.os.Looper;
46

57
import androidx.test.ext.junit.runners.AndroidJUnit4;
68

@@ -170,4 +172,34 @@ public void testLockScreenDismissibleWithEnableFalseAndDismissibilityTrue() {
170172
assertTrue(lockScreenManager.isLockscreenDismissible);
171173
}
172174

175+
@Test
176+
public void testShowingLockscreenAfterDismissibleFalse() {
177+
if (Looper.myLooper() == null) {
178+
Looper.prepare();
179+
}
180+
lockScreenManager.enableDismissGesture = true;
181+
lockScreenManager.displayMode = LockScreenConfig.DISPLAY_MODE_ALWAYS;
182+
183+
// Send first notification (DD=OFF, Dismissible=true)
184+
OnDriverDistraction onDriverDistraction = new OnDriverDistraction();
185+
onDriverDistraction.setLockscreenDismissibility(true);
186+
onDriverDistraction.setState(DriverDistractionState.DD_OFF);
187+
onDDListener.onNotified(onDriverDistraction);
188+
189+
// Dismiss lock screen activity
190+
lockScreenManager.mLockscreenDismissedReceiver.onReceive(null, new Intent(SDLLockScreenActivity.KEY_LOCKSCREEN_DISMISSED, null));
191+
192+
// Lock screen should be set to auto dismiss in future
193+
assertTrue(lockScreenManager.mLockScreenShouldBeAutoDismissed);
194+
195+
// Send second notification (DD=On, Dismissible=false)
196+
onDriverDistraction = new OnDriverDistraction();
197+
onDriverDistraction.setLockscreenDismissibility(false);
198+
onDriverDistraction.setState(DriverDistractionState.DD_ON);
199+
onDDListener.onNotified(onDriverDistraction);
200+
201+
// Lock screen should be set to NOT auto dismiss in future
202+
assertFalse(lockScreenManager.mLockScreenShouldBeAutoDismissed);
203+
}
204+
173205
}

android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/screen/choiceset/ChoiceSetManagerTests.java

+54-1
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,23 @@
4040
import com.smartdevicelink.managers.BaseSubManager;
4141
import com.smartdevicelink.managers.ISdl;
4242
import com.smartdevicelink.managers.file.FileManager;
43+
import com.smartdevicelink.proxy.rpc.ImageField;
4344
import com.smartdevicelink.proxy.rpc.KeyboardCapabilities;
4445
import com.smartdevicelink.proxy.rpc.KeyboardLayoutCapability;
4546
import com.smartdevicelink.proxy.rpc.KeyboardProperties;
4647
import com.smartdevicelink.proxy.rpc.SdlMsgVersion;
48+
import com.smartdevicelink.proxy.rpc.TextField;
4749
import com.smartdevicelink.proxy.rpc.WindowCapability;
4850
import com.smartdevicelink.proxy.rpc.enums.HMILevel;
51+
import com.smartdevicelink.proxy.rpc.enums.ImageFieldName;
4952
import com.smartdevicelink.proxy.rpc.enums.KeyboardInputMask;
5053
import com.smartdevicelink.proxy.rpc.enums.KeyboardLayout;
5154
import com.smartdevicelink.proxy.rpc.enums.KeypressMode;
5255
import com.smartdevicelink.proxy.rpc.enums.Language;
5356
import com.smartdevicelink.proxy.rpc.enums.SystemContext;
57+
import com.smartdevicelink.proxy.rpc.enums.TextFieldName;
5458
import com.smartdevicelink.proxy.rpc.enums.TriggerSource;
59+
import com.smartdevicelink.test.TestValues;
5560

5661
import org.junit.After;
5762
import org.junit.Before;
@@ -231,7 +236,8 @@ public void testAddUniqueNamesToCells() {
231236
ChoiceCell cell4 = new ChoiceCell("McDonalds", "4 mile away", null, null, null, null);
232237
ChoiceCell cell5 = new ChoiceCell("Starbucks", "5 mile away", null, null, null, null);
233238
ChoiceCell cell6 = new ChoiceCell("Meijer", "6 mile away", null, null, null, null);
234-
LinkedHashSet<ChoiceCell> cellList = new LinkedHashSet<>();
239+
List<ChoiceCell> cellList = new ArrayList<>();
240+
235241
cellList.add(cell1);
236242
cellList.add(cell2);
237243
cellList.add(cell3);
@@ -468,4 +474,51 @@ public void testDismissingQueuedKeyboard() {
468474
verify(testKeyboardOp, times(0)).dismissKeyboard();
469475
verify(testKeyboardOp2, times(1)).dismissKeyboard();
470476
}
477+
478+
@Test
479+
public void testUniquenessForAvailableFields() {
480+
WindowCapability windowCapability = new WindowCapability();
481+
TextField secondaryText = new TextField();
482+
secondaryText.setName(TextFieldName.secondaryText);
483+
TextField tertiaryText = new TextField();
484+
tertiaryText.setName(TextFieldName.tertiaryText);
485+
486+
List<TextField> textFields = new ArrayList<>();
487+
textFields.add(secondaryText);
488+
textFields.add(tertiaryText);
489+
windowCapability.setTextFields(textFields);
490+
491+
ImageField choiceImage = new ImageField();
492+
choiceImage.setName(ImageFieldName.choiceImage);
493+
ImageField choiceSecondaryImage = new ImageField();
494+
choiceSecondaryImage.setName(ImageFieldName.choiceSecondaryImage);
495+
List<ImageField> imageFieldList = new ArrayList<>();
496+
imageFieldList.add(choiceImage);
497+
imageFieldList.add(choiceSecondaryImage);
498+
windowCapability.setImageFields(imageFieldList);
499+
500+
csm.defaultMainWindowCapability = windowCapability;
501+
502+
ChoiceCell cell1 = new ChoiceCell("Item 1", "null", "tertiaryText", null, TestValues.GENERAL_ARTWORK, TestValues.GENERAL_ARTWORK);
503+
ChoiceCell cell2 = new ChoiceCell("Item 1", "null2", "tertiaryText2", null, null, null);
504+
List<ChoiceCell> choiceCellList = new ArrayList<>();
505+
choiceCellList.add(cell1);
506+
choiceCellList.add(cell2);
507+
508+
List<ChoiceCell> removedProperties = csm.removeUnusedProperties(choiceCellList);
509+
assertNotNull(removedProperties.get(0).getSecondaryText());
510+
511+
textFields.remove(secondaryText);
512+
textFields.remove(tertiaryText);
513+
imageFieldList.remove(choiceImage);
514+
imageFieldList.remove(choiceSecondaryImage);
515+
516+
removedProperties = csm.removeUnusedProperties(choiceCellList);
517+
csm.addUniqueNamesBasedOnStrippedCells(removedProperties, choiceCellList);
518+
assertEquals(choiceCellList.get(1).getUniqueText(), "Item 1 (2)");
519+
520+
521+
}
522+
523+
471524
}

0 commit comments

Comments
 (0)