Snap for 8082780 from 13f37c5b1a to tm-release

Change-Id: Ib568d360f78501173e1b94ba4db5085fb2f738b9
This commit is contained in:
Android Build Coastguard Worker
2022-01-15 04:09:53 +00:00
14 changed files with 322 additions and 47 deletions

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FF000000"
android:pathData="M20.65,19.27c-0.35,0-0.69-0.13-0.96-0.4l-8.66-8.66c-0.53-0.53-0.53-1.38,0-1.91 c0.53-0.53,1.38-0.53,1.91,0l8.66,8.66c0.53,0.53,0.53,1.38,0,1.91C21.34,19.14,20.99,19.27,20.65,19.27z" />
<path
android:fillColor="#FF000000"
android:pathData="M12.01,16.09c-0.35,0-0.69-0.13-0.96-0.4L2.4,7.04c-0.53-0.53-0.53-1.38,0-1.91s1.38-0.53,1.91,0l8.66,8.66 c0.53,0.53,0.53,1.38,0,1.91C12.7,15.96,12.36,16.09,12.01,16.09z" />
<path
android:fillColor="#FF000000"
android:pathData="M6.32,19.06c0-0.34,0.13-0.69,0.4-0.95l1.85-1.85c0.53-0.53,1.38-0.53,1.91,0c0.53,0.53,0.53,1.38,0,1.91 l-1.85,1.85c-0.53,0.53-1.38,0.53-1.91,0C6.45,19.75,6.32,19.4,6.32,19.06z" />
<path
android:fillColor="#FF000000"
android:pathData="M13.13,6.79c0-0.34,0.13-0.69,0.4-0.95l1.85-1.85c0.53-0.53,1.38-0.53,1.91,0c0.53,0.53,0.53,1.38,0,1.91 l-1.85,1.85c-0.53,0.53-1.38,0.53-1.91,0C13.27,7.48,13.13,7.13,13.13,6.79z" />
</vector>

View File

