[Audiosharing] When landscape mode, collapse app bar to make more space. Also refined fragments and make them scrollable.

Bug: b/356302527, b/356300387, b/356297148
Flag: com.android.settingslib.flags.enable_le_audio_qr_code_private_broadcast_sharing
Test: atest
Change-Id: I5d94f0d05afc78c13cab5b75ad662af72ffa0350
This commit is contained in:
chelseahao
2024-08-02 11:47:27 +08:00
committed by Chelsea Hao
parent b068edadf1
commit e7a1762ef3
9 changed files with 177 additions and 163 deletions

View File

@@ -15,48 +15,48 @@
~ limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="25dp"
android:baselineAligned="false">
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@android:id/summary"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="15sp"
android:textColor="?android:attr/textColorPrimary" />
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="25dp"
android:gravity="center">
<TextView
android:id="@android:id/summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:textSize="15sp"
android:textColor="?android:attr/textColorPrimary"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1"
android:gravity="center">
<ImageView
android:id="@+id/qrcode_view"
android:layout_width="@dimen/qrcode_size"
android:layout_height="@dimen/qrcode_size"
android:contentDescription="@string/qr_code_content_description"
android:focusable="true" />
<TextView
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="?android:attr/textColorPrimary"
android:gravity="center" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/qrcode_view"
android:layout_width="@dimen/qrcode_size"
android:layout_height="@dimen/qrcode_size"
android:contentDescription="@string/qr_code_content_description"
android:focusable="true" />
<TextView
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="?android:attr/textColorPrimary" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -15,60 +15,45 @@
limitations under the License.
-->
<LinearLayout
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="0dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@android:id/summary"
style="@style/QrCodeScanner"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:gravity="center"
android:clipChildren="true"
android:contentDescription="@string/audio_streams_qr_code_scanner_label"
android:focusable="true">
<TextureView
android:id="@+id/preview_view"
android:layout_marginStart="@dimen/qrcode_preview_margin"
android:layout_marginEnd="@dimen/qrcode_preview_margin"
android:layout_width="match_parent"
android:layout_height="@dimen/qrcode_preview_size"/>
</FrameLayout>
android:orientation="horizontal"
android:paddingTop="@dimen/audio_streams_qrcode_scanner_fragment_padding">
<TextView
android:id="@+id/error_message"
style="@style/TextAppearance.ErrorText"
android:layout_width="wrap_content"
android:id="@android:id/summary"
style="@style/QrCodeScanner"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:layout_gravity="center"
android:visibility="invisible"/>
android:orientation="vertical"
android:layout_weight="1"
android:gravity="center">
<TextureView
android:id="@+id/preview_view"
android:layout_width="@dimen/audio_streams_qrcode_preview_size"
android:layout_height="@dimen/audio_streams_qrcode_preview_size"
android:contentDescription="@string/audio_streams_qr_code_scanner_label"
android:focusable="true" />
<TextView
android:id="@+id/error_message"
style="@style/TextAppearance.ErrorText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -15,7 +15,7 @@
~ limitations under the License.
-->
<LinearLayout
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -23,10 +23,9 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingLeft="25dp"
android:paddingRight="25dp"
android:gravity="center_horizontal"
android:gravity="center"
android:orientation="vertical">
<TextView
@@ -35,30 +34,24 @@
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="15sp"
android:textColor="?android:attr/textColorPrimary"/>
android:textColor="?android:attr/textColorPrimary" />
<LinearLayout
android:layout_width="match_parent"
<ImageView
android:id="@+id/qrcode_view"
android:layout_width="@dimen/qrcode_size"
android:layout_height="@dimen/qrcode_size"
android:contentDescription="@string/qr_code_content_description"
android:focusable="true"
android:paddingTop="70dp"/>
<TextView
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="70dp">
<ImageView
android:id="@+id/qrcode_view"
android:layout_width="@dimen/qrcode_size"
android:layout_height="@dimen/qrcode_size"
android:contentDescription="@string/qr_code_content_description"
android:focusable="true"/>
<TextView
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="?android:attr/textColorPrimary"/>
</LinearLayout>
android:textSize="15sp"
android:textColor="?android:attr/textColorPrimary"
android:gravity="center" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -15,69 +15,41 @@
limitations under the License.
-->
<LinearLayout
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:layout_marginBottom="55dp">
<LinearLayout
android:orientation="vertical"
android:gravity="center"
android:layout_margin="20dp">
<TextView
android:id="@android:id/summary"
style="@style/QrCodeScanner"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="40dp"
android:paddingEnd="40dp"
android:layout_gravity="bottom"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@android:id/summary"
style="@style/QrCodeScanner"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"/>
</LinearLayout>
</LinearLayout>
android:layout_margin="40dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="7"
android:orientation="vertical">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:gravity="center"
android:clipChildren="true"
<TextureView
android:id="@+id/preview_view"
android:layout_width="@dimen/audio_streams_qrcode_preview_size"
android:layout_height="@dimen/audio_streams_qrcode_preview_size"
android:contentDescription="@string/audio_streams_qr_code_scanner_label"
android:focusable="true">
<TextureView
android:id="@+id/preview_view"
android:layout_marginStart="@dimen/qrcode_preview_margin"
android:layout_marginEnd="@dimen/qrcode_preview_margin"
android:layout_width="match_parent"
android:layout_height="@dimen/qrcode_preview_size"/>
</FrameLayout>
android:focusable="true" />
<TextView
android:id="@+id/error_message"
style="@style/TextAppearance.ErrorText"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:layout_gravity="center"
android:visibility="invisible"/>
android:visibility="gone"/>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -500,7 +500,9 @@
<dimen name="contrast_button_horizontal_spacing">16dp</dimen>
<dimen name="audio_streams_qrcode_size">264dp</dimen>
<dimen name="audio_streams_qrcode_preview_size">300dp</dimen>
<dimen name="audio_streams_qrcode_preview_radius">30dp</dimen>
<dimen name="audio_streams_qrcode_scanner_fragment_padding">16dp</dimen>
<!-- Zen Modes -->
<dimen name="zen_mode_header_size">136dp</dimen>

