Skip to content

Commit cdf9fdf

Browse files
committed
Align to V4.9.0
Signed-off-by: Luca Pezzoni <luca.pezzoni@st.com>
1 parent 297f73a commit cdf9fdf

116 files changed

Lines changed: 7875 additions & 1584 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

BlueMS/build.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ android {
6464

6565
minSdkVersion rootProject.ext.minSdkVersion
6666
targetSdkVersion rootProject.ext.targetSdkVersion
67-
versionCode 47
68-
versionName '4.7.1'
67+
versionCode 51
68+
versionName '4.9.0'
6969
applicationId "com.st.bluems"
7070
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
7171
vectorDrawables.useSupportLibrary = true
@@ -79,10 +79,9 @@ android {
7979
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
8080
}
8181
debug {
82-
minifyEnabled true
83-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
8482
applicationIdSuffix ".debug"
8583
versionNameSuffix "-dev" + getDate()
84+
//resValue 'string', 'application_id', android.defaultConfig.applicationId + applicationIdSuffix
8685
}
8786
}
8887

@@ -162,6 +161,8 @@ dependencies {
162161
implementation group: 'androidx.preference', name:'preference-ktx', version:"$rootProject.androidx_preferenceVersion"
163162

164163
implementation group:'androidx.room', name:'room-runtime', version: "$rootProject.androidx_roomVersion"
164+
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
165+
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
165166
annotationProcessor group:'androidx.room', name:'room-compiler', version: "$rootProject.androidx_roomVersion"
166167

167168
// Lifecycle components

BlueMS/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- needed for the BlueVoice demos -->
77
<uses-permission android:name="android.permission.INTERNET" />
88
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
9+
<uses-permission android:name="android.permission.RECORD_AUDIO" />
910
<!-- Memes Sensor Fusion vibrate when a free fall is detected -->
1011
<uses-permission android:name="android.permission.VIBRATE" />
1112

@@ -128,7 +129,6 @@
128129
android:name="android.support.PARENT_ACTIVITY"
129130
android:value="com.st.BlueMS.NodeListActivity" />
130131
</activity> <!-- End: integrate the BlueSTSDK.gui activity in the app, setting the parent activity -->
131-
132132
<receiver android:name=".NfcNodeConnection$InsertPairPin">
133133
<intent-filter>
134134
<action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />

BlueMS/src/main/java/com/st/BlueMS/DemosActivity.java

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,20 @@
5050
import com.st.BlueMS.demos.Audio.Beamforming.BeamformingFragment;
5151
import com.st.BlueMS.demos.Audio.BlueVoice.BlueVoiceFragment;
5252
import com.st.BlueMS.demos.Audio.BlueVoice.fullBand.BlueVoiceFullBandFragment;
53+
import com.st.BlueMS.demos.Audio.BlueVoice.fullDuplex.BlueVoiceFullDuplexFragment;
5354
import com.st.BlueMS.demos.Audio.SpeechToText.SpeechToTextFragment;
5455
import com.st.BlueMS.demos.AudioClassification.AudioClassificationFragment;
5556
import com.st.BlueMS.demos.COSensor.COSensorDemoFragment;
5657
import com.st.BlueMS.demos.CarryPositionFragment;
5758
import com.st.BlueMS.demos.Cloud.CloudLogFragment;
59+
import com.st.BlueMS.demos.ColorAmbientLight.ColorAmbientLightFragment;
60+
import com.st.BlueMS.demos.ExtConfig.ExtConfigurationFragment;
5861
import com.st.BlueMS.demos.HighSpeedDataLog.HighSpeedDataLogFragment;
5962
import com.st.BlueMS.demos.Level.LevelDemoFragment;
6063
import com.st.BlueMS.demos.PredictiveMaintenance.PredictiveMaintenanceFragment;
64+
import com.st.BlueMS.demos.QVARFragment;
6165
import com.st.BlueMS.demos.SDLog.SDLogFragment;
66+
import com.st.BlueMS.demos.TimeOfFlightMultiObject.TimeOfFlightMultiObjectFragment;
6267
import com.st.BlueMS.demos.aiDataLog.AIDataLogDemoFragment;
6368
import com.st.BlueMS.demos.fftAmpitude.FFTAmplitudeFragment;
6469
import com.st.BlueMS.demos.fitnessActivity.FitnessActivityFragment;
@@ -80,10 +85,13 @@
8085
import com.st.BlueMS.demos.plot.PlotFeatureFragment;
8186
import com.st.BlueMS.preference.nucleo.SettingsWithNucleoConfiguration;
8287
import com.st.BlueSTSDK.ExportedFeature;
83-
import com.st.BlueSTSDK.Features.Audio.Opus.ExportedFeatureAudioOpus;
88+
import com.st.BlueSTSDK.Features.Audio.Opus.ExportedAudioOpusConf;
89+
import com.st.BlueSTSDK.Features.Audio.Opus.ExportedFeatureAudioOpusMusic;
90+
import com.st.BlueSTSDK.Features.ExtConfiguration.FeatureExtConfiguration;
8491
import com.st.BlueSTSDK.Node;
8592
import com.st.BlueSTSDK.NodeServer;
8693
import com.st.BlueSTSDK.Utils.ConnectionOption;
94+
import com.st.BlueSTSDK.gui.SettingsActivityWithNode;
8795
import com.st.BlueSTSDK.gui.demos.DemoDescriptionAnnotation;
8896
import com.st.BlueSTSDK.gui.demos.DemoFragment;
8997
import com.st.STM32WB.fwUpgrade.feature.RebootOTAModeFeature;
@@ -171,8 +179,12 @@ public static class LedButtonControlFragment extends com.st.STM32WB.p2pDemo.LedB
171179
FitnessActivityFragment.class,
172180
MachineLearningCoreFragment.class,
173181
FiniteStateMachineFragment.class,
182+
TimeOfFlightMultiObjectFragment.class,
183+
ExtConfigurationFragment.class,
184+
ColorAmbientLightFragment.class,
185+
QVARFragment.class,
174186
NodeStatusFragment.class,
175-
//FeatureDebugFragment.class
187+
//FeatureDebugFragment.class,
176188
};
177189