@@ -24,62 +24,57 @@
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
> >
<RelativeLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
> android:minHeight="@*android:dimen/status_bar_icon_size"
android:gravity="center_vertical"
android:layout_marginBottom="11dp">
<ImageView <ImageView
android:id="@+id/icon" android:id="@+id/icon"
android:layout_width="@*android:dimen/status_bar_icon_size" android:layout_height="24dp"
android:layout_height="@*android:dimen/status_bar_icon_size" android:layout_width="24dp"
android:padding="4dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toEndOf="@+id/pkgicon" android:layout_marginEnd="14dp"
android:layout_marginStart="0dp"
android:layout_marginEnd="8dp"
android:contentDescription="@null" android:contentDescription="@null"
android:adjustViewBounds="true" android:scaleType="centerInside" />
android:tint="?android:attr/textColorPrimary"
android:maxHeight="@*android:dimen/status_bar_icon_size"
android:maxWidth="@*android:dimen/status_bar_icon_size"
android:scaleType="fitCenter" />
<TextView <TextView
android:id="@+id/pkgname" android:id="@+id/pkgname"
android:layout_width="wrap_content" android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toEndOf="@id/icon"
android:ellipsize="end" android:ellipsize="end"
android:singleLine="true" android:singleLine="true"
android:textColor="?android:attr/textColorPrimary" android:textColor="?android:attr/textColorPrimary"
android:textAppearance="?android:attr/textAppearanceSmall" android:textSize="12sp"
android:textStyle="bold" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification"
android:marqueeRepeatLimit = "marquee_forever"
android:scrollHorizontally = "true"
android:textAlignment="viewStart" /> android:textAlignment="viewStart" />
<ImageView <ImageView
android:id="@+id/alerted_icon" android:id="@+id/alerted_icon"
android:layout_width="@*android:dimen/status_bar_icon_size" android:layout_width="wrap_content"
android:layout_height="@*android:dimen/status_bar_icon_size" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="6dp" android:layout_marginStart="6dp"
android:paddingTop="1dp"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:visibility="gone" android:visibility="gone"
android:layout_toEndOf="@id/pkgname"
android:tint="?android:attr/textColorSecondary" android:tint="?android:attr/textColorSecondary"
android:src="@drawable/ic_notifications_alert" android:src="@drawable/ic_notifications_alert"
/> />
<ImageView <ImageView
android:id="@+id/profile_badge" android:id="@+id/profile_badge"
android:layout_width="@*android:dimen/status_bar_icon_size" android:layout_width="wrap_content"
android:layout_height="@*android:dimen/status_bar_icon_size" android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="6dp" android:layout_marginEnd="6dp"
android:paddingTop="1dp"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:visibility="gone" android:contentDescription="@*android:string/notification_work_profile_content_description"
android:layout_toStartOf="@id/timestamp" android:layout_toStartOf="@id/timestamp"
/> />
@@ -87,19 +82,14 @@
android:id="@+id/timestamp" android:id="@+id/timestamp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="13dp"
android:paddingBottom="13dp"
android:layout_alignBottom="@android:id/widget_frame"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignTop="@android:id/widget_frame"
android:layout_centerVertical="true"
android:ellipsize="end" android:ellipsize="end"
android:singleLine="true" android:singleLine="true"
android:textColor="?android:attr/textColorPrimary" android:textSize="12sp"
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification"
android:textAlignment="viewEnd" android:textAlignment="viewEnd"
/> />
</RelativeLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -5803,6 +5803,15 @@
<!-- List of synonyms used in the settings search bar to find the “Voice Access”. [CHAR LIMIT=NONE] --> <!-- List of synonyms used in the settings search bar to find the “Voice Access”. [CHAR LIMIT=NONE] -->
<string name="keywords_voice_access"></string> <string name="keywords_voice_access"></string>
<!-- Fast Pair settings -->
<skip />
<!-- Title in main settings screen for Fast Pair settings [CHAR LIMIT=15] -->
<string name="fast_pair_settings">Fast Pair</string>
<!-- Fast Pair setting summary in settings screen [CHAR LIMIT=50] -->
<string name="fast_pair_settings_summary">Nearby detection of Fast Pair bluetooth devices.</string>
<!-- Printing settings --> <!-- Printing settings -->
<skip /> <skip />
@@ -8213,6 +8222,9 @@
<!-- List of synonyms for the Bluetooth setting, used to match in settings search [CHAR LIMIT=NONE] --> <!-- List of synonyms for the Bluetooth setting, used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_bluetooth_settings">connected, device, headphones, headset, speaker, wireless, pair, earbuds, music, media </string> <string name="keywords_bluetooth_settings">connected, device, headphones, headset, speaker, wireless, pair, earbuds, music, media </string>
<!-- List of synonyms for the Fast Pair setting, used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_fast_pair">pair, earbuds, bluetooth</string>
<!-- List of synonyms for the Wallpaper picker setting, used to match in settings search [CHAR LIMIT=NONE] --> <!-- List of synonyms for the Wallpaper picker setting, used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_wallpaper">background, theme, grid, customize, personalize</string> <string name="keywords_wallpaper">background, theme, grid, customize, personalize</string>

View File