View File

@@ -28,10 +28,13 @@ import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.bluetooth.BluetoothLeBroadcastReceiveState;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
import com.android.settings.connecteddevice.audiosharing.AudioSharingUtils;
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -40,6 +43,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.utils.ThreadUtils;
import com.google.android.material.appbar.AppBarLayout;
import com.google.common.base.Strings;
import java.util.ArrayList;
@@ -346,4 +350,16 @@ public class AudioStreamsHelper {
intent.putParcelableArrayListExtra(DEVICES, new ArrayList<>(devices));
context.startService(intent);
}
static void configureAppBarByOrientation(@Nullable FragmentActivity activity) {
if (activity != null) {
AppBarLayout appBarLayout = activity.findViewById(R.id.app_bar);
if (appBarLayout != null) {
boolean canAppBarExpand =
activity.getResources().getConfiguration().orientation
== Configuration.ORIENTATION_PORTRAIT;
appBarLayout.setExpanded(canAppBarExpand);
}
}
}
}

View File

@@ -61,6 +61,8 @@ public class AudioStreamsQrCodeFragment extends InstrumentedFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Collapse or expand the app bar based on orientation for better display the qr code image.
AudioStreamsHelper.configureAppBarByOrientation(getActivity());
var unused = ThreadUtils.postOnBackgroundThread(
() -> {
BluetoothLeBroadcastMetadata broadcastMetadata = getBroadcastMetadata();

View File

@@ -116,6 +116,8 @@ public class AudioStreamsQrCodeScanFragment extends InstrumentedFragment
@Override
public final View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Collapse or expand the app bar based on orientation for better display the qr camera.
AudioStreamsHelper.configureAppBarByOrientation(getActivity());
return inflater.inflate(
R.layout.qrcode_scanner_fragment, container, /* attachToRoot */ false);
}

View File

@@ -16,6 +16,9 @@
package com.android.settings.connecteddevice.audiosharing.audiostreams;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -32,9 +35,13 @@ import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.bluetooth.BluetoothLeBroadcastReceiveState;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import androidx.fragment.app.FragmentActivity;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowThreadUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
@@ -42,6 +49,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.google.android.material.appbar.AppBarLayout;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -91,8 +99,7 @@ public class AudioStreamsHelperTest {
@Test
public void addSource_noDevice_doNothing() {
when(mAssistant.getAllConnectedDevices())
.thenReturn(Collections.emptyList());
when(mAssistant.getAllConnectedDevices()).thenReturn(Collections.emptyList());
mHelper.addSource(mMetadata);
verify(mAssistant, never()).addSource(any(), any(), anyBoolean());
@@ -114,8 +121,7 @@ public class AudioStreamsHelperTest {
@Test
public void removeSource_noDevice_doNothing() {
when(mAssistant.getAllConnectedDevices())
.thenReturn(Collections.emptyList());
when(mAssistant.getAllConnectedDevices()).thenReturn(Collections.emptyList());
mHelper.removeSource(BROADCAST_ID_1);
verify(mAssistant, never()).removeSource(any(), anyInt());
@@ -236,4 +242,40 @@ public class AudioStreamsHelperTest {
verify(mContext).startService(any());
}
@Test
public void configureAppBarByOrientation_landscape_shouldNotExpand() {
FragmentActivity fragmentActivity = mock(FragmentActivity.class);
// AppBarLayout requires a Theme.AppCompat.
mContext.setTheme(R.style.Theme_Settings_Home);
AppBarLayout appBarLayout = spy(new AppBarLayout(mContext));
setUpFragment(fragmentActivity, appBarLayout, ORIENTATION_LANDSCAPE);
AudioStreamsHelper.configureAppBarByOrientation(fragmentActivity);
verify(appBarLayout).setExpanded(eq(false));
}
@Test
public void configureAppBarByOrientation_portrait_shouldExpand() {
FragmentActivity fragmentActivity = mock(FragmentActivity.class);
// AppBarLayout requires a Theme.AppCompat.
mContext.setTheme(R.style.Theme_Settings_Home);
AppBarLayout appBarLayout = spy(new AppBarLayout(mContext));
setUpFragment(fragmentActivity, appBarLayout, ORIENTATION_PORTRAIT);
AudioStreamsHelper.configureAppBarByOrientation(fragmentActivity);
verify(appBarLayout).setExpanded(eq(true));
}
private void setUpFragment(
FragmentActivity fragmentActivity, AppBarLayout appBarLayout, int orientationPortrait) {
Resources resources = mock(Resources.class);
when(fragmentActivity.getResources()).thenReturn(resources);
Configuration configuration = new Configuration();
configuration.orientation = orientationPortrait;
when(resources.getConfiguration()).thenReturn(configuration);
when(fragmentActivity.findViewById(anyInt())).thenReturn(appBarLayout);
}
}