178190
@Override
@@ -183,6 +195,13 @@ protected Class<? extends DemoFragment>[] getAllDemos() {
183195
}
184196

185197
List<Class<? extends DemoFragment>> serverDemos = getServerSizeDemos();
198+
if(serverDemos.contains(BlueVoiceFullBandFragment.class)){
199+
demoList.remove(BlueVoiceFragment.class);
200+
demoList.remove(SpeechToTextFragment.class);
201+
}
202+
if(serverDemos.contains(BlueVoiceFullDuplexFragment.class)){
203+
demoList.remove(BlueVoiceFragment.class);
204+
}
186205
if(!serverDemos.isEmpty()) {
187206
demoList.addAll(0,serverDemos);
188207
}
@@ -196,11 +215,16 @@ private List<Class<? extends DemoFragment>> getServerSizeDemos(){
196215
}
197216
ArrayList<Class<? extends DemoFragment>> demos = new ArrayList<>();
198217

199-
ExportedFeature opusAudio = server.getExportedFeature(ExportedFeatureAudioOpus.class);
218+
ExportedFeature opusAudio = server.getExportedFeature(ExportedFeatureAudioOpusMusic.class);
219+
ExportedFeature opusAudioConf = server.getExportedFeature(ExportedAudioOpusConf.class);
200220
if(opusAudio!=null && opusAudio.isNotificationEnabled()){
201221
demos.add(BlueVoiceFullBandFragment.class);
222+
} else if(opusAudioConf!=null && opusAudioConf.isNotificationEnabled()){
223+
Log.e("DemosActivity", demos.toString());
224+
demos.add(BlueVoiceFullDuplexFragment.class);
225+
Log.e("DemosActivity", demos.toString());
226+
Log.e("DemosActivity","opusAudioConf.isNotificationEnabled()");
202227
}
203-
204228
return demos;
205229
}
206230