@@ -67,6 +67,15 @@
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.uwb.UwbPreferenceController"/> settings:controller="com.android.settings.uwb.UwbPreferenceController"/>
<Preference
android:key="connected_device_fast_pair"
android:title="@string/fast_pair_settings"
android:summary="@string/fast_pair_settings_summary"
android:icon="@drawable/ic_fast_pair_24dp"
android:fragment="com.android.settings.nearby.FastPairSettingsFragment"
settings:controller="com.android.settings.nearby.FastPairPreferenceController"
android:order="-2"/>
<PreferenceCategory <PreferenceCategory
android:key="dashboard_tile_placeholder" android:key="dashboard_tile_placeholder"
android:order="-8"/> android:order="-8"/>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/fast_pair_settings"
settings:keywords="@string/keywords_fast_pair">
</PreferenceScreen>

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.nearby;
import android.content.Context;
import androidx.lifecycle.LifecycleObserver;
import com.android.settings.core.BasePreferenceController;
/**
* {@link BasePreferenceController} for Fast Pair settings.
*/
public class FastPairPreferenceController extends BasePreferenceController implements
LifecycleObserver {
public static final String TAG = "FastPairPrefController";
public static final String KEY_FAST_PAIR_SETTINGS = "connected_device_fast_pair";
public FastPairPreferenceController(Context context) {
super(context, KEY_FAST_PAIR_SETTINGS);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
}

View File

@@ -0,0 +1,50 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.nearby;
import android.app.settings.SettingsEnums;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/**
* Fragment with the top level fast pair settings.
*/
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class FastPairSettingsFragment extends SettingsPreferenceFragment {
@Override
public int getMetricsCategory() {
return SettingsEnums.CONNECTION_DEVICE_ADVANCED_FAST_PAIR;
}
@Override
public int getHelpResource() {
return 0;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.fast_pair_settings;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.fast_pair_settings);
}

View File

@@ -151,6 +151,7 @@ public class VpnPreferenceController extends AbstractPreferenceController
} }
vpns.put(user.id, cfg); vpns.put(user.id, cfg);
} }
int numberOfNonLegacyVpn = vpns.size() - connectedLegacyVpnCount;
final UserInfo userInfo = mUserManager.getUserInfo(UserHandle.myUserId()); final UserInfo userInfo = mUserManager.getUserInfo(UserHandle.myUserId());
final int uid; final int uid;
if (userInfo.isRestricted()) { if (userInfo.isRestricted()) {
@@ -165,6 +166,12 @@ public class VpnPreferenceController extends AbstractPreferenceController
} else { } else {
summary = getNameForVpnConfig(vpn, UserHandle.of(uid)); summary = getNameForVpnConfig(vpn, UserHandle.of(uid));
} }
String summaryOverride = getInsecureVpnSummaryOverride(numberOfNonLegacyVpn);
final String finalSummary = (summaryOverride != null) ? summaryOverride : summary;
ThreadUtils.postOnMainThread(() -> mPreference.setSummary(finalSummary));
}
protected String getInsecureVpnSummaryOverride(int numberOfNonLegacyVpn) {
// Optionally add warning icon if an insecure VPN is present. // Optionally add warning icon if an insecure VPN is present.
if (mPreference instanceof VpnInfoPreference) { if (mPreference instanceof VpnInfoPreference) {
final int insecureVpnCount = getInsecureVpnCount(); final int insecureVpnCount = getInsecureVpnCount();
@@ -174,24 +181,22 @@ public class VpnPreferenceController extends AbstractPreferenceController
if (isInsecureVPN) { if (isInsecureVPN) {
// Add the users and the number of legacy vpns to determine if there is more than // Add the users and the number of legacy vpns to determine if there is more than
// one vpn, since there can be more than one VPN per user. // one vpn, since there can be more than one VPN per user.
final int vpnCount = vpns.size() final int vpnCount = numberOfNonLegacyVpn
+ LegacyVpnProfileStore.list(Credentials.VPN).length + LegacyVpnProfileStore.list(Credentials.VPN).length;
- connectedLegacyVpnCount;
if (vpnCount == 1) { if (vpnCount == 1) {
summary = mContext.getString(R.string.vpn_settings_insecure_single); return mContext.getString(R.string.vpn_settings_insecure_single);
} else if (insecureVpnCount == 1) { } else if (insecureVpnCount == 1) {
summary = mContext.getString( return mContext.getString(
R.string.vpn_settings_single_insecure_multiple_total, R.string.vpn_settings_single_insecure_multiple_total,
insecureVpnCount); insecureVpnCount);
} else { } else {
summary = mContext.getString( return mContext.getString(
R.string.vpn_settings_multiple_insecure_multiple_total, R.string.vpn_settings_multiple_insecure_multiple_total,
insecureVpnCount); insecureVpnCount);
} }
} }
} }
final String finalSummary = summary; return null;
ThreadUtils.postOnMainThread(() -> mPreference.setSummary(finalSummary));
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -361,6 +361,15 @@ public class NotificationBackend {
} }
} }
public boolean hasSentValidBubble(String pkg, int uid) {
try {
return sINM.hasSentValidBubble(pkg, uid);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return false;
}
}
/** /**
* Returns all notification channels associated with the package and uid that will bypass DND * Returns all notification channels associated with the package and uid that will bypass DND
*/ */

