Loading AndroidManifest.xml +0 −11 Original line number Diff line number Diff line Loading @@ -5216,17 +5216,6 @@ android:value="com.android.settings.connecteddevice.audiosharing.AudioSharingDashboardFragment"/> </activity> <activity android:name="com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode.QrCodeScanModeActivity" android:permission="android.permission.BLUETOOTH_CONNECT" android:screenOrientation="portrait" android:exported="false"> <intent-filter> <action android:name="android.settings.BLUETOOTH_LE_AUDIO_QR_CODE_SCANNER"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> <activity android:name="com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamConfirmDialogActivity" android:exported="true" Loading res/layout/qrcode_scanner_fragment.xml +0 −2 Original line number Diff line number Diff line Loading @@ -70,8 +70,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginStart="?attr/sudMarginStart" android:layout_marginEnd="?attr/sudMarginEnd" android:gravity="center" android:layout_gravity="center" android:visibility="invisible"/> Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java +3 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import static com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsDashboardFragment.KEY_BROADCAST_METADATA; import android.app.Activity; import android.app.Dialog; import android.app.settings.SettingsEnums; Loading @@ -30,7 +32,6 @@ import androidx.annotation.Nullable; import com.android.settings.R; import com.android.settings.bluetooth.Utils; import com.android.settings.connecteddevice.audiosharing.AudioSharingUtils; import com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode.QrCodeScanModeFragment; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt; Loading @@ -41,7 +42,6 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import com.google.common.base.Strings; public class AudioStreamConfirmDialog extends InstrumentedDialogFragment { public static final String KEY_BROADCAST_METADATA = "key_broadcast_metadata"; private static final String TAG = "AudioStreamConfirmDialog"; private static final int DEFAULT_DEVICE_NAME = R.string.audio_streams_dialog_default_device; @Nullable private LocalBluetoothManager mLocalBluetoothManager; Loading @@ -63,8 +63,7 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment { mLocalBluetoothManager = Utils.getLocalBluetoothManager(mActivity); mProfileManager = mLocalBluetoothManager == null ? null : mLocalBluetoothManager.getProfileManager(); mBroadcastMetadataStr = mActivity.getIntent().getStringExtra(QrCodeScanModeFragment.KEY_BROADCAST_METADATA); mBroadcastMetadataStr = mActivity.getIntent().getStringExtra(KEY_BROADCAST_METADATA); if (Strings.isNullOrEmpty(mBroadcastMetadataStr)) { Log.w(TAG, "onCreate() mBroadcastMetadataStr is null or empty!"); return; Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsDashboardFragment.java +3 −6 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.util.Log; import androidx.annotation.Nullable; import com.android.settings.R; import com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode.QrCodeScanModeFragment; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt; import com.android.settingslib.bluetooth.BluetoothUtils; Loading @@ -36,6 +35,7 @@ import com.android.settingslib.bluetooth.BluetoothUtils; import com.google.common.base.Strings; public class AudioStreamsDashboardFragment extends DashboardFragment { public static final String KEY_BROADCAST_METADATA = "key_broadcast_metadata"; private static final String TAG = "AudioStreamsDashboardFrag"; private static final boolean DEBUG = BluetoothUtils.D; private AudioStreamsProgressCategoryController mAudioStreamsProgressCategoryController; Loading Loading @@ -78,8 +78,7 @@ public class AudioStreamsDashboardFragment extends DashboardFragment { mAudioStreamsProgressCategoryController.setFragment(this); if (getArguments() != null) { String broadcastMetadataStr = getArguments().getString(AudioStreamConfirmDialog.KEY_BROADCAST_METADATA); String broadcastMetadataStr = getArguments().getString(KEY_BROADCAST_METADATA); if (!Strings.isNullOrEmpty(broadcastMetadataStr)) { BluetoothLeBroadcastMetadata broadcastMetadata = BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata( Loading Loading @@ -112,9 +111,7 @@ public class AudioStreamsDashboardFragment extends DashboardFragment { if (requestCode == REQUEST_SCAN_BT_BROADCAST_QR_CODE) { if (resultCode == Activity.RESULT_OK) { String broadcastMetadata = data != null ? data.getStringExtra(QrCodeScanModeFragment.KEY_BROADCAST_METADATA) : ""; data != null ? data.getStringExtra(KEY_BROADCAST_METADATA) : ""; BluetoothLeBroadcastMetadata source = BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata( broadcastMetadata); Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/qrcode/QrCodeScanModeFragment.java→src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsQrCodeScanFragment.java +60 −90 Original line number Diff line number Diff line Loading @@ -14,7 +14,9 @@ * limitations under the License. */ package com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode; package com.android.settings.connecteddevice.audiosharing.audiostreams; import static com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsDashboardFragment.KEY_BROADCAST_METADATA; import android.app.Activity; import android.app.settings.SettingsEnums; Loading @@ -26,6 +28,7 @@ import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.VibrationEffect; import android.os.Vibrator; Loading @@ -41,11 +44,9 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.android.settings.R; import com.android.settings.bluetooth.Utils; import com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsHelper; import com.android.settings.core.InstrumentedFragment; import com.android.settingslib.bluetooth.BluetoothBroadcastUtils; import com.android.settingslib.bluetooth.BluetoothUtils; Loading @@ -54,34 +55,54 @@ import com.android.settingslib.qrcode.QrCamera; import java.time.Duration; public class QrCodeScanModeFragment extends InstrumentedFragment public class AudioStreamsQrCodeScanFragment extends InstrumentedFragment implements TextureView.SurfaceTextureListener, QrCamera.ScannerCallback { private static final boolean DEBUG = BluetoothUtils.D; private static final String TAG = "QrCodeScanModeFragment"; /** Message sent to hide error message */ private static final String TAG = "AudioStreamsQrCodeScanFragment"; private static final int MESSAGE_HIDE_ERROR_MESSAGE = 1; /** Message sent to show error message */ private static final int MESSAGE_SHOW_ERROR_MESSAGE = 2; /** Message sent to broadcast QR code */ private static final int MESSAGE_SCAN_BROADCAST_SUCCESS = 3; private static final long SHOW_ERROR_MESSAGE_INTERVAL = 10000; private static final long SHOW_SUCCESS_SQUARE_INTERVAL = 1000; private static final Duration VIBRATE_DURATION_QR_CODE_RECOGNITION = Duration.ofMillis(3); public static final String KEY_BROADCAST_METADATA = "key_broadcast_metadata"; private final Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_HIDE_ERROR_MESSAGE: mErrorMessage.setVisibility(View.INVISIBLE); break; case MESSAGE_SHOW_ERROR_MESSAGE: String errorMessage = (String) msg.obj; mErrorMessage.setVisibility(View.VISIBLE); mErrorMessage.setText(errorMessage); mErrorMessage.sendAccessibilityEvent( AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); // Cancel any pending messages to hide error view and requeue the // message so user has time to see error removeMessages(MESSAGE_HIDE_ERROR_MESSAGE); sendEmptyMessageDelayed( MESSAGE_HIDE_ERROR_MESSAGE, SHOW_ERROR_MESSAGE_INTERVAL); break; case MESSAGE_SCAN_BROADCAST_SUCCESS: Log.d(TAG, "scan success"); Intent resultIntent = new Intent(); resultIntent.putExtra(KEY_BROADCAST_METADATA, mBroadcastMetadata); if (getActivity() != null) { getActivity().setResult(Activity.RESULT_OK, resultIntent); notifyUserForQrCodeRecognition(); } break; } } }; private LocalBluetoothManager mLocalBluetoothManager; private int mCornerRadius; @Nullable private String mBroadcastMetadata; private Context mContext; @Nullable private QrCamera mCamera; private TextureView mTextureView; private TextView mSummary; private TextView mErrorMessage; @Override Loading Loading @@ -119,35 +140,23 @@ public class QrCodeScanModeFragment extends InstrumentedFragment var device = AudioStreamsHelper.getCachedBluetoothDeviceInSharingOrLeConnected( mLocalBluetoothManager); mSummary = view.findViewById(android.R.id.summary); if (mSummary != null && device.isPresent()) { mSummary.setText( TextView summary = view.findViewById(android.R.id.summary); if (summary != null && device.isPresent()) { summary.setText( getString( R.string.audio_streams_main_page_qr_code_scanner_summary, device.get().getName())); } } private void initCamera(SurfaceTexture surface) { // Check if the camera has already created. @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { if (mCamera == null) { mCamera = new QrCamera(mContext, this); mCamera.start(surface); } } private void destroyCamera() { if (mCamera != null) { mCamera.stop(); mCamera = null; } } @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { initCamera(surface); } @Override public void onSurfaceTextureSizeChanged( @NonNull SurfaceTexture surface, int width, int height) {} Loading @@ -167,7 +176,8 @@ public class QrCodeScanModeFragment extends InstrumentedFragment Log.d(TAG, "handleSuccessfulResult(), get the qr code string."); } mBroadcastMetadata = qrCode; handleBtLeAudioScanner(); Message message = mHandler.obtainMessage(MESSAGE_SCAN_BROADCAST_SUCCESS); mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL); } @Override Loading @@ -194,52 +204,21 @@ public class QrCodeScanModeFragment extends InstrumentedFragment public boolean isValid(String qrCode) { if (qrCode.startsWith(BluetoothBroadcastUtils.SCHEME_BT_BROADCAST_METADATA)) { return true; } else { showErrorMessage(R.string.audio_streams_qr_code_is_not_valid_format); return false; } Message message = mHandler.obtainMessage( MESSAGE_SHOW_ERROR_MESSAGE, getString(R.string.audio_streams_qr_code_is_not_valid_format)); message.sendToTarget(); return false; } protected boolean isDecodeTaskAlive() { return mCamera != null && mCamera.isDecodeTaskAlive(); } private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_HIDE_ERROR_MESSAGE: mErrorMessage.setVisibility(View.INVISIBLE); break; case MESSAGE_SHOW_ERROR_MESSAGE: final String errorMessage = (String) msg.obj; mErrorMessage.setVisibility(View.VISIBLE); mErrorMessage.setText(errorMessage); mErrorMessage.sendAccessibilityEvent( AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); // Cancel any pending messages to hide error view and requeue the // message so // user has time to see error removeMessages(MESSAGE_HIDE_ERROR_MESSAGE); sendEmptyMessageDelayed( MESSAGE_HIDE_ERROR_MESSAGE, SHOW_ERROR_MESSAGE_INTERVAL); break; case MESSAGE_SCAN_BROADCAST_SUCCESS: Log.d(TAG, "scan success"); final Intent resultIntent = new Intent(); resultIntent.putExtra(KEY_BROADCAST_METADATA, mBroadcastMetadata); getActivity().setResult(Activity.RESULT_OK, resultIntent); notifyUserForQrCodeRecognition(); break; default: private void destroyCamera() { if (mCamera != null) { mCamera.stop(); mCamera = null; } } }; private void notifyUserForQrCodeRecognition() { if (mCamera != null) { Loading @@ -249,10 +228,12 @@ public class QrCodeScanModeFragment extends InstrumentedFragment mErrorMessage.setVisibility(View.INVISIBLE); mTextureView.setVisibility(View.INVISIBLE); triggerVibrationForQrCodeRecognition(getContext()); triggerVibrationForQrCodeRecognition(mContext); if (getActivity() != null) { getActivity().finish(); } } private static void triggerVibrationForQrCodeRecognition(Context context) { Vibrator vibrator = context.getSystemService(Vibrator.class); Loading @@ -265,17 +246,6 @@ public class QrCodeScanModeFragment extends InstrumentedFragment VibrationEffect.DEFAULT_AMPLITUDE)); } private void showErrorMessage(@StringRes int messageResId) { final Message message = mHandler.obtainMessage(MESSAGE_SHOW_ERROR_MESSAGE, getString(messageResId)); message.sendToTarget(); } private void handleBtLeAudioScanner() { Message message = mHandler.obtainMessage(MESSAGE_SCAN_BROADCAST_SUCCESS); mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL); } @Override public int getMetricsCategory() { return SettingsEnums.LE_AUDIO_BROADCAST_SCAN_QR_CODE; Loading Loading
AndroidManifest.xml +0 −11 Original line number Diff line number Diff line Loading @@ -5216,17 +5216,6 @@ android:value="com.android.settings.connecteddevice.audiosharing.AudioSharingDashboardFragment"/> </activity> <activity android:name="com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode.QrCodeScanModeActivity" android:permission="android.permission.BLUETOOTH_CONNECT" android:screenOrientation="portrait" android:exported="false"> <intent-filter> <action android:name="android.settings.BLUETOOTH_LE_AUDIO_QR_CODE_SCANNER"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> <activity android:name="com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamConfirmDialogActivity" android:exported="true" Loading
res/layout/qrcode_scanner_fragment.xml +0 −2 Original line number Diff line number Diff line Loading @@ -70,8 +70,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginStart="?attr/sudMarginStart" android:layout_marginEnd="?attr/sudMarginEnd" android:gravity="center" android:layout_gravity="center" android:visibility="invisible"/> Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamConfirmDialog.java +3 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import static com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsDashboardFragment.KEY_BROADCAST_METADATA; import android.app.Activity; import android.app.Dialog; import android.app.settings.SettingsEnums; Loading @@ -30,7 +32,6 @@ import androidx.annotation.Nullable; import com.android.settings.R; import com.android.settings.bluetooth.Utils; import com.android.settings.connecteddevice.audiosharing.AudioSharingUtils; import com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode.QrCodeScanModeFragment; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt; Loading @@ -41,7 +42,6 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import com.google.common.base.Strings; public class AudioStreamConfirmDialog extends InstrumentedDialogFragment { public static final String KEY_BROADCAST_METADATA = "key_broadcast_metadata"; private static final String TAG = "AudioStreamConfirmDialog"; private static final int DEFAULT_DEVICE_NAME = R.string.audio_streams_dialog_default_device; @Nullable private LocalBluetoothManager mLocalBluetoothManager; Loading @@ -63,8 +63,7 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment { mLocalBluetoothManager = Utils.getLocalBluetoothManager(mActivity); mProfileManager = mLocalBluetoothManager == null ? null : mLocalBluetoothManager.getProfileManager(); mBroadcastMetadataStr = mActivity.getIntent().getStringExtra(QrCodeScanModeFragment.KEY_BROADCAST_METADATA); mBroadcastMetadataStr = mActivity.getIntent().getStringExtra(KEY_BROADCAST_METADATA); if (Strings.isNullOrEmpty(mBroadcastMetadataStr)) { Log.w(TAG, "onCreate() mBroadcastMetadataStr is null or empty!"); return; Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsDashboardFragment.java +3 −6 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.util.Log; import androidx.annotation.Nullable; import com.android.settings.R; import com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode.QrCodeScanModeFragment; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt; import com.android.settingslib.bluetooth.BluetoothUtils; Loading @@ -36,6 +35,7 @@ import com.android.settingslib.bluetooth.BluetoothUtils; import com.google.common.base.Strings; public class AudioStreamsDashboardFragment extends DashboardFragment { public static final String KEY_BROADCAST_METADATA = "key_broadcast_metadata"; private static final String TAG = "AudioStreamsDashboardFrag"; private static final boolean DEBUG = BluetoothUtils.D; private AudioStreamsProgressCategoryController mAudioStreamsProgressCategoryController; Loading Loading @@ -78,8 +78,7 @@ public class AudioStreamsDashboardFragment extends DashboardFragment { mAudioStreamsProgressCategoryController.setFragment(this); if (getArguments() != null) { String broadcastMetadataStr = getArguments().getString(AudioStreamConfirmDialog.KEY_BROADCAST_METADATA); String broadcastMetadataStr = getArguments().getString(KEY_BROADCAST_METADATA); if (!Strings.isNullOrEmpty(broadcastMetadataStr)) { BluetoothLeBroadcastMetadata broadcastMetadata = BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata( Loading Loading @@ -112,9 +111,7 @@ public class AudioStreamsDashboardFragment extends DashboardFragment { if (requestCode == REQUEST_SCAN_BT_BROADCAST_QR_CODE) { if (resultCode == Activity.RESULT_OK) { String broadcastMetadata = data != null ? data.getStringExtra(QrCodeScanModeFragment.KEY_BROADCAST_METADATA) : ""; data != null ? data.getStringExtra(KEY_BROADCAST_METADATA) : ""; BluetoothLeBroadcastMetadata source = BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata( broadcastMetadata); Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/qrcode/QrCodeScanModeFragment.java→src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamsQrCodeScanFragment.java +60 −90 Original line number Diff line number Diff line Loading @@ -14,7 +14,9 @@ * limitations under the License. */ package com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode; package com.android.settings.connecteddevice.audiosharing.audiostreams; import static com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsDashboardFragment.KEY_BROADCAST_METADATA; import android.app.Activity; import android.app.settings.SettingsEnums; Loading @@ -26,6 +28,7 @@ import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.VibrationEffect; import android.os.Vibrator; Loading @@ -41,11 +44,9 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.android.settings.R; import com.android.settings.bluetooth.Utils; import com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsHelper; import com.android.settings.core.InstrumentedFragment; import com.android.settingslib.bluetooth.BluetoothBroadcastUtils; import com.android.settingslib.bluetooth.BluetoothUtils; Loading @@ -54,34 +55,54 @@ import com.android.settingslib.qrcode.QrCamera; import java.time.Duration; public class QrCodeScanModeFragment extends InstrumentedFragment public class AudioStreamsQrCodeScanFragment extends InstrumentedFragment implements TextureView.SurfaceTextureListener, QrCamera.ScannerCallback { private static final boolean DEBUG = BluetoothUtils.D; private static final String TAG = "QrCodeScanModeFragment"; /** Message sent to hide error message */ private static final String TAG = "AudioStreamsQrCodeScanFragment"; private static final int MESSAGE_HIDE_ERROR_MESSAGE = 1; /** Message sent to show error message */ private static final int MESSAGE_SHOW_ERROR_MESSAGE = 2; /** Message sent to broadcast QR code */ private static final int MESSAGE_SCAN_BROADCAST_SUCCESS = 3; private static final long SHOW_ERROR_MESSAGE_INTERVAL = 10000; private static final long SHOW_SUCCESS_SQUARE_INTERVAL = 1000; private static final Duration VIBRATE_DURATION_QR_CODE_RECOGNITION = Duration.ofMillis(3); public static final String KEY_BROADCAST_METADATA = "key_broadcast_metadata"; private final Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_HIDE_ERROR_MESSAGE: mErrorMessage.setVisibility(View.INVISIBLE); break; case MESSAGE_SHOW_ERROR_MESSAGE: String errorMessage = (String) msg.obj; mErrorMessage.setVisibility(View.VISIBLE); mErrorMessage.setText(errorMessage); mErrorMessage.sendAccessibilityEvent( AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); // Cancel any pending messages to hide error view and requeue the // message so user has time to see error removeMessages(MESSAGE_HIDE_ERROR_MESSAGE); sendEmptyMessageDelayed( MESSAGE_HIDE_ERROR_MESSAGE, SHOW_ERROR_MESSAGE_INTERVAL); break; case MESSAGE_SCAN_BROADCAST_SUCCESS: Log.d(TAG, "scan success"); Intent resultIntent = new Intent(); resultIntent.putExtra(KEY_BROADCAST_METADATA, mBroadcastMetadata); if (getActivity() != null) { getActivity().setResult(Activity.RESULT_OK, resultIntent); notifyUserForQrCodeRecognition(); } break; } } }; private LocalBluetoothManager mLocalBluetoothManager; private int mCornerRadius; @Nullable private String mBroadcastMetadata; private Context mContext; @Nullable private QrCamera mCamera; private TextureView mTextureView; private TextView mSummary; private TextView mErrorMessage; @Override Loading Loading @@ -119,35 +140,23 @@ public class QrCodeScanModeFragment extends InstrumentedFragment var device = AudioStreamsHelper.getCachedBluetoothDeviceInSharingOrLeConnected( mLocalBluetoothManager); mSummary = view.findViewById(android.R.id.summary); if (mSummary != null && device.isPresent()) { mSummary.setText( TextView summary = view.findViewById(android.R.id.summary); if (summary != null && device.isPresent()) { summary.setText( getString( R.string.audio_streams_main_page_qr_code_scanner_summary, device.get().getName())); } } private void initCamera(SurfaceTexture surface) { // Check if the camera has already created. @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { if (mCamera == null) { mCamera = new QrCamera(mContext, this); mCamera.start(surface); } } private void destroyCamera() { if (mCamera != null) { mCamera.stop(); mCamera = null; } } @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { initCamera(surface); } @Override public void onSurfaceTextureSizeChanged( @NonNull SurfaceTexture surface, int width, int height) {} Loading @@ -167,7 +176,8 @@ public class QrCodeScanModeFragment extends InstrumentedFragment Log.d(TAG, "handleSuccessfulResult(), get the qr code string."); } mBroadcastMetadata = qrCode; handleBtLeAudioScanner(); Message message = mHandler.obtainMessage(MESSAGE_SCAN_BROADCAST_SUCCESS); mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL); } @Override Loading @@ -194,52 +204,21 @@ public class QrCodeScanModeFragment extends InstrumentedFragment public boolean isValid(String qrCode) { if (qrCode.startsWith(BluetoothBroadcastUtils.SCHEME_BT_BROADCAST_METADATA)) { return true; } else { showErrorMessage(R.string.audio_streams_qr_code_is_not_valid_format); return false; } Message message = mHandler.obtainMessage( MESSAGE_SHOW_ERROR_MESSAGE, getString(R.string.audio_streams_qr_code_is_not_valid_format)); message.sendToTarget(); return false; } protected boolean isDecodeTaskAlive() { return mCamera != null && mCamera.isDecodeTaskAlive(); } private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_HIDE_ERROR_MESSAGE: mErrorMessage.setVisibility(View.INVISIBLE); break; case MESSAGE_SHOW_ERROR_MESSAGE: final String errorMessage = (String) msg.obj; mErrorMessage.setVisibility(View.VISIBLE); mErrorMessage.setText(errorMessage); mErrorMessage.sendAccessibilityEvent( AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); // Cancel any pending messages to hide error view and requeue the // message so // user has time to see error removeMessages(MESSAGE_HIDE_ERROR_MESSAGE); sendEmptyMessageDelayed( MESSAGE_HIDE_ERROR_MESSAGE, SHOW_ERROR_MESSAGE_INTERVAL); break; case MESSAGE_SCAN_BROADCAST_SUCCESS: Log.d(TAG, "scan success"); final Intent resultIntent = new Intent(); resultIntent.putExtra(KEY_BROADCAST_METADATA, mBroadcastMetadata); getActivity().setResult(Activity.RESULT_OK, resultIntent); notifyUserForQrCodeRecognition(); break; default: private void destroyCamera() { if (mCamera != null) { mCamera.stop(); mCamera = null; } } }; private void notifyUserForQrCodeRecognition() { if (mCamera != null) { Loading @@ -249,10 +228,12 @@ public class QrCodeScanModeFragment extends InstrumentedFragment mErrorMessage.setVisibility(View.INVISIBLE); mTextureView.setVisibility(View.INVISIBLE); triggerVibrationForQrCodeRecognition(getContext()); triggerVibrationForQrCodeRecognition(mContext); if (getActivity() != null) { getActivity().finish(); } } private static void triggerVibrationForQrCodeRecognition(Context context) { Vibrator vibrator = context.getSystemService(Vibrator.class); Loading @@ -265,17 +246,6 @@ public class QrCodeScanModeFragment extends InstrumentedFragment VibrationEffect.DEFAULT_AMPLITUDE)); } private void showErrorMessage(@StringRes int messageResId) { final Message message = mHandler.obtainMessage(MESSAGE_SHOW_ERROR_MESSAGE, getString(messageResId)); message.sendToTarget(); } private void handleBtLeAudioScanner() { Message message = mHandler.obtainMessage(MESSAGE_SCAN_BROADCAST_SUCCESS); mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL); } @Override public int getMetricsCategory() { return SettingsEnums.LE_AUDIO_BROADCAST_SCAN_QR_CODE; Loading