@@ -214,8 +238,15 @@ public boolean onOptionsItemSelected(MenuItem item) {
214238
int id = item.getItemId();
215239

216240
if (id == R.id.settings) {
241+
Node node = getNode();
217242
keepConnectionOpen(true,false);
218-
startActivity(SettingsWithNucleoConfiguration.getStartIntent(this, getNode()));
243+
if (node.getFeature(FeatureExtConfiguration.class) == null) {
244+
/* Start the Activity with the Settings */
245+
startActivity(SettingsWithNucleoConfiguration.getStartIntent(this, getNode()));
246+
} else {
247+
/* Start the Activity without the Settings */
248+
startActivity(SettingsActivityWithNode.getStartIntent(this, getNode(), true));
249+
}
219250
return true;
220251
}
221252

@@ -232,14 +263,14 @@ protected void onStart() {
232263
private ExportedFeature.ExportedFeatureCallback mRefreshDemoList = new ExportedFeature.ExportedFeatureCallback() {
233264
@Override
234265
public void onNotificationDisabled(@NonNull ExportedFeature onFeature) {
235-
Log.d("DEmoActivity","reload demos");
266+
Log.d("DemoActivity","reload demos");
236267
runOnUiThread(()->{reloadDemoList();});
237268

238269
}
239270

240271
@Override
241272
public void onNotificationEnabled(@NonNull ExportedFeature onFeature) {
242-
Log.d("DEmoActivity","reload demos");
273+
Log.d("DemoActivity","reload demos");
243274
runOnUiThread(()->{reloadDemoList();});
244275
}
245276
};
@@ -251,7 +282,7 @@ private void enableServerSideDemo() {
251282
NodeServer server = node.getNodeServer();
252283
if(server == null)
253284
return;
254-
ExportedFeature f = server.getExportedFeature(ExportedFeatureAudioOpus.class);
285+
ExportedFeature f = server.getExportedFeature(ExportedFeatureAudioOpusMusic.class);
255286
if(f!=null)
256287
f.addListener(mRefreshDemoList);
257288
}
@@ -269,7 +300,7 @@ private void disableServerSideDemo() {
269300
NodeServer server = node.getNodeServer();
270301
if(server == null)
271302
return;
272-
ExportedFeature f = server.getExportedFeature(ExportedFeatureAudioOpus.class);
303+
ExportedFeature f = server.getExportedFeature(ExportedFeatureAudioOpusMusic.class);
273304
if(f!=null)
274305
f.removeListener(mRefreshDemoList);
275306
}

BlueMS/src/main/java/com/st/BlueMS/MainActivity.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,4 @@ public void startAboutActivity(View view) {
6464
Intent licenseIntent = new Intent(this, OssLicensesMenuActivity.class);
6565
AboutActivity.startActivityWithAboutPage(this,ABOUT_PAGE_URL,privacyPage,licenseIntent);
6666
}
67-
68-
@Override
69-
public URL getPrivacyPolicyUrl(){
70-
return null;
71-
}
72-
7367
}

BlueMS/src/main/java/com/st/BlueMS/NodeListActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ public void onNodeSelected(@NonNull Node n) {
8181

8282
ConnectionOption.ConnectionOptionBuilder optionsBuilder = ConnectionOption.builder()
8383
.resetCache(clearCacheIsSelected())
84-
.enableAutoConnect(false)
84+
.enableAutoConnect(keepConnectionOpenIsSelected())
85+
//.enableAutoConnect(false)
8586
.setFeatureMap(STM32OTASupport.getOTAFeatures())
8687
.setFeatureMap(BlueNRGOTASupport.getOTAFeatures())
8788
.setFeatureMap(new StdCharToFeatureMap());

BlueMS/src/main/java/com/st/BlueMS/demos/Audio/BlueVoice/BlueVoiceFragment.java

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
import android.media.AudioFormat;
4242
import android.media.AudioManager;
4343
import android.media.AudioTrack;
44+
import android.os.Build;
4445
import android.os.Bundle;
45-
import androidx.annotation.NonNull;
4646
import android.view.LayoutInflater;
4747
import android.view.Menu;
4848
import android.view.MenuInflater;
@@ -53,14 +53,16 @@
5353
import android.widget.Switch;
5454
import android.widget.TextView;
5555

56-
import com.st.BlueSTSDK.Features.Audio.AudioCodecManager;
57-
import com.st.BlueSTSDK.Features.Audio.FeatureAudio;
58-
import com.st.BlueSTSDK.Features.Audio.FeatureAudioConf;
59-
import com.st.BlueMS.demos.util.BaseDemoFragment;
56+
import androidx.annotation.NonNull;
57+
6058
import com.st.BlueMS.R;
6159
import com.st.BlueMS.demos.Audio.Utils.AudioRecorder;
6260
import com.st.BlueMS.demos.Audio.Utils.WaveformView;
61+
import com.st.BlueMS.demos.util.BaseDemoFragment;
6362
import com.st.BlueSTSDK.Feature;
63+
import com.st.BlueSTSDK.Features.Audio.AudioCodecManager;
64+
import com.st.BlueSTSDK.Features.Audio.FeatureAudio;
65+
import com.st.BlueSTSDK.Features.Audio.FeatureAudioConf;
6466
import com.st.BlueSTSDK.Features.FeatureBeamforming;
6567
import com.st.BlueSTSDK.Node;
6668
import com.st.BlueSTSDK.Utils.LogFeatureActivity;
@@ -78,16 +80,15 @@
7880
requareAll = {FeatureAudio.class,FeatureAudioConf.class})
7981
public class BlueVoiceFragment extends BaseDemoFragment {
8082

81-
private static final String TAG = BlueVoiceFragment.class.getCanonicalName();
83+
private static final String BVCONF_PREFIX_KEY = BlueVoiceFragment.class.getCanonicalName();
8284

8385
private static final int AUDIO_STREAM = AudioManager.STREAM_MUSIC;
8486

85-
private static final String VOLUME_LEVEL = TAG+".VOLUME_LEVEL";
86-
private static final String IS_MUTE = TAG+".IS_MUTE";
87+
private static final String VOLUME_LEVEL_KEY = BVCONF_PREFIX_KEY+".VOLUME_LEVEL_KEY";
88+
private static final String IS_MUTE_KEY = BVCONF_PREFIX_KEY+".IS_MUTE";
8789

8890
private int audioSamplingFreq;
8991
private short audioChannels;
90-
//private Boolean audioEnabled;
9192

9293
private static final @FeatureBeamforming.Direction int DEFAULT_BEAM_FORMING_DIRECTION = FeatureBeamforming.Direction.RIGHT;
9394

@@ -161,9 +162,6 @@ public void onUpdate(@NonNull Feature f, @NonNull Feature.Sample sample) {
161162
audioChannels = mAudioCodecManager.getChannels();
162163
}
163164

164-
/*if(audioEnabled == null || audioEnabled != mAudioCodecManager.isAudioEnabled()) {
165-
audioEnabled = mAudioCodecManager.isAudioEnabled();
166-
if (audioEnabled)*/
167165
if(mAudioCodecManager.isAudioEnabled() != null) {
168166
if (mAudioCodecManager.isAudioEnabled())
169167
startAudioStreaming(f.getParentNode());
@@ -241,9 +239,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
241239

242240
mCodecValue = mRootView.findViewById(R.id.blueVoice_codecValue);
243241

244-
if(savedInstanceState!=null){
245-
restoreGuiStatus(savedInstanceState);
246-
}
242+
restoreGuiStatus();
247243

248244
return mRootView;
249245
}
@@ -264,6 +260,10 @@ public void onPause() {
264260
super.onPause();
265261
if(mAudioWavDump!=null && mAudioWavDump.isRecording())
266262
mAudioWavDump.stopRec();
263+
if(mVolumeBar != null)
264+
storeVolumeLevel(mVolumeBar.getProgress());
265+
if(mMuteButton != null)
266+
storeMuteStatus(mMuteButton.isMute());
267267
}
268268

269269
@Override
@@ -272,23 +272,32 @@ public void onStop(){
272272
stopAudioTrack();
273273
}
274274

275-
private void restoreGuiStatus(Bundle savedInstanceState) {
276-
if(savedInstanceState.containsKey(VOLUME_LEVEL)){
277-
mVolumeBar.setProgress(savedInstanceState.getInt(VOLUME_LEVEL));
278-
}
279-
if(savedInstanceState.containsKey(IS_MUTE)){
280-
if(savedInstanceState.getBoolean(IS_MUTE)!=mMuteButton.isMute())
281-
mMuteButton.changeState();
282-
}
275+
private void restoreGuiStatus(){
276+
mVolumeBar.setProgress(getVolumeLevel());
277+
if(getMuteStatus() != mMuteButton.isMute())
278+
mMuteButton.changeState();
283279
}
284280

285-
@Override
286-
public void onSaveInstanceState(@NonNull Bundle outState) {
287-
super.onSaveInstanceState(outState);
288-
if(mVolumeBar!=null)
289-
outState.putInt(VOLUME_LEVEL,mVolumeBar.getProgress());
290-
if(mMuteButton!=null)
291-
outState.putBoolean(IS_MUTE,mMuteButton.isMute());
281+
private void storeVolumeLevel(int volumeLevel){
282+
requireActivity().getSharedPreferences(BVCONF_PREFIX_KEY,Context.MODE_PRIVATE).edit()
283+
.putInt(VOLUME_LEVEL_KEY, volumeLevel)
284+
.apply();
285+
}
286+
287+
private void storeMuteStatus(boolean isMute){
288+
requireActivity().getSharedPreferences(BVCONF_PREFIX_KEY,Context.MODE_PRIVATE).edit()
289+
.putBoolean(IS_MUTE_KEY, isMute)
290+
.apply();
291+
}
292+
293+
private int getVolumeLevel(){
294+
return requireActivity().getSharedPreferences(BVCONF_PREFIX_KEY,Context.MODE_PRIVATE)
295+
.getInt(VOLUME_LEVEL_KEY, mAudioManager.getStreamVolume(AUDIO_STREAM));
296+
}
297+
298+
private boolean getMuteStatus(){
299+
return requireActivity().getSharedPreferences(BVCONF_PREFIX_KEY,Context.MODE_PRIVATE)
300+
.getBoolean(IS_MUTE_KEY,false);
292301
}
293302

294303
private void setUpVolumeBar(int maxVolume){
@@ -322,7 +331,6 @@ private void startConfStreaming(@NonNull Node node){
322331
mAudioCodecManager = mAudioSync.instantiateManager(true,false);
323332
audioSamplingFreq = mAudioCodecManager.getSamplingFreq();
324333
audioChannels = mAudioCodecManager.getChannels();
325-
//audioEnabled = mAudioCodecManager.isAudioEnabled();
326334

327335
mAudioSync.addFeatureListener(mAudioSyncListener);
328336
node.enableNotification(mAudioSync);
@@ -430,7 +438,12 @@ private void stopAudioTrack(){
430438

431439
void playAudio(short sample[]){
432440
synchronized (this) {
433-
mAudioTrack.write(sample, 0, sample.length);
441+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
442+
mAudioTrack.write(sample, 0, sample.length,
443+
AudioTrack.WRITE_NON_BLOCKING);
444+
} else {
445+
mAudioTrack.write(sample, 0, sample.length);
446+
}
434447
}
435448
}
436449

0 commit comments

Comments
 (0)