View File

@@ -63,7 +63,7 @@ public class BubbleSummaryPreferenceController extends NotificationPreferenceCon
return mAppRow != null; return mAppRow != null;
} }
} }
return isGloballyEnabled() && mBackend.hasSentValidMsg(mAppRow.pkg, mAppRow.uid); return isGloballyEnabled() && mBackend.hasSentValidBubble(mAppRow.pkg, mAppRow.uid);
} }
@Override @Override

View File

@@ -73,7 +73,7 @@ public class BubbleSummaryPreferenceControllerTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
ShadowApplication shadowApplication = ShadowApplication.getInstance(); ShadowApplication shadowApplication = ShadowApplication.getInstance();
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
when(mBackend.hasSentValidMsg(anyString(), anyInt())).thenReturn(true); when(mBackend.hasSentValidBubble(anyString(), anyInt())).thenReturn(true);
mAppRow = new NotificationBackend.AppRow(); mAppRow = new NotificationBackend.AppRow();
mAppRow.pkg = "pkg"; mAppRow.pkg = "pkg";
mAppRow.uid = 0; mAppRow.uid = 0;
@@ -103,10 +103,10 @@ public class BubbleSummaryPreferenceControllerTest {
} }
@Test @Test
public void isAvailable_NOTIFICATION_BUBBLESisOn_neverSentMsg_shouldReturnFalse() { public void isAvailable_NOTIFICATION_BUBBLESisOn_neverSentBubble_shouldReturnFalse() {
Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON); Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, SYSTEM_WIDE_ON);
mController.onResume(mAppRow, null, null, null, null, null, null); mController.onResume(mAppRow, null, null, null, null, null, null);
when(mBackend.hasSentValidMsg(anyString(), anyInt())).thenReturn(false); when(mBackend.hasSentValidBubble(anyString(), anyInt())).thenReturn(false);
assertFalse(mController.isAvailable()); assertFalse(mController.isAvailable());
} }

View File

@@ -4,7 +4,7 @@ $ atest SettingsUnitTests
A single class can also be tested with the following command A single class can also be tested with the following command
$ atest -c <YourClassName> $ atest -c <YourClassName>
// The following instrutions show how to run the test suite using make + adb // // The following instructions show how to run the test suite using make + adb //
To build the tests you can use the following command at the root of your android source tree To build the tests you can use the following command at the root of your android source tree
$ make SettingsUnitTests $ make SettingsUnitTests

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.nearby;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.content.Context;
import android.os.Looper;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class FastPairPreferenceControllerTest {
private Context mContext;
private FastPairPreferenceController mController;
@Before
public void setUp() {
mContext = spy(ApplicationProvider.getApplicationContext());
mController = new FastPairPreferenceController(mContext);
if (Looper.myLooper() == null) {
Looper.prepare();
}
}
@Test
public void isAvailable_shouldBeTrue() {
assertThat(mController.isAvailable()).isTrue();
}
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.nearby;
import static com.google.common.truth.Truth.assertThat;
import android.app.Instrumentation;
import android.app.settings.SettingsEnums;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class FastPairSettingsFragmentTest {
private FastPairSettingsFragment mFragment;
@Before
public void setUp() {
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.runOnMainSync(() -> mFragment = new FastPairSettingsFragment());
}
@Test
public void getCategoryKey_isNetwork() {
assertThat(mFragment.getMetricsCategory())
.isEqualTo(SettingsEnums.CONNECTION_DEVICE_ADVANCED_FAST_PAIR);
}
}