[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:
@@ -15,34 +15,33 @@
|
||||
~ 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="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:padding="25dp"
|
||||
android:baselineAligned="false">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
android:gravity="center">
|
||||
|
||||
<TextView
|
||||
android:id="@android:id/summary"
|
||||
android:layout_width="match_parent"
|
||||
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:textColor="?android:attr/textColorPrimary"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
android:gravity="center">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/qrcode_view"
|
||||
@@ -56,7 +55,8 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="15sp"
|
||||
android:textColor="?android:attr/textColorPrimary" />
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:gravity="center" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
@@ -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">
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="@dimen/audio_streams_qrcode_scanner_fragment_padding">
|
||||
|
||||
<TextView
|
||||
android:id="@android:id/summary"
|
||||
style="@style/QrCodeScanner"
|
||||
android:gravity="center"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
</LinearLayout>
|
||||
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:orientation="vertical"
|
||||
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">
|
||||
android:gravity="center">
|
||||
<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: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="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>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
@@ -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"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="70dp">
|
||||
android:textColor="?android:attr/textColorPrimary" />
|
||||
|
||||
<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:focusable="true"
|
||||
android:paddingTop="70dp"/>
|
||||
|
||||
<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:textColor="?android:attr/textColorPrimary"
|
||||
android:gravity="center" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
@@ -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:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="40dp"
|
||||
android:paddingEnd="40dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
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: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"
|
||||
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: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="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>
|
||||
|
||||
|
@@ -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>
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user