Loading android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/DistanceMeasurementInitiator.java +34 −2 Original line number Diff line number Diff line Loading @@ -38,6 +38,34 @@ import java.util.concurrent.Executors; class DistanceMeasurementInitiator { enum Freq { HIGH(DistanceMeasurementParams.REPORT_FREQUENCY_HIGH), MEDIUM(DistanceMeasurementParams.REPORT_FREQUENCY_MEDIUM), LOW(DistanceMeasurementParams.REPORT_FREQUENCY_LOW); private final int freq; Freq(int freq) { this.freq = freq; } int getFreq() { return freq; } @Override public String toString() { return name(); } public static Freq fromName(String name) { try { return Freq.valueOf(name); } catch (IllegalArgumentException e) { return MEDIUM; } } } private static final int DISTANCE_MEASUREMENT_DURATION_SEC = 3600; private static final List<Pair<Integer, String>> mDistanceMeasurementMethodMapping = List.of( Loading Loading @@ -119,8 +147,12 @@ class DistanceMeasurementInitiator { return methods; } List<String> getMeasurementFreqs() { return List.of(Freq.MEDIUM.toString(), Freq.HIGH.toString(), Freq.LOW.toString()); } @SuppressLint("MissingPermission") // permissions are checked upfront void startDistanceMeasurement(String distanceMeasurementMethodName) { void startDistanceMeasurement(String distanceMeasurementMethodName, String selectedFreq) { if (mTargetDevice == null) { printLog("do Gatt connect first"); Loading @@ -132,7 +164,7 @@ class DistanceMeasurementInitiator { DistanceMeasurementParams params = new DistanceMeasurementParams.Builder(mTargetDevice) .setDurationSeconds(DISTANCE_MEASUREMENT_DURATION_SEC) .setFrequency(DistanceMeasurementParams.REPORT_FREQUENCY_LOW) .setFrequency(Freq.fromName(selectedFreq).getFreq()) .setMethodId(getDistanceMeasurementMethodId(distanceMeasurementMethodName)) .build(); DistanceMeasurementManager distanceMeasurementManager = Loading android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorFragment.java +11 −2 Original line number Diff line number Diff line Loading @@ -43,9 +43,11 @@ public class InitiatorFragment extends Fragment { private static final DecimalFormat DISTANCE_DECIMAL_FMT = new DecimalFormat("0.00"); private ArrayAdapter<String> mDmMethodArrayAdapter; private ArrayAdapter<String> mFreqArrayAdapter; private TextView mDistanceText; private CanvasView mDistanceCanvasView; private Spinner mSpinnerDmMethod; private Spinner mSpinnerFreq; private Button mButtonCs; private LinearLayout mDistanceViewLayout; private TextView mLogText; Loading @@ -63,6 +65,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); mDistanceViewLayout = (LinearLayout) root.findViewById(R.id.layout_distance_view); mDistanceText = new TextView(getContext()); mDistanceViewLayout.addView(mDistanceText); Loading @@ -85,6 +88,11 @@ public class InitiatorFragment extends Fragment { mDmMethodArrayAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); mSpinnerDmMethod.setAdapter(mDmMethodArrayAdapter); mFreqArrayAdapter = new ArrayAdapter<String>( getContext(), android.R.layout.simple_spinner_item, new ArrayList<>()); mFreqArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSpinnerFreq.setAdapter(mFreqArrayAdapter); mInitiatorViewModel = new ViewModelProvider(this).get(InitiatorViewModel.class); mBleConnectionViewModel = new ViewModelProvider(this).get(BleConnectionViewModel.class); Loading Loading @@ -134,14 +142,15 @@ public class InitiatorFragment extends Fragment { }); mDmMethodArrayAdapter.addAll(mInitiatorViewModel.getSupportedDmMethods()); mFreqArrayAdapter.addAll(mInitiatorViewModel.getMeasurementFreqs()); mButtonCs.setOnClickListener( v -> { String methodName = mSpinnerDmMethod.getSelectedItem().toString(); String freq = mSpinnerFreq.getSelectedItem().toString(); if (TextUtils.isEmpty(methodName)) { printLog("the device doesn't support any distance measurement methods."); } mInitiatorViewModel.toggleCsStartStop(methodName); mInitiatorViewModel.toggleCsStartStop(methodName, freq); }); } Loading android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorViewModel.java +7 −2 Original line number Diff line number Diff line Loading @@ -71,9 +71,14 @@ public class InitiatorViewModel extends AndroidViewModel { return mDistanceMeasurementInitiator.getDistanceMeasurementMethods(); } void toggleCsStartStop(String distanceMeasurementMethodName) { List<String> getMeasurementFreqs() { return mDistanceMeasurementInitiator.getMeasurementFreqs(); } void toggleCsStartStop(String distanceMeasurementMethodName, String freq) { if (!mCsStarted.getValue()) { mDistanceMeasurementInitiator.startDistanceMeasurement(distanceMeasurementMethodName); mDistanceMeasurementInitiator.startDistanceMeasurement( distanceMeasurementMethodName, freq); } else { mDistanceMeasurementInitiator.stopDistanceMeasurement(); } Loading android/ChannelSoundingTestApp/app/src/main/res/layout/fragment_initiator.xml +33 −5 Original line number Diff line number Diff line Loading @@ -21,15 +21,43 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/dm_method_label" android:layout_width="wrap_content" android:layout_height="wrap_content" 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" /> <Spinner android:id="@+id/spinner_dm_method" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:padding="10dp" app:layout_constraintEnd_toStartOf="@id/btn_cs" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/freq_label" app:layout_constraintStart_toEndOf="@id/dm_method_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> <TextView android:id="@+id/freq_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "Freq" app:layout_constraintBottom_toTopOf="@id/btn_cs" 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:padding="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/freq_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> <Button android:id="@+id/btn_cs" Loading @@ -40,8 +68,8 @@ android:padding="10dp" android:text="Start Distance Measurement" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/spinner_dm_method" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/spinner_dm_method" /> <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 +34 −2 Original line number Diff line number Diff line Loading @@ -38,6 +38,34 @@ import java.util.concurrent.Executors; class DistanceMeasurementInitiator { enum Freq { HIGH(DistanceMeasurementParams.REPORT_FREQUENCY_HIGH), MEDIUM(DistanceMeasurementParams.REPORT_FREQUENCY_MEDIUM), LOW(DistanceMeasurementParams.REPORT_FREQUENCY_LOW); private final int freq; Freq(int freq) { this.freq = freq; } int getFreq() { return freq; } @Override public String toString() { return name(); } public static Freq fromName(String name) { try { return Freq.valueOf(name); } catch (IllegalArgumentException e) { return MEDIUM; } } } private static final int DISTANCE_MEASUREMENT_DURATION_SEC = 3600; private static final List<Pair<Integer, String>> mDistanceMeasurementMethodMapping = List.of( Loading Loading @@ -119,8 +147,12 @@ class DistanceMeasurementInitiator { return methods; } List<String> getMeasurementFreqs() { return List.of(Freq.MEDIUM.toString(), Freq.HIGH.toString(), Freq.LOW.toString()); } @SuppressLint("MissingPermission") // permissions are checked upfront void startDistanceMeasurement(String distanceMeasurementMethodName) { void startDistanceMeasurement(String distanceMeasurementMethodName, String selectedFreq) { if (mTargetDevice == null) { printLog("do Gatt connect first"); Loading @@ -132,7 +164,7 @@ class DistanceMeasurementInitiator { DistanceMeasurementParams params = new DistanceMeasurementParams.Builder(mTargetDevice) .setDurationSeconds(DISTANCE_MEASUREMENT_DURATION_SEC) .setFrequency(DistanceMeasurementParams.REPORT_FREQUENCY_LOW) .setFrequency(Freq.fromName(selectedFreq).getFreq()) .setMethodId(getDistanceMeasurementMethodId(distanceMeasurementMethodName)) .build(); DistanceMeasurementManager distanceMeasurementManager = Loading
android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorFragment.java +11 −2 Original line number Diff line number Diff line Loading @@ -43,9 +43,11 @@ public class InitiatorFragment extends Fragment { private static final DecimalFormat DISTANCE_DECIMAL_FMT = new DecimalFormat("0.00"); private ArrayAdapter<String> mDmMethodArrayAdapter; private ArrayAdapter<String> mFreqArrayAdapter; private TextView mDistanceText; private CanvasView mDistanceCanvasView; private Spinner mSpinnerDmMethod; private Spinner mSpinnerFreq; private Button mButtonCs; private LinearLayout mDistanceViewLayout; private TextView mLogText; Loading @@ -63,6 +65,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); mDistanceViewLayout = (LinearLayout) root.findViewById(R.id.layout_distance_view); mDistanceText = new TextView(getContext()); mDistanceViewLayout.addView(mDistanceText); Loading @@ -85,6 +88,11 @@ public class InitiatorFragment extends Fragment { mDmMethodArrayAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); mSpinnerDmMethod.setAdapter(mDmMethodArrayAdapter); mFreqArrayAdapter = new ArrayAdapter<String>( getContext(), android.R.layout.simple_spinner_item, new ArrayList<>()); mFreqArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSpinnerFreq.setAdapter(mFreqArrayAdapter); mInitiatorViewModel = new ViewModelProvider(this).get(InitiatorViewModel.class); mBleConnectionViewModel = new ViewModelProvider(this).get(BleConnectionViewModel.class); Loading Loading @@ -134,14 +142,15 @@ public class InitiatorFragment extends Fragment { }); mDmMethodArrayAdapter.addAll(mInitiatorViewModel.getSupportedDmMethods()); mFreqArrayAdapter.addAll(mInitiatorViewModel.getMeasurementFreqs()); mButtonCs.setOnClickListener( v -> { String methodName = mSpinnerDmMethod.getSelectedItem().toString(); String freq = mSpinnerFreq.getSelectedItem().toString(); if (TextUtils.isEmpty(methodName)) { printLog("the device doesn't support any distance measurement methods."); } mInitiatorViewModel.toggleCsStartStop(methodName); mInitiatorViewModel.toggleCsStartStop(methodName, freq); }); } Loading
android/ChannelSoundingTestApp/app/src/main/java/com/android/bluetooth/channelsoundingtestapp/InitiatorViewModel.java +7 −2 Original line number Diff line number Diff line Loading @@ -71,9 +71,14 @@ public class InitiatorViewModel extends AndroidViewModel { return mDistanceMeasurementInitiator.getDistanceMeasurementMethods(); } void toggleCsStartStop(String distanceMeasurementMethodName) { List<String> getMeasurementFreqs() { return mDistanceMeasurementInitiator.getMeasurementFreqs(); } void toggleCsStartStop(String distanceMeasurementMethodName, String freq) { if (!mCsStarted.getValue()) { mDistanceMeasurementInitiator.startDistanceMeasurement(distanceMeasurementMethodName); mDistanceMeasurementInitiator.startDistanceMeasurement( distanceMeasurementMethodName, freq); } else { mDistanceMeasurementInitiator.stopDistanceMeasurement(); } Loading
android/ChannelSoundingTestApp/app/src/main/res/layout/fragment_initiator.xml +33 −5 Original line number Diff line number Diff line Loading @@ -21,15 +21,43 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/dm_method_label" android:layout_width="wrap_content" android:layout_height="wrap_content" 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" /> <Spinner android:id="@+id/spinner_dm_method" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:padding="10dp" app:layout_constraintEnd_toStartOf="@id/btn_cs" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/freq_label" app:layout_constraintStart_toEndOf="@id/dm_method_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> <TextView android:id="@+id/freq_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "Freq" app:layout_constraintBottom_toTopOf="@id/btn_cs" 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:padding="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/freq_label" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> <Button android:id="@+id/btn_cs" Loading @@ -40,8 +68,8 @@ android:padding="10dp" android:text="Start Distance Measurement" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/spinner_dm_method" app:layout_constraintTop_toBottomOf="@id/init_ble_connection_container" /> app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/spinner_dm_method" /> <TextView android:id="@+id/text_log" android:layout_width="match_parent" Loading