From 0e385c0998548a4728e23875b3230032afce398c Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sun, 28 May 2023 11:59:59 -0700 Subject: OboeTester: consolidate CommDevice UI (#1811) Move SCO dialog to CommDeviceView To help debug b/282831177 --- .../audio_device/CommunicationDeviceSpinner.java | 21 +++-- .../oboetester/CommunicationDeviceView.java | 97 ++++++++++++++++++---- .../java/com/mobileer/oboetester/EchoActivity.java | 9 -- .../java/com/mobileer/oboetester/MainActivity.java | 42 ---------- .../oboetester/RoundTripLatencyActivity.java | 2 + .../com/mobileer/oboetester/TapToToneActivity.java | 2 + .../com/mobileer/oboetester/TestAudioActivity.java | 9 ++ .../com/mobileer/oboetester/TestInputActivity.java | 11 --- .../mobileer/oboetester/TestOutputActivity.java | 13 --- .../app/src/main/res/layout/activity_echo.xml | 1 + .../app/src/main/res/layout/activity_main.xml | 31 +------ .../src/main/res/layout/activity_rt_latency.xml | 8 ++ .../src/main/res/layout/activity_tap_to_tone.xml | 7 ++ .../app/src/main/res/layout/comm_device_view.xml | 22 ++++- .../OboeTester/app/src/main/res/values/strings.xml | 1 + 15 files changed, 145 insertions(+), 131 deletions(-) (limited to 'apps') diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/audio_device/CommunicationDeviceSpinner.java b/apps/OboeTester/app/src/main/java/com/mobileer/audio_device/CommunicationDeviceSpinner.java index fcdcf412..46a924f5 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/audio_device/CommunicationDeviceSpinner.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/audio_device/CommunicationDeviceSpinner.java @@ -29,8 +29,10 @@ import com.mobileer.oboetester.R; import java.util.List; public class CommunicationDeviceSpinner extends Spinner { - private static final int CLEAR_DEVICE_ID = 0; private static final String TAG = CommunicationDeviceSpinner.class.getName(); + // menu positions + public static final int POS_CLEAR = 0; + public static final int POS_DEVICES = 1; // base position for device list private AudioDeviceAdapter mDeviceAdapter; private AudioManager mAudioManager; private Context mContext; @@ -85,10 +87,9 @@ public class CommunicationDeviceSpinner extends Spinner { mDeviceAdapter = new AudioDeviceAdapter(context); setAdapter(mDeviceAdapter); - // Add a default entry to the list and select it - mDeviceAdapter.add(new AudioDeviceListEntry(CLEAR_DEVICE_ID, - mContext.getString(R.string.auto_select))); - setSelection(0); + // Add default entries to the list and select one. + addDefaultDevicesOptions(); + setSelection(POS_CLEAR); setupCommunicationDeviceListener(); } @@ -108,9 +109,8 @@ public class CommunicationDeviceSpinner extends Spinner { private void updateDeviceList() { mDeviceAdapter.clear(); - mDeviceAdapter.add(new AudioDeviceListEntry(CLEAR_DEVICE_ID, - mContext.getString(R.string.clear))); - setSelection(0); + addDefaultDevicesOptions(); + setSelection(POS_CLEAR); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { List commDeviceList = mAudioManager.getAvailableCommunicationDevices(); mCommDeviceArray = commDeviceList.toArray(new AudioDeviceInfo[0]); @@ -123,4 +123,9 @@ public class CommunicationDeviceSpinner extends Spinner { } }, null); } + + private void addDefaultDevicesOptions() { + mDeviceAdapter.add(new AudioDeviceListEntry(POS_CLEAR, + mContext.getString(R.string.clear_comm))); + } } diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/CommunicationDeviceView.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/CommunicationDeviceView.java index 4e8df135..17361eaa 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/CommunicationDeviceView.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/CommunicationDeviceView.java @@ -16,7 +16,10 @@ package com.mobileer.oboetester; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.os.Build; @@ -32,10 +35,16 @@ import android.widget.TextView; import com.mobileer.audio_device.CommunicationDeviceSpinner; public class CommunicationDeviceView extends LinearLayout { - private CheckBox mSpeakerphoneCheckbox; - private TextView mIsSpeakerphoneText; + private AudioManager mAudioManager; + private CheckBox mSpeakerphoneCheckbox; + private CheckBox mScoCheckbox; + private TextView mSpeakerStatusView; + private TextView mScoStatusView; + private BroadcastReceiver mScoStateReceiver; + private boolean mScoStateReceiverRegistered = false; private CommunicationDeviceSpinner mDeviceSpinner; + private int mScoState; public CommunicationDeviceView(Context context) { super(context); @@ -66,6 +75,29 @@ public class CommunicationDeviceView extends LinearLayout { mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mSpeakerphoneCheckbox = (CheckBox) findViewById(R.id.setSpeakerphoneOn); + mSpeakerphoneCheckbox.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + onSetSpeakerphoneOn(view); + } + }); + mSpeakerStatusView = (TextView) findViewById(R.id.spkr_status_view); + + mScoCheckbox = (CheckBox) findViewById(R.id.setBluetoothScoOn); + mScoCheckbox.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + onStartStopBluetoothSco(view); + } + }); + mScoStatusView = (TextView) findViewById(R.id.sco_status_view); + mScoStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mScoState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1); + showCommDeviceStatus(); + } + }; mDeviceSpinner = (CommunicationDeviceSpinner) findViewById(R.id.comm_devices_spinner); mDeviceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @@ -74,15 +106,15 @@ public class CommunicationDeviceView extends LinearLayout { AudioDeviceInfo[] commDeviceArray = mDeviceSpinner.getCommunicationsDevices(); if (commDeviceArray != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - if (position == 0) { + if (position == CommunicationDeviceSpinner.POS_CLEAR) { mAudioManager.clearCommunicationDevice(); } else { - AudioDeviceInfo selectedDevice = commDeviceArray[position - 1]; // skip "Clear" + AudioDeviceInfo selectedDevice = commDeviceArray[position - CommunicationDeviceSpinner.POS_DEVICES]; // skip "Clear" mAudioManager.setCommunicationDevice(selectedDevice); } - showCommDeviceStatus(); } } + showCommDeviceStatus(); } public void onNothingSelected(AdapterView parent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -92,19 +124,19 @@ public class CommunicationDeviceView extends LinearLayout { } }); - mSpeakerphoneCheckbox.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - onSetSpeakerphoneOn(view); - } - }); - mIsSpeakerphoneText = (TextView) findViewById(R.id.isSpeakerphoneOn); showCommDeviceStatus(); } - public void cleanup() { + public void onStart() { + registerScoStateReceiver(); + } + + public void onStop() { mSpeakerphoneCheckbox.setChecked(false); setSpeakerPhoneOn(false); + mScoCheckbox.setChecked(false); + mAudioManager.stopBluetoothSco(); + unregisterScoStateReceiver(); } public void onSetSpeakerphoneOn(View view) { @@ -122,14 +154,47 @@ public class CommunicationDeviceView extends LinearLayout { private void showCommDeviceStatus() { boolean enabled = mAudioManager.isSpeakerphoneOn(); - String text = (enabled ? "ON" : "OFF"); + String text = ":" + (enabled ? "ON" : "OFF"); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { AudioDeviceInfo commDeviceInfo = mAudioManager.getCommunicationDevice(); if (commDeviceInfo != null) { - text += ", CommDev=" + commDeviceInfo.getId(); + text += ", #" + commDeviceInfo.getId(); } } - mIsSpeakerphoneText.setText(" => " + text); + mSpeakerStatusView.setText(text + ","); + + if (mScoState == AudioManager.SCO_AUDIO_STATE_CONNECTING) { + text = ":WAIT"; + } else if (mScoState == AudioManager.SCO_AUDIO_STATE_CONNECTED) { + text = ":CON"; + } else if (mScoState == AudioManager.SCO_AUDIO_STATE_DISCONNECTED) { + text = ":DISCON"; + } + mScoStatusView.setText(text); + } + + public void onStartStopBluetoothSco(View view) { + CheckBox checkBox = (CheckBox) view; + if (checkBox.isChecked()) { + mAudioManager.startBluetoothSco(); + } else { + mAudioManager.stopBluetoothSco(); + } + } + + private synchronized void registerScoStateReceiver() { + if (!mScoStateReceiverRegistered) { + getContext().registerReceiver(mScoStateReceiver, + new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)); + mScoStateReceiverRegistered = true; + } + } + + private synchronized void unregisterScoStateReceiver() { + if (mScoStateReceiverRegistered) { + getContext().unregisterReceiver(mScoStateReceiver); + mScoStateReceiverRegistered = false; + } } } diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/EchoActivity.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/EchoActivity.java index 1d8e4dcc..e195a61f 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/EchoActivity.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/EchoActivity.java @@ -42,7 +42,6 @@ public class EchoActivity extends TestInputActivity { private Button mStartButton; private Button mStopButton; private TextView mStatusTextView; - private CommunicationDeviceView mCommunicationDeviceView; private ColdStartSniffer mNativeSniffer = new ColdStartSniffer(this); @@ -163,14 +162,6 @@ public class EchoActivity extends TestInputActivity { hideSettingsViews(); } - @Override - protected void onStop() { - if (mCommunicationDeviceView != null) { - mCommunicationDeviceView.cleanup(); - } - super.onStop(); - } - private void setDelayTimeByPosition(int progress) { mDelayTime = mTaperDelayTime.linearToExponential( ((double)progress)/MAX_DELAY_TIME_PROGRESS); diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/MainActivity.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/MainActivity.java index 70eca907..145dfbc0 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/MainActivity.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/MainActivity.java @@ -57,9 +57,7 @@ public class MainActivity extends BaseOboeTesterActivity { protected TextView mDeviceView; private TextView mVersionTextView; private TextView mBuildTextView; - private TextView mBluetoothScoStatusView; private Bundle mBundleFromIntent; - private BroadcastReceiver mScoStateReceiver; private CheckBox mWorkaroundsCheckBox; private CheckBox mBackgroundCheckBox; private static String mVersionText; @@ -117,21 +115,6 @@ public class MainActivity extends BaseOboeTesterActivity { mBuildTextView = (TextView) findViewById(R.id.text_build_info); mBuildTextView.setText(Build.DISPLAY); - mBluetoothScoStatusView = (TextView) findViewById(R.id.textBluetoothScoStatus); - mScoStateReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1); - if (state == AudioManager.SCO_AUDIO_STATE_CONNECTING) { - mBluetoothScoStatusView.setText("CONNECTING"); - } else if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) { - mBluetoothScoStatusView.setText("CONNECTED"); - } else if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED) { - mBluetoothScoStatusView.setText("DISCONNECTED"); - } - } - }; - saveIntentBundleForLaterProcessing(getIntent()); } @@ -139,15 +122,6 @@ public class MainActivity extends BaseOboeTesterActivity { return mVersionText; } - private void registerScoStateReceiver() { - registerReceiver(mScoStateReceiver, - new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)); - } - - private void unregisterScoStateReceiver() { - unregisterReceiver(mScoStateReceiver); - } - private void logScreenSize() { Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); @@ -213,16 +187,9 @@ public class MainActivity extends BaseOboeTesterActivity { public void onResume(){ super.onResume(); mWorkaroundsCheckBox.setChecked(NativeEngine.areWorkaroundsEnabled()); - registerScoStateReceiver(); processBundleFromIntent(); } - @Override - public void onPause(){ - unregisterScoStateReceiver(); - super.onPause(); - } - private void updateNativeAudioUI() { AudioManager myAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE); String audioManagerSampleRate = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); @@ -312,13 +279,4 @@ public class MainActivity extends BaseOboeTesterActivity { OboeAudioStream.setCallbackSize(callbackSize); } - public void onStartStopBluetoothSco(View view) { - CheckBox checkBox = (CheckBox) view; - AudioManager myAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE); - if (checkBox.isChecked()) { - myAudioMgr.startBluetoothSco(); - } else { - myAudioMgr.stopBluetoothSco(); - } - } } diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/RoundTripLatencyActivity.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/RoundTripLatencyActivity.java index 7d1f1339..3fe63210 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/RoundTripLatencyActivity.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/RoundTripLatencyActivity.java @@ -349,6 +349,8 @@ public class RoundTripLatencyActivity extends AnalyzerActivity { hideSettingsViews(); mBufferSizeView.setFaderNormalizedProgress(0.0); // for lowest latency + + mCommunicationDeviceView = (CommunicationDeviceView) findViewById(R.id.comm_device_view); } @Override diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TapToToneActivity.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TapToToneActivity.java index 7f02425a..8f282b44 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TapToToneActivity.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TapToToneActivity.java @@ -103,6 +103,8 @@ public class TapToToneActivity extends TestOutputActivityBase { return true; }); + mCommunicationDeviceView = (CommunicationDeviceView) findViewById(R.id.comm_device_view); + mStartButton = (Button) findViewById(R.id.button_start); mStopButton = (Button) findViewById(R.id.button_stop); updateButtons(false); diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestAudioActivity.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestAudioActivity.java index dd2ee814..65d8ae69 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestAudioActivity.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestAudioActivity.java @@ -92,6 +92,8 @@ abstract class TestAudioActivity extends Activity { private Button mCloseButton; private MyStreamSniffer mStreamSniffer; private CheckBox mCallbackReturnStopBox; + // Only set in some activities + protected CommunicationDeviceView mCommunicationDeviceView; private int mSampleRate; private int mSingleTestIndex = -1; private static boolean mBackgroundEnabled; @@ -229,6 +231,10 @@ abstract class TestAudioActivity extends Activity { super.onStart(); resetConfiguration(); setActivityType(getActivityType()); + // TODO Use LifeCycleObserver instead of this. + if (mCommunicationDeviceView != null) { + mCommunicationDeviceView.onStart(); + } } protected void resetConfiguration() { @@ -293,6 +299,9 @@ abstract class TestAudioActivity extends Activity { Log.i(TAG, "onStop() called so stop the test ========================="); onStopTest(); } + if (mCommunicationDeviceView != null) { + mCommunicationDeviceView.onStop(); + } super.onStop(); } diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestInputActivity.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestInputActivity.java index 65018cff..003efb95 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestInputActivity.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestInputActivity.java @@ -17,8 +17,6 @@ package com.mobileer.oboetester; import android.content.Intent; -import android.media.audiofx.AcousticEchoCanceler; -import android.media.audiofx.AutomaticGainControl; import android.net.Uri; import android.os.Bundle; import android.os.Environment; @@ -44,7 +42,6 @@ public class TestInputActivity extends TestAudioActivity { private InputMarginView mInputMarginView; private int mInputMarginBursts = 0; private WorkloadView mWorkloadView; - private CommunicationDeviceView mCommunicationDeviceView; public native void setMinimumFramesBeforeRead(int frames); public native int saveWaveFile(String absolutePath); @@ -82,14 +79,6 @@ public class TestInputActivity extends TestAudioActivity { mCommunicationDeviceView = (CommunicationDeviceView) findViewById(R.id.comm_device_view); } - @Override - protected void onStop() { - if (mCommunicationDeviceView != null) { - mCommunicationDeviceView.cleanup(); - } - super.onStop(); - } - @Override int getActivityType() { return ACTIVITY_TEST_INPUT; diff --git a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestOutputActivity.java b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestOutputActivity.java index 80812ccf..987832eb 100644 --- a/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestOutputActivity.java +++ b/apps/OboeTester/app/src/main/java/com/mobileer/oboetester/TestOutputActivity.java @@ -16,17 +16,13 @@ package com.mobileer.oboetester; -import android.content.Context; -import android.media.AudioManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.Spinner; -import android.widget.TextView; import java.io.IOException; @@ -38,7 +34,6 @@ public final class TestOutputActivity extends TestOutputActivityBase { public static final int MAX_CHANNEL_BOXES = 16; private CheckBox[] mChannelBoxes; private Spinner mOutputSignalSpinner; - protected CommunicationDeviceView mCommunicationDeviceView; private class OutputSignalSpinnerListener implements android.widget.AdapterView.OnItemSelectedListener { @Override @@ -97,14 +92,6 @@ public final class TestOutputActivity extends TestOutputActivityBase { return ACTIVITY_TEST_OUTPUT; } - @Override - protected void onStop() { - if (mCommunicationDeviceView != null) { - mCommunicationDeviceView.cleanup(); - } - super.onStop(); - } - public void openAudio() throws IOException { super.openAudio(); } diff --git a/apps/OboeTester/app/src/main/res/layout/activity_echo.xml b/apps/OboeTester/app/src/main/res/layout/activity_echo.xml index 65cd6ea7..032494c8 100644 --- a/apps/OboeTester/app/src/main/res/layout/activity_echo.xml +++ b/apps/OboeTester/app/src/main/res/layout/activity_echo.xml @@ -6,6 +6,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true" > + - - - - - - + app:layout_constraintStart_toStartOf="@+id/useCallback" + app:layout_constraintTop_toBottomOf="@+id/useCallback" /> + + + + + + android:text="SpkrPhone" /> + android:text="?" /> + + + + + Measure Cancel Clear + clearCommunicationDevice() Run Cancel -- cgit v1.2.3