Loading android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/DistanceMeasurementInitiator.java +7 −3 Original line number Diff line number Diff line Loading @@ -66,7 +66,6 @@ class DistanceMeasurementInitiator { } } private static final int DISTANCE_MEASUREMENT_DURATION_SEC = 3600; private static final List<Pair<Integer, String>> mDistanceMeasurementMethodMapping = List.of( new Pair<>(DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_AUTO, "AUTO"), Loading Loading @@ -151,8 +150,13 @@ class DistanceMeasurementInitiator { return List.of(Freq.MEDIUM.toString(), Freq.HIGH.toString(), Freq.LOW.toString()); } List<String> getMeasureDurationsInSeconds() { return List.of("3600", "300", "60", "10"); } @SuppressLint("MissingPermission") // permissions are checked upfront void startDistanceMeasurement(String distanceMeasurementMethodName, String selectedFreq) { void startDistanceMeasurement( String distanceMeasurementMethodName, String selectedFreq, int duration) { if (mTargetDevice == null) { printLog("do Gatt connect first"); Loading @@ -163,7 +167,7 @@ class DistanceMeasurementInitiator { DistanceMeasurementParams params = new DistanceMeasurementParams.Builder(mTargetDevice) .setDurationSeconds(DISTANCE_MEASUREMENT_DURATION_SEC) .setDurationSeconds(duration) .setFrequency(Freq.fromName(selectedFreq).getFreq()) .setMethodId(getDistanceMeasurementMethodId(distanceMeasurementMethodName)) .build(); Loading android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorFragment.java +14 −1 Original line number Diff line number Diff line Loading @@ -44,10 +44,12 @@ public class InitiatorFragment extends Fragment { private ArrayAdapter<String> mDmMethodArrayAdapter; private ArrayAdapter<String> mFreqArrayAdapter; private ArrayAdapter<String> mDurationArrayAdapter; private TextView mDistanceText; private CanvasView mDistanceCanvasView; private Spinner mSpinnerDmMethod; private Spinner mSpinnerFreq; private Spinner mSpinnerDuration; private Button mButtonCs; private LinearLayout mDistanceViewLayout; private TextView mLogText; Loading @@ -66,6 +68,7 @@ public class InitiatorFragment extends Fragment { mButtonCs = (Button) root.findViewById(R.id.btn_cs); mSpinnerDmMethod = (Spinner) root.findViewById(R.id.spinner_dm_method); mSpinnerFreq = (Spinner) root.findViewById(R.id.spinner_freq); mSpinnerDuration = (Spinner) root.findViewById(R.id.spinner_duration); mDistanceViewLayout = (LinearLayout) root.findViewById(R.id.layout_distance_view); mDistanceText = new TextView(getContext()); mDistanceViewLayout.addView(mDistanceText); Loading Loading @@ -93,6 +96,12 @@ public class InitiatorFragment extends Fragment { getContext(), android.R.layout.simple_spinner_item, new ArrayList<>()); mFreqArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSpinnerFreq.setAdapter(mFreqArrayAdapter); mDurationArrayAdapter = new ArrayAdapter<String>( getContext(), android.R.layout.simple_spinner_item, new ArrayList<>()); mDurationArrayAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); mSpinnerDuration.setAdapter(mDurationArrayAdapter); mInitiatorViewModel = new ViewModelProvider(this).get(InitiatorViewModel.class); mBleConnectionViewModel = new ViewModelProvider(this).get(BleConnectionViewModel.class); Loading Loading @@ -143,14 +152,18 @@ public class InitiatorFragment extends Fragment { mDmMethodArrayAdapter.addAll(mInitiatorViewModel.getSupportedDmMethods()); mFreqArrayAdapter.addAll(mInitiatorViewModel.getMeasurementFreqs()); mDurationArrayAdapter.addAll(mInitiatorViewModel.getMeasurementDurations()); mButtonCs.setOnClickListener( v -> { String methodName = mSpinnerDmMethod.getSelectedItem().toString(); String freq = mSpinnerFreq.getSelectedItem().toString(); int duration = Integer.parseInt(mSpinnerDuration.getSelectedItem().toString()); if (TextUtils.isEmpty(methodName)) { printLog("the device doesn't support any distance measurement methods."); } mInitiatorViewModel.toggleCsStartStop(methodName, freq); mInitiatorViewModel.toggleCsStartStop(methodName, freq, duration); }); } Loading android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorViewModel.java +6 −2 Original line number Diff line number Diff line Loading @@ -75,10 +75,14 @@ public class InitiatorViewModel extends AndroidViewModel { return mDistanceMeasurementInitiator.getMeasurementFreqs(); } void toggleCsStartStop(String distanceMeasurementMethodName, String freq) { List<String> getMeasurementDurations() { return mDistanceMeasurementInitiator.getMeasureDurationsInSeconds(); } void toggleCsStartStop(String distanceMeasurementMethodName, String freq, int duration) { if (!mCsStarted.getValue()) { mDistanceMeasurementInitiator.startDistanceMeasurement( distanceMeasurementMethodName, freq); distanceMeasurementMethodName, freq, duration); } else { mDistanceMeasurementInitiator.stopDistanceMeasurement(); } Loading android/ChannelSoundingTestApp/app/src/main/res/layout/fragment_initiator.xml +68 −36 Original line number Diff line number Diff line Loading @@ -16,49 +16,81 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" app:layout_constraintBottom_toTopOf="@id/spinner_dm_method" app:layout_constraintBottom_toTopOf="@id/layout_methods" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <LinearLayout android:id="@+id/layout_methods" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" app:layout_constraintBottom_toTopOf="@id/layout_parameters" android:weightSum="4" android:orientation="horizontal"> <TextView android:id="@+id/dm_method_label" android:layout_width="wrap_content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.6" android:text= "Method" app:layout_constraintBottom_toTopOf="@id/btn_cs" app:layout_constraintEnd_toStartOf="@id/spinner_dm_method" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" app:layout_constraintEnd_toStartOf="@id/spinner_dm_method" /> <Spinner android:id="@+id/spinner_dm_method" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_weight="1.4" android:padding="10dp" app:layout_constraintEnd_toStartOf="@id/freq_label" app:layout_constraintStart_toEndOf="@id/dm_method_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> app:layout_constraintEnd_toEndOf="parent" /> </LinearLayout> <LinearLayout android:id="@+id/layout_parameters" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/layout_methods" app:layout_constraintBottom_toTopOf="@id/btn_cs" android:weightSum="4" android:orientation="horizontal"> <TextView android:id="@+id/freq_label" android:layout_width="wrap_content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.6" android:text= "Freq" app:layout_constraintBottom_toTopOf="@id/btn_cs" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/spinner_freq" app:layout_constraintStart_toEndOf="@id/spinner_dm_method" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> <Spinner android:id="@+id/spinner_freq" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_weight="1.4" android:padding="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/freq_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> app:layout_constraintEnd_toStartOf="@id/duration_label" /> <TextView android:id="@+id/duration_label" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.7" android:text= "Duration (s)" app:layout_constraintStart_toEndOf="@id/spinner_freq" app:layout_constraintEnd_toStartOf="@id/spinner_duration" /> <Spinner android:id="@+id/spinner_duration" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.3" android:padding="10dp" app:layout_constraintStart_toEndOf="@id/duration_label" app:layout_constraintEnd_toEndOf="parent" /> </LinearLayout> <Button android:id="@+id/btn_cs" android:layout_width="wrap_content" Loading @@ -69,7 +101,7 @@ android:text="Start Distance Measurement" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/spinner_dm_method" /> app:layout_constraintTop_toBottomOf="@id/layout_parameters" /> <TextView android:id="@+id/text_log" android:layout_width="match_parent" Loading Loading
android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/DistanceMeasurementInitiator.java +7 −3 Original line number Diff line number Diff line Loading @@ -66,7 +66,6 @@ class DistanceMeasurementInitiator { } } private static final int DISTANCE_MEASUREMENT_DURATION_SEC = 3600; private static final List<Pair<Integer, String>> mDistanceMeasurementMethodMapping = List.of( new Pair<>(DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_AUTO, "AUTO"), Loading Loading @@ -151,8 +150,13 @@ class DistanceMeasurementInitiator { return List.of(Freq.MEDIUM.toString(), Freq.HIGH.toString(), Freq.LOW.toString()); } List<String> getMeasureDurationsInSeconds() { return List.of("3600", "300", "60", "10"); } @SuppressLint("MissingPermission") // permissions are checked upfront void startDistanceMeasurement(String distanceMeasurementMethodName, String selectedFreq) { void startDistanceMeasurement( String distanceMeasurementMethodName, String selectedFreq, int duration) { if (mTargetDevice == null) { printLog("do Gatt connect first"); Loading @@ -163,7 +167,7 @@ class DistanceMeasurementInitiator { DistanceMeasurementParams params = new DistanceMeasurementParams.Builder(mTargetDevice) .setDurationSeconds(DISTANCE_MEASUREMENT_DURATION_SEC) .setDurationSeconds(duration) .setFrequency(Freq.fromName(selectedFreq).getFreq()) .setMethodId(getDistanceMeasurementMethodId(distanceMeasurementMethodName)) .build(); Loading
android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorFragment.java +14 −1 Original line number Diff line number Diff line Loading @@ -44,10 +44,12 @@ public class InitiatorFragment extends Fragment { private ArrayAdapter<String> mDmMethodArrayAdapter; private ArrayAdapter<String> mFreqArrayAdapter; private ArrayAdapter<String> mDurationArrayAdapter; private TextView mDistanceText; private CanvasView mDistanceCanvasView; private Spinner mSpinnerDmMethod; private Spinner mSpinnerFreq; private Spinner mSpinnerDuration; private Button mButtonCs; private LinearLayout mDistanceViewLayout; private TextView mLogText; Loading @@ -66,6 +68,7 @@ public class InitiatorFragment extends Fragment { mButtonCs = (Button) root.findViewById(R.id.btn_cs); mSpinnerDmMethod = (Spinner) root.findViewById(R.id.spinner_dm_method); mSpinnerFreq = (Spinner) root.findViewById(R.id.spinner_freq); mSpinnerDuration = (Spinner) root.findViewById(R.id.spinner_duration); mDistanceViewLayout = (LinearLayout) root.findViewById(R.id.layout_distance_view); mDistanceText = new TextView(getContext()); mDistanceViewLayout.addView(mDistanceText); Loading Loading @@ -93,6 +96,12 @@ public class InitiatorFragment extends Fragment { getContext(), android.R.layout.simple_spinner_item, new ArrayList<>()); mFreqArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSpinnerFreq.setAdapter(mFreqArrayAdapter); mDurationArrayAdapter = new ArrayAdapter<String>( getContext(), android.R.layout.simple_spinner_item, new ArrayList<>()); mDurationArrayAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); mSpinnerDuration.setAdapter(mDurationArrayAdapter); mInitiatorViewModel = new ViewModelProvider(this).get(InitiatorViewModel.class); mBleConnectionViewModel = new ViewModelProvider(this).get(BleConnectionViewModel.class); Loading Loading @@ -143,14 +152,18 @@ public class InitiatorFragment extends Fragment { mDmMethodArrayAdapter.addAll(mInitiatorViewModel.getSupportedDmMethods()); mFreqArrayAdapter.addAll(mInitiatorViewModel.getMeasurementFreqs()); mDurationArrayAdapter.addAll(mInitiatorViewModel.getMeasurementDurations()); mButtonCs.setOnClickListener( v -> { String methodName = mSpinnerDmMethod.getSelectedItem().toString(); String freq = mSpinnerFreq.getSelectedItem().toString(); int duration = Integer.parseInt(mSpinnerDuration.getSelectedItem().toString()); if (TextUtils.isEmpty(methodName)) { printLog("the device doesn't support any distance measurement methods."); } mInitiatorViewModel.toggleCsStartStop(methodName, freq); mInitiatorViewModel.toggleCsStartStop(methodName, freq, duration); }); } Loading
android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorViewModel.java +6 −2 Original line number Diff line number Diff line Loading @@ -75,10 +75,14 @@ public class InitiatorViewModel extends AndroidViewModel { return mDistanceMeasurementInitiator.getMeasurementFreqs(); } void toggleCsStartStop(String distanceMeasurementMethodName, String freq) { List<String> getMeasurementDurations() { return mDistanceMeasurementInitiator.getMeasureDurationsInSeconds(); } void toggleCsStartStop(String distanceMeasurementMethodName, String freq, int duration) { if (!mCsStarted.getValue()) { mDistanceMeasurementInitiator.startDistanceMeasurement( distanceMeasurementMethodName, freq); distanceMeasurementMethodName, freq, duration); } else { mDistanceMeasurementInitiator.stopDistanceMeasurement(); } Loading
android/ChannelSoundingTestApp/app/src/main/res/layout/fragment_initiator.xml +68 −36 Original line number Diff line number Diff line Loading @@ -16,49 +16,81 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" app:layout_constraintBottom_toTopOf="@id/spinner_dm_method" app:layout_constraintBottom_toTopOf="@id/layout_methods" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <LinearLayout android:id="@+id/layout_methods" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" app:layout_constraintBottom_toTopOf="@id/layout_parameters" android:weightSum="4" android:orientation="horizontal"> <TextView android:id="@+id/dm_method_label" android:layout_width="wrap_content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.6" android:text= "Method" app:layout_constraintBottom_toTopOf="@id/btn_cs" app:layout_constraintEnd_toStartOf="@id/spinner_dm_method" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" app:layout_constraintEnd_toStartOf="@id/spinner_dm_method" /> <Spinner android:id="@+id/spinner_dm_method" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_weight="1.4" android:padding="10dp" app:layout_constraintEnd_toStartOf="@id/freq_label" app:layout_constraintStart_toEndOf="@id/dm_method_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> app:layout_constraintEnd_toEndOf="parent" /> </LinearLayout> <LinearLayout android:id="@+id/layout_parameters" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/layout_methods" app:layout_constraintBottom_toTopOf="@id/btn_cs" android:weightSum="4" android:orientation="horizontal"> <TextView android:id="@+id/freq_label" android:layout_width="wrap_content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.6" android:text= "Freq" app:layout_constraintBottom_toTopOf="@id/btn_cs" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/spinner_freq" app:layout_constraintStart_toEndOf="@id/spinner_dm_method" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> <Spinner android:id="@+id/spinner_freq" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_weight="1.4" android:padding="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/freq_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> app:layout_constraintEnd_toStartOf="@id/duration_label" /> <TextView android:id="@+id/duration_label" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.7" android:text= "Duration (s)" app:layout_constraintStart_toEndOf="@id/spinner_freq" app:layout_constraintEnd_toStartOf="@id/spinner_duration" /> <Spinner android:id="@+id/spinner_duration" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.3" android:padding="10dp" app:layout_constraintStart_toEndOf="@id/duration_label" app:layout_constraintEnd_toEndOf="parent" /> </LinearLayout> <Button android:id="@+id/btn_cs" android:layout_width="wrap_content" Loading @@ -69,7 +101,7 @@ android:text="Start Distance Measurement" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/spinner_dm_method" /> app:layout_constraintTop_toBottomOf="@id/layout_parameters" /> <TextView android:id="@+id/text_log" android:layout_width="match_parent" Loading