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"
>
<RelativeLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
android:minHeight="@*android:dimen/status_bar_icon_size"
android:gravity="center_vertical"
android:layout_marginBottom="11dp">
<ImageView
android:id="@+id/icon"
android:layout_width="@*android:dimen/status_bar_icon_size"
android:layout_height="@*android:dimen/status_bar_icon_size"
android:layout_height="24dp"
android:layout_width="24dp"
android:padding="4dp"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/pkgicon"
android:layout_marginStart="0dp"
android:layout_marginEnd="8dp"
android:layout_marginEnd="14dp"
android:contentDescription="@null"
android:adjustViewBounds="true"
android:tint="?android:attr/textColorPrimary"
android:maxHeight="@*android:dimen/status_bar_icon_size"
android:maxWidth="@*android:dimen/status_bar_icon_size"
android:scaleType="fitCenter" />
android:scaleType="centerInside" />
<TextView
android:id="@+id/pkgname"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@id/icon"
android:ellipsize="end"
android:singleLine="true"
android:textColor="?android:attr/textColorPrimary"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textStyle="bold"
android:textSize="12sp"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification"
android:marqueeRepeatLimit = "marquee_forever"
android:scrollHorizontally = "true"
android:textAlignment="viewStart" />
<ImageView
android:id="@+id/alerted_icon"
android:layout_width="@*android:dimen/status_bar_icon_size"
android:layout_height="@*android:dimen/status_bar_icon_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="6dp"
android:paddingTop="1dp"
android:scaleType="fitCenter"
android:visibility="gone"
android:layout_toEndOf="@id/pkgname"
android:tint="?android:attr/textColorSecondary"
android:src="@drawable/ic_notifications_alert"
/>
<ImageView
android:id="@+id/profile_badge"
android:layout_width="@*android:dimen/status_bar_icon_size"
android:layout_height="@*android:dimen/status_bar_icon_size"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="6dp"
android:paddingTop="1dp"
android:scaleType="fitCenter"
android:visibility="gone"
android:contentDescription="@*android:string/notification_work_profile_content_description"
android:layout_toStartOf="@id/timestamp"
/>
@@ -87,19 +82,14 @@
android:id="@+id/timestamp"
android:layout_width="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_alignTop="@android:id/widget_frame"
android:layout_centerVertical="true"
android:ellipsize="end"
android:singleLine="true"
android:textColor="?android:attr/textColorPrimary"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="12sp"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification"
android:textAlignment="viewEnd"
/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
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] -->
<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 -->
<skip />
@@ -8213,6 +8222,9 @@
<!-- 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>
<!-- 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] -->
<string name="keywords_wallpaper">background, theme, grid, customize, personalize</string>

View File

@@ -67,6 +67,15 @@
android:summary="@string/summary_placeholder"
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
android:key="dashboard_tile_placeholder"
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);
}
int numberOfNonLegacyVpn = vpns.size() - connectedLegacyVpnCount;
final UserInfo userInfo = mUserManager.getUserInfo(UserHandle.myUserId());
final int uid;
if (userInfo.isRestricted()) {
@@ -165,6 +166,12 @@ public class VpnPreferenceController extends AbstractPreferenceController
} else {
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.
if (mPreference instanceof VpnInfoPreference) {
final int insecureVpnCount = getInsecureVpnCount();
@@ -174,24 +181,22 @@ public class VpnPreferenceController extends AbstractPreferenceController
if (isInsecureVPN) {
// 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.
final int vpnCount = vpns.size()
+ LegacyVpnProfileStore.list(Credentials.VPN).length
- connectedLegacyVpnCount;
final int vpnCount = numberOfNonLegacyVpn
+ LegacyVpnProfileStore.list(Credentials.VPN).length;
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) {
summary = mContext.getString(
return mContext.getString(
R.string.vpn_settings_single_insecure_multiple_total,
insecureVpnCount);
} else {
summary = mContext.getString(
return mContext.getString(
R.string.vpn_settings_multiple_insecure_multiple_total,
insecureVpnCount);
}
}
}
final String finalSummary = summary;
ThreadUtils.postOnMainThread(() -> mPreference.setSummary(finalSummary));
return null;
}
@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
*/

View File

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

View File

@@ -73,7 +73,7 @@ public class BubbleSummaryPreferenceControllerTest {
MockitoAnnotations.initMocks(this);
ShadowApplication shadowApplication = ShadowApplication.getInstance();
mContext = RuntimeEnvironment.application;
when(mBackend.hasSentValidMsg(anyString(), anyInt())).thenReturn(true);
when(mBackend.hasSentValidBubble(anyString(), anyInt())).thenReturn(true);
mAppRow = new NotificationBackend.AppRow();
mAppRow.pkg = "pkg";
mAppRow.uid = 0;
@@ -103,10 +103,10 @@ public class BubbleSummaryPreferenceControllerTest {
}
@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);
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());
}

View File

@@ -4,7 +4,7 @@ $ atest SettingsUnitTests
A single class can also be tested with the following command
$ 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
$ 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);
}
}